swh:1:snp:79c9132b4a8931e989e318225e00e088ef6f383d
Raw File
Tip revision: a8fa8f03b50a72034009439908f1339f4ce94518 authored by Ron Burkey on 06 June 2021, 12:28:21 UTC
Fixed more hyperlinks.
Tip revision: a8fa8f0
Gemini.html
<!DOCTYPE doctype PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <title>The Gemini Spacecraft Computer</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="author" content="Ron Burkey">
    <link rel="icon" type="image/png" href="favicon.png">
    <meta name="author" content="Ron Burkey">
    <script type="text/javascript" src="Header.js"></script>
  </head>
  <body style="background-image: url(gray3.jpg);">
    <script type="text/javascript">
document.write(headerTemplate.replace("@TITLE@","Gemini Spacecraft").replace("@SUBTITLE@","On-Board Computer (OBC)"))
</script>
    <h2>Contents</h2>
    <ul>
      <li><a href="#What_is_the_Gemini_Spacecraft_Computer_">What is
          the Gemini Spacecraft Computer (OBC)?</a></li>
      <li><a href="#Peripheral_Devices">Peripheral
          Devices</a><br>
      </li>
      <li><a href="#Gemini_Documentation">Gemini
          Documentation</a></li>
      <li><a href="#Evolution_of_the_Flight_Software">Evolution of
          the Flight Software</a></li>
      <li><a href="#Architecture_of_the_Computer">OBC Architecture
          and Interfacing<br>
        </a></li>
      <ul>
        <li><a href="#References">References</a></li>
        <li><a href="#General_Characteristics_of_the_Computer">General
            Characteristics of the OBC</a></li>
        <li><a href="#Layout_of_Memory_Words">Layout of Memory
            Words</a></li>
        <li><a href="#Instruction_Sequencing">Instruction
            Sequencing</a><br>
        </li>
        <li><a href="#CPU_Instructions">CPU Instructions</a></li>
        <li><a href="#IO_Ports_For_PRO_Instruction">I/O Signals (for
            <span style="font-family: courier new,courier,monospace;">PRO</span>
            Instruction)</a></li>
        <li><a href="#Discrete_Inputs_For_CLD_Instruction">Discrete
            Inputs (for <span style="font-family: courier
              new,courier,monospace;">CLD</span>
            Instruction)</a></li>
        <li><a href="#Subroutine_Linkage">Subroutines</a><br>
        </li>
        <li><a href="#Telemetry">Telemetry</a></li>
        <ul>
          <li><a href="#Uplink">Uplink</a></li>
          <li><a href="#Downlink">Downlink</a></li>
        </ul>
        <li><a href="#Rendezvous_Radar">Rendezvous Radar</a></li>
        <li><a href="#Aerospace_Ground_Equipment_AGE">Aerospace
            Ground Equipment (AGE)</a></li>
        <li><a href="#Time_Reference_System_TRS">Time Reference
            System (TRS)</a><br>
        </li>
        <li><a href="#Auxiliary_Tape_Memory_ATM">Auxiliary Tape
            Memory (ATM)</a></li>
        <li>(See also <a href="#yaPanel_the_Control_Panel_Emulation_">the
            yaPanel
            section</a> for various other user-interface related
          peripheral devices.)<br>
        </li>
      </ul>
      <li><a href="#Gemini_Assembly_Language">OBC Assembly
          Language</a></li>
      <ul>
        <li><a href="#General_format">General format</a></li>
        <li><a href="#Shorthands_for_some_instructions_">Shorthands
            for some instructions</a></li>
        <li><a href="#Pseudo-ops">Pseudo-ops</a></li>
        <li><a href="#Software_Examples">Software
            Examples</a><br>
        </li>
      </ul>
      <li><a href="#Virtual_AGC_simulation_software">Virtual AGC
          simulation software</a></li>
      <ul>
        <li><a href="#Downloads">Downloads</a><br>
        </li>
        <li><a href="#The_Gemini_Catch-Up_and_Rendezvous">The Gemini
            Catch-Up and Rendezvous Simulation Program</a></li>
        <ul>
          <li><a href="#Background">Background</a></li>
          <li><a href="#Source_Code">Source Code</a><br>
          </li>
          <li><a href="#Building_the_Catch-Up_and_Rendezvous">Building
              the
              Catch-Up and Rendezvous Simulation Program</a></li>
          <li><a href="#Running_the_Catch-Up_and_Rendezvous">Running
              the Catch-Up and Rendezvous Simulation Program</a></li>
          <li><a href="#Data_for_the_Catch-Up_and_Rendezvous">Data
              for the Catch-Up and Rendezvous Simulation Program</a></li>
          <li><a href="#Theory_of_Operation_for_the_Catch-Up_and">Theory
              of
              Operation and Porting-Problems for the Catch-Up and
              Rendezvous Simulation Program</a></li>
        </ul>
        <li><a href="#yaOBC_the_OBC_CPU_Emulation"><span
              style="font-weight: bold;">yaOBC</span>, the OBC CPU
            Emulation</a></li>
        <ul>
          <li><a href="#Invoking_yaOBC_">Invocation</a></li>
          <li><a href="#Debugging_Interface_of_yaOBC">Debugging
              interface</a></li>
          <li><a href="#Protocol">Communications
              Protocol</a><br>
          </li>
        </ul>
        <li><a href="#yaOBCASM_the_OBC_Cross-Assembler"><span
              style="font-weight: bold;">yaASM</span>, the OBC
            Cross-Assembler</a></li>
        <li><a href="#yaPanel_the_Control_Panel_Emulation_"><span
              style="font-weight: bold;">yaPanel</span>, the
            Control-Panel
            Emulation</a> (includes discussion of <a
            href="#yaMDIU_the_MDIU_Emulation">MDIU</a>, <a href="#PCDP">PCDP</a>,
          <a href="#IVI">IVI</a>, ...)</li>
      </ul>
      <li><a href="#Plea_for_Data">Plea for Data</a></li>
      <li><a href="#Reminiscences_and_Factoids_from_the">Reminiscences
          and
          Factoids from the Original Developers</a><br>
      </li>
      <li><a href="#Homage">Homage</a><br>
      </li>
    </ul>
    <h2><a name="What_is_the_Gemini_Spacecraft_Computer_"
        id="What_is_the_Gemini_Spacecraft_Computer_"></a>What is the
      Gemini
      Spacecraft Computer (OBC)?<br>
    </h2>
    The Gemini spacecraft computer
    is, as the name implies, the onboard computer of the Gemini
    spacecraft.&nbsp; The computer seems to have been referred to
    variously as the "spacecraft computer", the "digital computer",
    or the "On-Board Computer" (OBC).&nbsp;&nbsp; It was the Gemini
    equivalent of Apollo's AGC, though with more limited capabilities
    and functionality.&nbsp; Its basic use was in the post-launch
    phases of missions (orbit phase, retrograde phase, re-entry
    phase), because the Titan II rocket which carried the Gemini
    spacecraft into orbit was guided by its own (separate) ACS-15
    guidance computer, but there was provision also for switchover to
    the Gemini computer for backup guidance if the need arose.&nbsp;
    Interestingly, the OBC could be used for automatic attitude
    control of the spacecraft, but not automatic velocity control;
    rather, it performed necessary calculations for maneuvers such as
    orbital insertion or re-entry, and the pilots then performed the
    manual chores of actually adjusting the spacecraft velocity
    appropriately.<br>
    <br>
    The OBC was designed and manufactured by IBM's Federal Systems
    Division, in Owego, New York, just as Apollo's <a href="LVDC.html">Launch
      Vehicle Digital Computer (LVDC)</a> was.&nbsp;
    The OBC and the LVDC are extraordinarily similar at the CPU
    level.<br>
    <br>
    <table summary="" style="width: 100%; text-align: left;"
      cellspacing="2" cellpadding="2">
      <tbody>
        <tr>
          <td style="text-align: center; vertical-align: middle;"><img
              style="width: 576px; height: 649px;" alt=""
              src="GeminiComputerPhoto.jpg" width="576" height="649"><br>
            <span style="font-weight: bold;">The Gemini VIII OBC, with
              cover removed</span><br>
            (Smithsonian National Air &amp; Space Museum)<br>
          </td>
          <td style="text-align: center; vertical-align: middle;"><img
              alt="" src="GeminiPhysicalLayout.jpg" style="width: 566px;
              height: 532px;" width="566" height="532"><br>
            <br>
            <span style="font-weight: bold;">Location of the OBC in the
              spacecraft</span><br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    <h2><a name="Peripheral_Devices" id="Peripheral_Devices"></a>Peripheral
      Devices</h2>
    This section
    contains a general overview of the OBC's peripheral devices, but
    many of them are discussed in much greater detail in later
    sections.<br>
    <br>
    From a user standpoint, the most visible of the OBC's peripheral
    device was the Manual Data Insertion Unit (MDIU)—the Gemini
    equivalent of the Apollo <a href="yaDSKY.html">DSKY</a>—which
    comprised the Modular Display Keyboard (MDK) and the Modular
    Display Readout (MDR).<br>
    <br>
    <table summary="" style="text-align: left; width: 100%;"
      cellspacing="2" cellpadding="2" border="0">
      <tbody>
        <tr>
          <td style="vertical-align: middle; text-align: center;"><img
              style="width: 364px; height: 307px;" alt=""
              src="GeminiMDK.png" width="364" height="307"><br>
            <span style="font-weight: bold;">Modular Display Keyboard
              (MDK)</span><br>
          </td>
          <td style="vertical-align: top; text-align: center;"><img
              style="width: 476px; height: 324px;" alt=""
              src="GeminiMDR.png" width="476" height="324"><br>
            <span style="font-weight: bold;">Modular Display
              Readout</span><br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    These were on the Pilot's (as opposed to the Command Pilot's)
    side of the control panel, at the lower right in the drawing
    below.&nbsp; The small image below is from the familiarization
    manual, but if you click on it you'll get a much bigger, much
    more detailed drawing from the <span style="font-style: italic;">Gemini
      5 Mission Report</span>.<br>
    <br>
    <div style="text-align: center;"><a href="Gemini5-panels.png"><img
          alt="" title="Click to enlarge" src="GeminiPanels-small.png"
          style="border: 2px solid ; width: 863px; height: 610px;"
          width="863" height="610"></a><br>
      <div style="text-align: left;"><br>
        A basic inventory of the guidance sub-systems includes:<br>
        <ul>
          <li>Attitude Control and Maneuver Electronics (ACME), which
            is the sub-system that directly controls the propulsion
            system.<br>
          </li>
          <li>Inertial Guidance System (IGS), including the Inertial
            Measurement Unit (IMU) and the OBC itself.<br>
          </li>
          <li>Horizon Sensors</li>
          <li>Time Reference System (TRS)</li>
        </ul>
        The diagram below shows a very simplified block diagram
        of the guidance system, but if you click it you'll get a
        (different) more-detailed block diagram.<br>
        <br>
        <div style="text-align: center;"><span style="text-decoration:
            underline;"><a href="GeminiGuidanceSystemBlockDiagram.jpg"><img
                alt="" title="Click for a more-detailed diagram"
                src="GeminiGuidanceSystemBlockDiagram-small.jpg"
                style="border: 2px solid ; width: 600px; height: 403px;"
                width="600" height="403"></a></span><br>
        </div>
        <br>
        The IMU is the usual gimballed stable platform with
        accelerometers and angular resolvers as in Apollo, except for
        a key difference that the Gemini IMU had four gimbals rather
        than the three gimbals of Apollo.&nbsp; This means that it
        was not subject to the phenomenon of "gimbal lock", and hence
        the software used to adjust spacecraft alignment could be
        simpler than with three gimbals.&nbsp; The value of the 4th
        gimbal can be appreciated when considering incidents like the
        mishap in Gemini VIII in which an uncontrolled roll
        occurred.&nbsp; (If the IMU had had only three gimbals, my
        understanding is that gimbal lock would have occured when the
        roll angle was too great.)&nbsp; On the other hand, at that
        point the spacecraft was under manual control anyway, and I'm
        sure that the notion that the IMU would have to be realigned
        later would have been the least of Neil Armstrong and Dave
        Scott's worries.<br>
      </div>
    </div>
    <h2><a name="Gemini_Documentation" id="Gemini_Documentation"></a>Gemini
      Documentation</h2>
    Sadly,
    documentation we've been able to collect for the OBC lags far
    behind that of the AGC or even that of the Abort Guidance System
    (AGS).&nbsp; What little survives that we have been able to
    access can be found in our <a
      href="links.html#Gemini_spacecraft_computer">Document
      Library</a>.&nbsp; There's a lot of unique stuff there
    contributed by original Gemini developers.<br>
    <br>
    Of particular note are the portions of the <i>Gemini Operations
      Handbook</i>, for spacecraft 7 and 10, and especially subsection
    2.5.7 of those handbooks.&nbsp; These provide user instructions for
    the flight-computer software, and in the case of spacecraft 10 are
    particularly detailed.&nbsp; For example, in the case of spacecraft
    10, there's a complete list, with explanations, scope, and format,
    of all of the memory variables (addresses 0-162) accessible from the
    MDIU/DCS.<br>
    <h2><a name="Evolution_of_the_Flight_Software"
        id="Evolution_of_the_Flight_Software"></a>Evolution of the
      Flight
      Software ... or, "Everybody Loves Math Flow 7" ... or, "What is
      software, my man?&nbsp; What is software?"<br>
    </h2>
    Information
    about the Gemini OBC software is hard to come by.&nbsp; Useful
    information we <span style="font-style: italic;">don't</span>
    have includes any actual OBC software that's contemporary to the
    Gemini project itself, and that's a lot not to know.&nbsp; But
    the situation isn't all bad, partly because the development
    method of the Gemini OBC software causes us to question what the
    notion of having the original software even means.&nbsp; I'll
    explain more about that shortly, but there's an important sense
    in which we actually do have significant portions of the software
    at our disposal.<br>
    <br>
    But before turning our attention to such lofty matters, let's
    begin with some of the more-mundane details.&nbsp; Firstly, as
    far as naming is concerned, the flight software seems to have
    been called simply the "operational program".&nbsp;&nbsp; On the
    subject of versioning of the operational program, we have only
    partial information, from the familiarization manual, from
    <a
      href="http://www.hq.nasa.gov/office/pao/History/computers/Ch1-3.html">James
Tomayko's
      Computers in Spaceflight, Chapter 1, section 4</a>, and
    from <a href="Documents/GeminiSoftwareHistory.pdf">
      this short memo</a>.&nbsp; (Where there's any discrepancy, I
    personally believe in the memo.)<br>
    <br>
    The operational programs were characterized in terms of something
    called the "Math Flow".&nbsp; In brief, the Math Flow is the
    complete design of the software, expressed in Gemini as a series
    of very detailed flowcharts.&nbsp; The development of the Math
    Flow eventualy went through 7 major versions, designated MF-1
    through MF-7.&nbsp; But there were differing revisions for each
    of the major versions as well.<br>
    <br>
    The overall software design was partitioned into several
    different areas of basic functionality. In math-flow MF-1 through
    MF-6, these functional areas were integrated into a single
    operational program.&nbsp; (Though for some missions, unneeded
    functionality could be omitted. Thus, Catch-up &amp; Rendezvous
    were omitted in spacecraft GT-3, GT-4, and GT-7.)&nbsp; In MF-7,
    the code was refactored into 6 different high-level "Program
    Modules", which could be loaded into memory from the <a
      href="Gemini.html#Auxiliary_Tape_Memory_ATM">Auxiliary Tape Memory
      (ATM)</a> when needed during specific mission phases, though
    Module I was in memory at all times and didn't need to be loaded
    from the ATM.&nbsp; The modules were as follows:<br>
    <table summary="" style="margin-left: auto; margin-right: auto;
      text-align: left;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top;">Module<br>
          </th>
          <th style="vertical-align: top;">Basic
            Functionality<br>
          </th>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD I</span><br>
          </td>
          <td style="vertical-align: top;">Executor<br>
            Pre-Launch<br>
            Diagnostics<br>
            Computational subroutines (SINCOS, SQROOT, etc.)<br>
            ATM-read<br>
          </td>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD</span> <span style="font-weight: normal;">II</span><br>
          </td>
          <td style="vertical-align: top;">Ascent (with abort
            capability)<br>
            Catch-up (without radar)<br>
            Re-entry for ascent-abort<br>
          </td>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD</span> <span style="font-weight: normal;">III</span><br>
          </td>
          <td style="vertical-align: top;">Catch-up (with radar)<br>
            Rendezvous<br>
          </td>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD</span> <span style="font-weight: normal;">IV</span><br>
          </td>
          <td style="vertical-align: top;">Touchdown-predict<br>
            Re-entry<br>
            Re-entry initialization<br>
          </td>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD</span> <span style="font-weight: normal;">V</span><br>
          </td>
          <td style="vertical-align: top;">
            Simplified functions as backup for ATM failure:<br>
            <div style="margin-left: 40px;">
              Ascent (without abort capability)<br>
              Catch-up and Rendezvous (without self-test)<br>
            </div>
          </td>
        </tr>
        <tr>
          <td style="font-weight: bold;"><span style="font-weight:
              normal;">MOD</span> <span style="font-weight: normal;">VI</span><br>
          </td>
          <td style="vertical-align: top;">Orbit-predict<br>
            Orbit-navigation<br>
            Orbit-determination<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    The astronauts used the Computer Mode rotary switch on the
    <a href="#PCDP">Pilots' Control and Display Panel</a> to select
    from amount the following mission phases to indirectly affect the
    active functionality areas:&nbsp; Pre-launch, Ascent, Catch-up,
    Rendezvous, or Re-entry.<br>
    <br>
    All of these functionality areas are self-explanatory, except
    "Executor".&nbsp; Executor is the interface that interrelates the
    other software modules and allows them to interact with each
    other, as well has implementing certain common functionality
    among them.<br>
    <br>
    As far as the relationship between this stuff and the missions is
    concerned, the best info I have at present is as follows:<br>
    <br>
    <table summary="" style="margin-left: auto; margin-right: auto;
      text-align: left;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="font-weight: bold; text-align: center;"><br>
            <br>
            Spacecraft<br>
          </th>
          <th style="text-align: center; vertical-align: bottom;">
            Mission<br>
            Designation<br>
          </th>
          <th style="text-align: center; vertical-align: bottom;">
            Math Flow<br>
            version<br>
          </th>
          <th style="vertical-align: bottom;">
            <div style="text-align: center;">
              Program<br>
              number,<br>
            </div>
            <div style="text-align: center;">
              revision<br>
            </div>
          </th>
          <th style="font-weight: bold; vertical-align: top;"><br>
            <br>
            Comments<br>
          </th>
        </tr>
        <tr>
          <td style="text-align: center;">GT-1<br>
          </td>
          <td style="text-align: center;">Gemini 1<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="vertical-align: middle;">Unmanned mission.&nbsp;
            Since Gemini I was apparently intended principally as a
            structural test of the spacecraft, it may not have had a
            computer onboard.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">MF-1<br>
          </td>
          <td style="text-align: center;">-<br>
          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">MF-2<br>
          </td>
          <td style="text-align: center;">-<br>
          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            MF-3<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);"><a
              href="Documents/GeminiMinnickMathFlow.pdf">
              6444540, B</a></td>
          <td style="vertical-align: top; color: rgb(0, 153, 0);">
            Flowcharts that we have!&nbsp; Seemingly, one minor
            revision prior to the software flown in the Gemini 2
            unmanned mission.&nbsp; You'll notice, though, that the
            first manned missions (Gemini 3 and 4) still used MF-3,
            though in a later minor revision.&nbsp; It's useful to
            know that:<br>
            <ul>
              <li>Rendezvous begins on p. 1</li>
              <li>Gimbal Angle and CLOCK subroutines are on p. 8</li>
              <li>SINCOS and ARCTAN subroutines are on p. 9<br>
              </li>
              <li>Re-entry begins on p. 10</li>
              <li>SHIFT, SQRT (also computes arcsin), and LOG
                subroutines are on p. 15</li>
              <li>MDIU subroutine is on p. 16</li>
              <li>Ascent guidance begins on p. 17</li>
              <li>Fast-loop ascent guidance begins on p. 19</li>
              <li>Root sum subroutine begins on p. 22</li>
              <li>Executor, Accelerometer, DCS, and DAS are on p.
                23</li>
              <li>MDIU scaling stuff starts on p. 24<br>
              </li>
              <li>AGE is on p. 26</li>
              <li>Standby, TRS, and I/O subroutines are on p.
                27<br>
              </li>
            </ul>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            MF-3(?)<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);"><a
              href="Documents/GeminiAscentAppendixE.pdf">
              62-564-0020, B<br>
              (Ascent Guidance and<br>
              Fast Ascent Guidance only)</a><br>
          </td>
          <td style="vertical-align: middle; color: rgb(0, 153, 0);">
            Flowcharts that we have!&nbsp; See pp. 2-3 of the linked
            document.&nbsp; The document contains a lot of other
            helpful stuff like detailed explanations of the variables,
            some additional theory, and source code of a FORTRAN
            implementation.<br>
            <br>
            I'm not really clear where this goes in the development
            chronology, merely that it is a few months later than the
            corresponding elements from the Detailed Math Flow in the
            preceding entry.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-2<br>
          </td>
          <td style="text-align: center;">Gemini 2<br>
          </td>
          <td style="text-align: center;">MF-3<br>
          </td>
          <td style="text-align: center; white-space: nowrap;">
            6444541, C</td>
          <td style="vertical-align: middle;">Unmanned
            mission.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-3<br>
          </td>
          <td style="text-align: center;">Gemini III<br>
          </td>
          <td style="text-align: center;">MF-3<br>
          </td>
          <td style="text-align: center;">6444566, C</td>
          <td style="vertical-align: middle;">First manned
            mission.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-4<br>
          </td>
          <td style="text-align: center;">Gemini IV<br>
          </td>
          <td style="text-align: center;">MF-3<br>
          </td>
          <td style="text-align: center;">6444909, C<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">MF-4<br>
          </td>
          <td style="text-align: center;">-<br>
          </td>
          <td style="vertical-align: top;">Work stopped prior to
            "sell off".<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">MF-5<br>
          </td>
          <td style="text-align: center;">-<br>
          </td>
          <td style="vertical-align: top;">Work stopped prior to
            release or sell off.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-5<br>
          </td>
          <td style="text-align: center;">Gemini V<br>
          </td>
          <td style="text-align: center;">MF-6<br>
          </td>
          <td style="text-align: center;">6444871, B<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-6<br>
          </td>
          <td style="text-align: center;">Gemini VI-A<br>
          </td>
          <td style="text-align: center;">MF-6<br>
          </td>
          <td style="text-align: center; white-space: nowrap;">
            6444871, D<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-7<br>
          </td>
          <td style="text-align: center;">Gemini VII<br>
          </td>
          <td style="text-align: center;">MF-6<br>
          </td>
          <td style="text-align: center;">6444871, D</td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-8 (backup)<br>
          </td>
          <td style="text-align: center;">n/a<br>
          </td>
          <td style="text-align: center;">MF-6<br>
          </td>
          <td style="text-align: center;">6444871, E<br>
          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-8<br>
          </td>
          <td style="text-align: center;">Gemini VIII<br>
          </td>
          <td style="text-align: center;">MF-7<br>
          </td>
          <td style="text-align: center; white-space: nowrap;">MOD I:
            6449856, C<br>
            MOD II: not used<br>
            MOD III: not used<br>
            MOD IV: 6449864, B<br>
            MOD V: 6449812, B<br>
            MOD VI: not used<br>
          </td>
          <td style="vertical-align: middle;">The principal
            difference between MF-6 and MF-7 was the reworking of the
            integrated operational program into 6 individual Modules
            (here referred to as MOD I through MOD VI) that were
            treated as independent programs, loadable into main memory
            at runtime from the new Auxiliary Tape Memory (ATM).&nbsp;
            One consequence is that each of the 6 Modules in MF-7 now
            had its own individual program number and
            revision.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-9<br>
          </td>
          <td style="text-align: center;">Gemini IX-A<br>
          </td>
          <td style="text-align: center;">MF-7<br>
          </td>
          <td style="text-align: center;">MOD I: 6449856, C<br>
            MOD II: not used<br>
            MOD III: not used<br>
            MOD IV: 6449864, B<br>
            MOD V: 6449812, B<br>
            MOD VI: not used</td>
          <td rowspan="1" style="vertical-align: middle;">&nbsp;<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            n/a<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);">
            MF-7<br>
          </td>
          <td style="text-align: center; color: rgb(0, 153, 0);"><a
              href="Documents/GeminiOBC-MathFlow-III.pdf">
              MOD III: 6449883</a></td>
          <td style="vertical-align: top; color: rgb(0, 153, 0);">
            Flowcharts that we have!&nbsp; Later than any Module III
            flown prior to the ATM, and therefore presumably
            algorithmically mature, but preceding (by some unknown
            number of revisions) the first use of Module III as an
            integrated program loaded from the ATM in Gemini X and
            therefore presumably relatively immature in terms of its
            implementation in OBC assembly language.&nbsp; But
            remember, we don't have any of the original OBC assembly
            language, and it's only the algorithmic correctness that
            concerns us.<br>
            <br>
            Incidentally, this scan derived from a microfilm retrieved
            from a wastebasket prior to the project's move from the
            Washington, D.C., area in mid-1966.&nbsp; Obviously, we're
            always trying to find better sources of material.&nbsp; (If
            you happen to have any wastebaskets from that era that are
            still loaded with microfilm, be sure to let us know.)</td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-10<br>
          </td>
          <td style="text-align: center;">Gemini X</td>
          <td style="text-align: center;">MF-7<br>
          </td>
          <td style="text-align: center; white-space: nowrap;">MOD I:
            6449856, C (?)<br>
            MOD II: 6449816, A<br>
            MOD III: 6449895<br>
            MOD IV: 6449864, B (?)<br>
            MOD V: 6449812, B (?)<br>
            MOD VI: 6450027<br>
          </td>
          <td rowspan="1" style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-11<br>
          </td>
          <td style="text-align: center;">Gemini XI<br>
          </td>
          <td style="text-align: center;">MF-7<br>
          </td>
          <td style="text-align: center;">?<br>
          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center;">GT-12<br>
          </td>
          <td style="text-align: center;">Gemini XII<br>
          </td>
          <td style="text-align: center;">MF-7<br>
          </td>
          <td style="text-align: center;">?<br>
          </td>
          <td style="vertical-align: top;"><br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    Finally, let's return to odd question of whether or not we're in
    possession of any of the original flight software.&nbsp; This
    question is related to the serious if somewhat
    facetiously-phrased question asked in this title's heading,
    namely:&nbsp; "What is software?"&nbsp; In the context of the
    Virtual AGC project --- and I think in the minds of most
    currently-active computer programmers (2011) --- the question
    "What is software?" is very easily answered:&nbsp; If you have
    the source code of the program (and some way of compiling or
    assembling that code) or if you have the binary executable of the
    program (and some way to execute it), then you have the
    software.&nbsp; If you have all of the instructions for how to
    compile/assemble it, so much the better.&nbsp; But the OBC
    software developers had a somewhat different view of this
    question, and their view is bound up in the method used to
    develop the software.<br>
    <br>
    The most important thing to understand about the
    software-development process for the OBC software is that it was
    very heavily dependent on design as opposed to coding.&nbsp; What
    I mean by that is the following:<br>
    <ol>
      <li>Great attention was given to deriving the mathematics
        needed for achieving the objectives, and great attention was
        given as well to verifying the correctness of that
        mathematics.</li>
      <li>Then (and only then), great attention was given to
        developing the "Math Flow".&nbsp; To repeat what I said
        earlier, the Math Flow was a series of a flowcharts specifying
        the algorithms to be implemented in very great detail.&nbsp;
        The flowcharts described the algorithms in such detail that the
        programmer had very few options left open to him in actually
        coding that software into a form that could be compiled or
        assembled.</li>
      <li>Then (and only then), software was coded.&nbsp; But the
        coding was almost entirely a slavish detail-by-detail
        translation of the flowchart into computer source-code
        form.</li>
    </ol>
    It was interesting (and at first frustrating) for me to
    discuss the matter of existence of the software with OBC
    developers, because from my point of view the software (source
    code) seemingly no longer existed, while from the point of view
    of the OBC developers the software did still exist to the extent
    that the flowcharts still existed ... because to them the
    software <span style="font-style: italic;">is</span> the
    flowchart and not the source code.&nbsp; The source code could
    always be reproduced from the flowchart, albeit with great
    effort, and not necessarily byte-for-byte identical to the
    original.&nbsp; When viewed from this perspective, it makes
    little difference how the flowchart is translated into computer
    language—whether into FORTRAN as was done for simulation purposes
    or into OBC assembly language for the mission computer—because
    regardless, it's the same flowchart so it's the same program.<br>
    <br>
    Now, in the preceding paragraph I probably exaggerated the OBC
    developers' somewhat in order to make my point, but I think there
    is nevertheless a lot of validity in the viewpoint that was
    expressed:&nbsp; If we have the Math Flow charts, then we have
    the software.&nbsp; You'll notice from the table above that we do
    have some of the Math Flow charts, though the validity of what we
    have could be debated.<br>
    <br>
    I'll leave it as an exercise for the reader to decide whether or
    not we actually have any of the software, or whether or not we're
    rationalizing.<br>
    <h2><a name="Architecture_of_the_Computer"
        id="Architecture_of_the_Computer"></a>OBC Architecture and
      Interfacing<br>
    </h2>
    <h3><a name="References" id="References"></a>References</h3>
    The
    principal known sources of information about the computer itself
    are the "Guidance and Control" sections (Section VIII) of the
    <span style="font-style: italic;">Project Gemini Familiarization
      Manual</span>, <a href="Documents/GeminiManualVol1Sec2.pdf">
      Volume 1</a> and <a href="Documents/GeminiManualVol2Sec2.pdf">
      Volume 2</a>, and most of the information on this web-page was
    extracted from those sources.&nbsp; If you find my redigesting of
    the material too poor, you may want to read the Manual
    instead.&nbsp; However, any simulation software, assemblers,
    etc., will be based on <span style="font-style: italic;">my</span>
    understanding and hence on the
    content of this web-page, so please bring any errors to my
    attention.<br>
    <br>
    Also, I should state that there's a lot of information on this
    page that comes from personal communications with original OBC
    developers, and can't be found in any other reference that's
    going to be available to the reader ... or probably, to
    anyone.&nbsp; While I present a general acknowledgements and
    "homage" to the original OBC developers in general at the very
    end of this web-page, let me mention here the OBC developers who
    have been so directly helpful to me.&nbsp; In no particular
    order:<br>
    <ul>
      <li>Gene Mertz</li>
      <li>Charlie Leist</li>
      <li>Alden Minnick</li>
      <li>Don O'Neill</li>
    </ul>
    <h3><a name="General_Characteristics_of_the_Computer"
        id="General_Characteristics_of_the_Computer"></a>General
      Characteristics of the OBC</h3>
    The OBC measured
    18.9"(H)×14.5"(W)×12.75"(D), and weighed 58.98 pounds.&nbsp; OBC
    power was supplied by the IGS Power Supply, which was itself
    powered from the spacecraft's main +28VDC bus or (for very brief
    main-power outages or brownouts) the Auxiliary Computer Power
    Unit (ACPU).&nbsp; The OBC required various voltages (+27.2VDC,
    +9.3VDC -27.2VDC, +20VDC, +28VDC, and 26VAC, but the existing
    documentation is inconsistent on the exact voltages used), and
    itself supplied the MDIU (+25VDC, -25VDC +8VDC) and these latter
    three voltages were what was actually used internally by the OBC
    itself.<br>
    <br>
    The computing characteristics were:<br>
    <ul>
      <li>39 bits per memory word.&nbsp; Each memory word comprised
        three "syllables" (syllable 0, syllable 1, and syllable 2) of
        13 bits each.</li>
      <li>4096 words of memory, in a ferrite core array.&nbsp; All of
        this RAM was writable—i.e., there was no read-only memory—but
        the readout of the memory was non-destructive.</li>
      <li>The memory was logically divided into 16 "sectors" of 256
        words each.</li>
      <li>At any given time only 2 sectors are actually accessable,
        the current sector (selectable under program control) and the
        "residual" sector (sector 17 octal).<br>
      </li>
      <li>The third syllables of memory words were writable by the
        OBC hardware, but this function was disabled after the
        spacecraft left the hangar, so at that point the 3rd syllables
        were effectively read-only.&nbsp; Consequently, data words
        always needed to be placed into the first two syllables of
        memory words.&nbsp; The addressing of data by CPU instructions
        enforced this data alignment anyway.<br>
      </li>
      <li>"Instruction words" were 13 bits each, and "data words"
        were 26 bits each, so any given memory word could have had a
        data word and/or several instruction words packed into
        it.&nbsp; There were also provisions for "short" data words of
        13 bits, but these short data words could be used only for
        testing purposes by <a href="#Aerospace_Ground_Equipment_AGE">Aerospace
          Ground
          Equipment</a> (AGE), and so were irrelevant for software.</li>
      <li>Integer arithmetic was 2's-complement.<br>
      </li>
      <li>Instruction cycle time was 140 μs and all instructions
        required a single cycle except for MLT and DIV.<br>
      </li>
    </ul>
    <h3><a name="Layout_of_Memory_Words" id="Layout_of_Memory_Words"></a>Layout
      of Memory Words</h3>
    I should
    make it clear that in this section I'm describing my perspective
    on the organization of OBC memory, in terms of how the original
    OBC programmers would have worked with it, in terms of how one
    would work with it using the tools I've created for this site,
    and in terms of what I think would be the thinking of "modern"
    programmers at the time I'm writing these words (2011).&nbsp; I'm
    not slavishly reproducing here the material on memory
    orgainization from the most-complete documentation available to
    us, namely the "Guidance and Control" sections (Section VIII) of
    the <span style="font-style: italic;">Project Gemini
      Familiarization Manual</span>, <a
      href="Documents/GeminiManualVol1Sec2.pdf">
      Volume 1</a> and <a href="Documents/GeminiManualVol2Sec2.pdf">
      Volume 2</a>, because that documentation seems to me to conflict
    with what I"ve been told by actual OBC programmers.&nbsp; The
    specific area of difficulty is bit-ordering within memory
    words.&nbsp; You see, the memory was accessed by a kind of serial
    interface, and the natural hardware view is in terms of the
    time-order in which the bits are shifted in and out ... whereas
    the natural software or mathematical view is in terms of which
    bits are the most-significant or least-significant—or as normally
    represented, which bits are on the "left" and which are on the
    "right".&nbsp; So I'll adopt the latter perspective, but if you
    wish to explore what the documentation says on the topic of
    bit-ordering, feel free to do so.<br>
    <br>
    In all cases, when I show you binary or octal representations of
    OBC memory, it will use the notation common today, in which the
    least-significant bits or octal digits are on the right and the
    most-significant bits or octal digits are on the left.<br>
    <br>
    As mentioned earlier, memory words are 39 bits, comprising three
    13-bit "syllables".&nbsp; In most ways, the syllable is really
    the natural memory unit, and not the word.&nbsp; Except in one
    specific case, storing and retrieving 26-bit data, syllables
    within a memory word are completely unrelated to (and independent
    of) each other.&nbsp; So you're really best served by thinking of
    memory as a set of syllables rather than a set of words.<br>
    <br>
    Not all syllables are created equal.&nbsp; In the normal
    operating mode of the OBC at mission time, the following rules
    apply:<br>
    <ul>
      <li>All CPU instructions which fetch, store, or otherwise
        operate on data stored in memory work <span style="font-style:
          italic;">only</span> with 26-bit (2-syllable) data
        words in which the less-significant syllable is stored in
        syllable 0 of memory and the more-significant word is stored in
        syllable 1 (in the same word) of memory.</li>
      <li>Only syllables 0 and 1 are cabable of being modified.&nbsp;
        Syllable 2 is read-only.</li>
      <li>Therefore, as you can imagine, all data other than code is
        allocated in syllables 0 and 1.</li>
      <li>Code is commonly stored in syllable 2 ... though since data
        does not use all of syllables 0 and 1, some code will be stored
        in syllables 0 and 1 as well.</li>
    </ul>
    (There's also a less-common operating mode called "half-word
    mode" which has somewhat different rules, but this mode has
    limited usage so we'll return to it later rather than diverting
    the main discussion.)<br>
    <br>
    Now let's look at some common syllable or double-syllable
    formats.<br>
    <br>
    Every CPU instruction consists of a single syllable, in the
    following bit layout:<br>
    <div style="text-align: left; margin-left: 40px;"><br>
      <span style="font-family: Courier New,Courier,monospace;">PPPPAAAAAAAAA</span><br>
    </div>
    <br>
    where <span style="font-family: Courier New,Courier,monospace;">PPPP</span>
    is a
    4-bit code identifying the specific CPU instruction (the "op
    code") and <span style="font-family: Courier
      New,Courier,monospace;">AAAAAAAAA</span> is
    a 9-bit code (3 octal digits) identifying (in a way that varies
    by instruction type) the operand for the instruction.&nbsp;
    Conventionally, OBC programmers name the individual bits like
    so:<br>
    <ul>
      <li><span style="font-family: Courier New,Courier,monospace;">OP4</span>
        is the
        most-significant bit of <span style="font-family: Courier
          New,Courier,monospace;">PPPP</span> and
        <span style="font-family: Courier New,Courier,monospace;">OP1</span>
        is the
        least-significant.</li>
      <li><span style="font-family: Courier New,Courier,monospace;">A9</span>
        is the
        most-significant bit of <span style="font-family: Courier
          New,Courier,monospace;">AAAAAAAAA</span>
        and <span style="font-family: Courier New,Courier,monospace;">A1</span>
        is the
        least-significant.<br>
      </li>
    </ul>
    In most instruction types, <span style="font-family: Courier
      New,Courier,monospace;">A1-A8</span> select
    a particular memory word.&nbsp; Since there are only 8 bits, only
    256 different words are accessible.&nbsp; Recall, moreover, that
    memory consists of 16 sectors of 256 words each of 3 syllables
    each.&nbsp; So the instruction is able to select a specific word
    address, but the sector containing the word and the syllable
    within the word can't be selected ... those have to be known by
    other means, which we'll discuss later; for now, just realize
    that at any time there's some "current sector" and "current
    syllable", and that whatever the CPU is doing operates within
    that current selection.&nbsp; When <span style="font-family:
      Courier New,Courier,monospace;">A1-A8</span> is
    interpreted in this way, <span style="font-family: Courier
      New,Courier,monospace;">A9</span> can be
    used to override the current sector and instead to do a one-time
    selection of sector 0, which is referred to as the "residual
    sector".&nbsp; <span style="font-family: Courier
      New,Courier,monospace;">A9=0</span> means
    to use the current sector and <span style="font-family: Courier
      New,Courier,monospace;">A9=1</span> means
    to use the residual sector.&nbsp; But there's no way to select a
    different sector or a different syllable on an
    individual-instruction basis.<br>
    <br>
    Several instructions use a scheme in which the field consisting
    of bits <span style="font-family: Courier New,Courier,monospace;">A1-A3</span>
    is
    given the name "X" and <span style="font-family: Courier
      New,Courier,monospace;">A4-A6</span> are
    given the name "Y", thus giving the instruction two independent
    parameters.&nbsp; In those cases, <span style="font-family: Courier
      New,Courier,monospace;">A7</span> and
    <span style="font-family: Courier New,Courier,monospace;">A8</span>
    are
    unused, and <span style="font-family: Courier
      New,Courier,monospace;">A9</span> may or
    may supply additional functionality<br>
    <br>
    For normal 26-bit data, recall that a standard 2's-complement
    format is used.&nbsp; OBC programmers conventionally refer to the
    sign bit (i.e., the most-significant bit if interpreting the data
    as an unsigned integer) as <span style="font-family: Courier
      New,Courier,monospace;">S</span>, to the
    most-significant non-sign bit as <span style="font-family: Courier
      New,Courier,monospace;">M25</span>, and to
    the least-significant bit as <span style="font-family: Courier
      New,Courier,monospace;">M1</span>.
    Therefore, in a word containing such data, syllable 1 will
    contain <span style="font-family: Courier New,Courier,monospace;">S</span>
    and
    <span style="font-family: Courier New,Courier,monospace;">M25-M14</span>;
    syllable 0 will contain <span style="font-family: Courier
      New,Courier,monospace;">M13-M1</span>.<br>
    <br>
    Numerical data can be interpreted in two different ways,
    depending on the interpretation of the software.&nbsp; Obviously,
    the data could be interpreted as a simple 2's complement
    integer.&nbsp; It can also be interpreted as a fractional value
    with absolute value less than 1.0.&nbsp; In the latter
    interpretation, there is some scaling factor needed to relate the
    actual value of the number to the binary value that's stored in
    memory. The OBC and its software have no method for dealing with
    scaling factors, and it was up to the programmer to understand
    which interpretation was used, as well as to explicitly scale
    values during computations to avoid overflow and loss of
    significant bits.<br>
    <br>
    An important variation in which 26 bits of data aren't numerical
    in nature is the so-called "HOP constant".&nbsp; A "HOP constant"
    is used by a dedicated CPU instruction (<span style="font-family:
      courier new,courier,monospace;">HOP</span>)&nbsp;
    to change things such as the currently-selected memory sector and
    syllable by loading a hidden CPU register that can't be accessed
    by other means. The layout of a HOP constant is as follows:<br>
    <br>
    <div style="margin-left: 40px;"><span style="font-family: Courier
        New,Courier,monospace;">xxxxxxxxHxSSxPPPPAAAAAAAAA</span><br>
    </div>
    <br>
    In this scheme:<br>
    <ul>
      <li>Bits <span style="font-family: Courier
          New,Courier,monospace;">AAAAAAAAA</span>
        are given names <span style="font-family: Courier
          New,Courier,monospace;">A9-A1</span> and
        are interpreted as described earlier, in that they allow
        selection of a word address (0-255) and provide an override for
        current-sector vs. residual sector.&nbsp; After the
        <span style="font-family: courier new,courier,monospace;">HOP</span>
        instruction executes, this setting persists within the CPU's
        hidden HOP register only for the current instruction and is
        then incremented to the next sequential word (or to some other
        word if a branch occurs).<br>
      </li>
      <li>Bits <span style="font-family: Courier
          New,Courier,monospace;">SS</span>,
        respectively given the names <span style="font-family: Courier
          New,Courier,monospace;">SYB</span> and
        <span style="font-family: Courier New,Courier,monospace;">SYA</span>,&nbsp;
specify
        the current syllable:&nbsp; 00 for syllable 0, 01 for
        syllable 1, and 10 for syllable 2.&nbsp; After the <span
          style="font-family: courier new,courier,monospace;">HOP</span>
        instruction executes, this setting persists until another
        <span style="font-family: courier new,courier,monospace;">HOP</span>
        instruction changes it.</li>
      <li>Bits <span style="font-family: Courier
          New,Courier,monospace;">PPPP</span>,
        respectively given the names <span style="font-family: Courier
          New,Courier,monospace;">S4-S1</span>,
        specify the current sector.&nbsp; After the <span
          style="font-family: courier new,courier,monospace;">HOP</span>
        instruction executes, this setting persists until another
        <span style="font-family: courier new,courier,monospace;">HOP</span>
        instruction changes it, though as we've seen it can be
        overridden to instead use sector 0 on an
        instruction-by-instruction basis using the <span
          style="font-family: Courier New,Courier,monospace;">A9</span>
        feature
        possessed by some of the CPU instructions.<br>
      </li>
      <li><span style="font-family: Courier New,Courier,monospace;">H</span>
        selects
        between "normal" mode (<span style="font-family: Courier
          New,Courier,monospace;">H=0</span>) and
        "half-word" mode (<span style="font-family: Courier
          New,Courier,monospace;">H=1</span>), and
        this mode persists until another <span style="font-family:
          Courier New,Courier,monospace;">HOP</span>
        instruction changes it.&nbsp; "Normal" mode is what I've been
        describing to you up to this point.&nbsp; In half-word mode
        (HWM), the data comes from syllable 2&nbsp; rather than
        syllables 0,1, and therefore is only 13 bits rather than
        26.&nbsp; When the CPU fetches such data from memory, it fills
        the least-significant 13 bits of the CPU's accumulator
        register, while the most-significant 13-bits are all 0.&nbsp;
        An interesting consequence of being in the half-word mode is
        that <span style="font-style: italic;">any</span> <span
          style="font-family: courier new,courier,monospace;">HOP</span>
        instruction will return to normal mode (since <span
          style="font-family: Courier New,Courier,monospace;">H</span>
        is among
        the higher 13 bits of a HOP constant) and the current syllable
        will always become 0 (since <span style="font-family: Courier
          New,Courier,monospace;">SYB</span> and
        <span style="font-family: Courier New,Courier,monospace;">SYA</span>
        are
        also among the 13 more-signficant bits).&nbsp; Moreover, since
        the the OBC's ability to write to syllable 2 is disabled after
        the spacecraft has left the hangar, no <span
          style="font-family: courier new,courier,monospace;">STO</span>
        or
        <span style="font-family: courier new,courier,monospace;">SPQ</span>
        have
        any effect in half-word mode.<br>
      </li>
      <li>At power-up, the behavior differed between the early Gemini
        missions without ATM (Auxiliary Tape Memory), and the later
        ones with ATM:</li>
      <ul>
        <li>Without ATM, it is as if a HOP constant is loaded that
          puts the unit in normal mode (i.e., not half-word mode) at
          syllable 0 of word 0 in sector 0.</li>
        <li>With ATM, it is as if a HOP constant is loaded that puts
          the unit into half-word mode at syllable 2 of word 0 in
          sector 0.<br>
        </li>
      </ul>
    </ul>
    You may wonder what half-word mode is good for?&nbsp; Well,
    originally, it seems to have been intended for testing
    purposes.&nbsp; Later, when the flight-program outstripped the
    size of available memory, it became necessary to add the ATM and
    use it to overlay programs at runtime.&nbsp; In that case, I
    guess, it's useful to be able to run a program entirely within
    syllable 2 (which is read-only) without fear that the ATM can
    overlay it.&nbsp; But you know, I'm not really sure.<br>
    <h3><a name="Instruction_Sequencing" id="Instruction_Sequencing"></a>Instruction
      Sequencing</h3>
    You may
    na\EFvely suppose (I did!) if you did not read the preceding
    section in great detail, that the everyday usage of the words
    "word" and "syllable" applies similarly in stepping through the
    OBC (or LVDC) instructions.&nbsp; In proceeding through a
    sentence of natural language like English, you use up all of the
    syllables in a word before proceeding to the next word.&nbsp; So
    you might suppose that OBC instructions would sequence in a
    manner something like the following:&nbsp; word <span
      style="font-style: italic; font-family:
      Helvetica,Arial,sans-serif;">N</span>
    syllable 0, word <span style="font-style: italic; font-family:
      Helvetica,Arial,sans-serif;">N</span>
    syllable 1, word <span style="font-style: italic; font-family:
      Helvetica,Arial,sans-serif;">N</span>
    syllable 2, word <span style="font-style: italic; font-family:
      Helvetica,Arial,sans-serif;">N+1</span>
    syllable 0, word <span style="font-style: italic; font-family:
      Helvetica,Arial,sans-serif;">N+1</span>
    syllable 1, and so on.&nbsp; In fact, this is not the case at
    all, and (as you may infer from the instruction definitions in
    the following section) would have caused insuperable
    difficulties.&nbsp; So get the na\EFve interpretation right out
    of your head!<br>
    <br>
    <span style="font-style: italic;">Instead,</span> the instruction
    sequencing was like this:<br>
    <div style="margin-left: 40px;"><br>
      word 0 syllable <span style="font-style: italic; font-family:
        Helvetica,Arial,sans-serif;">N<br>
      </span> word 1 syllable <span style="font-style: italic;
        font-family: Helvetica,Arial,sans-serif;">N<br>
      </span> word 2 syllable <span style="font-style: italic;
        font-family: Helvetica,Arial,sans-serif;">N<br>
      </span> etc.<br>
    </div>
    <br>
    so that the syllable number never changed automatically as you
    progressed through the program.&nbsp; But you could always change
    the syllable manually by executing an instruction
    (<big><span style="font-family: Courier New,Courier,monospace;">HOP</span></big>)&nbsp;
and
    a HOP constant specifically designed to change the syllable
    number.&nbsp;<br>
    <br>
    In retrospect, from an outsiders point of view, it would perhaps
    have been less confusing in terms of instruction sequencing if
    the OBC hardware designers had used the word "paragraph" rather
    than "syllable".&nbsp; Alas! it's a bit late to worry about that
    now.&nbsp; The OBC programmers I've consulted seem to think that
    this is a perfectly natural scheme, and don't seem to have
    experienced any confusion over the concept of
    "syllables".&nbsp;<br>
    <h3><a name="CPU_Instructions" id="CPU_Instructions"></a>CPU
      Instructions</h3>
    If you're interested in Gemini, you may not be
    very interested in Apollo's <a href="LVDC.html#CPU_Instructions">LVDC</a>
    instruction set.&nbsp; But
    there are so many similarities between the two that I'll probably
    not be able to resist the temptation to point out some of the
    differences as I proceed.&nbsp; A difference not pointed out in
    the table below is that the LVDC instructions <span
      style="font-family: courier new,courier,monospace;">MPH</span>,
    <span style="font-family: courier new,courier,monospace;">XOR</span>,
    and
    <span style="font-family: courier new,courier,monospace;">CDS</span>,
    <span style="font-family: courier new,courier,monospace;">EXM</span>
    are not
    present in the OBC.<br>
    <br>
    Note that in what follows, a name representing a location of
    memory holding an instruction is called a "left-hand symbol" in
    the parliance of the Gemini OBC programmers, and I will continue
    to call it that (or LHS for short) rather than adopting
    more-current terminology.<br>
    <br>
    Finally, when I talk below about the assembly-language syntax of
    the instructions, I'm referring to the syntax supported by my own
    <span style="font-weight: bold;">yaASM</span> assembler presented
    as a download on this website.&nbsp; This syntax is very similar
    to the original OBC assembler's syntax but we can't be sure it's
    identical because no documentation for the original assembler has
    been located up to this point in time.<br>
    <br>
    <table summary="" style="text-align: left; width: 100%;"
      cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="text-align: center;"><br>
            <br>
            Mnemonic<br>
          </th>
          <th style="text-align: center;">Opcode<br>
            (OP1-OP4)<br>
            in octal<br>
          </th>
          <th style="vertical-align: top; text-align: center;">
            Timing<br>
            (140 μs<br>
            cycles)<br>
          </th>
          <th><br>
            <br>
            Description of the instruction<br>
          </th>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            HOP<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            00<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            This instruction combines an unconditional jump
            instruction with various other configuration options,
            such as memory-sector selection.&nbsp; The way it works
            is that the address A1-A9 points to a memory word that
            contains a "HOP constant", and the <span
              style="font-family: Courier New,Courier,monospace;">HOP</span>
            instruction transfers that HOP constant into the HOP
            register.&nbsp; Recall that A1-A8 select the offset
            within a 256-word sector, and A9 is the "residual bit"
            that selects between the current sector and the "residual
            sector".&nbsp; There is no provision for a partial HOP
            constant, and the full HOP constant needs to be given
            every time a <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            instruction is used.&nbsp; See also <span
              style="font-family: Courier New,Courier,monospace;">TRA</span>.<br>
            <br>
            However ... the fact that <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            operates on HOP constants rather than on the left-hand
            symbols that are the labels for locations in the code as
            actually understood by the programmers, is not very
            convenient.&nbsp; The simple act of HOPping to a location
            would have to look something like this:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">HTARGET
                &nbsp; HOPC &nbsp;&nbsp; TARGET&nbsp;&nbsp;&nbsp; # Set
                up a HOP constant for the target location.<br>
                &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;
                ...<br>
                &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                HOP&nbsp;&nbsp;&nbsp;&nbsp; HTARGET&nbsp;&nbsp; # HOP
                to the target location<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...<br>
                TARGET&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Location we want to HOP to.</span><br>
            </div>
            <br>
            This is pretty cumbersome.&nbsp; The assembler therefore
            provides a special feature in that if the operand of a
            HOP is a left-hand symbol for a code location, which
            would otherwise be illegal, the assembler silently
            allocates and initializes a HOP constant of the same
            name, but enclosed in parentheses, and then it pretends
            that the operand of the HOP was really the newly-created
            HOP constant.&nbsp; Therefore, in assembly language, the
            following becomes legal even though seemingly illegal in
            machine code:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                HOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TARGET&nbsp;&nbsp; #
                HOP to the target location<br>
                &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...<br>
                TARGET&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Location we want to HOP to.<br>
              </span></div>
            <br>
            But what the assembler really outputs in this case is the
            same as in the first example (with the HOP constant named
            "<span style="font-family: Courier New,Courier,monospace;">(TARGET)</span>"
            instead of "<span style="font-family: Courier
              New,Courier,monospace;">HTARGET</span>").<br>
            <br>
            The assembler performs a similar service for the
            <span style="font-family: Courier New,Courier,monospace;">CLA</span>
            and <span style="font-family: Courier
              New,Courier,monospace;">STO</span>
            instructions (see below). There are some drawbacks to
            this special feature as well, namely:<br>
            <ul>
              <li>Any left-hand symbols used as targets of HOPs in
                this way must be 6 characters or less rather than
                8.</li>
              <li>The assembler always creates the implicit HOP
                constants in the residual sector 17, syllable 0.</li>
              <li>Since there are no explicit allocations for the
                implicit HOP constants, it's easy for the programmer to
                overlook that they're being created, and therefore to
                be less aware of the rate at which memory is being used
                up.</li>
              <li>There's no provision for half-word mode.</li>
            </ul>
            Fortunately, there's no drawback here that can't be
            worked around by explicitly defining any troublesome HOP
            constants needed, as in the first example.<br>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            DIV<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            01<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
            (results<br>
            &nbsp;available<br>
            after 6)<br>
          </td>
          <td style="vertical-align: middle;">
            This is the division instruction.&nbsp; The contents of
            the accumulator are divided by the operand pointed to by
            the address A1-A9 embedded within the instruction to
            produce a 24-bit quotient.&nbsp; Recall that A1-A8 select
            the offset within a 256-word sector, and A9 is the
            "residual bit" that selects between the current sector
            and the "residual sector".&nbsp; The quotient is
            available via the <span style="font-family: courier
              new,courier,monospace;">SPQ</span>
            instruction from the 5th instruction following the
            <span style="font-family: Courier New,Courier,monospace;">DIV</span>.&nbsp;
In
            other words, 4 other instructions not involving
            multiplication or division can be performed in the
            interval between <span style="font-family: Courier
              New,Courier,monospace;">DIV</span>
            and <span style="font-family: courier
              new,courier,monospace;">SPQ</span>.<br>
            <br>
            To illustrate the assembly-language syntax, let's divide
            the integer 56 by 3 and store the result in a
            variable:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate variable for output.<br>
                K56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp;
                56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Provide
                dividend as a constant.<br>
                K3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp;
                3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #
                Provide divisor as a constant.<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp;
                K56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Load divisor
                into accumulator.<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                DIV&nbsp;&nbsp;&nbsp;&nbsp;
                K3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Start
                the division.<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                The result won't be available<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                for a while, so kill some time.<br>
                &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; NOP<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                NOP<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                SPQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Fetch quotient into accumulator.<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp; RESULT&nbsp;&nbsp;&nbsp; #
                Save it!</span><br>
            </div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            PRO<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            02<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Inputs or outputs an i/o "signal" into or from the
            accumulator.&nbsp; (In the AGC these are called
            "channels".&nbsp; In current terminology, we'd probably
            usually refer to them as "ports".)&nbsp; Whether or not
            an input or an output is performed depends on the
            particular signal chosen.&nbsp; The X (A1-A3) and Y
            (A4-A6) operand fields are used for signal
            selection.&nbsp; A9 is used as well.&nbsp; For an output
            operation, it determines if the accumulator should be
            cleared after the output (A9=1) or preserved
            (A9=0).&nbsp;&nbsp; For an input operation, it determines
            if the data should be loaded into the accumulator (A9=1)
            or logically OR'd with the accumulator (A9=0).&nbsp; A
            table of the i/o signals vs. addresses is given in the
            <a href="#IO_Ports_For_PRO_Instruction">following
              section</a>.&nbsp; (The <span style="font-family: Courier
              New,Courier,monospace;">PRO</span>
            instruction is essentially equivalent to the <a
              href="LVDC.html#CPU_Instructions">LVDC</a> <span
              style="font-family: courier new,courier,monospace;">PIO</span>
            instruction, but the selection of i/o signals is
            different.)<br>
            <br>
            The documentation does not explain this, but I think that
            when the <span style="font-family: Courier
              New,Courier,monospace;">PRO</span>
            instruction is accessing a single-bit signal, only the
            accumulator's sign bit is used as the output or the
            input.&nbsp; (I'm not sure what the effect on other
            bit-positions should be on input.)<br>
            <br>
            There are several allowable assembly-language syntaxes
            for this instruction:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">PRO&nbsp;&nbsp;&nbsp;
                <span style="font-style: italic;">YX&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span
                style="font-family: Courier New,Courier,monospace;"># If
                A9=0</span><br>
              <span style="font-family: Courier New,Courier,monospace;">PRO&nbsp;&nbsp;&nbsp;
                0<span style="font-style: italic;">YX&nbsp;&nbsp;&nbsp;</span></span><span
                style="font-family: Courier New,Courier,monospace;">#
                Same as
                "PRO YX"</span><br>
              <span style="font-family: Courier New,Courier,monospace;">PRO&nbsp;&nbsp;&nbsp;
                4<span style="font-style: italic;">YX</span>&nbsp;&nbsp;&nbsp;
                # If
                A9=1</span><br>
              <br>
            </div>
            (Or, you could just look at it as having a literal
            octal constant as operand, and that constant was placed
            directly into the bits A9-A1.)&nbsp; For example, to read
            MDIU keystroke data, <span style="font-style: italic;">X</span>=3
            and <span style="font-style: italic;">Y</span>=4, so<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">PRO&nbsp;&nbsp;&nbsp;
                43</span><br>
            </div>
            <div style="margin-left: 40px;"></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            RSU<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            03<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Same as <span style="font-family: monospace;">SUB</span>
            (see below), except that the order of the operands in the
            subtraction is reversed.<br>
            <br>
            Assembly-language example to compute <span
              style="font-family: Courier New,Courier,monospace;">RESULT</span>=3-56:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate variable for output.<br>
                ARG1&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp; 56<br>
                ARG2 &nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                3<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp; ARG1<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RSU
                &nbsp;&nbsp;&nbsp; ARG2<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp; RESULT</span></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            ADD<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            04<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Adds the contents of the accumulator with the contents of
            the address embedded within the instruction and places
            the result in the accumulator.&nbsp; Recall that A1-A8
            select the offset within a 256-word sector, and A9 is the
            "residual bit" that selects between the current sector
            and the "residual sector".<br>
            <br>
            Assembly-language example to compute <span
              style="font-family: Courier New,Courier,monospace;">RESULT</span>=56+3:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate variable for output.<br>
                ARG1&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp; 56<br>
                ARG2 &nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                3<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp; ARG1<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADD
                &nbsp;&nbsp;&nbsp; ARG2<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp;
                RESULT&nbsp;</span>&nbsp;&nbsp;
            </div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            SUB<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            05<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Subtracts the contents of a word pointed to by the
            address embedded within the instruction from the
            accumulator, and puts the result back into the
            accumulator.&nbsp; Recall that A1-A8 select the offset
            within a 256-word sector, and A9 is the "residual bit"
            that selects between the current sector and the "residual
            sector".&nbsp; See also <span style="font-family: Courier
              New,Courier,monospace;">RSU</span>.<br>
            <br>
            Assembly-language example to compute <span
              style="font-family: Courier New,Courier,monospace;">RESULT</span>=56-3:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate variable for output.<br>
                ARG1&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp; 56<br>
                ARG2 &nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                3<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp; ARG1<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUB
                &nbsp;&nbsp;&nbsp; ARG2<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp; RESULT<br>
              </span></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            CLA<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            06<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Store a value to the accumulator, from the memory word at
            the address embedded within the instruction.&nbsp;&nbsp;
            Recall that A1-A8 select the offset within a 256-word
            sector, and A9 is the "residual bit" that selects between
            the current sector and the "residual sector".<br>
            <br>
            Assembly-langauge example to load the accumulator with
            decimal 56:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">K56&nbsp;
                &nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                56</span><br>
              <span style="font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CLA&nbsp;&nbsp;&nbsp;&nbsp;
                K56</span><br>
            </div>
            <br>
            Note that as with the <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            instruction, the assembler allows seemingly meaningless
            usages like "<span style="font-family: Courier
              New,Courier,monospace;">CLA
              LHS</span>", where <span style="font-family: Courier
              New,Courier,monospace;">LHS</span>
            is the left-hand symbol of a code location rather that
            the name of a variable or constant.&nbsp; What the
            assembler does in this case is automatically, silently to
            create a HOP constant in memory called "<span
              style="font-family: Courier New,Courier,monospace;">(LHS)</span>",
and
            then to subsitute the "<span style="font-family: Courier
              New,Courier,monospace;">CLA
              (LHS)</span>" for the original instruction.&nbsp; See the
            notes accompanying the <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            instruction for full details.<br>
            <div style="margin-left: 40px;"></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            AND<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            07<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Logically ANDs the contents of the accumulator with the
            contents of the address embedded within the instruction
            and places the result in the accumulator.&nbsp; Recall
            that A1-A8 select the offset within a 256-word sector,
            and A9 is the "residual bit" that selects between the
            current sector and the "residual sector".<br>
            <br>
            Assembly-language example to compute <span
              style="font-family: Courier New,Courier,monospace;">RESULT</span>=037&amp;052
(i.e.,
            to logically AND together octal 37 and octal
            52):<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate variable for output.<br>
                ARG1&nbsp;&nbsp;&nbsp;&nbsp; OCT &nbsp;&nbsp;&nbsp;
                37<br>
                ARG2 &nbsp;&nbsp;&nbsp; OCT &nbsp;&nbsp;&nbsp; 52<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp; ARG1<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SUB
                &nbsp;&nbsp;&nbsp; ARG2<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp; RESULT</span></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            MPY<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            10<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
            (results<br>
            available after 3)<br>
          </td>
          <td style="vertical-align: middle;">This is a
            multiplication instruction.&nbsp; It multiplies two 24-bit
            numbers to produce a 26-bit product.&nbsp; The accumulator
            provides the address of one operand, and the address
            embedded in the instruction points to the other
            operand.&nbsp; Recall that A1-A8 select the offset within a
            256-word sector, and A9 is the "residual bit" that selects
            between the current sector and the "residual sector".&nbsp;
            In both cases, the most-significant 24-bits of the operands
            are used, and the least-significant 2 bits of the operand
            are ignored.&nbsp; The result is available via the
            <span style="font-family: monospace;">SPQ</span>
            instruction on the 2nd instruction following <span
              style="font-family: Courier New,Courier,monospace;">MPY</span>.&nbsp;
Any
            other instruction not involving multiplication or
            division can be performed between the <span
              style="font-family: courier new,courier,monospace;">MPY</span>
            and the <span style="font-family: courier
              new,courier,monospace;">SPQ</span>.<br>
            <br>
            To illustrate the assembly-language syntax, let's multiply
            the integer 56 by 3 and store the result in a variable:<br>
            <br>
            <span style="font-family: Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
              Allocate variable for output.<br>
              K56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              DEC&nbsp;&nbsp;&nbsp;&nbsp; 56<br>
              K3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              DEC&nbsp;&nbsp;&nbsp;&nbsp; 3<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              CLA&nbsp;&nbsp;&nbsp;&nbsp; K56<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MUL
              &nbsp;&nbsp;&nbsp;
              K3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Start the
              multiplication.<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
              The result won't be available<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
              for a while, so kill some time.<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              SPQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
              Fetch product into accumulator.<br>
              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
              STO&nbsp;&nbsp;&nbsp;&nbsp; RESULT&nbsp;&nbsp;&nbsp; #
              Save
              it!</span><br>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            TRA<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            11<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            This is an unconditional jump instruction, which branches
            to the address embedded in the instruction.&nbsp; Bits
            A1-A9 of the embedded address represent the new offset
            within either the currently-selected sector or the
            residual sector.&nbsp; Note that the syllable remains the
            same, so if (for example) the TRA is itself in syllable 1
            of the current program counter, then the next instruction
            executed will be at syllable 1 in the new program
            counter.&nbsp; (This differs from the behavior of the
            corresponding <a href="LVDC.html#CPU_Instructions">LVDC</a>
            instruction, in
            that the LVDC instruction allows selection of the target
            syllable via A9, but does not allow the new program
            counter to be in the residual sector.)<br>
            <br>
            See also the description of <a
              href="Gemini.html#Shorthands_for_some_instructions_">shorthands
for
              various instructions</a>.<br>
            <br>
            Assembly-language examples:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;"># Branch
                from location START to location FINISH.<br>
                START&nbsp;&nbsp;&nbsp; TRA&nbsp;&nbsp;&nbsp;&nbsp;
                FINISH<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...</span><br>
              <span style="font-family: Courier New,Courier,monospace;">FINISH&nbsp;&nbsp;
                ...<br>
                # Branch from location START2 to FINISH2, but use<br>
                # relative addressing rather than the left-hand<br>
                # symbol FINISH2.&nbsp; The NOP instructions below<br>
                # could be anything --- the point is simply that<br>
                # FINISH2 is 3 words in memory after START2.<br>
                START2&nbsp;&nbsp; TRA&nbsp;&nbsp;&nbsp;&nbsp; *+3<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                NOP<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                NOP<br>
                FINISH2&nbsp; ...</span><br style="font-family: Courier
                New,Courier,monospace;">
            </div>
            <br>
            The operand for <span style="font-family: Courier
              New,Courier,monospace;">TRA</span>
            is either an existing left-hand symbol for an instruction
            (rather than for a variable or constant), or else an
            expression of the form "*+<span style="font-style: italic;">N</span>"
            or "*-<span style="font-style: italic;">N</span>", where <span
              style="font-style: italic;">N</span> is any number from 1
            to
            7.<br>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            SHF<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            12<br>
          </td>
          <td style="text-align: center; vertical-align: middle;"><br>
          </td>
          <td style="vertical-align: middle;">
            Performs a logical shift operation on the
            accumulator.&nbsp; For this instruction, only bits A1-6
            are actually used, as follows:<br>
            <br>
            <table summary="" style="text-align: left; margin-left:
              auto; margin-right: auto;" cellspacing="2" cellpadding="2"
              border="1">
              <tbody>
                <tr>
                  <th style="vertical-align: top; font-weight: bold;
                    text-align: center;">
                    X<br>
                    (A1-3)<br>
                  </th>
                  <th style="vertical-align: top; font-weight: bold;
                    text-align: center;">
                    Y<br>
                    (A4-6)<br>
                  </th>
                  <th style="vertical-align: top; font-weight: bold;"><br>
                    Description of operation<br>
                  </th>
                </tr>
                <tr>
                  <td style="vertical-align: top; text-align: center;">
                    1<br>
                  </td>
                  <td style="vertical-align: top; text-align: center;">
                    2<br>
                  </td>
                  <td style="vertical-align: top;">Shift "right" one
                    position<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: top; text-align: center;">
                    0<br>
                  </td>
                  <td style="vertical-align: top; text-align: center;">
                    2<br>
                  </td>
                  <td style="vertical-align: top;">Shift "right" two
                    positions</td>
                </tr>
                <tr>
                  <td style="vertical-align: top; text-align: center;">
                    X<br>
                  </td>
                  <td style="vertical-align: top; text-align: center;">
                    3<br>
                  </td>
                  <td style="vertical-align: top;">Shift "left" one
                    position</td>
                </tr>
                <tr>
                  <td style="vertical-align: top; text-align: center;">
                    X<br>
                  </td>
                  <td style="vertical-align: top; text-align: center;">
                    4<br>
                  </td>
                  <td style="vertical-align: top;">Shift "left" two
                    positions</td>
                </tr>
                <tr>
                  <td colspan="2" rowspan="1" style="vertical-align:
                    top; text-align: center;">
                    (Other)<br>
                  </td>
                  <td style="vertical-align: top;">Clears the
                    accumulator<br>
                  </td>
                </tr>
              </tbody>
            </table>
            <br>
            But what do "left" and "right" mean?&nbsp; Fortunately,
            "left" implies multiplication by powers of two, and
            "right" division by powers of two, just as modern
            programmers are accustomed to.<br>
            <br>
            For the left-shifts, 0 is shifted into the
            least-significant bit at the right.&nbsp; For the
            right-shifts, the sign-bit is duplicated into the
            most-significant bit at the left.<br>
            <br>
            For illegal X,Y combinations, the accumulator is
            zeroed.<br>
            <br>
            Note that this instruction is similar to the
            corresponding <a href="LVDC.html#CPU_Instructions">LVDC</a>
            instruction, but
            differs in details.<br>
            <br>
            See also the description of <a
              href="Gemini.html#Shorthands_for_some_instructions_">shorthands
for
              various instructions</a>.<br>
            <br>
            There assembly-language syntax for this instruction
            is:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">SHF
                &nbsp;&nbsp; <span style="font-style: italic;">YX</span></span><br>
              <br>
            </div>
            (Or, you could just look at it as having a literal
            octal constant as operand, and that constant was placed
            directly into the bits A6-A1.)&nbsp; For example, to
            shift right one position, <span style="font-style: italic;">X</span>=1
            and <span style="font-style: italic;">Y</span>=2, so<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">SHF
                &nbsp;&nbsp; 21</span><br>
            </div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            TMI<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            13<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            This is a conditional jump instruction, which branches to
            the address embedded in the instruction if the
            accumulator is less than zero, but simply continues to
            the next instruction in sequence if the accumulator
            greater than or equal to zero.&nbsp; Bits A1-A9 of the
            embedded address represent the new offset within the
            currently selected 256-word instruction sector or the
            residual sector.&nbsp; See also <span style="font-family:
              Courier New,Courier,monospace;">TNZ</span>.&nbsp;
            (This differs from the behavior of the corresponding
            <a href="LVDC.html#CPU_Instructions">LVDC</a>
            instruction, in that the LVDC instruction allows
            selection of the target syllable via A9, but does not
            allow the new program counter to be in the residual
            sector.)<br>
            <br>
            Assembly-language examples:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;"># Branch
                from location START to location FINISH<br>
                # because VALUE is negative:<br>
                VALUE&nbsp;&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                -129<br>
                START&nbsp;&nbsp;&nbsp; TMI &nbsp;&nbsp;&nbsp;
                FINISH<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Never gets here!<br>
              </span> <span style="font-family: Courier
                New,Courier,monospace;">FINISH&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                But does get to here!<br>
                # Don't branch from START2 to FINISH2, because<br>
                # VALUE2 is not negative:<br>
                VALUE2&nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp; 127<br>
                START2&nbsp;&nbsp; TMI&nbsp;&nbsp;&nbsp;&nbsp;
                FINISH2<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Comes to here!<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                TRA&nbsp;&nbsp;&nbsp;&nbsp; BAILOUT<br>
                FINISH2&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Never comes to here!<br>
                BAILOUT&nbsp; ...<br>
              </span><br style="font-family: Courier
                New,Courier,monospace;">
            </div>
            The operand for <span style="font-family: Courier
              New,Courier,monospace;">TMI</span>
            is either an existing left-hand symbol for an instruction
            (rather than for a variable or constant), or else an
            expression of the form "*+<span style="font-style: italic;">N</span>"
            or "*-<span style="font-style: italic;">N</span>", where <span
              style="font-style: italic;">N</span> is any number from 1
            to
            7.&nbsp; The usage of the latter relative-addressing
            forms isn't illustrated in the code example for
            <span style="font-family: Courier New,Courier,monospace;">TMI</span>,
            but you can look at the code example for <span
              style="font-family: Courier New,Courier,monospace;">TRA</span>
            instead; it works exactly the same for <span
              style="font-family: Courier New,Courier,monospace;">TMI</span>.<br>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            STO<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            14<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            Stores the contents of the accumulator in the word
            indicated by the address embedded within the
            instruction.&nbsp; Recall that A1-A8 select the offset
            within a 256-word sector, and A9 is the "residual bit"
            that selects between the current sector and the "residual
            sector".&nbsp;&nbsp; The accumulator retains its
            value.<br>
            <br>
            Assembly-language example:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">RESULT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Allocate a variable</span><br style="font-family:
                Courier New,Courier,monospace;">
              <span style="font-family: Courier New,Courier,monospace;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
STO&nbsp;&nbsp;&nbsp;&nbsp;
                RESULT&nbsp;&nbsp; # Store
                accumulator value in the variable.</span><br>
            </div>
            <br>
            Note that as with the <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            instruction, the assembler allows seemingly meaningless
            usages like "<span style="font-family: Courier
              New,Courier,monospace;">STO
              LHS</span>", where <span style="font-family: Courier
              New,Courier,monospace;">LHS</span>
            is the left-hand symbol of a code location rather that
            the name of a variable or constant.&nbsp; What the
            assembler does in this case is automatically, silently to
            create a HOP constant in memory called "<span
              style="font-family: Courier New,Courier,monospace;">(LHS)</span>",
and
            then to subsitute the "<span style="font-family: Courier
              New,Courier,monospace;">STO
              (LHS)</span>" for the original instruction.&nbsp; See the
            notes accompanying the <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>
            instruction for full details.<br>
            <div style="margin-left: 40px;"></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            SPQ<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            15<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">Store a product or
            quotient (computed with <span style="font-family: courier
              new,courier,monospace;">MPY</span> or
            <span style="font-family: courier new,courier,monospace;">DIV</span>)
            into the word indicated by the address embedded within the
            instruction.&nbsp; Recall that A1-A8 select the offset
            within a 256-word sector, and A9 is the "residual bit" that
            selects between the current sector and the "residual
            sector".&nbsp;&nbsp; The accumulator retains its
            value.&nbsp; (This instruction is somewhat similar to the
            <a href="LVDC.html#CPU_Instructions">LVDC</a> instruction
            <span style="font-family: courier new,courier,monospace;">CLA
              0775</span>, though quite different in detail.)<br>
            <br>
            For assembly-language examples, see <span
              style="font-family: Courier New,Courier,monospace;">MPY</span>
            or
            <span style="font-family: Courier New,Courier,monospace;">DIV</span>
            above.<br>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            CLD<br>
          </td>
          <td style="vertical-align: middle; text-align: center;">
            16<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            A discrete input (i.e., a single bit) selected by the
            operand address is read into the accumulator.&nbsp; The
            entire accumulator is overwritten so that every bit
            position has the value of the discrete input bit, and
            consequently will be either 000000000 or else 377777777
            octal.&nbsp; A test of either <span style="font-family:
              Courier New,Courier,monospace;">TMI</span>
            or <span style="font-family: Courier
              New,Courier,monospace;">TNZ</span>
            thereafter can thus branch on the basis of the bit
            value..&nbsp; A <a
              href="#Discrete_Inputs_For_CLD_Instruction">table of the
              allowed discretes</a> follows later.&nbsp; (This
            instruction does not exist in the <a
              href="LVDC.html#CPU_Instructions">LVDC</a>.)<br>
            <br>
            See also the description of <a
              href="Gemini.html#Shorthands_for_some_instructions_">shorthands
for
              various instructions</a>.<br>
            <br>
            There assembly-language syntax for this instruction
            is:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">CLD
                &nbsp;&nbsp; <span style="font-style: italic;">YX</span></span><br>
              <br>
            </div>
            (Or, you could just look at it as having a literal
            octal constant as operand, and that constant was placed
            directly into the bits A6-A1.)&nbsp; For example, to read
            the MDIU data-ready bit, <span style="font-style: italic;">X</span>=1
            and <span style="font-style: italic;">Y</span>=0, so<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">CLD
                &nbsp;&nbsp; 01</span></div>
          </td>
        </tr>
        <tr>
          <td style="font-family: courier new,courier,monospace;
            vertical-align: middle; text-align: center;">
            TNZ</td>
          <td style="vertical-align: middle; text-align: center;">
            17<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="vertical-align: middle;">
            This is a conditional jump instruction, which branches to
            the address embedded in the instruction if the
            accumulator is not zero, but simply continues to the next
            instruction in sequence if the accumulator is zero.&nbsp;
            Bits A1-A8 of the embedded address represent the new word
            address within the sector, while bit A9 selects between
            the current sector vs. the residual sector.&nbsp; (In the
            LVDC, A9 instead selects the syllable within the current
            sector, which is possible since the LVDC has only 2
            syllables.) See also <span style="font-family: Courier
              New,Courier,monospace;">TMI</span>.<br>
            <br>
            Assembly-language examples:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;"># Example
                1: Branch to location IS129 if accumulator is<br>
                # equal to 129 and to ISNOT129 if accumulator is
                not<br>
                # equal to 129:<br>
                K129&nbsp; &nbsp;&nbsp; DEC&nbsp;&nbsp;&nbsp;&nbsp;
                129<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                SUB&nbsp;&nbsp;&nbsp;&nbsp; K129<br>
                &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; TNZ
                &nbsp;&nbsp;&nbsp; ISNOT129<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                TRA&nbsp;&nbsp;&nbsp;&nbsp; IS129<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...<br>
                IS129&nbsp;&nbsp;&nbsp; ...<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...<br>
                ISNOT129 ...<br>
                # Example 2: A simple loop with 10 iterations:<br>
                LOOPCTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Variable for counting loop iterations.<br>
                K1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp; 1<br>
                K10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                DEC&nbsp;&nbsp;&nbsp;&nbsp; 10<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp;
                K10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Setup for the
                loop.<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                STO&nbsp;&nbsp;&nbsp;&nbsp; LOOPCTR<br>
                LOOP&nbsp;&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Do stuff<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                CLA&nbsp;&nbsp;&nbsp;&nbsp; LOOPCTR&nbsp;&nbsp; #
                Decrement and test loop counter<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                SUB&nbsp;&nbsp;&nbsp;&nbsp; K1<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                TNZ&nbsp;&nbsp;&nbsp;&nbsp; LOOP<br>
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
#
                Done!<br>
              </span><br style="font-family: Courier
                New,Courier,monospace;">
            </div>
            The operand for <span style="font-family: Courier
              New,Courier,monospace;">TNZ</span>
            is either an existing left-hand symbol for an instruction
            (rather than for a variable or constant), or else an
            expression of the form "*+<span style="font-style: italic;">N</span>"
            or "*-<span style="font-style: italic;">N</span>", where <span
              style="font-style: italic;">N</span> is any number from 1
            to
            7.&nbsp; The usage of the latter relative-addressing
            forms isn't illustrated in the code example for
            <span style="font-family: Courier New,Courier,monospace;">TNZ</span>,
            but you can look at the code example for <span
              style="font-family: Courier New,Courier,monospace;">TRA</span>
            instead; it works exactly the same for <span
              style="font-family: Courier New,Courier,monospace;">TNZ</span>.<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    <h3><a name="IO_Ports_For_PRO_Instruction"
        id="IO_Ports_For_PRO_Instruction"></a>I/O Signals (For <span
        style="font-family: courier new,courier,monospace;">PRO</span>
      Instruction)<br>
    </h3>
    Note that in assembly language, in the
    operand for a <span style="font-family: courier
      new,courier,monospace;">PRO</span>
    instruction, the Y operand field would proceed the X operand
    field.&nbsp; So, for example, if X=3 and Y=4, the instruction
    would be <span style="font-family: courier new,courier,monospace;">PRO43</span>.&nbsp;
That's
    the opposite of present ordering of the columns in the
    table below and could be confusing, for which I apologize, but
    I'm too lazy to completely rewrite the table.<br>
    <br>
    <table summary="" style="margin-left: auto; margin-right: auto;
      text-align: left;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th colspan="2" rowspan="1" style="text-align: center;
            vertical-align: middle;">
            Operand<br>
          </th>
          <th colspan="1" rowspan="2" style="text-align: center;
            vertical-align: bottom;">Input /<br>
            Output<br>
          </th>
          <th colspan="1" rowspan="2" style="text-align: center;
            vertical-align: bottom;">
            Signal<br>
          </th>
          <th colspan="1" rowspan="2" style="text-align: center;
            vertical-align: bottom;">
            Comment<br>
          </th>
        </tr>
        <tr>
          <th style="text-align: center; vertical-align: middle;">X
            (A1-A3)<br>
          </th>
          <th style="text-align: center; vertical-align: middle;">Y
            (A4-A6)<br>
          </th>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Digital Command System shift pulse gate<br>
          </td>
          <td style="vertical-align: middle;">Causes a 24-bit word
            buffered in the <a href="#Uplink">Digital Command
              System</a> (DCS) to be read into bits M1-M24 of the
            accumulator.&nbsp; Or, reads data from the <a
              href="#Rendezvous_Radar">Rendezvous Radar</a> (if any).<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Data
            Transmission System control gate<br>
          </td>
          <td style="vertical-align: middle;">Used to output a data
            word to the <a href="#Downlink">Instrumentation System</a>
            (IS) for digital downlink.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In/Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Time
            Reference System data and timing pulses<br>
          </td>
          <td style="vertical-align: middle;">The action of this
            signal seems pretty complex.&nbsp; Please read the section
            on the <a href="#Time_Reference_System_TRS">Time Reference
              System</a> (TRS) for my conclusions as to what it's
            actually supposed to do.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            magnitude weight 1<br>
          </td>
          <td style="vertical-align: middle;">
            Used in conjunction with "Digit magnitude weight 2",
            "Digit magnitude weight 4", and "Digit magnitude weight
            8" to write a particular digit to an <a
              href="#yaMDIU_the_MDIU_Emulation">MDR</a> position
            previously
            selected using the "Digit select weight <span
              style="font-style: italic;">X</span>" outputs.&nbsp; The
            weights derive from a BCD value of the digit whose
            display is desired.<br>
            <br>
            I haven't seen any explanation of how to clear a digit so
            that it's blank ... perhaps there was no such feature,
            though it seems to me that it would make data-entry very
            confusing if so.&nbsp; There are a number of ways this
            might have been done.&nbsp; Until I understand it better,
            the <span style="font-weight: bold;">yaPanel</span> MDIU
            emulator handles this as follows:<br>
            <ul>
              <li>Using any combination of magnitudes that doesn't
                form a BCD (i.e., something in the range 0-9) will
                clear the selected digit to be blank.</li>
              <li>Pressing the MDR's CLEAR button will make all of
                the digits blank.<br>
              </li>
            </ul>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Reset
            data ready, enter, and readout<br>
          </td>
          <td style="vertical-align: middle;">When zeroed, signals
            the <a href="#yaMDIU_the_MDIU_Emulation">MDIU</a> to reset
            its internal buffer so that a numerical keystroke
            subsequently be collected.&nbsp; It is unclear if this
            needs to be returned to a non-zero state later.&nbsp; The
            <span style="font-family: courier new,courier,monospace;">CLD</span>
            inputs associated with the ENTER and READ OUT keys also are
            cleared as a result.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            select weight 1<br>
          </td>
          <td style="vertical-align: middle;">Used in conjunction
            with "Digit select weight 2" and "Digit select weight 4" to
            select the next digit position to which a display value
            will be output to the <a href="#yaMDIU_the_MDIU_Emulation">MDIU</a>.&nbsp;
            It is not
            really explained how these work, but I think that they are
            used to form an index from 0-7 in the obvious way, and that
            the leftmost address digit is 0, the 2nd address digit is
            1, the leftmost message digit is 2, and so on.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Memory strobe<br>
          </td>
          <td style="vertical-align: middle;">I believe that this
            signal is used <span style="font-style: italic;">only</span>
            in conjunction with the
            <a href="#Aerospace_Ground_Equipment_AGE">AGE</a> for
            testing purposes.&nbsp; When the accumulator is negative,
            it seems to enable a hardware mode called "marginal early"
            may help in determining how robust the memory access is
            with respect to marginal timing.&nbsp; When the accumulator
            is positive or zero, it disables this diagnostic
            feature.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer ready<br>
          </td>
          <td style="vertical-align: middle;">Signal to the <a
              href="#Uplink">Digital Command System</a> (DCS) that the
            OBC
            wishes to read a buffered uplinked data word.&nbsp; Also
            used to tell the <a href="#Rendezvous_Radar">Rendezvous
              Radar</a>, if any, that radar data is required.&nbsp; In
            the latter case, a 20 ms. delay must occur afterward before
            polling the radar-ready discrete input (<span
              style="font-family: courier new,courier,monospace;">CLD00</span>).<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Drive
            counters to zero<br>
          </td>
          <td style="vertical-align: middle;">For setting a delta-V
            display on the <a href="#IVI">IVI</a> to zero.&nbsp; First
            do <span style="font-family: courier
              new,courier,monospace;">PRO11</span>
            with the accumulator negative, then (see "Select X
            counter") select the X, Y, or Z axis, then do <span
              style="font-family: courier new,courier,monospace;">PRO11</span>
            with the accumulator positive or zero to return to the
            normal state.&nbsp; <span style="font-family: courier
              new,courier,monospace;">CLD31</span>,
            <span style="font-family: courier new,courier,monospace;">CLD25</span>,
            and <span style="font-family: courier
              new,courier,monospace;">CLD26</span>
            can be subsequently used for feedback that the displays are
            actually at zero.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Enter<br>
          </td>
          <td style="vertical-align: middle;">When inactive, the
            <a href="#Time_Reference_System_TRS">Time Reference
              System</a> (TRS) is capable of receiving timing data (like
            T<sub><small>R</small></sub> or
            T<sub><small>X</small></sub>) from the ODC.&nbsp; When
            active, the ODC can receive timing data (like ET or
            T<sub><small>R</small></sub>) from the TRS.&nbsp;</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            magnitude weight 2<br>
          </td>
          <td style="vertical-align: middle;">See Digit magnitude
            weight&nbsp; 1<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Display device drive<br>
          </td>
          <td style="vertical-align: middle;">
            The "display device drive", as far as I can see, is
            what's used to turn the physical wheel on which the
            <a href="Gemini.html#yaMDIU_the_MDIU_Emulation">MDIU</a>
            display-digits are inscribed to the proper position for
            display.&nbsp; In other words when the drive is off
            (i.e., PRO41 output a zero) the last-selected digit
            continues to be displayed, while when the drive is on
            (PRO41 output non-zero) the display wheel will be turned
            if necessary.&nbsp; Therefore, the drive is normally off,
            but is turned on briefly when a digit is being
            changed.&nbsp; The full procedure is as follows:<br>
            <ol>
              <li>Use the digit-select weights to choose the
                display-position which is supposed to be changed.</li>
              <li>Turn on the display device drive.</li>
              <li>Use the digit-magnitude weights to determine what
                digit is driven into the selected display
                position.</li>
              <li>Wait 0.5 seconds.</li>
              <li>Turn off the display device drive.<br>
              </li>
            </ol>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            select weight 2<br>
          </td>
          <td style="vertical-align: middle;">See Digit select weight
            1<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;"><br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Autopilot scale factor<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Pitch
            resolution<br>
          </td>
          <td style="vertical-align: middle;">Controls the range
            switch for Pitch Error (or down range error) output.&nbsp;
            If the sign bit is positive, then there is a 6-to-1
            attenuation applied; if the sign bit is negative, there is
            no attenuation.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Select X counter<br>
          </td>
          <td style="vertical-align: middle;">
            Used along with "Select Y counter" to select one of the
            <a href="#IVI">IVI</a>'s delta-V displays to receive
            additional commands, as follows:<br>
            <ul>
              <li>X-axis:&nbsp; <span style="font-family: courier
                  new,courier,monospace;">PRO12</span>
                with accumulator negative, <span style="font-family:
                  courier new,courier,monospace;">PRO13</span>
                with accumulator positive or zero.</li>
              <li>Y-axis:&nbsp; <span style="font-family: courier
                  new,courier,monospace;">PRO12</span>
                with accumulator positive or zero, <span
                  style="font-family: courier new,courier,monospace;">PRO13</span>
                with accumulator negative.</li>
              <li>Z-axis:&nbsp; <span style="font-family: courier
                  new,courier,monospace;">PRO12</span>
                with accumulator negative, <span style="font-family:
                  courier new,courier,monospace;">PRO13</span>
                with accumulator negative.</li>
            </ul>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Aerospace Ground Equipment data link<br>
          </td>
          <td style="vertical-align: middle;">For outputting a single
            data bit to the dedicated <a
              href="#Aerospace_Ground_Equipment_AGE">AGE</a> data
            link.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            magnitude weight 4<br>
          </td>
          <td style="vertical-align: middle;">See Digit magnitude
            weight&nbsp; 1</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            select weight 4<br>
          </td>
          <td style="vertical-align: middle;">See Digit select weight
            1<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Reset
            start computation<br>
          </td>
          <td style="vertical-align: middle;">From the <a href="#PCDP">PCDP</a>'s
            RESET switch.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Yaw
            resolution<br>
          </td>
          <td style="vertical-align: middle;">Controls the range
            switch for Yaw Error (or cross-range error) output.&nbsp;
            If the sign bit is positive, then there is a 6-to-1
            attenuation applied; if the sign bit is negative, there is
            no attenuation.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Select Y counter<br>
          </td>
          <td style="vertical-align: middle;">See "Select X
            counter".<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Aerospace Ground Equipment data clock<br>
          </td>
          <td style="vertical-align: middle;">Provides a data clock,
            one pulse at a time, for reading data on the dedicated
            <a href="#Aerospace_Ground_Equipment_AGE">AGE</a> data
            link.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Digit
            magnitude weight 8<br>
          </td>
          <td style="vertical-align: middle;">See Digit magnitude
            weight 1<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Read
            Manual Data Insertion Unit insert data<br>
          </td>
          <td style="vertical-align: middle;">Reads a keystroke that
            has been buffered in the <a
              href="#yaMDIU_the_MDIU_Emulation">MDIU</a>.&nbsp; This
            operation
            should be done only in response to a separate discrete
            "Data ready" input via <span style="font-family: courier
              new,courier,monospace;">CLD</span>.&nbsp;
            The BCD value of the digit is stored into bits M1-M4 of the
            accumulator.&nbsp; A <span style="font-family: courier
              new,courier,monospace;">PRO40</span>
            should be performed afterward to clear the MDIU buffer and
            allow the next keystroke to be collected, and additional
            <span style="font-family: courier new,courier,monospace;">PRO</span>
            instructions should be used to display the digit on the
            MDIU.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Reset
            radar ready<br>
          </td>
          <td style="vertical-align: middle;">Sent to the <a
              href="#Rendezvous_Radar">Rendezvous Radar</a>, if any, to
            reset
            its discrete input buffer.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Roll
            resolution<br>
          </td>
          <td style="vertical-align: middle;">Controls the range
            switch for Roll Error output.&nbsp; If the sign bit is
            positive, then there is a 6-to-1 attenuation applied; if
            the sign bit is negative, there is no attenuation.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Elapsed time control and Time Reference System control
            reset / ATM wind-rewind reset<br>
          </td>
          <td style="vertical-align: middle;">Signal to the <a
              href="#Time_Reference_System_TRS">Time Reference System</a>
            (TRS) that the data about to be fetched from the TRS with
            <span style="font-family: courier new,courier,monospace;">PRO20</span>
            commands is the elapsed time (ET).&nbsp; This output should
            persist for 9-15 ms. before being returned to the normal
            state.&nbsp; It also apparently acts to reset the TRS
            control circuitry.<br>
            <br>
            <span style="font-style: italic;">(Units with ATM
              only.)</span> It has additional functionality for the
            <a href="#Auxiliary_Tape_Memory_ATM">Auxiliary Tape
              Memory</a> (ATM), in that it commands the ATM to stop
            winding or rewinding.&nbsp; I believe that it also turns
            off the ATM ERROR lamp.&nbsp; (I don't know how to select
            between the TRS/ATM functions, or if it always performs
            both simultaneously.)<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer malfunction<br>
          </td>
          <td style="vertical-align: middle;">To the <a href="#PCDP">PCDP</a>'s
            MALF light.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            verify/repro command<br>
          </td>
          <td style="vertical-align: middle;">Send a command to the
            <a href="#Auxiliary_Tape_Memory_ATM">Auxiliary Tape
              Memory</a> (ATM) to begin data output.&nbsp; I assume that
            the accumulator is negative to begin the output and zero or
            positive to end it.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            TBD<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Second stage engine cutoff<br>
          </td>
          <td style="vertical-align: middle;">TBD<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer running<br>
          </td>
          <td style="vertical-align: middle;">To the <a href="#PCDP">PCDP</a>'s
            COMP light.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In?/Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Time
            to start re-entry calculations control / ATM wind
            command<br>
          </td>
          <td style="vertical-align: middle;">The use for "time to
            start re-entry calculations" is TBD.<br>
            <br>
            <span style="font-style: italic;">(Units with ATM
              only.)</span>&nbsp; Initiates winding of the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>.&nbsp;
            I
            assume that the value in the accumulator should be
            negative, however, I don't think that outputting a positive
            or zero value stops the winding.&nbsp; Instead, use
            <a href="#Auxiliary_Tape_Memory_ATM">PRO14</a>.&nbsp; (I
            don't know how to select between the timing and ATM
            functions, or if it always performs both
            simultaneously.)</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Time
            to reset control / ATM rewind command<br>
          </td>
          <td style="vertical-align: middle;">Signal to the <a
              href="#Time_Reference_System_TRS">Time Reference System</a>
            (TRS) that transfer of time-to-equipment-reset
            (T<sub><small>X</small></sub>) data is desired.&nbsp; This
            output should persist for 9-15 ms. before being returned to
            the normal state.<br>
            <br>
            <span style="font-style: italic;">(Units with ATM
              only.)</span>&nbsp; Initiates rewinding of the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>.&nbsp;
            I
            assume that the value in the accumulator should be
            negative, however, I don't think that outputting a positive
            or zero value stops the rewinding.&nbsp; Instead, use
            <a href="Gemini.html#Auxiliary_Tape_Memory_ATM">PRO14</a>.&nbsp;
            (I
            don't know how to select between the TRS/ATM functions, or
            if it always performs both simultaneously.)</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Write
            output processor<br>
          </td>
          <td style="vertical-align: middle;">For incrementally
            adjusting the delta-V displays of the <a href="#IVI">IVI</a>.&nbsp;
            First, the X, Y, or Z display is
            selected (see "Select X counter" above).&nbsp; No more than
            1 ms. later, <span style="font-family: courier
              new,courier,monospace;">PRO35</span>
            is used to begin the update.&nbsp; The value in the
            accumulator comprises the sign bit and M1-M12, so the
            maximum change is -4096 to +4095.&nbsp; Since the displays
            are actually -999 to +999, in theory the adjustment range
            is more than full.&nbsp; In practice, only very small
            adjustments would be made.&nbsp; My understanding of what
            the hardware actually does is to increment or decrement the
            displays by 1 every 21.5 ms., and that it will not be ready
            to process another delta-V until the count has reached
            zero.&nbsp; For example, trying to change the display by 25
            would take about half a second, and no other outputs to the
            IVI should take place in that interval.&nbsp; The "Velocity
            error count not zero" discrete (<span style="font-family:
              courier new,courier,monospace;">CLD22</span>)
            can be polled to determine when the increment/decrement
            pulses have all been sent to the display and the counter
            has reached zero.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle; color:
            rgb(0, 0, 0);">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Read
            delta velocity<br>
          </td>
          <td style="vertical-align: middle;">
            This port is used to read the change in velocity from the
            platform electronics, and to zero the reference velocity
            for the next readings.<br>
            <br>
            A single <span style="font-family: courier
              new,courier,monospace;">PRO45</span>
            instruction reads the Δ<span style="font-style: italic;">V</span>
            from all three axes into
            the accumulator.&nbsp; Documentation is unclear as to how
            the data appearing in the accumulator is packed, but my
            nearest guess as to what it's trying to tell us is that
            each of the X, Y, and Z axis readings is a 4-bit
            2's-complement value (thus being in the range -8 to +7),
            and that they are packed into the accumulator as
            follows:<br>
            <br>
            <div style="margin-left: 40px;"><span style="font-family:
                Courier New,Courier,monospace;">XXXXYYYYZZZZ00000000000000</span><br>
            </div>
            <br>
            Even if correct, the units are TBD.
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            TBD<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Input
            processor time<br>
          </td>
          <td style="vertical-align: middle;">TBD<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Time
            to retrofire control<br>
          </td>
          <td style="vertical-align: middle;">Signal to the <a
              href="#Time_Reference_System_TRS">Time Reference System</a>
            (TRS) that transfer of time-to-retrograde
            (T<sub><small>R</small></sub>) data is desired.&nbsp; This
            output should persist for 9-15 ms. before being returned to
            the normal state.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle; color:
            rgb(0, 0, 0);">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Read
            pitch gimbal<br>
          </td>
          <td rowspan="3" style="vertical-align: middle;">
            These ports are used for reading gimbal angles from the
            inertial platform.&nbsp; The units used are TBD, as the
            documents discussing them speak only of phase-shifted 400
            cps voltages rather than true angles.<br>
            <br>
            15-bit values are provided, including the sign bit and
            the 14 most-significant bits.&nbsp; The 11
            least-significant bits are zeroed.&nbsp; Each of the
            <span style="font-family: courier new,courier,monospace;">PRO</span>
            commands associated with these ports both reads a
            previously-measured value and begins accumulating a new
            measurement, so these ports must be accessed in a very
            specific procedure to get a complete set of readings, as
            follows:<br>
            <div style="margin-left: 40px;"><span style="font-family:
                courier new,courier,monospace;">... at
                least 5 ms. from last read of gimbals ...<br>
                PRO36&nbsp;&nbsp;&nbsp; # Must ignore the first value
                received.<br>
                ... wait &gt;= 5 ms. ...<br>
                PRO46<br>
                STO PITCH<br>
              </span> <span style="font-family: courier
                new,courier,monospace;">... wait
                &gt;= 5 ms. ...<br>
              </span> <span style="font-family: courier
                new,courier,monospace;">PRO56<br>
                STO ROLL<br>
              </span> <span style="font-family: courier
                new,courier,monospace;">... wait
                &gt;= 5 ms. ...<br>
              </span> <span style="font-family: courier
                new,courier,monospace;">PRO36<br>
                STO YAW<br>
                # The total time must be &lt;=30 ms.<br>
              </span></div>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle; color:
            rgb(0, 0, 0);">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Read
            roll gimbal<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle; color:
            rgb(0, 0, 0);">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            In<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Read
            yaw gimbal<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Pitch
            error command<br>
          </td>
          <td rowspan="3" style="vertical-align: middle;">For the
            re-entry mode, the
            outputs are down-range error rather than pitch error, and
            cross-range error rather than yaw error.<br>
            <br>
            These are values which are expected to be output at
            intervals of 50 ms. or less, and feed into a 7-bit
            digital-to-analog converter for driving the Flight Director
            Indicator (FDI).&nbsp; The output comes from the
            accumulator sign bit and from bit-positions M8-M13.&nbsp;
            The analog outputs also feed into range switches which can
            attenuate the signals, and are controlled by <span
              style="font-family: courier new,courier,monospace;">PRO02</span>,
            <span style="font-family: courier new,courier,monospace;">PRO03</span>,
            and <span style="font-family: courier
              new,courier,monospace;">PRO04</span>.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Yaw
            error command<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            Out<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Roll
            error command<br>
          </td>
        </tr>
      </tbody>
    </table>
    <h3><a name="Discrete_Inputs_For_CLD_Instruction"
        id="Discrete_Inputs_For_CLD_Instruction"></a>Discrete Inputs
      (For
      <span style="font-family: courier new,courier,monospace;">CLD</span>
      Instruction)</h3>
    Note that in assembly language, in the operand
    for a <span style="font-family: courier new,courier,monospace;">CLD</span>
    instruction, the Y operand field would proceed the X operand
    field.&nbsp; So, for example, if X=3 and Y=4, the instruction
    would be <span style="font-family: courier new,courier,monospace;">CLD
      43</span>.&nbsp; That's the opposite of present ordering of the
    columns in the table below and could be confusing, for which I
    apologize, but as I said above, I'm too lazy to rewrite the
    table.<br>
    <br>
    <table summary="" style="margin-left: auto; margin-right: auto;
      text-align: left;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th colspan="2" rowspan="1" style="text-align: center;
            vertical-align: middle;">
            Operand<br>
          </th>
          <th colspan="1" rowspan="2" style="text-align: center;
            vertical-align: bottom;">
            Signal<br>
          </th>
          <th colspan="1" rowspan="2" style="text-align: center;
            vertical-align: bottom;">
            Comment<br>
          </th>
        </tr>
        <tr>
          <th style="text-align: center; vertical-align: middle;">X
            (A1-A3)<br>
          </th>
          <th style="text-align: center; vertical-align: middle;">Y
            (A4-A6)<br>
          </th>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Radar
            ready<br>
          </td>
          <td style="vertical-align: middle;">Indicates that data
            from the <a href="#Rendezvous_Radar">Rendezvous Radar</a>
            (if any) is ready.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer mode 2<br>
          </td>
          <td style="vertical-align: middle;">
            From the <a href="#PCDP">PCDP</a>'s COMPUTER mode
            selector rotary dial.&nbsp; The rotary dial has 7
            positions, encoded onto 3 discrete inputs, "Computer mode
            1", "Computer mode 2", and Computer mode 3".&nbsp; The
            encoding is:<br>
            <br>
            <table summary="" style="margin-left: auto; margin-right:
              auto; text-align: left;" cellspacing="2" cellpadding="2"
              border="1">
              <tbody>
                <tr>
                  <th style="vertical-align: top; font-weight: bold;
                    text-align: center;">
                    Computer<br>
                    Mode 1<br>
                  </th>
                  <th style="vertical-align: top; font-weight: bold;
                    text-align: center;">
                    Computer<br>
                    Mode 2<br>
                  </th>
                  <th style="vertical-align: top; font-weight: bold;
                    text-align: center;">
                    Computer<br>
                    Mode 3<br>
                  </th>
                  <th style="font-weight: bold; vertical-align: bottom;
                    text-align: center;">
                    Mode<br>
                  </th>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    TBD<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    Pre-launch<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    Ascent<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    Catch-up<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    Rendezvous<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    Re-entry<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    0<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    TBD<br>
                  </td>
                </tr>
                <tr>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    1<br>
                  </td>
                  <td style="vertical-align: middle; text-align:
                    center;">
                    TBD<br>
                  </td>
                </tr>
              </tbody>
            </table>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Processor timing phase 1<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Data
            ready<br>
          </td>
          <td style="vertical-align: middle;">From the <a
              href="#yaMDIU_the_MDIU_Emulation">MDIU</a>.&nbsp; It
            indicates
            that a digit-keystroke has been buffered within the MDIU
            and is ready to be read.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer mode 1<br>
          </td>
          <td style="vertical-align: middle;">See "Computer mode
            2".</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Start
            computation<br>
          </td>
          <td style="vertical-align: middle;">From the <a href="#PCDP">PCDP</a>'s
            START switch<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">X
            zero indication<br>
          </td>
          <td style="vertical-align: middle;">Indicates that the
            <a href="#IVI">IVI</a>'s X-velocity display is at
            zero.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            clock<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="#Auxiliary_Tape_Memory_ATM">ATM</a> section.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Enter<br>
          </td>
          <td style="vertical-align: middle;">From ENTER key of
            <a href="#yaMDIU_the_MDIU_Emulation">MDIU</a><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Instrumentation System sync<br>
          </td>
          <td style="vertical-align: middle;">From <a href="#Downlink">Instrumentation
              System</a> (IS), to trigger
            beginning of a new downlink cycle every 2.4
            seconds.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Velocity error count not zero<br>
          </td>
          <td style="vertical-align: middle;">From the <a href="#IVI">IVI</a>.&nbsp;
            It is an indicator that a prior
            "Write output processor" (<span style="font-family: courier
              new,courier,monospace;">PRO35</span>)
            has reached completion.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Aerospace Ground Equipment request<br>
          </td>
          <td style="vertical-align: middle;">From the <a
              href="#Aerospace_Ground_Equipment_AGE">AGE</a>.&nbsp;
            Becomes
            active (accumulator negative) when a word is available on
            the dedicated AGE data link.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Readout<br>
          </td>
          <td style="vertical-align: middle;">From READ OUT key of
            <a href="#yaMDIU_the_MDIU_Emulation">MDIU</a><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Computer mode 3<br>
          </td>
          <td style="vertical-align: middle;">See "Computer mode
            2".</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            on<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            data channel 2<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Clear<br>
          </td>
          <td style="vertical-align: middle;">From CLEAR key of
            <a href="#yaMDIU_the_MDIU_Emulation">MDIU</a><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            mode control 1<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Simulaton mode command<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            end of tape<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            data channel 3<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Time
            to start re-entry calculations<br>
          </td>
          <td style="vertical-align: middle;">This is a signal from
            the <a href="#Time_Reference_System_TRS">Time Reference
              System</a> (TRS) that its T<sub>R</sub> (time to
            retrograde) counter has reached zero.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            mode control 2<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Y
            zero indication<br>
          </td>
          <td style="vertical-align: middle;">Indicates that the
            <a href="Gemini.html#IVI">IVI</a>'s Y-velocity display is
            at zero.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">ATM
            data 1<br>
          </td>
          <td style="vertical-align: middle;"><span style="font-style:
              italic;">(Units with ATM only. Otherwise,
              spare.)</span> See the <a
              href="Gemini.html#Auxiliary_Tape_Memory_ATM">ATM</a>
            section.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            5<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Digital Command System ready<br>
          </td>
          <td style="vertical-align: middle;">This is a signal from
            the <a href="#Uplink">Digital Command System</a>
            (DCS)—i.e., the digital uplink from ground control—that
            data is available for the OBC to read.&nbsp; In general, it
            is expected that this signal be polled at 50 ms. intervals
            or shorter.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Fade-in discrete<br>
          </td>
          <td style="vertical-align: middle;">From the <a href="#PCDP">PCDP</a>'s
            FADE-IN.&nbsp; This is a signal from a
            relay, but anything beyond that is TBD.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Z
            zero indication<br>
          </td>
          <td style="vertical-align: middle;">Indicates that the
            <a href="Gemini.html#IVI">IVI</a>'s Z-velocity display is
            at zero.</td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Umbilical disconnect<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            6<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            0<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Instrumentation System request<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            1<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">Abort
            transfer<br>
          </td>
          <td style="vertical-align: middle;">From the <a href="#PCDP">PCDP</a>'s
            ABORT switch.&nbsp; The software should
            poll it during ascent mode, and switch from ascent mode to
            re-entry mode if the input becomes active.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            2<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Aerospace Ground Equipment input data<br>
          </td>
          <td style="vertical-align: middle;">Reads a single data bit
            on the dedicated <a href="#Aerospace_Ground_Equipment_AGE">AGE</a>
            data
            link.<br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            3<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
        <tr>
          <td style="text-align: center; vertical-align: middle;">
            7<br>
          </td>
          <td style="text-align: center; vertical-align: middle;">
            4<br>
          </td>
          <td style="text-align: left; vertical-align: middle;">
            Spare<br>
          </td>
          <td style="vertical-align: middle;"><br>
          </td>
        </tr>
      </tbody>
    </table>
    <h3><a name="Subroutine_Linkage" id="Subroutine_Linkage"></a>Subroutines</h3>
    As weird as it may seem
    in modern terms, <span style="font-style: italic;">the Gemini OBC
      CPU had no mechanism for easily implementing
      subroutines</span>.&nbsp; Further, the assembly-language source
    code for the OBC slavishly implemented what is basically a state
    machine, using the separately designed "math flow" as a
    pattern.&nbsp; Therefore <span style="font-style: italic;">the
      OBC software developers had little need for
      subroutines</span>.&nbsp; You may think I'm wrong about this, but
    I've pursued this question with several OBC developers to an
    extent they probably consider tiresome—fortunately, they've been
    very patient!—and I think that this is an inescapable
    conclusion.&nbsp; Therefore, while the OBC may have been a
    splendid mechanism for developing state machines, it would have
    been very tiresome for developing general-purpose software
    without any easy subroutine mechanism.<br>
    <br>
    Now, there <span style="font-style: italic;">were</span> a few
    subroutines, but they weren't created willy-nilly during
    development as we often do today.&nbsp; Indeed, the full list
    (give or take a few due to errors), including some explanation of
    how to set up the inputs and retrieve the outputs of the
    subroutines, can be found in the Gemini Programming Manual.&nbsp;
    In modern terms, we'd probably think of these as library
    routines, but in Gemini they were the <span style="font-style:
      italic;">only</span> subroutines.&nbsp; I'll return
    to this topic of library routines at the end of the section.<br>
    <br>
    Naturally, since there were some subroutines, there had to be
    some software workaround for the fact that the CPU itself didn't
    support subroutines, and it seems to have been this:<br>
    <ul>
      <li>Before calling a subroutine such as SQROOT, the calling
        program would load the accumulator with the HOP constant of the
        location to which the subroutine was supposed to return, and
        then HOP to the subroutine.</li>
      <li>While we don't actually have any of the math subroutines to
        look at, presumably the math subroutine would have to:</li>
      <ul>
        <li>Save the accumulator in a variable.</li>
        <li>Do whatever computations it was supposed to do.</li>
        <li>HOP to the saved return address.</li>
      </ul>
    </ul>
    In terms of the native capabilities of the machine code,
    it's actually very cumbersome to accomplish all of this, since
    it's necessary to set up several HOP constants (one for the
    subroutine entry point and one for each potential return
    address), each of which has names that must be distinct from the
    names of the subroutine and return points themselves.&nbsp; But
    you may have noticed from the earlier descriptions of the
    <span style="font-family: Courier New,Courier,monospace;">HOP</span>,
    <span style="font-family: Courier New,Courier,monospace;">CLA</span>,
    and
    <span style="font-family: Courier New,Courier,monospace;">STO</span>
    instructions that the assembler implements a feature for them in
    which left-hand symbols can be used as their operands (which
    would otherwise be illegal), and the assembler simply
    automatically creates HOP constants as necessary.&nbsp;
    Therefore, even though what's going on behind the scenes is
    somewhat more complex, the assembly language for the subroutine
    linkage as described above simply looks like this:<br>
    <br>
    <div style="margin-left: 40px;"><span style="font-family: Courier
        New,Courier,monospace;">&nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp; CLA&nbsp;&nbsp;&nbsp;
        RETADR&nbsp;&nbsp;&nbsp; # Set up the return address.<br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HOP&nbsp;&nbsp;&nbsp;
        SUBROU&nbsp;&nbsp;&nbsp; # HOP to the subroutine.<br>
        RETADR&nbsp; ...&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp; &nbsp; # Subroutine returns to here.<br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ...<br>
        RSUBROU &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; # Variable to hold
        SUBROU's return address.<br>
        SUBROU&nbsp; STO&nbsp;&nbsp;&nbsp; RSUBROU&nbsp;&nbsp; # Enter
        SUBROU, store return address.<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        ...&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Do stuff inside of SUBROU.<br>
        &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; HOP&nbsp;&nbsp;&nbsp;
        RSUBROU&nbsp;&nbsp; # Return from SUBROU.<br>
      </span><br>
    </div>
    There are several HOP constants used here ("<span
      style="font-family: Courier New,Courier,monospace;">(SUBROU)</span>"
    and "<span style="font-family: Courier New,Courier,monospace;">(RETADR)</span>"),
but
    the assembler creates them transparently, and the programmer
    doesn't have to know about them unless he suddenly finds himself
    out of memory.&nbsp; In this example, <span style="font-family:
      Courier New,Courier,monospace;">RSUBROU</span> also
    holds a HOP constant, but is neverthless just a normal variable
    that hasn't been handled in any special way by the
    assembler.&nbsp; (A construct like "<span style="font-family:
      Courier New,Courier,monospace;">CLA *+2</span>"
    seems like it would be useful here, since it would have
    eliminated the need to explicitly define the symbol <span
      style="font-family: Courier New,Courier,monospace;">RETADR</span>.
    But
    the OBC developers haven't mentioned doing anything like that, so
    I haven't bothered to implement it.&nbsp; This makes sense in
    light of the Math Flow diagrams from which the code was created,
    because they include the detail of setting up the return
    addresses.&nbsp; Hence to conform to the Math Flow, the coders
    would have explicitly set up the return addresses anyway.)<br>
    <br>
    I suppose I should make it clear that I'm not honestly sure that
    the original OBC assembler worked in this way.&nbsp; But multiple
    OBC developers have made it clear to me that this is the way they
    recall handling subroutines, even though the explanation of why
    it was <span style="font-style: italic;">legal</span> to do so
    (in light of the contradictory machine-code characteristics) has
    been lost in the ensuing decades.&nbsp; So I see little
    alternative to supposing that the original assembler did indeed
    have a similar feature.<br>
    <br>
    Before leaving the subject of subroutines, let me just briefly
    return to the list of existing subroutines on pages 21-24 the
    <a href="Documents/GeminiProgrammingManual.pdf">
      Gemini Programming Manual</a> that I mentioned earlier.&nbsp; One
    of the most important subroutines is <span style="font-family:
      Courier New,Courier,monospace;">I/O</span>, which
    seems to be rather mysterious and we're unfortunately told little
    about it; it appears to be an exception in that no return address
    was supposed to be supplied to it.&nbsp; The most complete
    information is available for the subroutines listed on page 22 of
    the manual, since for those routines there's actually some
    documentation about how to set up the inputs and how to fetch the
    outputs of the subroutines.&nbsp; I've collected a little
    additional information on some of those routines not covered by
    the manual, and will present that info here just for the sake of
    completeness:<br>
    <ul>
      <li><span style="font-family: Courier New,Courier,monospace;">ROOTSUM</span>
        computed the square root of the squares of its two
        arguments.</li>
      <li><span style="font-family: Courier New,Courier,monospace;">SQROOT</span>
        seemingly accepted its input in the variable <span
          style="font-family: Courier New,Courier,monospace;">ALPHA1</span>
        and
        output the square root in variable <span style="font-family:
          Courier New,Courier,monospace;">ALPHA3</span>.&nbsp;
        The input variable <span style="font-family: Courier
          New,Courier,monospace;">ALPHA2</span> was
        a first guess at the result, to speed up the
        computation.<br>
      </li>
      <li><span style="font-family: Courier New,Courier,monospace;">SINCOS</span>,
        listed in the manual as "SIN COS" is a single routine that
        returns both the sine and cosine.&nbsp; The input was in units
        of degrees.<br>
      </li>
      <li><span style="font-family: Courier New,Courier,monospace;">ATANGM</span>,
        computed the arctangent, <span style="font-style: italic;">probably</span>
        of the ratio <span style="font-family: Courier
          New,Courier,monospace;">GAMMA1</span>/<span
          style="font-family: Courier New,Courier,monospace;">GAMMA2</span>
        of the input variables.&nbsp; The output is thought to be in
        units of radians.<br>
      </li>
      <li>There was also a routine to compute the tangent, even
        though it's missing from the tables.</li>
      <li><span style="font-family: Courier New,Courier,monospace;">LOG</span>
        is the
        base 10 logarithm.<br>
      </li>
    </ul>
    Sadly, I'm not aware of what most of the other routines
    actually did.&nbsp; Though not a subroutine as such, the code
    identified as the "Executer" was very important and deserves some
    special attention.&nbsp; Also known as <big><font><font size="2"
          color="black"><big>the executive program (commonly called Hard
            Core), it was assigned to sector 00 and contained
            code&nbsp;common to all mode programs</big></font></font></big><big><font><font
          size="2" color="black"><big>(Pre-Launch, Ascent,
            Catch-up, Rendezvous,
            Re-entry)</big></font></font></big><big><font><font size="2"
          color="black"><big>, such as:<br>
          </big></font></font></big>
    <ul>
      <li><big><font><font size="2" color="black"><big>resetting
                discrete outputs</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>reading time
                programs</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>subroutines</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>timing
                programs</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>go-nogo-go
                routine</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>setting
                computer malfunction light</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>AGE
                routine</big></font></font></big></li>
      <li><big><font><font size="2" color="black"><big>logic to jump
                to the mode programs<br>
              </big></font></font></big></li>
    </ul>
    <big><font><font size="2" color="black"><big>The Executer
            and whatever mode program happened to be active functioned
            somewhat like coroutines.&nbsp; After each pass through a
            mode
            program, there was always a return to the beginning of
            the&nbsp;executive program, where the discrete outputs were
            set,
            time was read again, and so forth.&nbsp; After the Executer
            pass,
            control was passed back to the mode program again, and this
            process of cycling back and forth between the Executor and
            the
            mode program continued.<br>
            <br>
          </big></font></font></big> There's also a little information
    available on placement of some of these subroutines (and other
    programs) in memory ... though, other than the Executer and MDIU
    programs, I'm told that the placement of the various subprograms
    in memory may not have been terribly important.&nbsp; As of early
    1963, prior to the ATM and in-flight swapping of programs in and
    out of memory, the following is known about memory placement
    (thanks to notes by Alden Minnick):<br>
    <br>
    <table summary="" style="text-align: left; margin-left: auto;
      margin-right: auto;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top; text-align: center;">
            Program<br>
          </th>
          <th style="vertical-align: top; text-align: center;">
            Starting address<br>
          </th>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            Rendezvous<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            01-2-007 ... but I've also been told 02-2-105, 01-2-105,
            06-2-007, 03-2-306.<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">Catch
            Up<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            01-2-105<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            Reentry<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            06-2-000<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">Sin
            Cos<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            05-2-000<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">Square
            root, Arcsine<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            05-2-325 ... but I've also been told 05-2-000<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            MDIU<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            11-0-060<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">Ascent
            Guidance<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            13-2-002<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            Executor<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            00-0-000<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            Standby<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            00-1-023<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    But I suspect these allocations changed a lot after that as, for
    example, I'm also told that at some point the MDIU was assigned
    to sector 17 (octal) rather than 11 (octal).<br>
    <h3><a name="Telemetry" id="Telemetry"></a>Telemetry<br>
    </h3>
    <h4><a name="Uplink" id="Uplink"></a>Uplink<br>
    </h4>
    It was
    possible to digitally uplink data from ground control to the OBC,
    via the Digital Command System (DCS).&nbsp; The procedure for
    fetching a single word from the DCS is as follows:<br>
    <ol>
      <li>Poll <span style="font-family: courier
          new,courier,monospace;">CLD06</span> at
        intervals of 50 ms. or less to determine if data is
        ready.<br>
      </li>
      <li>When data is ready:</li>
      <ol style="list-style-type: lower-alpha;">
        <li><span style="font-family: courier new,courier,monospace;">PRO01</span>
          to
          tell the enable the DCS to send the data.</li>
        <li><span style="font-family: courier new,courier,monospace;">PRO00</span>
          to
          fetch the 24-bit data word into the accumulator bits
          M1-M24.<br>
        </li>
      </ol>
    </ol>
    In the fetched word, bits M1-M18 contain a data value, while
    bits M19-M24 contain an address in the range 000-077.&nbsp; The
    flight software is expected to store the data at the specified
    address.<br>
    <br>
    The obvious limitations here are that full 26-bit data words are
    not provided and that the address-range covered is limited.&nbsp;
    As a variation, there is an "extended" protocol that transmits
    word pairs rather than single words.&nbsp; The extended protocol
    allows 26-bit data words and slightly extends the covered address
    range.&nbsp; It works as follows:<br>
    <ul>
      <li>Consecutive command words are transmitted to address 20
        followed by address 21.&nbsp;&nbsp;</li>
      <li>Rather than writing to either address 20 or 21, the two
        18-bit data fields are combined into a 36-bit structure.</li>
      <li>A full 26-bit data field and up to 10 address bits can be
        extracted from the 36-bit structure.&nbsp; The locations of
        these fields are TBD.<br>
      </li>
      <li>The 26-bit data is actually written to the 10-bit address,
        if the 10-bit address was in the range 000-117 octal.</li>
    </ul>
    <h4><a name="Downlink" id="Downlink"></a>Downlink</h4>
    Conversely,
    telemetry data could be digitally downlinked from the OBC to
    ground control.&nbsp; The flight software output 21 data words to
    the Instrumentation System (IS) for downlinking every 2.4
    seconds.&nbsp; The flight software would snapshot the values of
    21 memory locations (dependent on the operational mode) into a
    memory buffer, and then to output the contents of that buffer for
    transmission.&nbsp; Specifically, the way it works is that:<br>
    <ol>
      <li><span style="font-family: courier new,courier,monospace;">CLD07</span>
        is
        polled at 50 ms. or less intervals.&nbsp; When it becomes
        active (accumulator negative), the steps below are taken.</li>
      <li><span style="font-family: courier new,courier,monospace;">CLD12</span>
        is
        tested.</li>
      <ul>
        <li>If the accumulator is negative, then the software should
          snapshot the mode-dependent 21 memory locations into the
          buffer and output the first buffer word with a <span
            style="font-family: courier new,courier,monospace;">PRO10</span>
          instruction.</li>
        <li>If instead the accumulator positive or zero, then the
          software should output the next buffer word in sequence using
          a <span style="font-family: courier new,courier,monospace;">PRO10</span>
          instruction.</li>
      </ul>
    </ol>
    <h3><a name="Rendezvous_Radar" id="Rendezvous_Radar"></a>Rendezvous
      Radar</h3>
    For those spacecraft
    having a Rendezvous Radar, the following procedure is used to
    fetch data from it:<br>
    <ol>
      <li><span style="font-family: courier new,courier,monospace;">PRO63</span>
        is
        used to reset the radar's discrete input buffer.</li>
      <li><span style="font-family: courier new,courier,monospace;">PRO01</span>
        is
        used to tell the radar that the OBC wants data.</li>
      <li>Wait 20 ms.</li>
      <li>Test if data available using <span style="font-family:
          courier new,courier,monospace;">CLD00</span>.</li>
      <li>If data is ready (i.e., if accumulator is negative),
        perform a code-sequence like the following:</li>
    </ol>
    <div style="margin-left: 80px;"><span style="font-family: courier
        new,courier,monospace;">PRO00<br>
        STO&nbsp;&nbsp;&nbsp;&nbsp; RANGE&nbsp;&nbsp; # 15 BITS<br>
        PRO00<br>
        STO&nbsp;&nbsp;&nbsp;&nbsp; SINAZI&nbsp; # SINE OF AZIMUTH, 10
        BITS<br>
        PRO00<br>
        STO&nbsp;&nbsp;&nbsp;&nbsp; SINELEV # SINE OF ELEVATION, 10
        BITS<br>
      </span></div>
    <br>
    The Range data is positive (being a magnitude),&nbsp; and is
    stored in accumulator bits M8-M24.&nbsp; The least-significant
    bit (M25) is thus not used.&nbsp; If M8-M11, the 4
    most-significant bits, are all 1, then the data should be
    discarded.&nbsp; The two sine values are stored in M15-M24.<br>
    <h3><a name="Aerospace_Ground_Equipment_AGE"
        id="Aerospace_Ground_Equipment_AGE"></a>Aerospace Ground
      Equipment
      (AGE)</h3>
    The AGE provides a dedicated data link from the OBC to
    (as implied by the name) aerospace ground equipment, and provides
    a way of performing tests or other diagnostic activities by
    connecting special equipment.&nbsp; The technique of reading a
    word from the AGE is as follows:<br>
    <ol>
      <li>Poll <span style="font-family: courier
          new,courier,monospace;">CLD32</span>
        until active (accumulator negative).</li>
      <li>Fetch an 18-bit word by repeating the following 18
        times:</li>
      <ol style="list-style-type: lower-alpha;">
        <li><span style="font-family: courier new,courier,monospace;">PRO23</span>
          with accumulator negative.&nbsp; (Starts a pulse on the AGE
          data clock.)</li>
        <li>Wait 2.5 ms.</li>
        <li><span style="font-family: courier new,courier,monospace;">PRO23</span>
          with accumulator positive or zero.&nbsp; (Ends the clock
          pulse.)</li>
        <li>Wait 1.5 ms.</li>
        <li><span style="font-family: courier new,courier,monospace;">CLD27</span>.&nbsp;
(Reads
          the data bit.)</li>
        <li>Wait 1.5 ms.<br>
        </li>
      </ol>
    </ol>
    Assuming that what the software does with this data is to
    pack it into bits M1-M18 of a data word, with the first bit read
    going into M1 and so forth, M4-M1 will contain an operation code.
    The operation-code bits specify the requested operation as
    follows:<br>
    <br>
    <table summary="" style="margin-left: auto; margin-right: auto;
      text-align: left;" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th colspan="4" rowspan="1" style="vertical-align: top;
            text-align: center;">Mode
            Bits<br>
          </th>
          <th colspan="1" rowspan="2" style="vertical-align: bottom;
            text-align: center;">Mode<br>
          </th>
        </tr>
        <tr>
          <th style="vertical-align: top; text-align: center;">
            M4<br>
          </th>
          <th style="vertical-align: top; text-align: center;">
            M3<br>
          </th>
          <th style="vertical-align: top; text-align: center;">
            M2<br>
          </th>
          <th style="vertical-align: top; text-align: center;">
            M1<br>
          </th>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: left;">
            None<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: bottom; text-align: left;">Read
            words from memory.&nbsp; (See below.)<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set
            marginal early.&nbsp; The software should use <span
              style="font-family: courier new,courier,monospace;">PRO60</span>
            to enable the "marginal early" memory-accessing
            mode.<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set
            computer malfunction on.&nbsp; The software should use
            <span style="font-family: courier new,courier,monospace;">PRO34</span>
            to turn the MALF light on.&nbsp; (It's unclear how the MALF
            light gets turned off.&nbsp; Probably the astronaut is
            supposed to do it manually by pressing the RESET button on
            the <a href="#PCDP">PCDP</a>.)<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set
            marginal late.&nbsp; The software should use <span
              style="font-family: courier new,courier,monospace;">PRO60</span>
            to disable the "marginal early" memory-accessing mode.</td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set
            pitch ladder output.&nbsp; (See below.)<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set yaw
            ladder output.&nbsp; (See below.)</td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set roll
            ladder output.&nbsp; (See below.)</td>
        </tr>
        <tr>
          <td style="vertical-align: top; text-align: center;">
            1<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: center;">
            0<br>
          </td>
          <td style="vertical-align: top; text-align: left;">Set all
            ladder outputs.&nbsp; (See below.)</td>
        </tr>
      </tbody>
    </table>
    <br>
    As you can see, one of these commands causes a memory word to be
    read and reported back through the interface, while the others
    are supposed to trigger the OBC software to perform some
    operation.<br>
    <br>
    When data is being read back (operation 0001), the data word read
    from the AGE link is interpreted as follows:&nbsp; M5-M12 will
    contain a data address (A1-A8), M13 (A9) will contain a bit
    related to AGE internal clock pulse timing, M14-M17 will identify
    the sector (S1-S4) of the requested data, and S5 will identify
    the syllable of the requested data.&nbsp; (By selecting S5=0, the
    data is taken from syllables 0,1.&nbsp; By selecting S5=1, the
    data is taken from syllable 2 with an implied but fictitious
    syllable 3 that is entirely 0.)&nbsp; The first bit transmitted
    is the most-significant bit of higher selected syllable and the
    last bit transmitted is the least-significant bit of lower
    selected syllable.&nbsp; The actual transmission technique is to
    repeat the following 26 times, in most-significant to
    least-significant bit order:<br>
    <ol>
      <li>Load the accumulator so that the bit to be sent is the sign
        bit.</li>
      <li><span style="font-family: courier new,courier,monospace;">PRO22</span>
        to
        output the bit.</li>
      <li>Wait 2.5 ms.</li>
      <li><span style="font-family: courier new,courier,monospace;">PRO23</span>
        with
        accumulator negative.&nbsp; (Start AGE data clock pulse.)</li>
      <li>Wait 2 ms.</li>
      <li><span style="font-family: courier new,courier,monospace;">PRO23</span>
        with
        accumulator positive or zero.&nbsp; (End clock pulse.)</li>
      <li>Wait 2 ms.</li>
      <li><span style="font-family: courier new,courier,monospace;">PRO22</span>
        with
        acculator positive or zero.&nbsp; (Put AGE datalink line back
        to its normal resting state.)</li>
      <li>Wait 1 ms.</li>
    </ol>
    (The manual states that specifically that "there is a delay
    of 4.5 ms. between resetting clock 18 and setting clock
    19".&nbsp; I cannot fathom any meaning in this statement, so I
    simply report it as written.)<br>
    <br>
    As far as the "Set XXX ladder outputs" operations are concerned
    (0101, 0110, 0111, and 1000), the data word read from the AGE is
    interpreted as a sign bit at M18 and a 6-bit data word (D1-D6) at
    M12-M17.&nbsp; What is done with this data is TBD.<br>
    <h3><a name="Time_Reference_System_TRS"
        id="Time_Reference_System_TRS"></a>Time Reference System
      (TRS)</h3>
    The Time Reference System (TRS) keeps track of elapsed
    time from lift-off, and provides count-down times to retrograde
    and to equipment reset.&nbsp; It counts in 1/8-second
    increments.&nbsp; The timings being tracked can be transferred to
    the OBC or set from the OBC, and they can be set by other means
    such as manual entry and digital uplink from the ground.<br>
    <br>
    The TRS can be accessed by the OBC in one of two modes:&nbsp;
    "readout mode", which is activated by <span style="font-family:
      Courier New,Courier,monospace;">PRO21</span> with
    the accumulator negative, and "enter mode", which is activated by
    <span style="font-family: Courier New,Courier,monospace;">PRO21</span>
    with
    the accumulator positive or zero.&nbsp; In readout mode, the
    elapsed time (ET), the time until retrograde (T<sub>R</sub>) or
    the time until equipment reset (T<sub>X</sub>) is transferred
    from the OBC to the TRS.&nbsp; In enter mode, the transfer is
    instead from the TRS to the OBC.&nbsp; If T<sub>R</sub> reaches
    zero, then a discrete from the TRS which can be read with
    <span style="font-family: Courier New,Courier,monospace;">CLD05</span>
    becomes active, and the software is generally expected to poll
    this discrete so that it can know when to begin retrograde.<br>
    <br>
    The TRS has three internal 24-bit counter-buffers in which times
    are counting upward or downward, and a separate 24-bit buffer
    used to transfer data to/from the OBC.&nbsp;<br>
    <br>
    In order to make sense of the procedures documented in the
    familiarization manual, the <span style="font-family: Courier
      New,Courier,monospace;">PRO21</span>
    instruction must have some unusual behavior, such as the
    following:<br>
    <ul>
      <li>It places the accumulator's M25 bit onto the output line to
        the TRS.</li>
      <li>It places the signal from the input line from the TRS into
        the accumulator's M1 bit.</li>
      <li>It generates a clock pulse for the TRS.<br>
      </li>
    </ul>
    <h4>Readout Mode</h4>
    Here's how the OBC can write data to the
    TRS.<br>
    <ol>
      <li><span style="font-family: Courier New,Courier,monospace;">PRO21</span>
        with
        accumulator negative to select readout mode.</li>
      <li>Load the accumulator with 24-bit data for the TRS.&nbsp;
        The data should be in accumulator bits M2-M25.</li>
      <li>Repeat the following 24 times:</li>
      <ol style="list-style-type: lower-alpha;">
        <li><span style="font-family: Courier New,Courier,monospace;">PRO20</span>
          to
          output accumulator's M1 to the TRS.</li>
        <li><span style="font-family: Courier New,Courier,monospace;">SHR1</span>
          to
          discard M1 from the accumulator and move the other
          accumulator bits downward.</li>
      </ol>
      <li>With the accumulator negative use (only) one of
        <span style="font-family: Courier New,Courier,monospace;">PRO14</span>,
        <span style="font-family: Courier New,Courier,monospace;">PRO65</span>,
        or
        <span style="font-family: Courier New,Courier,monospace;">PRO25</span>
        to
        strobe the TRS transfer buffer into one its ET, T<sub>R</sub>,
        or T<sub>X</sub> counter, respectively.</li>
      <li>Delay 9-15 ms.</li>
      <li>Use the same <span style="font-family: Courier
          New,Courier,monospace;">PRO</span>
        instruction from step 4, but with the accumulator zero or
        positive.<br>
      </li>
    </ol>
    <h4>Enter Mode</h4>
    Here's how the OBC can read data from the
    TRS.<br>
    <ol>
      <li><span style="font-family: Courier New,Courier,monospace;">PRO21</span>
        with
        accumulator zero or positive to select enter mode.</li>
      <li>With the accumulator negative use (only) one of
        <span style="font-family: Courier New,Courier,monospace;">PRO14</span>,
        <span style="font-family: Courier New,Courier,monospace;">PRO65</span>,
        or
        <span style="font-family: Courier New,Courier,monospace;">PRO25</span>
        to
        load the TRS ET, T<sub>R</sub>, or T<sub>X</sub> counter value,
        respectively, into its transfer buffer.</li>
      <li>Delay 9-15 ms.</li>
      <li>Use the same <span style="font-family: Courier
          New,Courier,monospace;">PRO</span>
        instruction from step 2, but with the accumulator positive or
        zero.<br>
      </li>
      <li>25 repetitions of the following steps.&nbsp; (Yes, that's
        25 repetitions, even though only 24 bits are
        involved.)<br>
      </li>
      <ol style="list-style-type: lower-alpha;">
        <li><span style="font-family: Courier New,Courier,monospace;">PRO20</span>
          to
          get the next bit from the TRS into the accumulator's M1
          bit.<br>
        </li>
        <li><span style="font-family: Courier New,Courier,monospace;">SHR1</span>
          to
          logically right-shift the accumulator by one place.<br>
        </li>
      </ol>
      <li>Notice that after the 25th step above, the first bit that
        was read will have been shifted out of the accumulator
        entirely, so only the bits from the 2nd through 25th reads will
        remain.<br>
      </li>
    </ol>
    <h3><a name="Auxiliary_Tape_Memory_ATM"
        id="Auxiliary_Tape_Memory_ATM"></a>Auxiliary Tape Memory
      (ATM)</h3>
    At some point in the evolution of the operational
    program, feature creep caused the size of the operational program
    to overrun the total amount of memory provided by the ferrite
    array.&nbsp; For Gemini VIII through XII, the approach taken was
    to modularize the software in a way that allowed it to be
    reloaded into the OBC during the mission with software that was
    specialized for the current phase of the mission.&nbsp; So even
    though we talk (for example) about the "software for Gemini X",
    the software for Gemini X was really several different programs
    that were loaded just during the mission phases in which they
    were used.&nbsp; The programs were stored in the <span
      style="font-weight: bold;">Auxiliary Tape Memory</span> (ATM) and
    then
    transferred to the OBC.&nbsp; The actual capacity of the tape was
    "over 85,000 thirteen-bit words", which is about 7 times the
    capacity of the ferrite array.&nbsp; I don't know exactly how
    long it took to load programs from the ATM into the OBC, but the
    total tape could be read in 67 minutes, so the maximum amount of
    time a program load could have taken would be about 10
    minutes.&nbsp; Since not all of the memory could be overwritten,
    and since syllable 2 of the 39-bit memory words couldn't be
    changed in flight anyway, the actual loads would have taken less
    time, and is estimated at about 7 minutes.<br>
    <br>
    Loading software from the ATM into the OBC is actually a software
    operation rather than a hardware-only operation, so it requires
    that some software—namely, the software that does the software
    loading—remain always in the OBC without being overwritten.&nbsp;
    That invariant portion of the software is known as "Module
    I".&nbsp; There were six modules in all, and I've already
    <a href="#Evolution_of_the_Flight_Software">described them
      above</a>.<br>
    <br>
    I can't tell you (yet) how many separate software loads occurred
    during the missions, nor which modules were loaded during these
    loads, but that is probably information we can find or deduce at
    some point in the future.&nbsp; I believe, however, that loads
    occurred during the pre-launch phase after diagnostics had been
    completed, in orbit prior to rendezvous, and after rendezvous but
    prior to re-entry.<br>
    <br>
    <img style="width: 295px; height: 212px;" alt=""
      src="GeminiPanelATM.png" width="295" height="212" align="right">The
documentation
    does not precisely describe how data is read from
    the ATM.&nbsp; But the following is my best guess as to how the
    actual OBC/ATM inteface works.&nbsp;<br>
    <br>
    Various of the <span style="font-family: Courier
      New,Courier,monospace;">PRO</span>/<span style="font-family:
      Courier New,Courier,monospace;">CLD</span>
    instructions mentioned below are repurposed from interfacing to
    other peripherals like the TRS.&nbsp; The image at right, showing
    the pilot controls for the ATM, came from the <a
      href="Documents/Gemini12MissionReport.pdf">
      Gemini XII Mission Report</a>. (I was obliged to replace all of
    the text to make it legible for presentation here.)&nbsp; In the
    AUTO mode, it appears as though data could be written to the tape
    using the <a href="#Aerospace_Ground_Equipment_AGE">Aerospace
      Ground Equipment</a> (AGE), but only the STDBY, REWIND, WIND, and
    PROG modes seem to have been useful during the mission.&nbsp;<br>
    <ul>
      <li>The position of the ATM mode switch can be read by
        combining the two bits from <span style="font-family: Courier
          New,Courier,monospace;">CLD14</span> and
        <span style="font-family: Courier New,Courier,monospace;">CLD15</span>.&nbsp;
I
        <span style="font-style: italic;">assume</span> that being in
        STDY or not is what affects the repurposing of the <span
          style="font-family: Courier New,Courier,monospace;">PRO</span>/<span
          style="font-family: Courier New,Courier,monospace;">CLD</span>
        instructions I mentioned earlier and that the remaining 4
        positions are what is reported as the mode.&nbsp; I don't know
        what numerical codes are associated with which modes.<br>
      </li>
      <li>The ATM is commanded by the computer to wind (fast
        forward), rewind, or to stop winding/rewinding with the
        <span style="font-family: Courier New,Courier,monospace;">PRO15</span>,
        <span style="font-family: Courier New,Courier,monospace;">PRO25</span>,
        or
        <span style="font-family: Courier New,Courier,monospace;">PRO14</span>
        instructions, respectively, on the basis of the positioning of
        the ATM mode switch.&nbsp; Wind and rewind occur at about 12
        inches per second, whereas reading or writing occurs at 1.5
        inches per second.<br>
      </li>
      <li>The ATM is commanded to verify/reprogram (i.e., to output
        actual data or, I assume, to pause playback) with the
        <span style="font-family: Courier New,Courier,monospace;">PRO44</span>
        instruction.</li>
      <li><span style="font-family: Courier New,Courier,monospace;">CLD33</span>
        is
        used to determine that the ATM has reached the proper speed for
        reading (or writing) data from (to) it, and become active
        roughly 5 seconds after the tape drive has been set in
        motion.<br>
      </li>
      <li>When the ATM is outputting data, the data is provided in
        3-bit frames at a rate of 200 frames per second.</li>
      <li>A new 3-bit data frame is ready to be used when
        <span style="font-family: Courier New,Courier,monospace;">CLD41</span>
        becomes active.</li>
      <li>The 3-bit frame's data is retrieved using the commands
        <span style="font-family: Courier New,Courier,monospace;">CLD44</span>,
        <span style="font-family: Courier New,Courier,monospace;">CLD43</span>,
        and
        <span style="font-family: Courier New,Courier,monospace;">CLD35</span>
        to
        get the individual bits-positions of the frame.</li>
      <li>The end or beginning of the tape is detected with
        <span style="font-family: Courier New,Courier,monospace;">CLD34</span>.</li>
    </ul>
    The ERROR lamp seems to have been directly controlled from
    the ATM rather than from the OBC.&nbsp; The 3-bit data frames
    mentioned above were actually 4 bits each, with the 4th bit being
    a parity bit, so the ERROR lamp was lit when a parity error was
    detected.&nbsp; Moreover, the data was triply redundant as well,
    so a voter circuit could detect an error if there was a mismatch
    between the redundant data.&nbsp; Finally, the data checks occur
    even during wind/rewind operations, so the ERROR light can
    potentially be lit during those activities.&nbsp; On a similar
    note, it may have been possible to read data from the ATM during
    a tape wind/rewind operation, but I have no data on that
    subject.&nbsp; I believe that a <span style="font-family: Courier
      New,Courier,monospace;">PRO14</span> will
    extinguish the lamp if it is lit.&nbsp;<br>
    <br>
    The RUN lamp is also controlled directly by the ATM, and
    indicates that the tape is in motion; it lights 5 seconds after
    receiving any command that sets the tape in motion.&nbsp; It will
    be automatically extenguished if the beginning or end of the tape
    is reached.<br>
    <br>
    During an ATM search operation, the <a href="#IVI">IVI</a> was
    used to show the tape position (in 13-bit words) on the
    left/right display, and the module words on the fore/aft
    display.<br>
    <br>
    As far as how the data is actually encoded on the tape—i.e., how
    the 3-bit frames are recombined into 39-bit memory words, and
    where those words are placed in memory—I have, as of yet, found
    no clue in the documentation.
    <h2><a name="Gemini_Assembly_Language" id="Gemini_Assembly_Language"></a>OBC
      Assembly Language</h2>
    I've
    given a number of examples of OBC assembly-language above,
    particularly where describing the various CPU instructions, but
    I'd like to devote this section and its sub-sections to
    describing the assembly language and its syntax a little more
    generally.&nbsp; I'll try to describe the original language used
    by the OBC developers to the extent possible, but since no
    documentation of the language or the assembler other than the
    names of the instructions is known to survive, nor any examples
    of OBC assembly-language contemporary to Gemini, you can't assume
    that my description is completely correct.&nbsp;<br>
    <br>
    On the other hand, my information has been gleaned from a lot of
    communications with OBC developers, and by some rather extensive
    modern (2011) recreations of sample code by OBC developers.&nbsp;
    You can find the sample code here:<br>
    <ul>
      <li><a href="Documents/Alden.doc">Sample code
          by OBC programmer Alden Minnick</a></li>
      <li><a href="Documents/Charlie.doc">Sample
          code by OBC programmer Charlie Leist</a></li>
    </ul>
    This sample code was produced with the intent of showing the
    coding style that was employed, and was developed similarly to
    the way that the original OBC code was developed: namely, by
    "slavishly" duplicating the extremely detailed flowcharts known
    as the "math flow".&nbsp; (I got the description "slavish" here
    from OBC developer Don O'Neill, who was in charge of the
    assembler program.)&nbsp; So I think that there's a pretty high
    degree of authenticity.&nbsp; On the other hand, you have to
    recognize that the sample code was developed 45 years after the
    end of Gemini, and that Alden and Charlie had (at the time of
    creating the samples) neither an assembler nor an OBC simulator,
    so you have to expect that there's going to be some degree of
    inconsistency and unavoidable error as well.&nbsp; Charlie has
    passed along the following additional brief notes that he wrote
    while creating his own code snippet that I think give a much
    fuller picture not merely of the production of the sample code,
    but of the method by which the original OBC software was produced
    ... not that all of the original developers necessarily worked
    the same way, of course!<br>
    <ul>
      <li><a href="Documents/GeminiCharlieLeistRulesForCodeSnippets.pdf">
          Some rules proposed prior to coding the samples</a>.</li>
      <li><a href="Documents/GeminiCharlieLeistCodeSnippetMethod.pdf">
          Explanation of the coding method</a>.</li>
      <li><span style="font-style: italic;">Design
          diagrams</span>.&nbsp; Charlie's sample code is supposed to be
        an implementation of page 7 of the <a
          href="Documents/GeminiOBC-MathFlow-III.pdf">
          1966 Catch-up &amp; Rendezvous Math Flow</a>.&nbsp; This was
        transformed into a <a
          href="Documents/GeminiLeistSampleCodeFlowchart.png">
          flowchart more-directly related to OBC assembly language</a>
        and a <a href="Documents/GeminiLeistSampleMemAssignments.pdf">
          memory-allocation table</a> as a preliminary to actual
        coding.<br>
      </li>
      <li><a href="Documents/CharliesReview.txt">Code
          review of Alden's code sample</a>.</li>
    </ul>
    Here also is a far briefer sample and explanation by Charlie
    of coding a simple formula in OBC assembly language:<br>
    <br>
    <table summary="" style="width: 80%; text-align: left; margin-left:
      auto; margin-right: auto;" cellspacing="2" cellpadding="2"
      border="1">
      <tbody>
        <tr>
          <td rowspan="1">
            <div><font size="2" color="black"
                face="arial,helvetica,sansserif"><span style="font-size:
                  10pt; font-family: Arial; color: black;">I
                  will start out with a simple equation like: Y=MX +
                  B</span></font><font size="2" color="black"
                face="arial,helvetica,sansserif"><span style="font-size:
                  10pt; font-family: Arial; color: black;">.
                  Here goes:<br>
                  <br>
                </span></font></div>
            <div><font size="2" color="black"
                face="arial,helvetica,sansserif"><span style="font-size:
                  10pt; font-family: Arial; color: black;">Lets
                  assume the numbers are small as that we won't have to
                  do any fixed point scaling.<br>
                  <br>
                </span></font></div>
            <div><font size="2" color="black"
                face="arial,helvetica,sansserif"><span style="font-size:
                  10pt; font-family: Arial; color: black;">Lets
                  define B as a constant with the decimal value of +3.
                  The 24 bit memory in binary word would be as. (0 00
                  000
                  000 000 000 000 000 011) There is no actual spaces
                  between the binary zeros - it makes it easier for me
                  count the bits and look at the sign bit! The sign bit
                  was the most significant bit while the the least
                  significant bit was the 1.<br>
                  <br>
                </span></font></div>
            <div><font size="2" color="black"
                face="arial,helvetica,sansserif"><span style="font-size:
                  10pt; font-family: Arial; color: black;">Lets
                  also assume the program is in sector (00) - in octal
                  (zero). There were 16 sectors in octal that you could
                  program in. To change sectors you had to execute a HOP
                  instruction.<br>
                  <br>
                </span></font></div>
            <small><span style="font-family: Arial;">The first
                bit of constant (+3) in memory is the sign bit of zero
                which repents a positive number, A negative number would
                have a 1 bit.<br>
                <br>
              </span></small>
            <div style="font-family: Arial;"></div>
            <div style="font-family: Arial;"><font size="2"
                color="black"><span style="font-size: 10pt; color:
                  black;">The Gemini symbolic
                  instructions on punch cards fed in to the Assembler
                  would look like this:<br>
                  <br>
                </span></font></div>
            <div style="margin-left: 40px; font-family: Courier
              New,Courier,monospace;"><font size="2" color="black"><span
                  style="font-size: 10pt; color: black;">CLA X &nbsp;
                  &nbsp;&nbsp;&nbsp; Variable Comment</span></font></div>
            <div style="margin-left: 40px; font-family: Courier
              New,Courier,monospace;"><font size="2" color="black"><span
                  style="font-size: 10pt; color: black;">MPY
                  M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Slope
                  Comment</span></font></div>
            <div style="margin-left: 40px; font-family: Courier
              New,Courier,monospace;"><font size="2" color="black"><span
                  style="font-size: 10pt; color: black;">SPQ Temp1
                  &nbsp; Store
                  the product in a memory location Temp1
                  comment</span></font></div>
            <div style="margin-left: 40px; font-family: Courier
              New,Courier,monospace;"><font size="2" color="black"><span
                  style="font-size: 10pt; color: black;">ADD
                  B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constant (+3)
                  comment</span></font></div>
            <div style="font-family: Courier New,Courier,monospace;">
              <div style="margin-left: 40px;"><font size="2"
                  color="black"><span style="font-size: 10pt; color:
                    black;">STO Y &nbsp; &nbsp;
                    &nbsp; Store result in Variable Y memory
                    location</span></font></div>
            </div>
          </td>
        </tr>
      </tbody>
    </table>
    <br>
    To a certain extent, I have tried to get around some of the
    problem of having no feedback for detecting coding errors by
    developing a <a href="#yaOBCASM_the_OBC_Cross-Assembler">recreated
      version of the OBC
      assembler, which I call <span style="font-weight: bold;">yaASM</span></a>,
    and <a href="#yaOBC_the_OBC_CPU_Emulation">an OBC CPU emulator,
      which I call
      <span style="font-weight: bold;">yaOBC</span></a>.&nbsp; At this
    point, these programs are very much works in progress, and I
    don't claim that they are fully debugged or even that they will
    run on your computer.&nbsp; For this reason, they have not made
    their way into the official Virtual AGC software source or binary
    distribution.&nbsp; But for now you can download the cutting-edge
    binaries from the <a href="#Downloads">temporary Gemini download
      section</a> on this page.<br>
    <br>
    Finally, before starting, let me note that in contemplating the
    original OBC assembly language, there was a small set of features
    which (from a modern standpoint) seem to be absolutely necessary
    to the language, but which don't seem to have existed originally;
    perhaps they truly existed in some form but have simply been
    forgotten over time.&nbsp; In those cases, I have taken the
    liberty of adding those features to <span style="font-weight:
      bold;">yaASM</span> and to the assembly-language
    syntax.&nbsp; In the description that follows, <span style="color:
      rgb(153, 51, 0);">I have color coded in this brown color
      any aspects of the language that seem to me to be newly-added and
      not to have existed in this exact form in the original OBC
      assembly language</span>.<br>
    <h3><a name="General_format" id="General_format"></a>General
      format</h3>
    The format of an individual line of code,
    corresponding to a single punch-card from the point of view of
    the original OBC developers or to a line of a source file from
    the current perspective, is<br>
    <br>
    <div style="text-align: center;"><span style="font-family: Courier
        New,Courier,monospace;">LHS
        OPERATOR OPERAND COMMENT</span><br>
    </div>
    <br>
    Note that these fields are not aligned on an particular column,
    and are simply separated by white space of any kind.&nbsp; The
    total number of characters in a line was originally limited to
    punch-card length (80 characters), as the assembler did not allow
    for continuation cards, <span style="color: rgb(153, 51, 0);">but
      the current assembler extends that limit to 132 characters.&nbsp;
      Moreover, since it's a little easier to compose source-code these
      days (without having to use punch-cards), with newly-written code
      I think it's nicer to align the columns attractively.</span><br>
    <ul>
      <li><span style="font-family: Courier New,Courier,monospace;">LHS</span>
        an
        optional symbolic name for the memory address at which the line
        of code or variable/constant allocation is located.&nbsp; (The
        reason I call this "<span style="font-family: Courier
          New,Courier,monospace;">LHS</span>" is
        that the OBC developers referred to the symbolic name for a
        location holding a CPU instruction as a "left-hand
        symbol".&nbsp; They didn't use that term for names of variables
        or constants, though for the purpose of describing syntax I'll
        symbolize all such things as <span style="font-family: Courier
          New,Courier,monospace;">LHS</span>.)
        <span style="font-family: Courier New,Courier,monospace;">LHS</span>
        is
        limited to <span style="color: rgb(153, 51, 0);">8 characters
          or less</span>, and may contain any character which is not
        white-space.&nbsp; I <span style="font-style: italic;">believe</span>
        that the original OBC
        assembler accepted only up to 6 characters, and I further
        believe that the original OBC developers conventionally used
        only upper-case characters and digits.&nbsp; <span
          style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
          style="color: rgb(153, 51, 0);">also treats all words
          defined by the language itself (</span><span style="color:
          rgb(153, 51, 0);">such as</span> <a style="color: rgb(153,
          51, 0);" href="Gemini.html#CPU_Instructions">opcodes</a><span
          style="color: rgb(153, 51, 0);">) as reserved, and doesn't
          allow</span> <span style="font-family: Courier
          New,Courier,monospace; color: rgb(153, 51, 0);">
          LHS</span> <span style="color: rgb(153, 51, 0);">to be a
          reserved word.</span></li>
      <li><span style="font-family: Courier New,Courier,monospace;">OPERATOR</span>
        is either an <a href="#CPU_Instructions">opcode</a> or else a
        <a href="#Pseudo-ops">pseudo-op</a>.<br>
      </li>
      <li>Not all instructions have an <span style="font-family:
          Courier New,Courier,monospace;">OPERAND</span>.&nbsp;
        Where required, though, the nature of <span style="font-family:
          Courier New,Courier,monospace;">OPERAND</span>
        differs by <span style="font-family: Courier
          New,Courier,monospace;">OPERATOR</span>
        type.&nbsp; The descriptions of the individual <span
          style="font-family: Courier New,Courier,monospace;">OPERATOR</span>
        types elsewhere on this page also list the allowed <span
          style="font-family: Courier New,Courier,monospace;">OPERAND</span>
        types for them.<br>
      </li>
      <li>The optional <span style="font-family: Courier
          New,Courier,monospace;">COMMENT</span> is
        any string of characters whatever.&nbsp; <span style="color:
          rgb(153, 51, 0);">It is unclear if the original
          assembler required the comment to be preceded by any special
          character, and</span> <span style="font-weight: bold; color:
          rgb(153, 51, 0);">yaASM</span><span style="color: rgb(153, 51,
          0);">does not require
          it.&nbsp; However, for convenience purposes,</span><span
          style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
          style="color: rgb(153, 51, 0);">does ignore any text from
          a '#' character to the end of line, and following this
          convention has the advantages both of allowing a full-line
          comment and of allowing the assembler to detect certain syntax
          errors that would otherwise be undetectable.&nbsp; In fact,
          for</span> <span style="font-weight: bold; color: rgb(153,
          51, 0);">yaASM</span><span style="color: rgb(153, 51, 0);">I
          arbitrarily disallow
          comments in without leading '#' in variable allocations since
          such comments would indistinguishable from misspelled</span><span
          style="font-family: Courier New,Courier,monospace; color:
          rgb(153, 51, 0);">
          OPERATOR</span><span style="color: rgb(153, 51, 0);">s.&nbsp;
          A
          full line containing only white-space is also treated as a
          comment.&nbsp; The following additional conventions related to
          comments are also useful, though not enforced in any
          way:</span></li>
      <ul style="color: rgb(153, 51, 0);">
        <li>A comment made by the developer of the code should be
          preceded by a single '#'.</li>
        <li>A comment made by a downstream editor of the code (such
          as the maintainer of this website) should be preceded by
          "##".</li>
      </ul>
    </ul>
    The original OBC developers, I told, formatted the code for
    submission to the assembler as follow:<br>
    <ol>
      <li>A list of all variables used, where a "variable" is the
        name a memory location whose value can be changed at
        runtime.&nbsp; In these lines, <span style="font-family:
          Courier New,Courier,monospace;">LHS</span> is
        present but <span style="font-family: Courier
          New,Courier,monospace;">OPERATOR</span>
        and <span style="font-family: Courier New,Courier,monospace;">OPERAND</span>
        are not.&nbsp; <span style="font-weight: bold; color: rgb(153,
          51, 0);">yaASM</span><span style="color: rgb(153, 51, 0);">treats
          such a line as an
          allocation for an uninitialized variable named</span><span
          style="font-family: Courier New,Courier,monospace; color:
          rgb(153, 51, 0);">
          LHS</span><span style="color: rgb(153, 51, 0);">, as the
          original OBC assembly language doesn't seem to have had any
          other method of making such an allocation.</span>&nbsp; I'm
        not
        sure, but I think that lines of the form "<span
          style="font-family: Courier New,Courier,monospace;">LHS SYN
          REFLHS
          COMMENT</span>" might be included in this section.</li>
      <li>A list of all constants used, where a "constant" is the
        name of a memory location assigned a value at
        assembly-time.&nbsp; They're not really "constant", though,
        since there's nothing to stop the runtime program from changing
        the values later.&nbsp; In modern terms, it's probably best to
        think of these as allocations of initialized variables.&nbsp;
        To my understanding, the OBC programmers used a naming
        convention in which if the name of the constant began with 'K',
        the program was not supposed to alter the value.&nbsp;
        (Interestingly, the original assembler did not have a concept
        of a symbolic constant that was used only at assembly time
        without corresponding to a memory location.&nbsp; The pseudo-op
        <span style="font-family: Courier New,Courier,monospace;">EQU</span>
        which
        would be used for that purpose in many current assembly
        languages is, in fact, used for something else.)&nbsp; In
        section, <span style="font-family: Courier
          New,Courier,monospace;">OPERATOR</span>
        is generally <span style="font-family: courier
          new,courier,monospace;">DEC</span>,
        <span style="font-family: courier new,courier,monospace;">OCT</span>,
        <span style="font-family: Courier New,Courier,monospace;">EQU</span>,
        <span style="color: rgb(153, 51, 0);">or</span> <span
          style="font-family: Courier New,Courier,monospace; color:
          rgb(153, 51, 0);">
          HOPC</span>.<br>
      </li>
      <li>Instructions.</li>
    </ol>
    <span style="color: rgb(153, 51, 0);"><span style="color: rgb(0, 0,
        0);">Curiously, I've been unable to ascertain
        how the original assembler was told what areas of memory were to
        be used for assembly of instructions or data.&nbsp; Perhaps each
        memory region was assembled separately, along with job-control
        directives giving the memory region, and all of the little
        pre-assembled chunks were merged together later into a single
        executable image.&nbsp;</span> At any rate, to overcome
      this</span><span style="color: rgb(153, 51, 0);">, I've found it
      necessary to invent my own syntax for such things.&nbsp;</span><span
      style="color: rgb(153, 51, 0);">The following directives
      for that purpose are completely new in</span> <span
      style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
      style="color: rgb(153, 51, 0);">and didn't exist in this
      form originally:</span><br style="color: rgb(153, 51, 0);">
    <br style="color: rgb(153, 51, 0);">
    <table summary="" style="text-align: left; width: 100%; color:
      rgb(153, 51, 0);" cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top;">Directive<br>
          </th>
          <th style="vertical-align: top;">Description<br>
          </th>
        </tr>
        <tr>
          <td style="vertical-align: top; font-family: Courier
            New,Courier,monospace;">
            HALF<br>
          </td>
          <td style="vertical-align: top;">Tells the assembler that
            the half-word memory access mode is in effect in following
            block of code.&nbsp; This remains in effect unti a
            <span style="font-family: Courier New,Courier,monospace;">NORM</span>
            directive is encountered.<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; font-family: Courier
            New,Courier,monospace;">
            NORM<br>
          </td>
          <td style="vertical-align: top;">Tells the assembler that
            the normal memory access mode is in effect in following
            block of code.&nbsp; This remains in effect unti a
            <span style="font-family: Courier New,Courier,monospace;">HALF</span>
            directive is encountered that overrides it.<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; font-family: Courier
            New,Courier,monospace; white-space: nowrap;">
            CODE <span style="font-style: italic;">M-PP-S-WWW</span><br>
          </td>
          <td style="vertical-align: top;">Tells the assembler that
            the next instruction encountered should be assembled at
            address <span style="font-style: italic; font-family:
              Courier New,Courier,monospace;">
              M-PP-S-WWW</span>, where <span style="font-style: italic;
              font-family: Courier New,Courier,monospace;">
              M</span> is the module,&nbsp; <span style="font-style:
              italic; font-family: Courier New,Courier,monospace;">
              PP</span> represents two octal digits giving the memory
            sector, <span style="font-style: italic; font-family:
              Courier New,Courier,monospace;">
              S</span> is the syllable, and <span style="font-style:
              italic; font-family: Courier New,Courier,monospace;">
              WWW</span> represents three octal digits giving the word
            number.&nbsp; The word number is incremented by the
            assembler on each successive instruction encountered, but
            assumptions about the selected sector and syllable are
            never changed until another <span style="font-family:
              Courier New,Courier,monospace;">CODE</span>
            directive is encountered.<br>
            <br>
            The concept of a "module" (<span style="font-family: Courier
              New,Courier,monospace; font-style: italic;">M</span>)
            is completely different in Gemini OBC vs. Apollo LVDC, and
            yet in some quirk of fate can be treated identically by the
            assembler.&nbsp; In OBC, the program modules (I, II, III,
            IV, V, and IV) can be loaded at runtime from the <a
              href="#Auxiliary_Tape_Memory_ATM">Auxiliary Tape Memory</a>,
            thus overlaying each other, although module I was intended
            to always be present.&nbsp; In LVDC, in contrast, there
            were up to 8 memory modules installed in the computer, each
            equivalent to 2/3 of the total OBC memory, and there was no
            ATM.&nbsp; But as far as the assembler is concerned, these
            two very different types of "modules" can each be treated
            simply as independent memory areas.&nbsp; To make the
            handling consistent, <span style="font-weight: bold;">yaASM</span>
            allows 8 modules numbered
            0-7 for either case.&nbsp; For OBC, module 0 corresponds to
            program module I, 1 corresponds to II, and so on.<br>
            <br>
            The discussion that follows pertains solely to the Gemini
            OBC.<br>
            <br>
            <span style="font-weight: bold;">yaASM</span> expects to
            assemble a complete set of program modules as a single
            operation, rather assembling the program modules separately
            and merging them afterward ... which, I gather, was the
            original procedure in Gemini itself.&nbsp; This makes it
            easier for all program modules to be aware of the same set
            of global variables. As a consequence of this feature,
            however, <span style="font-weight: bold;">yaASM</span>
            requires that progam modules do <span style="font-style:
              italic;">not</span> redefine left-hand symbols
            or variable/constant names from one module to the
            next.&nbsp; So (for example) if you had a variable named
            <span style="font-family: Courier New,Courier,monospace;">X</span>
            in
            module I, you couldn't define a different variable
            <span style="font-family: Courier New,Courier,monospace;">X</span>
            in
            module II, even though you could continue using
            <span style="font-family: Courier New,Courier,monospace;">X</span>
            from module I within module II, as long as module II hadn't
            actually overlaid the portion of module I where
            <span style="font-family: Courier New,Courier,monospace;">X</span>
            was defined.&nbsp; <span style="font-weight: bold;">yaASM</span>
            has no way of detecting
            runtime problems where code or data are accessed that
            aren't actually loaded, so it is the responsibility of the
            programmer to avoid it.&nbsp;<br>
            <br>
            One situation that may arise is that some memory location
            may be used as a variable with two different
            interpretations in two different modules, and therefore
            it's desirable to assign two different symbolic names to
            it.&nbsp; For example, we might desire a specific address
            to be the variable <span style="font-family: Courier
              New,Courier,monospace;">PHI</span> in
            module II and the variable <span style="font-family:
              Courier New,Courier,monospace;">EPSILON</span>
            in module III.&nbsp; Using multiple names for the same
            address causes no problems if module II and module III use
            the same region of memory and hence don't coexist.&nbsp; In
            this case, the <span style="font-family: Courier
              New,Courier,monospace;">SYN</span>
            pseudo-op could be used to define <span style="font-family:
              Courier New,Courier,monospace;">PHI</span>
            and <span style="font-family: Courier
              New,Courier,monospace;">EPSILON</span>
            as synonyms; module II would use only the symbol
            <span style="font-family: Courier New,Courier,monospace;">PHI</span>
            and module III would use only the symbol <span
              style="font-family: Courier New,Courier,monospace;">EPSILON</span>.&nbsp;
The
            same situation could occur with left-hand symbols as
            well; for example, if there were two modules for the exact
            same area of memory, and the entry points for both were at
            the same address, then two different left-hand symbols
            would refer to the same address but in two different
            modules.&nbsp; But generally in this latter situation, the
            left-hand symbols are all defined naturally just by
            assembling the code, and therefore no explicit <span
              style="font-family: Courier New,Courier,monospace;">SYN</span>
            is
            needed.<br>
          </td>
        </tr>
        <tr>
          <td style="vertical-align: top; font-family: Courier
            New,Courier,monospace; white-space: nowrap;">
            DATA <span style="font-style: italic;">M-PP-S-WWW</span><br>
          </td>
          <td style="vertical-align: top;">Tells the assembler that
            the next variable or constant declaration encountered
            should be assembled at address <span style="font-style:
              italic; font-family: Courier New,Courier,monospace;">
              M-PP-S-WWW</span>.&nbsp; See the <span
              style="font-family: Courier New,Courier,monospace;">CODE</span>
            directive for more detail.<br>
          </td>
        </tr>
      </tbody>
    </table>
    <br style="color: rgb(153, 51, 0);">
    <span style="color: rgb(153, 51, 0);">These directives, with
      whatever operands they may have, are expected to be placed on
      lines by themselves, without any left-hand-symbol or
      comment.&nbsp; However, any desired white-space can be added to
      make them look pretty.&nbsp;&nbsp; Note that <span
        style="font-family: Courier New,Courier,monospace;">CODE</span>
      and
      <span style="font-family: Courier New,Courier,monospace;">DATA</span>
      are
      completely separate and independent, so that they can logically
      be use together or separately.&nbsp; I'd think that the most
      normal usage, though, would be to issue both directives together,
      like so:<br style="color: rgb(153, 51, 0);">
      <br style="color: rgb(153, 51, 0);">
    </span>
    <div style="margin-left: 40px; color: rgb(153, 51, 0);"><span
        style="font-family: Courier New,Courier,monospace;">CODE
        <span style="font-style: italic;">M-PP</span>-2-000</span><br
        style="font-family: Courier New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">DATA
        <span style="font-style: italic;">M-PP</span>-0-000</span><br
        style="font-family: Courier New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">...
        <span style="font-style: italic;">all of the code, variables,
          and constants for sector PP</span> ...</span><br>
    </div>
    <span style="color: rgb(153, 51, 0);"><br style="color: rgb(153, 51,
        0);">
      Because of the existence of these directives,</span> <span
      style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
      style="color: rgb(153, 51, 0);">has no need to enforce the
      original-OBC division into sections (VARIABLE/CONSTANT/CODE)
      described earlier, and expects that variable- and
      constant-specifications can be intermixed at random with
      instructions.&nbsp; However, it is required that blocks of source
      code be preceded by the appropriate directives <span
        style="font-family: Courier New,Courier,monospace;">HALF/NORM/CODE/DATA</span>
      describing the memory being used.&nbsp; It's very important to
      understand that the directives only affect the assembler's
      assumptions, but don't have any effect at runtime.&nbsp; While
      the assembler can help to keep the assemble-time assumptions
      consistent with the runtime conditions, it's still possible for
      the programmer to fool the assembler and generate code that won't
      actually execute. For example, for HOP constants generated with
      HOPC, the runtime effect of a HOP will generally be consistent
      with the assembler's assumptions about memory use; for HOP
      constants generated instead by OCT, there's no such
      expectation.&nbsp; It's ultimately up to the programmer to insure
      consistency.</span><br style="color: rgb(153, 51, 0);">
    <br style="color: rgb(153, 51, 0);">
    <span style="color: rgb(153, 51, 0);">In order to allow
      relatively clean organization of source code, <span
        style="font-weight: bold;">yaASM</span> allows an OBC source
      file to
      include the complete contents of another OBC source file within
      it by placing the name, preceded by the character '$', by itself
      on a line, like so:<br>
      <br>
    </span>
    <div style="margin-left: 40px; color: rgb(153, 51, 0);"><span
        style="font-family: Courier New,Courier,monospace;">...</span><br
        style="font-family: Courier New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">$IncludeThisFile.obc</span><br
        style="font-family: Courier New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">...</span><br>
    </div>
    <br style="color: rgb(153, 51, 0);">
    <span style="color: rgb(153, 51, 0);">Multiple include-files can
      be used in a single source file, and include-files can include
      other files.&nbsp; This feature could be used, for example, to
      organize a program in terms of pages in its math-flow diagram by
      putting each page in a separate source file.</span>&nbsp;<br>
    <h3><a name="Shorthands_for_some_instructions_"
        id="Shorthands_for_some_instructions_"></a>Shorthands for some
      instructions<br>
    </h3>
    <table summary="" style="text-align: left; width: 100%;"
      cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top; font-weight: bold;">
            Shorthand<br>
          </th>
          <th style="vertical-align: top; font-weight: bold;">
            Description<br>
          </th>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            SHR 1<br>
          </td>
          <td style="vertical-align: middle;">Same as an <span
              style="font-family: courier new,courier,monospace;">SHF</span>
            with X=1, Y=2.</td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            SHR 2<br>
          </td>
          <td style="vertical-align: middle;">Same as an <span
              style="font-family: courier new,courier,monospace;">SHF</span>
            with X=0, Y=2.</td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            SHL 1<br>
          </td>
          <td style="vertical-align: middle;">Same as an <span
              style="font-family: courier new,courier,monospace;">SHF</span>
            with Y=3.&nbsp; The value of X doesn't matter in this case,
            but our assembler will use X=0.</td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            SHL 2<br>
          </td>
          <td style="vertical-align: middle;">Same as an <span
              style="font-family: courier new,courier,monospace;">SHF</span>
            with Y=4.&nbsp; The value of X doesn't matter in this case,
            but our assembler will use X=0.</td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            NOP<br>
          </td>
          <td style="vertical-align: middle;">A no-operation
            instruciton that simply advances to the next instruction in
            sequence.&nbsp; The assembler translates this to
            "<span style="font-family: courier new,courier,monospace;">TRA
              *+1</span>".&nbsp; The existence of <span
              style="font-family: courier new,courier,monospace;">NOP</span>.</td>
        </tr>
      </tbody>
    </table>
    <br>
    In discussions or in documentation you'll often see references to
    things like "SHR1" or "PRO43" — in other words, to things that
    <span style="font-style: italic;">look like</span> <span
      style="font-family: Courier New,Courier,monospace;">SHR</span>,
    <span style="font-family: Courier New,Courier,monospace;">SHL</span>,
    <span style="font-family: Courier New,Courier,monospace;">SHF</span>,
    <span style="font-family: Courier New,Courier,monospace;">PRO</span>,
    or
    <span style="font-family: Courier New,Courier,monospace;">CLD</span>
    instructions+operands, but without any space between the operator
    and operand.&nbsp; Indeed, you'll find references like that on
    this web page.&nbsp; <span style="color: rgb(153, 51, 0);">It
      remains unclear to me whether the original OBC assembler accepted
      constructs of this kind, but the</span> <span style="font-weight:
      bold; color: rgb(153, 51, 0);">yaASM</span><span style="color:
      rgb(153, 51, 0);">assembler does not:</span><span
      style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
      style="color: rgb(153, 51, 0);">expects the instruction and
      operand to be delimited by space(s) in all these
      cases.</span><span style="color: rgb(153, 51, 0);">&nbsp;
      Until/unless actual OBC source code is found so that it can be
      fed into the assembler, the point is (of course) not of
      overwhelming concern.</span><br>
    <h3><a name="Pseudo-ops" id="Pseudo-ops"></a>Pseudo-ops</h3>
    <table summary="" style="text-align: left; width: 100%;"
      cellspacing="2" cellpadding="2" border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top; font-weight: bold;">
            Pseudo-op<br>
          </th>
          <th style="vertical-align: top; font-weight: bold;">
            Description<br>
          </th>
          <th style="vertical-align: top; font-weight: bold;">
            Example<br>
          </th>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            DEC<br>
          </td>
          <td style="vertical-align: middle;">Assembles a decimal
            constant into memory.&nbsp; It can assemble either integer
            values or else fractional values.&nbsp; The allowed range
            of values is -33554432≤<i>Operand</i>≤+33554431.&nbsp; As
            with all data, in normal mode the data was stored in
            syllables 0,1, while in half-word mode it was stored in
            syllable 2.<br>
            <br>
            If the literal decimal constant is an integer (i.e., if it
            has no decimal point in it), then it is converted much as
            you might expect: for example, a decimal 3 is stored as a
            binary 11.&nbsp;<br>
            <br>
            But in converting fractional values in which the literal
            decimal constant contains a decimal point, the value is
            auto-scaled by whatever power-of-2 is required to make the
            most-significant data bit (other than the sign) 1; in other
            words, the value is left-shifted to maximally fill the
            range -1.0&lt;<span style="font-style: italic;">ScaledOperand</span>&lt;+1.0.&nbsp;
There
            is no convention for storing values in memory with
            the binary point at any location other than fully to the
            left or fully to the right of all the bits; it's up to the
            programmer to understand these conventions and explicitly
            apply scaling to deal with it as the computation
            progresses.<br>
            <br>
          </td>
          <td style="vertical-align: middle; font-family: courier
            new,courier,monospace; white-space: nowrap;"><small>ANINT
              DEC -12345678<br>
              PI DEC 3.14159<br>
            </small></td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;
            vertical-align: middle;">
            OCT<br>
          </td>
          <td style="vertical-align: middle;">Assembles an octal
            constant into memory.&nbsp; Its operand is a set of octal
            digits.&nbsp; The allowed range of values is 0 to
            377777777.&nbsp; As with all data, in normal mode the data
            was stored in syllables 0,1, while in half-word mode it was
            stored in syllable 2.&nbsp;</td>
          <td style="vertical-align: middle; font-family: courier
            new,courier,monospace; white-space: nowrap;"><small>ANOCT
              OCT 1234567<br>
            </small></td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;"><big><span
                style="font-family: Courier New,Courier,monospace;">SYN</span><br>
            </big></td>
          <td style="vertical-align: top;">Creates a symbol referring
            to the same memory address as a different symbol ... i.e.,
            causes symbols to be synonyms for each other.&nbsp; This is
            useful in cases where different programs which never run
            simultaneously are sharing the same memory locations for
            variable storage. Since the different programs would have
            different interpretations for these same memory locations,
            they'd naturally want to assign different symbolic names to
            them. (I believe that the OBC programmers referred to such
            variables as "timeshared" variables.)&nbsp; <span
              style="color: rgb(153, 51, 0);">In</span> <span
              style="font-weight: bold; color: rgb(153, 51, 0);">yaASM</span><span
              style="color: rgb(153, 51, 0);">,</span><span
              style="font-family: Courier New,Courier,monospace; color:
              rgb(153, 51, 0);">
              SYN</span> <span style="color: rgb(153, 51, 0);">can be
              used to create a synonym for instruction left-hand-symbols
              as well, though I'm not sure if that feature was present
              in
              the original assembler or would have had any use
              there.</span><br>
          </td>
          <td style="font-family: Courier New,Courier,monospace;"><small>A
              SYN B<br>
            </small></td>
        </tr>
        <tr>
          <td style="font-family: Courier New,Courier,monospace;"><big>EQU<br>
            </big></td>
          <td style="vertical-align: top;">Creates a variable having
            the same initial value as a different variable (presumably
            created by <span style="font-family: Courier
              New,Courier,monospace;">OCT</span> or
            <span style="font-family: Courier New,Courier,monospace;">DEC</span>).&nbsp;
In
            the example shown at right, two variables (<span
              style="font-family: Courier New,Courier,monospace;">A</span>
            and
            <span style="font-family: Courier New,Courier,monospace;">B</span>)
            are
            allocated, each having the same initial value of 21, but
            they're at two different memory locations and may have
            different values later in the program's execution.<br>
          </td>
          <td style="font-family: Courier New,Courier,monospace;"><small>A
              DEC 21<br>
              B EQU A<br>
            </small></td>
        </tr>
        <tr>
          <td style="color: rgb(153, 51, 0);"><span style="font-family:
              Courier New,Courier,monospace;">HOPC</span><br>
          </td>
          <td style="vertical-align: top; color: rgb(153, 51, 0);">
            Creates a HOP constant from an existing left-hand symbol
            for an instruction.&nbsp; The constant is stored in the
            currently-active <span style="font-family: Courier
              New,Courier,monospace;">DATA</span>
            section at the position where the <span style="font-family:
              Courier New,Courier,monospace;">HOPC</span>
            pseudo-op is encountered, but the constant itself is
            constructed using the <span style="font-family: Courier
              New,Courier,monospace;">CODE</span>
            and <span style="font-family: Courier
              New,Courier,monospace;">HALF/NORM</span>
            settings which exist at the location of the left-hand
            symbol being targeted, which is exactly what's required to
            make the constant usable.&nbsp; It's possible alternatively
            to create a HOP constant manually using <span
              style="font-family: Courier New,Courier,monospace;">OCT</span>,
            but it's frankly difficult and error-prone to do so, and
            creates a constant that's easily broken by future code
            changes.<br>
            <br>
            Because of the assembler's feature of implicitly creating
            HOP constants when it finds code left-hand symbols used as
            operands for <span style="font-family: Courier
              New,Courier,monospace;">HOP</span>,
            <span style="font-family: Courier New,Courier,monospace;">CLA</span>,
            or <span style="font-family: Courier
              New,Courier,monospace;">STO</span>
            instructions, it actually turns out that there's little
            need to explicitly use <span style="font-family: Courier
              New,Courier,monospace;">HOPC</span>
            except in odd cases which the assembler would handle
            implicit HOP constants incorrectly, like half-word
            mode.<br>
          </td>
          <td style="color: rgb(153, 51, 0);"><small><span
                style="font-family: Courier New,Courier,monospace;">HLAB
                HOPC
                LAB</span><br style="font-family: Courier
                New,Courier,monospace;">
              <span style="font-family: Courier New,Courier,monospace;">...</span><br
                style="font-family: Courier New,Courier,monospace;">
              <span style="font-family: Courier New,Courier,monospace;">LAB
                ... code
                ...</span></small><br>
          </td>
        </tr>
      </tbody>
    </table>
    <h3><a name="Software_Examples" id="Software_Examples"></a>Software
      Examples</h3>
    Above, you've seen
    various code snippets of OBC assembly-language generated by me or
    original OBC developers in the absence of any OBC programming
    manual or <span style="font-style: italic;">actual</span>
    examples of OBC code contemporary to Gemini to work from.&nbsp;
    You may also find the <a href="Pultorak_files/SGSCexample.pdf">short
programming
      example</a> created by John Pultorak
    instructive.&nbsp; (In John's document, "SGSC" refers to a
    Gemini-related project of his own, and not to anything that
    actually existed in the true Gemini project.)&nbsp;
    Unfortunately, John is in the same boat as I am, and is working
    without geniune code or code samples.<br>
    <br>
    <h2><a name="Virtual_AGC_simulation_software"
        id="Virtual_AGC_simulation_software"></a>Virtual AGC simulation
      software</h2>
    In the foregoing sections I've talked about the
    characteristics of the Gemini OBC itself.&nbsp; In this section I
    discuss simulation software provided by the Virtual AGC project
    to simulate the OBC &amp; friends.&nbsp; Some of the software
    discussed below exists, but some of the description below is
    speculation about software that I <span style="font-style: italic;">might</span>
    create in the future, and how
    I might go about doing it. I apologise for that.&nbsp;
    Nevertheless some significant software is available already.<br>
    <h3><a name="Downloads" id="Downloads"></a>Downloads</h3>
    As
    mentioned earlier, I have created a new <a
      href="Gemini.html#yaOBCASM_the_OBC_Cross-Assembler">version of the
      OBC
      assembler, which I call <span style="font-weight: bold;">yaASM</span></a>,
    and <a href="Gemini.html#yaOBC_the_OBC_CPU_Emulation">an OBC CPU
      emulator,
      which I call <span style="font-weight: bold;">yaOBC</span></a>.&nbsp;
    At this point, these
    programs are very much works in progress, and I don't claim that
    they are fully debugged or even that they will run on your
    computer.&nbsp; Therefore, they have not made their way into the
    Virtual AGC software source or binary distribution as of
    yet.&nbsp; But you can still download the source code for them
    from our subversion respository, or you can download the binaries
    for various platforms right here:<br>
    <br>
    <div style="text-align: center;"><span style="color: rgb(255, 0,
        0);"><span style="font-style: italic;">Most recent update
          builds:
          2012-01-08</span></span><br>
    </div>
    <table summary="" style="text-align: left; width: 60%; margin-left:
      auto; margin-right: auto;" cellspacing="2" cellpadding="2"
      border="1">
      <tbody>
        <tr>
          <th style="vertical-align: top;">Operating System<br>
          </th>
          <th style="vertical-align: top;">yaASM (Assembler)<br>
          </th>
          <th style="vertical-align: top;">yaOBC (Emulator)<br>
          </th>
          <th style="vertical-align: top;">Test source file<br>
          </th>
        </tr>
        <tr>
          <td style="vertical-align: top;">Linux 'x86<br>
          </td>
          <td style="vertical-align: top;"><a href="Downloads/yaASM">yaASM</a></td>
          <td style="vertical-align: top;"><a href="Downloads/yaOBC">yaOBC</a><br>
          </td>
          <td style="vertical-align: top;"><a href="Downloads/Test.obc">Test.obc</a></td>
        </tr>
        <tr>
          <td style="vertical-align: top;">Windows<br>
          </td>
          <td style="vertical-align: top;"><a href="Downloads/yaASM.exe">yaASM.exe</a></td>
          <td style="vertical-align: top;"><a href="Downloads/yaOBC.exe">yaOBC.exe</a><br>
          </td>
          <td style="vertical-align: top;"><a href="Downloads/Test.obc">Test.obc</a></td>
        </tr>
        <tr>
          <td style="vertical-align: top;">Mac OS X<br>
          </td>
          <td style="vertical-align: top;"><a
              href="Downloads/yaASM-macosx">yaASM-macosx</a></td>
          <td style="vertical-align: top;"><a
              href="Downloads/yaOBC-macosx">yaOBC-macosx</a><br>
          </td>
          <td style="vertical-align: top;"><a href="Downloads/Test.obc">Test.obc</a></td>
        </tr>
      </tbody>
    </table>
    <br>
    In brief, <span style="font-weight: bold;">yaASM</span> is a
    command-line tool which:<br>
    <ul>
      <li>Reads OBC source code from a file</li>
      <li>Creates a file called yaASM.bin to hold the assembled OBC
        program executable</li>
      <li>Outputs an assembly listing to the console, where you can
        pipe it into a file<br>
      </li>
    </ul>
    while <span style="font-weight: bold;">yaOBC</span> is a
    command-line tool which:<br>
    <ul>
      <li>Reads the yaASM.bin OBC executable file created by
        <span style="font-weight: bold;">yaASM</span></li>
      <li>Reads the assembly listing created by <span
          style="font-weight: bold;">yaASM</span></li>
      <li>Emulates the behavior of the OBC CPU, so that the OBC
        program can be executed<br>
      </li>
    </ul>
    There's no nice setup program as of yet, so you have to do a
    few manual steps to set up these programs before using them the
    first time:<br>
    <ol>
      <li>Create an empty folder in some convenient place on your
        computer.</li>
      <li>Download the files specific to your computer type, and put
        them in the folder you just created.</li>
      <li>From a command-line, 'cd' to the folder.<br>
      </li>
      <li>On Linux or Mac OS X, you'll want to run the command "chmod
        +x ya*" to make sure that the programs are marked as being
        executable.&nbsp; (Since Windows has no security to speak of,
        it will happily execute any file you download, so we don't have
        to worry about this extra step.)<br>
      </li>
      <li>On Windows or Mac OS X, the download process may have
        renamed your Test.obc file to Test.obc.txt.&nbsp; The
        instructions below assume that the file is actually named
        Test.obc as I intended it, so you might want to rename it
        back.<br>
      </li>
    </ol>
    Having done these steps, the programs should be ready to
    run.&nbsp; More-detailed explanations are available in the
    sections specifically devoted to <span style="font-weight: bold;">yaASM</span>
    and <span style="font-weight: bold;">yaOBC</span> below, but at its
    most basic,
    here are the commands you'd use to assemble the test OBC
    assembly-langage source-code file, and then run the assembled
    program in the emulator/debugger from the command-line in
    Windows:<br>
    <br>
    <div style="margin-left: 40px;"><span style="font-family: Courier
        New,Courier,monospace;">yaASM
        --input=Test.obc &gt;Test.lst</span><br style="font-family:
        Courier New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">yaOBC
        --binary=yaASM.bin --symbols=Test.lst</span><br>
    </div>
    <br>
    The commands above will present you with a debugger interface in
    which you can do things like examine or modify OBC memory, set
    breakpoints, run or single-step through the OBC test program,
    etc.&nbsp; You can also view the assembly listing, Test.lst, in
    any convenient text editor you happen to have handy, such as
    Notepad or Wordpad.<br>
    <br>
    The steps are very slightly different if you're not using
    Windows.&nbsp; On Linux, you'd have to replace <span
      style="font-family: Courier New,Courier,monospace;">yaASM</span>
    and
    <span style="font-family: Courier New,Courier,monospace;">yaOBC</span>
    by
    <span style="font-family: Courier New,Courier,monospace;">./yaASM</span>
    and
    <span style="font-family: Courier New,Courier,monospace;">./yaOBC</span>.&nbsp;
On
    Mac OS X you'd have to replace them by <span style="font-family:
      Courier New,Courier,monospace;">./yaASM-macosx</span>
    and <span style="font-family: Courier New,Courier,monospace;">./yaOBC-macosx</span>.&nbsp;
But
    otherwise, the programs should operate in exactly the same
    manner on any of the platforms.<br>
    <br>
    By the way, I follow the convention that OBC source files have
    names of the form *.obc, OBC executables have names of the form
    *.bin, and OBC assembly-listings have names of the form
    *.lst.&nbsp; These conventions are not enforced by <span
      style="font-weight: bold;">yaASM</span> and <span
      style="font-weight: bold;">yaOBC</span>, though, and you're free
    to do
    as you like.<br>
    <br>
    <h3><a name="The_Gemini_Catch-Up_and_Rendezvous"
        id="The_Gemini_Catch-Up_and_Rendezvous"></a>The Gemini Catch-Up
      and
      Rendezvous Simulation Program</h3>
    <h4><a name="Background" id="Background"></a>Background<br>
    </h4>
    This is an <span style="font-style: italic;">actual existing
      program</span> described in
    <a
href="Documents/GeminiCatchUpAndRendezvousAnalysisAndSimulationReport4.pdf">this
      report</a>, with the full FORTRAN source code in Appendix A
    of the report.&nbsp; The program was used by the original Gemini
    developers to verify algorithms for the catch-up and rendezvous
    flight phases.&nbsp; It is a behavioral simulation of the flight
    code, rather than being flight code itself.&nbsp; The actual
    flight code was apparently developed by handing the validated
    FORTRAN source code to programmers, who recoded it to something
    usable directly in the Gemini OBC.&nbsp; It is therefore the
    closest thing we have at the present time to actual flight
    code.&nbsp; The report was contributed by Gemini developer Eugene
    Mertz, and scanned by his son Dave.&nbsp; Thanks, Gene and
    Dave!<br>
    <br>
    Although the report is dated slightly after the <a
      href="http://en.wikipedia.org/wiki/Gemini_7">Gemini 7/6 mission</a>,
    Gene recollects that it was actually prepared a few weeks before
    the mission, which was the first rendezvous maneuver of manned
    spacecraft.&nbsp; In other words, it's reasonable to suppose that
    the FORTRAN code corresponds to the Gemini 7/6 mission.&nbsp;<br>
    <br>
    Gene comments, "<font style="color: rgb(0, 0, 0);" size="2"
      color="navy" face="arial,helvetica,sansserif"><span
        style="font-size: 10pt; font-family: Arial;">The FORTRAN code
        seems to
        be complete since it had to simulate the flight code.&nbsp; The
        coding style is archaic, to say the least.&nbsp; Today's
        techniques (and newer languages) would produce better
        code!&nbsp;
        But, hey, the system worked to perfection despite problems that
        cropped up in equipment other than the computer (example:&nbsp;
        the plug falling out at 2 inches off the
        pad!)</span></font><span style="color: rgb(0, 0, 0);">.&nbsp;</span>
    <font style="color: rgb(0, 0, 0);" size="2" color="navy"
      face="arial,helvetica,sansserif"><span style="font-size: 10pt;
        font-family: Arial;">I believe
        the version was FORTRAN IV since this was the language of choice
        at the time for the IBM 7094.&nbsp; I recall one problem that we
        had running the binary deck after it sat dormant for several
        months.&nbsp; The problem arose because one of the FORTRAN
        programmers used an 'undocumented instruction' that IBM decided
        to change to make it better.&nbsp; I put one chad in the
        offending hole and duplicated the deck.&nbsp; The chad stayed in
        long enough to read the 'fix' into memory.&nbsp; After that, no
        problem!&nbsp; (Also, no voting machine was
        involved.)</span></font>"<br>
    <br>
    Two separate application programs are actually provided, though
    using much of the same underlying machinery.&nbsp; Both a
    batch-oriented program (capable of receiving a bunch of input
    data and quickly generating corresponding output data for the
    mission) and a dynamic simulation program that operates in
    real-time are provided.<br>
    <h4><a name="Source_Code" id="Source_Code"></a>Source
      Code</h4>
    The source code for Report #4 described above has been
    extracted from the report and is available in the Virtual AGC
    software source tree under the directory
    yaAGC/GeminiCatchUpandRendezvousProgram/.<br>
    <br>
    The original program was really combined FORTRAN II and IBM
    7090/7094 assembly-language.&nbsp; <span style="font-style:
      italic;">Both</span> the original FORTRAN II and the
    assembly code did things which simply cannot be performed with
    any modern version of FORTRAN, so the original source wouldn't
    have been directly compilable and (if somehow it compiled) the
    executable would not have worked as expected on any computer
    other than an IBM 7090/7094.&nbsp; The <a
      href="#Theory_of_Operation_for_the_Catch-Up_and">theory of
      operation
      section</a> explains some of the problems involved.&nbsp;
    Therefore, the source code in the Virtual AGC source tree has
    necessarily been modified from the original to be buildable and
    portable.<br>
    <br>
    In general, the following modifications have been made:<br>
    <ul>
      <li>Every effort has been made to keep the FORTRAN source
        identical to the original, in files with names of the form
        *.f.&nbsp; The very minimal differences from the original which
        could not be avoided are clearly marked, and would have
        compiled and worked properly with the original compiler.</li>
      <li>The IBM 7090/7094 assembly-language is provided (in files
        named *.s) but does not participate in the build.&nbsp;
        Instead, complete replacements are provided (in files named
        *.c).</li>
    </ul>
    <h4><a name="Building_the_Catch-Up_and_Rendezvous"
        id="Building_the_Catch-Up_and_Rendezvous"></a>Building the
      Catch-Up
      and Rendezvous Simulation Program</h4>
    In a general Virtual AGC
    program build, the catch-up and rendezvous simulation program is
    built automatically.&nbsp; But if you just want to build the
    Gemini simulation and none of the rest of Virtual AGC, you can do
    this:<br>
    <br>
    <div style="margin-left: 40px;">
      cd yaAGC/GeminiCatchUpandRendezvousProgram<br>
      make<br>
    </div>
    <br>
    This requires:<br>
    <ul>
      <li>GNU <span style="font-weight: bold;">make</span></li>
      <li>GNU <span style="font-weight: bold;">gcc</span></li>
      <li>GNU <span style="font-weight: bold;">gfortran</span></li>
      <li>GNU <span style="font-weight: bold;">sed<br>
        </span></li>
    </ul>
    Although the Makefile has provisions for using the earlier
    GNU <span style="font-weight: bold;">g77</span> in place of
    <span style="font-weight: bold;">gfortran</span>, but it's best
    not to use it because I've found that with <span
      style="font-weight: bold;">g77</span> the program will appear to
    compile but the executable will not be fully functional.&nbsp; If
    you adapt for other compilers, let me know the details.&nbsp;
    <span style="font-weight: bold;">Note:</span> At build-time, the
    Makefile dynamically transforms the FORTRAN II to a more-modern
    FORTRAN dialect (*.f → *.for), since the FORTRAN II code cannot
    be directly compiled with a modern compiler.&nbsp; This
    transformation behavior must therefore also be mimicked if
    changing to a different toolset.<br>
    <h4><a name="Running_the_Catch-Up_and_Rendezvous"
        id="Running_the_Catch-Up_and_Rendezvous"></a>Running the
      Catch-Up
      and Rendezvous Simulation Program</h4>
    The batch-oriented
    simulation program, referred to in Report #4 as the "static
    environment", is created as the executable named <span
      style="font-weight: bold;">BENCH7</span>.&nbsp; The dynamic
    simulation
    program, referred to in Report #4 as the "dynamic environment",
    is created as <span style="font-weight: bold;">MAIN7</span>.&nbsp;
    Neither has any
    command-line arguments, but both expect input files to be
    available.&nbsp; (The nature of the input files and output files
    is discussed in the next section.)<br>
    <ul>
      <li><span style="font-weight: bold;">BENCH7</span>:&nbsp;
        Receives input on file-descriptors 5 and 6, and outputs on
        file-descriptor 9.&nbsp; Therefore, in a UNIX-type runtime
        environment, it would be reasonable to run the program with the
        command "BENCH7 5&lt;<span style="font-style: italic;">Infile1</span>
        6&lt;<span style="font-style: italic;">Infile2</span> 9&gt;<span
          style="font-style: italic;">Outfile</span>".<br>
      </li>
      <li><span style="font-weight: bold;">MAIN7</span>:&nbsp;
        Receives input on file-descriptor 5, and outputs on
        file-descriptors 9 and 14.&nbsp; Therefore, in a UNIX-type
        runtime environment, it would be reasonable to run the program
        with the command "BENCH7 5&lt;<span style="font-style: italic;">Infile</span>
        9&gt;<span style="font-style: italic;">Outfile1</span> 14&gt;<span
          style="font-style: italic;">Outfile2</span>".</li>
    </ul>
    Both programs may also print some status messages on stderr,
    due to my alterations rather than to any intention of the
    original programmers.<br>
    <h4><a name="Data_for_the_Catch-Up_and_Rendezvous"
        id="Data_for_the_Catch-Up_and_Rendezvous"></a>Data for the
      Catch-Up
      and Rendezvous Simulation Program</h4>
    The input-data files needed
    to run the simulation program(s) are described in Report
    #4.&nbsp; Actually generating such data is TBD.<br>
    <br>
    Gene's comments: "<font size="2" face="arial,helvetica,sansserif"><span
        style="font-size: 10pt; font-family: Arial;">The problem is that
        there
        is no 'environment' FORTRAN program to generate the radar inputs
        to the OBC (range, azimuth, and elevation to the target), the
        platform inputs to the OBC (gimbal angles and accelerations),
        horizon sensor angles, and astronaut inputs (thrusting, switch
        position selections, etc.) required for a complete simulation of
        rendezvous flights.&nbsp; Without that, the executable just
        loops
        through the equations and logic waiting for dynamic inputs to
        arrive.&nbsp; As I recall, the 'environment' simply had the
        target moving in a constant, 'circular' orbit around an oblate
        Earth whose gravitational field was defined by a six-term series
        potential function.&nbsp; Time (one second increments) was
        common
        to both the 'environment' and the OBC FORTRAN programs. &nbsp;I
        believe the astronaut switch inputs were originally simulated
        using the 7090 (or 7094) console keys.&nbsp; Today, mouse clicks
        would do the trick.</span></font><font size="2"
      face="arial,helvetica,sansserif"><span style="font-size: 10pt;
        font-family: Arial;">&nbsp;
        Thrusting and attitude were closed-loop from the OBC results
        using rates approximating the actual spacecraft
        capability.&nbsp;
        The 'environment' development is being left to the student at
        this time.&nbsp; Data were communicated between FORTRAN programs
        through judicious use of COMMON arrays.</span></font>"<br>
    <h4><a name="Theory_of_Operation_for_the_Catch-Up_and"
        id="Theory_of_Operation_for_the_Catch-Up_and"></a>Theory of
      Operation and Porting-Problems for the Catch-Up and Rendezvous
      Simulation Program</h4>
    As mentioned above, the original source
    code from Report #4 is incompatible with modern FORTRAN—or
    indeed, any modern high-level computer language—in various
    fundamental ways.&nbsp; Therefore, significant code alterations
    had to be made to produce a portable, working program; yet, every
    attempt was made to preserve the original source in as much
    detail as possible, and to preserve its "look and feel"
    otherwise.&nbsp; Those problems and fixes are described in this
    section, along with some theory of operation of the original code
    in order to understand the nature of the problems.<br>
    <br>
    TBD<br>
    <h3><a name="yaOBC_the_OBC_CPU_Emulation"
        id="yaOBC_the_OBC_CPU_Emulation"></a>yaOBC, the OBC CPU
      Emulation</h3>
    <h4><a name="Invoking_yaOBC_" id="Invoking_yaOBC_"></a>Invoking
      yaOBC<br>
    </h4>
    <span style="font-weight: bold;">yaOBC</span> is a
    software-based emulator for the OBC CPU.&nbsp; It is simply a
    command-line program for Linux, Windows, or Mac OS X.&nbsp; It
    has no user-interface as such, except for a debugger interface
    which can be used to perform such operations as examining
    emulated memory, single-stepping through instructions, setting
    breakpoints, and so on.&nbsp; However, it can optionally be used
    to connect to other programs like <span style="font-weight: bold;">yaPanel</span>
    <span style="font-style: italic;">(not yet available!)</span> which
    do
    provide a user interface; if not so connected, it simply uses the
    CPU instructions <span style="font-family: Courier
      New,Courier,monospace;">PRO</span> and
    <span style="font-family: Courier New,Courier,monospace;">CLD</span>
    (which
    would otherwise be used to communicate with peripheral devices)
    to read and write to a dedicated memory area separate from the
    regular OBC memory, and therefore remains usable for software
    debugging even without peripheral devices.<br>
    <br>
    The command-line syntax for <span style="font-weight: bold;">yaOBC</span>
    is as follows:<br>
    <br>
    <div style="text-align: center;"><big><span style="font-family:
          monospace;">yaOBC [<span style="font-style: italic;">OPTIONS</span>]</span></big><br>
    </div>
    <br>
    By default, <span style="font-weight: bold;">yaOBC</span> treats
    OBC memory as persistent, and thus to have the same contents
    whenever <span style="font-weight: bold;">yaOBC</span> starts as
    it had on the last occasion <span style="font-weight: bold;">yaOBC</span>
    stopped.&nbsp; It accomplishes
    this by means of an auxiliary file it creates called yaOBC.bin,
    but in order to do this effectively requires an orderly shutdown
    process by means of the debugging interface it provides, in order
    to insure that yaOBC.bin is actually saved.&nbsp; (More on this
    later.)&nbsp; However, if no such file as yaOBC.bin exists, it
    instead requires a replacement file—generally created by
    <span style="font-weight: bold;">yaASM</span>, since both
    programs use the same file format—to be specified by means of its
    <span style="font-style: italic;">OPTIONS</span>.<br>
    <br>
    The presently-accepted <span style="font-style: italic;">OPTIONS</span>
    are:<br>
    <br>
    --help<br>
    <div style="margin-left: 40px;">
      Displays the available <span style="font-style: italic;">OPTIONS</span>
      and exits.<br>
    </div>
    <br>
    -v<br>
    <div style="margin-left: 40px;">
      Increases the verbosity of messages displayed by <span
        style="font-weight: bold;">yaOBC</span>.&nbsp; Multiple -v
      switches
      can be used.&nbsp; At present, the maximum verbosity that has
      any observable effect is "-v -v -v -v -v -v".<br>
    </div>
    <br>
    --lvdc<br>
    <div style="margin-left: 40px;">
      This switch causes the program to emulate the Apollo LVDC
      computer.&nbsp; The default, when the switch is missing, is the
      Gemini OBC is emulated.<br>
      <br>
    </div>
    --binary=<span style="font-style: italic;">Filename</span><br>
    <div style="margin-left: 40px;">
      This specifies the name of a binary file containing the
      complete contents of memory/ATM at startup, along with the
      starting value of the HOP constant.&nbsp; Typically, this file
      would be created by <span style="font-weight: bold;">yaASM</span>,
      but it could be a snapshot
      of the OBC system status created earlier by <span
        style="font-weight: bold;">yaOBC</span> as well.&nbsp; If
      present, it
      overrides the default yaOBC.bin file.<br>
    </div>
    <br>
    --symbols=<span style="font-style: italic;">Filename</span><br>
    <div style="margin-left: 40px;">
      This is the name of a listing file produced by <span
        style="font-weight: bold;">yaASM</span>.&nbsp; If this option is
      used, then it gives <span style="font-weight: bold;">yaOBC</span>
      knowledge of the source code
      and symbol table associated with the OBC binary being used, and
      allows symbolic debugging of the OBC program ... i.e., it
      allows memory to be inspected or modified by variable/constant
      name rather than just addresses, allows breakpoints to be put
      at left-hand symbols rather than just addresses, allows source
      code to be displayed when single-stepping or reaching a
      breakpoint (merely than being disassembled from the contents of
      memory), and so on.<br>
    </div>
    <br>
    --run<br>
    <div style="margin-left: 40px;">
      By default, <span style="font-weight: bold;">yaOBC</span>
      starts in a paused state at the starting HOP constant specified
      by the input binary file.&nbsp; In other words, by default, no
      OBC instruction will be executed until explicitly commanded via
      the debugging interface.&nbsp; If the --run switch is used, it
      instead causes OBC program execution to begin in real time
      without further intervention.<br>
    </div>
    <br>
    --ports=<span style="font-style: italic;">Port</span><br>
    <div style="margin-left: 40px;">
      Specifies the port number of a network socket by which
      additional emulation programs such as <span style="font-weight:
        bold;">yaPanel</span> can connect to the CPU
      emulation and interact with it.&nbsp; By default, we use
      "--port=19653" ... because the first Gemini mission was in
      March 1965 (in case you wondered).&nbsp; Because network
      sockets are used, peripheral-emulating programs such as
      <span style="font-weight: bold;">yaPanel</span> can reside on
      entirely different computers from the one running <span
        style="font-weight: bold;">yaOBC</span>, as long as there's a
      network
      connection between them.<br>
    </div>
    <br>
    --method=<span style="font-style: italic;">Peripheral</span>,<span
      style="font-style: italic;">Driver</span><br>
    <div style="margin-left: 40px;">
      This switch relates to the method by which emulated or physical
      peripheral devices connect to the emulated CPU. In essence, it
      allows different types of device drivers to be used for
      different <span style="font-style: italic; font-family: Courier
        New,Courier,monospace;">
        XY</span> ranges for the <span style="font-family: Courier
        New,Courier,monospace;">PRO</span> and
      <span style="font-family: Courier New,Courier,monospace;">CLD</span>
      instructions of the CPU.&nbsp; The <span style="font-style:
        italic;">Peripheral</span> field selects the
      <span style="font-style: italic; font-family: Courier
        New,Courier,monospace;">
        XY</span> range by the designator of a specific peripheral
      device, as follows:<br>
      <ul>
        <li><span style="font-style: italic;">Peripheral=</span>ALL
          applies the Driver choice to the complete <span
            style="font-style: italic; font-family: Courier
            New,Courier,monospace;">
            XY</span> range.</li>
        <li><span style="font-style: italic;">Peripheral=</span>ACME</li>
        <li><span style="font-style: italic;">Peripheral=</span>AGE</li>
        <li><span style="font-style: italic;">Peripheral=</span>ATM</li>
        <li><span style="font-style: italic;">Peripheral=</span>DCS</li>
        <li><span style="font-style: italic;">Peripheral=</span>FDI</li>
        <li><span style="font-style: italic;">Peripheral=</span>IMU</li>
        <li><span style="font-style: italic;">Peripheral=</span>IS</li>
        <li><span style="font-style: italic;">Peripheral=</span>IVI</li>
        <li><span style="font-style: italic;">Peripheral=</span>MDIU</li>
        <li><span style="font-style: italic;">Peripheral=</span>PCDP</li>
        <li><span style="font-style: italic;">Peripheral=</span>RR</li>
        <li><span style="font-style: italic;">Peripheral=</span>TRS</li>
      </ul>
      The <span style="font-style: italic;">Driver</span> field
      specifies the the data-transport method for the <span
        style="font-style: italic; font-family: Courier
        New,Courier,monospace;">
        XY</span> ranges associated with <span style="font-style:
        italic;">Peripheral</span>, as follows:<br>
      <ul>
        <li>MEM, meaning that there is no emulated or physical
          peripheral of type <span style="font-style: italic;">Peripheral</span>,
          and so <span style="font-family: Courier
            New,Courier,monospace;">PRO/CLD</span>
          are simply supposed to read/write to a special memory buffer
          maintained by yaOBC.&nbsp; This choice would typically be
          used when doing pure debugging OBC software.</li>
        <li>SOCK, meaning that a network socket (as with the --ports
          switch described above) are used.&nbsp; This choice would be
          used for emulated peripherals provided directly by the
          Virtual AGC project, such as <span style="font-weight: bold;">yaPanel</span>.</li>
        <li>COM1, COM2, etc., meaning that the RS232 port or
          USB-to-RS232 converter converter designated as COM1, COM2,
          etc., is used.&nbsp; (Note that these are desgnations used by
          Windows and not by Linux or Mac OS X, so in those cases you
          need to additionally use one or more of the --com1, --com2,
          ..., switches described below to link designations like
          COM<span style="font-style: italic;">n</span> to an actual
          comport as understood by those operating systems.)&nbsp; This
          choice might be used (for example), if you had constructed a
          physical simulation of an MDIU or IVI.</li>
        <li>CUSTOM, meaning that a custom driver (of a type not
          otherwise supported by Virtual AGC) is used.&nbsp; This
          choice would be used if you were doing something I didn't
          know how to help you with or had not otherwised
          envisaged.&nbsp; In particular, I think this is the method
          that would be used to interface yaOBC to the Orbiter
          spacecraft-simulation system.<br>
        </li>
      </ul>
    </div>
    <div style="margin-left: 40px;">
      The default is "--method=ALL,MEM".&nbsp; Note that regardless
      of the driver type, all <span style="font-family: Courier
        New,Courier,monospace;">PRO/CLD</span>
      ends up in the memory array, so all drivers ultimately build
      atop the MEM driver.<br>
    </div>
    <br>
    --io=<span style="font-style: italic;">Filename</span><br>
    <div style="margin-left: 40px;">
      When the MEM driver (see --method above) is used, the dedicated
      memory area used for emulating the <span style="font-family:
        Courier New,Courier,monospace;">PRO/CLD</span>
      instructions defaults to being all zeroes at startup, or else
      is populated with values from the preceding run of <span
        style="font-weight: bold;">yaOBC</span>.&nbsp; It's possible
      instead
      to load that area with different values using the --io
      switch.&nbsp; <span style="font-style: italic;">Filename</span>
      represents a simple ASCII file that can be created in any text
      editor.&nbsp; The file has 128 lines, each of which is of the
      form "PRO <span style="font-style: italic;">yx value</span>" or
      "CLD <span style="font-style: italic;">yx value</span>".&nbsp;
      The first 64 lines are for <span style="font-family: Courier
        New,Courier,monospace;">PRO</span> and
      the last 64 are for <span style="font-family: Courier
        New,Courier,monospace;">CLD</span>. Each
      of the two areas is in YX order: 00, 01, 02, ..., 77.&nbsp; So
      while it may <span style="font-style: italic;">appear</span>
      that you can rearrange the lines of the file however you like,
      you actually cannot: the "PRO <span style="font-style: italic;">yx</span>"
      and "CLD <span style="font-style: italic;">yx</span>" portions of
      the lines are
      present simply to make it easier for you to know which
      <span style="font-style: italic;">value</span> is which, but
      cannot actually be changed and only the <span style="font-style:
        italic;">value</span> fields should be
      edited.&nbsp; The easiest way to get such a file to edit is to
      start from the yaOBC.io file of a prior <span style="font-weight:
        bold;">yaOBC</span> run, since such a file is
      automatically created when <span style="font-weight: bold;">yaOBC</span>
      shuts down.&nbsp; (This is
      the file which is loaded, if it exists, at <span
        style="font-weight: bold;">yaOBC</span> startup unless
      overridden by
      --io.)&nbsp; You can also manually create such a file during a
      <span style="font-weight: bold;">yaOBC</span> run via the
      COREDUMP command debugging interface as described below.<br>
    </div>
    <br>
    --com1=<span style="font-style: italic;">ComportName</span>,
    --com2=<span style="font-style: italic;">ComportName</span>,
    etc.<br>
    <div style="margin-left: 40px;">
      Optionally used with the --method switch.&nbsp; The defaults
      are "--com<span style="font-style: italic;">N</span>=COM<span
        style="font-style: italic;">N</span>", but those defaults are
      meaningful only in Windows.&nbsp; On Linux, the comport names
      are generally one of the following instead:&nbsp; /dev/ttyS0,
      /dev/ttyS1, ..., /dev/ttyUSB0, /dev/ttyUSB1, .....&nbsp; So in
      Linux, you'd need switches like "--com1=/dev/ttyS3",
      "--com2=/dev/ttyUSB1", and so forth, depending on your
      setup.&nbsp; I don't know what they're typically called in Mac
      OS X, but they'd be /dev/<span style="font-style: italic;">something</span>
      as well.<br>
    </div>
    <br>
    <h4><a name="Debugging_Interface_of_yaOBC"
        id="Debugging_Interface_of_yaOBC"></a>Debugging Interface of
      yaOBC</h4>
    <h5>General Information About the yaOBC Debugger<br>
    </h5>
    The
    <span style="font-weight: bold;">yaOBC</span> debugging interface
    is a method of controlling, examining, or altering the emulation
    process at runtime by entering textual commands from a
    command-line.&nbsp; The debugging interface is always present,
    whether or not you choose to use it.&nbsp; By default,
    <span style="font-weight: bold;">yaOBC</span> starts in a paused
    state, so that the emulation won't even start unless you manually
    start it with (for example), the debugger's RUN command; however,
    you can override this behavior and start <span style="font-weight:
      bold;">yaOBC</span> in a running state by using its
    "--run" command-line switch.&nbsp; If you do the latter, and if
    there are physical or emulated peripheral devices attached to the
    the CPU, you never need to use the debugging interface at
    all.&nbsp; Conversely, if you have no attached peripheral
    devices, you can never observe the behavior of the emulation
    unless you use the debugger.<br>
    <br>
    At startup in a paused state, the <span style="font-weight: bold;">yaOBC</span>
    command line will display
    something of this nature:<br>
    <br>
    <div style="margin-left: 40px;"><span style="font-family: Courier
        New,Courier,monospace;">HOP=000100000
        (ADR=0-00-2-000 HWM=0 VAL=06400)&nbsp; ACC=000000000&nbsp;
        PQ=000000000 (TMR:0)</span><br style="font-family: Courier
        New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">Cycles=0
        (0.00000
        seconds)</span><br style="font-family: Courier
        New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">0-00-2-000&nbsp;&nbsp;&nbsp;
START&nbsp;&nbsp;&nbsp;
        CLA&nbsp;
        KZERO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;
        # Get 0 into accumulator</span><br style="font-family: Courier
        New,Courier,monospace;">
      <span style="font-family: Courier New,Courier,monospace;">OBC
        debugger paused&gt;</span><br>
      <br>
    </div>
    It may not look exactly like this, but I'll describe some
    of what's here just to give you the general idea.&nbsp; The first
    line shows the values of various CPU registers:<br>
    <ul>
      <li>HOP register, in octal form.&nbsp; The HOP register is also
        parsed into its constituent parts, namely the address
        ("0-<span style="font-style: italic;">Sector-Syllable-Word</span>")
        and
        half-word-mode bit.&nbsp; The leading "0-" is present, because
        the debugger always includes the program module in the address,
        but that field isn't present in the HOP register and hence will
        always be 0.&nbsp; The "VAL" that's shown in the example above
        is the 13-bit octal value stored in the memory location pointed
        to by the HOP register.&nbsp; If that location happens never to
        have been written to either by the assembler or the emulated
        program, it will have the illegal value 77777.<br>
      </li>
      <li>Accumulator, in octal form.</li>
      <li>PQ register, in octal form.&nbsp; The PQ register is used
        for forming results of <span style="font-family: Courier
          New,Courier,monospace;">MPY</span> and
        <span style="font-family: Courier New,Courier,monospace;">DIV</span>
        operations, and in the real OBC had the property that the
        results weren't valid for several machine cycles after the
        operation started.&nbsp; <span style="font-weight: bold;">yaOBC</span>
        makes the result available
        immediately, but implements a small countdown timer that is set
        to a non-zero value when the multiplication or division
        commences and counts down by one for every instruction
        thereafter until a value of 0 is reached.&nbsp; In other words,
        while the results become available immediately, they wouldn't
        have been valid in a real OBC until the counter reaches
        0.&nbsp; It's the value of that counter that's shown as "TMR"
        above.</li>
    </ul>
    The second line shows the total number of instructions
    executed so far, and the amount of real time those instructions
    would have taken.&nbsp; Realize that <span style="font-weight:
      bold;">yaOBC</span> cannot maintain the exact
    timing of 140 μsec. of the original OBC, since even though the
    computer on which it is running is far, far faster than the OBC,
    it is nevertheless not an embedded system and <span
      style="font-weight: bold;">yaOBC</span> must share resources with
    other
    software running on the computer.&nbsp; So <span
      style="font-weight: bold;">yaOBC</span> merely tries to maintain
    the
    same average instruction rate in a manner that's hopefully
    transparent to the user.&nbsp; Under normal circumstances, the
    total time listed by the debugger should correspond closely with
    the actual real time consumed, except when the emulator is
    explicitly commanded to run the emulation faster or slower than
    real time.<br>
    <br>
    The third line shows the source code of the line at which the
    emulation is currently paused.&nbsp; This source line is taken
    from the <span style="font-weight: bold;">yaASM</span> listing
    file, where available, in which case it will be include left-hand
    symbols, show the operand by name, and show comments.&nbsp; If
    the listing file is not available, or the location is somehow
    absent from the listing file, what will insted be shown is a
    disassembly of the current location, which in the case of this
    example would be:<br>
    <br>
    <div style="margin-left: 40px;"><span style="font-family: Courier
        New,Courier,monospace;">0-00-2-000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        &nbsp; &nbsp; &nbsp;&nbsp; CLA&nbsp; 400</span></div>
    <br>
    Another interesting factoid about source-code lines is that since
    the complete OBC software consists not only of program modules
    loaded into main memory, but also program modules residing on the
    ATM but not yet loaded, the source-code line associated with any
    given address in memory is ambiguous: several different program
    modules may use the same addresses for different purposes and
    associate different source code with them.&nbsp; Unfortunately,
    the debugger has no way of knowing which program modules are
    loaded or are associated with which addresses.&nbsp; So it tries
    to match the value stored at the address with the value that each
    of the program modules think should be stored at that address,
    and then displays the first source-code line that actually
    matches.&nbsp; But this method can still be wrong and the wrong
    source-code line could be displayed sometimes.&nbsp; The address
    printed with the source line will show the module which the
    debugger thinks the source line is from (for example
    "1-00-2-000") even though the code is actually being run from
    main memory ("0-00-2-000") rather than from the ATM directly.<br>
    <br>
    Finally, the fourth line is the debugger's prompt, and which is
    where commands you input would appear.&nbsp; If <span
      style="font-weight: bold;">yaOBC</span> starting in a running
    state
    instead of a paused state, you'd have <span style="font-style:
      italic;">only</span> this prompt, and wouldn't have
    any of the other three lines.&nbsp; (By the way, any user input
    to the debugger discards anything from an '#'&nbsp; character to
    the end of the line.&nbsp; This isn't of much interest under
    normal circumstances, but can be useful if input is piped into
    the debugger from the command line from a prewritten script,
    since it allows the addition of comments to such scripts.)<br>
    <br>
    When the emulation is in a running state, <span style="font-style:
      italic;">any</span> command (legal or illegal, or
    even just hitting the Enter key) at the debugger prompt will
    pause the emulation.&nbsp; The emulation remains paused until
    commanded otherwise.<br>
    <h5>Commands Recognised by the yaOBC Debugger<br>
    </h5>
    The
    commands which can be entered at the prompt are the
    following.&nbsp; Items in brackets (like so: [<span
      style="font-style: italic;">Stuff</span>]) are optional.&nbsp; The
    commands themselves are not case-sensitive.<br>
    <ul>
      <li>HELP or MENU or ? — display a list of available
        commands.</li>
      <li>QUIT or EXIT — exits <span style="font-weight: bold;">yaOBC</span>,
        saving the current state so
        that the emulation can be resumed from where it stopped if
        <span style="font-weight: bold;">yaOBC</span> is run again
        later.&nbsp; Resuming the emulation exactly is really only
        feasible if using the MEM driver (see --method switch above)
        for peripherals, because a physical or emulated peripheral will
        have its own internal state not necessarily accessible or
        controllable by <span style="font-weight: bold;">yaOBC</span>.<br>
      </li>
      <li>RUN or CONT or R — stop pausing and begin running the
        program.&nbsp; The program will then run until encountering one
        of the following conditions, in which case the emulation will
        again pause:</li>
      <ul>
        <li>Reaching an instruction having a breakpoint</li>
        <li>Modifying a memory location having a watchpoint</li>
        <li>Encountering an illegal runtime condition such as
          executing past the end of memory</li>
        <li>Detecting user input from the debugger prompt</li>
      </ul>
      <li>STEP [<span style="font-style: italic;">N</span>] or NEXT
        [<span style="font-style: italic;">N</span>] or S [<span
          style="font-style: italic;">N</span>] or N [<span
          style="font-style: italic;">N</span>] — executes the next
        <span style="font-style: italic;">N</span> assembly-language
        instructions.&nbsp; If <span style="font-style: italic;">N</span>
        is omitted, then it defaults to
        1.&nbsp; As a convenience, if the <span style="font-style:
          italic;">previous</span> command was
        STEP/NEXT/S/N, then simply hitting the Enter key without
        inputting any command at all will do a "NEXT 1", so you can
        simply advance through the program step-by-step by repeatedly
        hitting the Enter key.&nbsp; The Enter key by itself has no
        effect if the previous command was something other than
        STEP/NEXT/S/N.<br>
      </li>
      <li>BREAK <span style="font-style: italic;">Location</span> —
        set a breakpoint at a memory location, CPU register, or PRO/CLD
        <span style="font-style: italic;">YX</span>.&nbsp; <a
          href="#Location-Field_Parsing_by_the_Debugger">See the section
          below
          on parsing the <span style="font-style: italic;">Location</span>
          field</a>. Notice that a
        breakpoint can be set not only at an instruction, but also at
        locations containing data (thus corresponding to what some
        debuggers call a "watchpoint").&nbsp; The behavior of a
        breakpoint is that it pauses emulation whenever the debugger
        detects one of the following two conditions:</li>
      <ul>
        <li>The next instruction to be executed would come from a
          location marked with a breakpoint; or</li>
        <li>The next instruction would access a data-location marked
          with a breakpoint.&nbsp; The exact meaning of "access"
          depends on the global WATCHMODE setting (see
          below).&nbsp;&nbsp;</li>
      </ul>
      <li>WATCHMODE <span style="font-style: italic;">Mode</span> —
        This global setting determines what kinds of accesses of a data
        location trigger a break.&nbsp; The behavior of breakpoints for
        code locations is not affected.&nbsp; The choices for
        <span style="font-style: italic;">Mode</span> are:</li>
      <ul>
        <li>ANY&nbsp; —&nbsp; Trying either to read or write the data
          location with the breakpoint triggers a break.</li>
        <li>WRITE — Trying to write the data location with the
          breakpoint triggers a break.</li>
        <li>CHANGE — (Default) Trying to <span style="font-style:
            italic;">change</span> the value stored at the
          data location triggers a break.&nbsp; For example, writing 0
          to a location already containing 0 would not trigger a break,
          but changing it to 1 would.&nbsp; This concept only applies
          to memory; for breakpoints on registers or PRO<span
            style="font-style: italic;">YX</span> or CLD<span
            style="font-style: italic;">YX</span>, <span
            style="font-style: italic;">Mode</span>=WRITE is used even
          if
          CHANGE is selected.<br>
        </li>
      </ul>
      <li>BREAKPOINTS — display all currently-defined
        breakpoints.<br>
      </li>
      <li>DELETE [<span style="font-style: italic;">Location</span>]
        — delete the breakpoint from the designated <span
          style="font-style: italic;">Location</span>, or delete all
        watchpoints and breakpoints if no <span style="font-style:
          italic;">Location</span> is specified.&nbsp;
        <a href="Gemini.html#Location-Field_Parsing_by_the_Debugger">See
          the
          section below on parsing the <span style="font-style:
            italic;">Location</span> field</a>.</li>
      <li>PRINT <span style="font-style: italic;">Location</span> —
        displays the value stored at <span style="font-style: italic;">Location</span>.&nbsp;
        <a href="Gemini.html#Location-Field_Parsing_by_the_Debugger">See
          the
          section below on parsing the <span style="font-style:
            italic;">Location</span> field</a>.&nbsp; Note
        that program modules on the ATM but not loaded into memory can
        be accessed by this method.&nbsp; <a
          href="#Treatment_of_Program_Modules_by_the">See the section
          below on
          program modules</a>.<br>
      </li>
      <li>EDIT <span style="font-style: italic;">Location
          Value</span> — modifies the value stored at <span
          style="font-style: italic;">Location</span>.&nbsp; <a
          href="Gemini.html#Location-Field_Parsing_by_the_Debugger">See
          the
          section below on parsing the <span style="font-style:
            italic;">Location</span> field</a>.&nbsp; Note
        that program modules on the ATM but not loaded into memory can
        be accessed by this method.&nbsp; <a
          href="Gemini.html#Treatment_of_Program_Modules_by_the">See the
          section below on program modules</a>. Note also that this
        command does little or no consistency checking, so you can
        easily cause memory locations to be loaded with values that
        make no sense contextually at all, such as loading the HOP
        register from a variable.&nbsp; <span style="font-style:
          italic;">Value</span> is one of the
        following:</li>
      <ul>
        <li>An octal number if it has a leading 0 and consists
          entirely of octal digits.</li>
        <li>A decimal number if it consists entirely of decimal
          digits, an optional decimal point, and optional leading plus-
          or minus-sign.&nbsp; Also:</li>
        <ul>
          <li>If there is no decimal point, then the value is treated
            as an integer and is stored as-is.</li>
          <li>If there is a decimal point, then the value is scaled
            to have absolute value less than 1.0 but to retain the
            maximum possible number of significant bits—i.e., so that
            the most-significant bit other than the sign bit is 1
            unless the value is exactly 0.</li>
        </ul>
        <li>An existing left-hand symbol, in which case the value is
          assembled as a HOP constant formed from that left-hand
          symbol.</li>
        <li>An existing variable-name or constant-name, in which case
          the value is <span style="font-style: italic;">the value
            stored in that variable or constant</span>.</li>
        <li>An address of the form "<span style="font-style: italic;">Module-Sector-Syllable-Word</span>",
          in
          which case a HOP constant is formed with the half-word mode
          flag reset to 0.&nbsp; (The value of <span style="font-style:
            italic;">Module</span> is ignored, since the OBC
          HOP constant has no field associated with it.)</li>
        <li>An address of the form "H-<span style="font-style: italic;">Module-Sector-Syllable-Word</span>",
          in
          which case a HOP constant is formed with the half-word mode
          flag set to 1.<br>
        </li>
      </ul>
      <li>COREDUMP <span style="font-style: italic;">Filename</span>
        [<span style="font-style: italic;">IoFilename</span>] — creates
        a snapshot file of the OBC into the file <span
          style="font-style: italic;">Filename</span>.&nbsp; The
        snapshot
        contains all memory and CPU registers.&nbsp; These snapshot
        files can be loaded into yaOBC at startup via the --binary
        command-line switch.&nbsp; Optionally, if <span
          style="font-style: italic;">IoFilename</span> is present, the
        dedicated memory areas which the MEM driver (see the --method
        switch) uses to emulate the <span style="font-family: Courier
          New,Courier,monospace;">PRO/CLD</span>
        instructions will be written out as well, and can be reloaded
        into yaOBC later with the --io command-line switch.&nbsp;
        However, this will have little or no effect in recreating the
        states of the peripheral devices if drivers other than MEM are
        used.</li>
      <li>ATM <span style="font-style: italic;">Module</span> — Loads
        a given program module from ATM into memory.&nbsp; Only values
        in the range 1-7 are sensible.&nbsp; <a
          href="#Treatment_of_Program_Modules_by_the">See the
          program-modules
          section below</a>.&nbsp; What this command does is to
        overwrite
        all of main memory, but only for those addresses in which the
        selected <span style="font-style: italic;">Module</span> has an
        initialized value —i.e., an instruction or a constant.&nbsp;
        Variables and unused memory locations are not initialized by
        the assembler, so any contents of main memory at such locations
        remain intact.&nbsp; Other than ignoring uninitialized
        locations, there is no provision for loading subsets (such as
        restricted address ranges) from <span style="font-style:
          italic;">Module</span> into main memory.<br>
      </li>
    </ul>
    Notice that while no way is provided to directly do
    something like jump to a given location and begin executing
    there, you can indirectly achieve that by doing things such as
    "EDIT HOP <span style="font-style: italic;">ExistingLeftHandSymbol</span>"
    and then
    "RUN".<br>
    <h5><a name="Treatment_of_Program_Modules_by_the"
        id="Treatment_of_Program_Modules_by_the"></a>Treatment of
      Program
      Modules by the Debugger</h5>
    The assembler, <span style="font-weight: bold;">yaASM</span>,
    expects to assemble a complete
    set of program modules as a single operation, and hence the
    binary file loaded by <span style="font-weight: bold;">yaOBC</span>
    contains not only the contents
    of main memory but also the contents of all program modules on
    the ATM but not yet loaded into main memory.&nbsp; This is why
    the debugger treats full addresses as being of the form
    "<span style="font-style: italic;">Module-Sector-Syllable-Word</span>".&nbsp;
A
    numbering system is used in which <span style="font-style: italic;">Module</span>=0
    corresponds to Program
    Module I, <span style="font-style: italic;">Module</span>=1
    corresponds to Program Module II, and so on.<br>
    <br>
    However, this idealized numbering scheme pertains only to the
    situation immediately after assembly and before any ATM modules
    have been loaded into main memory, because the debugger really
    interprets <span style="font-style: italic;">Module</span>=0 as
    being "the contents of main memory" and not merely as Program
    Module I.&nbsp; Therefore, as time progresses and various program
    modules are loaded from ATM into main memory, <span
      style="font-style: italic;">Module</span>=0 becomes a mashup of
    not
    only Program Module I, but also a lot of other program modules as
    well.&nbsp; However, <span style="font-style: italic;">Module</span>=1-7
    will always continue to
    be the pure contents of ATM.<br>
    <h5><a name="Location-Field_Parsing_by_the_Debugger"
        id="Location-Field_Parsing_by_the_Debugger"></a><span
        style="font-style: italic;">Location</span>-Field Parsing by the
      Debugger</h5>
    Several of the debugger's commands (BREAK, DELETE,
    PRINT, EDIT) have a <span style="font-style: italic;">Location</span>
    field that represents a
    location at which an operation is supposed to be performed.&nbsp;
    For simplicity, the debugger uses the same parser for this field
    in all cases, whether or not all possibilities necessarily make
    sense for all commands.&nbsp; The <span style="font-style: italic;">Location</span>
    field can be any of the
    following:<br>
    <ul>
      <li>An existing left-hand symbol.</li>
      <li>An existing constant's name.</li>
      <li>An existing variable's name.</li>
      <li>An address of the form "<span style="font-style: italic;">Module-Sector-Syllable-Word</span>",
        with
        all fields being octal numbers, <span style="font-style:
          italic;">accesses a 13-bit value</span> at the
        specified address.&nbsp; <span style="font-style: italic;">Module</span>
        is in the range 0-7,
        <span style="font-style: italic;">Sector</span> is in range
        0-17 octal, <span style="font-style: italic;">Syllable</span>
        is in the range 0-2, and <span style="font-style: italic;">Word</span>
        is in the range 0-377
        octal.&nbsp; See the <a
          href="#Treatment_of_Program_Modules_by_the">section on program
          modules above</a> for more info on <span style="font-style:
          italic;">Module</span>.&nbsp;<br>
      </li>
      <li>An address of the form "D-<span style="font-style: italic;">Module-Sector-</span>0<span
          style="font-style: italic;">-Word"</span> is used to access a
        26-bit
        value in <span style="font-style: italic;">Syllable</span>
        0.<span style="font-style: italic;"><br>
        </span></li>
      <li>"HOP", for the HOP register.</li>
      <li>"ACC", for the Accumulator register.</li>
      <li>"PQ", for the PQ register.</li>
      <li>"PRO<span style="font-style: italic;">YX</span>", where
        <span style="font-style: italic;">YX</span> is a 2-digit octal
        number.&nbsp; This is meaningful only for the MEM driver of the
        <span style="font-weight: bold;">yaOBC</span> "--method"
        command-line switch.<br>
      </li>
      <li>"CLD<span style="font-style: italic;">YX</span>", where
        <span style="font-style: italic;">YX</span> is a 2-digit octal
        number.&nbsp; This is meaningful only for the MEM driver of the
        <span style="font-weight: bold;">yaOBC</span> "--method"
        command-line switch.</li>
    </ul>
    <h4><a name="Protocol" id="Protocol"></a>Communications Protocol
      for yaOBC</h4>
    If, perchance, you are familiar with the socket
    protocol use for Apollo-related software provided by the
    VirtualAGC project, such as <span style="font-weight: bold;">yaAGC</span>,
    <span style="font-weight: bold;">yaAGS</span>, <span
      style="font-weight: bold;">yaDSKY</span>, etc., you'll find the
    protocol and external tools used for the Gemini-related software
    very different.&nbsp; There's no particular reason for this,
    other than present convenience for me, though the new method does
    have some points in its favor as compared to the old.&nbsp;<br>
    <br>
    As mentioned above, <span style="font-weight: bold;">yaOBC</span>
    supports both network sockets or comports (RS-232, USB) for
    connecting the emulated CPU to emulated or physical
    peripherals.&nbsp; The protocol I envisage is basically the same
    in either case, and is as follows:<br>
    <ul>
      <li>Messages are 7-bit ASCII text.</li>
      <ul>
        <li>For comports, messages are delimited by a line-feed (LF)
          or carriage-return (CR) character, and empty messages are
          discarded.&nbsp; Therefore, software can terminate messages
          using newline characters from any of the major computing
          platforms (CR-LF for Windows, CR for Mac, LF for Linux/UNIX)
          without affecting the interpretation of the messge by its
          receiver.&nbsp; <span style="font-style: italic;">(If anyone
            was really going to use this for comports, it might be
            worthwhile to add CRC to the ends of the messages.&nbsp; I'm
            not going to worry about this for now, since at the moment I
            visualize it as extra complexity for a usage case that's not
            terribly likely.)</span><br>
        </li>
        <li>For sockets, messages are interchanged via <a
            href="http://enet.bespin.org/index.html">the cross-platform
            <span style="font-weight: bold;">enet</span> library</a>,
          and
          are "packets" as understood by that library. CR or LF
          terminations are not expected to be present within the
          messages.&nbsp; In this situation, the CPU emulator
          <span style="font-weight: bold;">yaOBC</span> acts as an
          <span style="font-weight: bold;">enet</span> server listening
          on the port defined by its command line switches (defaulting
          to "--port=19653), while peripheral emulators such as
          <span style="font-weight: bold;">yaPanel</span> act as
          <span style="font-weight: bold;">enet</span> clients
          connecting on the defined port.&nbsp; I also provide a
          utility program (<span style="font-weight: bold;">enetHost</span>)
          which can be used
          either as a client or server, and hence can be used for
          debugging or experimenting with the interface.<br>
        </li>
      </ul>
      <li>The following message types are defined:</li>
      <ul>
        <li>"R <span style="font-style: italic;">X</span>" is a
          message in either direction between the peripheral and CPU;
          if the CPU receives the message from a peripheral, it relays
          it to all peripherals.&nbsp; The message is a command to
          adjust the passage of emulated time with respect to real-time
          by factor <span style="font-style: italic;">X</span>, with
          <span style="font-style: italic;">X</span> being a
          floating-point number.&nbsp; If <span style="font-style:
            italic;">X</span>==1.0 (the default at startup),
          then emulated time is nominally identical to real time.&nbsp;
          If <span style="font-style: italic;">X</span>==2.0, then
          emulated time progresses twice as fast as real time, and so
          on.&nbsp; If emulated time is paused (for example, while OBC
          execution is paused at a debugger prompt), then <span
            style="font-style: italic;">X</span>==0.0.</li>
        <li>"S <span style="font-style: italic;">C</span>" is a
          message from the server to peripherals, instructing them to
          synchronize their internal timers to a nominal value of count
          <span style="font-style: italic;">C</span> (decimal).&nbsp;
          The synchronization is merely nominal, because it may need to
          be adjusted for the delays in sending and interpreting the
          command itself, and because the software's grasp of time is
          only nominal anyway.&nbsp; <span style="font-style: italic;">C</span>
          is actually the current number
          of OBC instructions executed by <span style="font-weight:
            bold;">yaOBC</span> since startup, and during
          debugging operations like single-step (when "R 0.0" is in
          effect), the "S" message is updated after every
          instruction.&nbsp; When "R 0.0" is not in effect, an "S"
          message is sent to any newly-connected peripheral, but "S"
          messages are sent only at several-second intervals
          thereafter.<br>
        </li>
        <li>"D<span style="font-style: italic;">YXB C</span>" is a
          message from a peripheral emulator to the CPU emulator which
          provides the current state of a discrete input.&nbsp; In this
          case, <span style="font-style: italic;">Y</span> and
          <span style="font-style: italic;">X</span> are octal digits
          which are the same as would be used in a <span
            style="font-family: Courier New,Courier,monospace;">"CLD
            <span style="font-style: italic;">YX</span>"</span> CPU
          instruction, while <span style="font-style: italic;">B</span>
          is either 0 or 1.&nbsp; <span style="font-style: italic;">C</span>
          is the timestamp (see the "S
          <span style="font-style: italic;">C</span>" command above) at
          which the data is valied.&nbsp; These messages are sent
          asynchronously, whenever the peripheral wishes to change the
          state of the input.&nbsp; <span style="font-weight: bold;">yaOBC</span>
          buffers the message
          appropriately, and only makes the result available to the
          CPU's actual CLD instruction when the appropriate timestamp
          <span style="font-style: italic;">C</span> is reached.&nbsp;
          If <span style="font-style: italic;">C</span> is 0, it is
          interpreted as the current time and the data is used
          immediately; this feature is primarily intended for debugging
          using the <span style="font-weight: bold;">enetHost</span>
          program mentioned above, and shouldn't be used by the CPU or
          peripherals in most cases.<br>
        </li>
        <li>"P<span style="font-style: italic;">YX D C</span>" is a
          message in either direction between the peripheral and the
          CPU, representing a <span style="font-family: Courier
            New,Courier,monospace;">"PRO
            <span style="font-style: italic;">YX</span>"</span> CPU
          instruction input in one case and an output in the
          other.&nbsp; <span style="font-style: italic;">D</span> is a
          set of up to 9 octal digits representing the data and
          <span style="font-style: italic;">C</span> is the timestamp
          at which the data is valid.&nbsp; These messages are sent
          asynchronously, and the receiving device is supposed to
          buffer it until the time indicated by the timestamp has been
          reached.&nbsp; If <span style="font-style: italic;">C</span>
          is 0, it is interpreted as the current time and the data is
          used immediately; this feature is primarily intended for
          debugging using the <span style="font-weight: bold;">enetHost</span>
          program mentioned above,
          and shouldn't be used by the CPU or peripherals in most
          cases.</li>
        <li>"A <span style="font-style: italic;">C</span>" (comports
          only) is a message in either direction to repeat all messages
          from timestamp <span style="font-style: italic;">C</span>
          onward, and would presumably be used in case a corrupted
          message had been detected.&nbsp; <span style="font-style:
            italic;">(I don't intend actually implementing
            this until/unless somebody asks me for it, since I don't
            presently think that comports are a likely usage
            case.)</span></li>
      </ul>
      <li>The full set of messages which need to be sent over new
        connections between the CPU and peripherals is presently
        TBD.&nbsp; I'm not sure that there is any good answer to this
        question. <span style="font-style: italic;"><br>
        </span></li>
    </ul>
    For example:&nbsp; Part of the process of downlinking
    telemetry data is outputting a data word via <span
      style="font-family: Courier New,Courier,monospace;">"PRO 10"</span>
    to
    the <a href="#Downlink">Instrumentation System</a> (IS).&nbsp;
    For the sake of argument, we'll suppose that the word in the
    accumulator is octal 123454321, and that the <span
      style="font-family: Courier New,Courier,monospace;">PRO</span>
    instruction will be the 666'th instruction executed.&nbsp; The
    message emitted by the CPU is "P10 123454321 666".<br>
    <br>
    The optional usage of the <span style="font-weight: bold;">enetHost</span>
    program is very
    simple:&nbsp; To start a server, do "enetHost --server"; only one
    server can be running on any given port, so if <span
      style="font-weight: bold;">yaOBC</span> or another instance of
    <span style="font-weight: bold;">enetHost</span> is running on
    the same port, this operation will fail.&nbsp; To start a client,
    just "enetHost" (or "enetHost --client", if you prefer).&nbsp; Up
    to 32 clients can connect to one server, as presently
    configured.&nbsp; The switch "--port=<span style="font-style:
      italic;">PortNum</span>" can be used to select a
    port other than the default 19653.&nbsp; Message data which is
    supposed to be sent is accepted on stdin, without any
    supplemental data.&nbsp; Received-message data is output on
    stdout, accompanied by some helpful information:<br>
    <ul>
      <li>A leading field consisting of the number of characters in
        the message.</li>
      <li>A field uniquely identifying the sender of the message, by
        IP address and dynamically-assigned port number.</li>
      <li>The message itself is in double-quotes.</li>
    </ul>
    Additional information of a less-useful nature, like
    information on connects and disconnects, user prompts, and so on,
    is output on stderr.&nbsp; In theory, one could construct a
    Gemini peripheral emulator from a language with no bindings for
    the <span style="font-weight: bold;">enet</span> library, such
    Tcl/Tk or some other interpreted language, by using <span
      style="font-weight: bold;">enetHost</span> as a backend and
    redirecting/interpreting stdin/stdout/stderr appropriately.<br>
    <h3><a name="yaOBCASM_the_OBC_Cross-Assembler"
        id="yaOBCASM_the_OBC_Cross-Assembler"></a>yaASM, the OBC
      Cross-Assembler</h3>
    <span style="font-weight: bold;">yaASM</span>
    has been discussed above quite a bit, but a few unexplored
    details remain.&nbsp; This program is presently functional for
    OBC, though not necessarily debugged or tested.<br>
    <br>
    <span style="font-weight: bold;">yaASM</span> is an assembler for
    Gemini OBC and <a href="LVDC.html">LVDC</a> assembly language
    files, outputting a binary executable suitable for being used
    with <a href="#yaOBC_the_OBC_CPU_Emulation"><span
        style="font-weight: bold;">yaOBC</span></a> or <span
      style="font-weight: bold;">yaLVDC</span> simulation
    software.&nbsp; The
    assembly language for OBC is as <a href="#Gemini_Assembly_Language">defined
      above</a>, while the
    assembly-language for LVDC is defined on the <a
      href="LVDC.html#LVDC_Assembly_Language">LVDC page</a>.&nbsp; Of
    course, the reason this combined approach is used is because of
    the great similarities between the two computers and their
    instruction sets.<br>
    <br>
    By convention, but not by any requirement of the assembler,
    Gemini OBC and LVCD source-code files have the filename
    extensions .obc and .lvdc, respectively.&nbsp; This convention
    arises from the existence (or potential existence) of
    CPU-specific syntax highlighters when viewing such source
    code.&nbsp; The assembler does not care what the filename
    extensions are.<br>
    <br>
    Note that at present, <span style="font-weight: bold;">yaASM</span>
    simply aborts with an error
    message upon the first source-code error it detects.&nbsp; I
    personally don't like that behavior—I'd like to get a complete
    list of all errors—but I may or may not be too lazy to ever
    change it.<br>
    <br>
    The command-line syntax for <span style="font-weight: bold;">yaASM</span>
    is as follows<br>
    <br>
    <div style="text-align: center;"><big><span style="font-family:
          monospace;">yaASM [<span style="font-style: italic;">OPTIONS</span>]
          --input=<span style="font-style: italic;">SourceFilename
            &gt;OutputListing</span></span></big><br>
    </div>
    <br>
    The assembled executable binary is always put into a file called
    yaASM.bin.<br>
    <br>
    The presently-defined <span style="font-style: italic;">OPTIONS</span>
    are:<br>
    <br>
    --help<br>
    <div style="margin-left: 40px;">
      Displays the available <span style="font-style: italic;">OPTIONS</span>
      and exits.<br>
    </div>
    <br>
    --lvdc<br>
    <div style="margin-left: 40px;"><span style="font-style: italic;">(Option
        present, but not
        currently correctly functional.)</span> This switch causes
      assembly to occur for the LVDC computer.&nbsp; The default,
      when the switch is missing, is to assemble for the Gemini
      OBC.<br>
      <br>
    </div>
    --hwm<br>
    <div style="margin-left: 40px;">
      Equivalent to putting the directive <span style="font-family:
        Courier New,Courier,monospace;">HALF</span> at
      the top of the input source file to set half-word mode.&nbsp;
      The default is <span style="font-family: Courier
        New,Courier,monospace;">NORM</span> to
      set normal mode instead.&nbsp; The --hwm switch (or lack
      thereof) can be overridden by the directives within the source
      file itself.<br>
    </div>
    <br>
    --code=<span style="font-style: italic;">M-</span><span
      style="font-style: italic;">PP-S-WWW</span><br>
    <div style="margin-left: 40px;">
      Equivalent to putting the directive "CODE <span
        style="font-style: italic;">M-</span><span style="font-style:
        italic;">PP-S-WWW</span>" at the top of the input
      source file.&nbsp; The default for OBC is "CODE
      0-00-2-000".&nbsp; Can be overridden by the directives within
      the source file itself.<br>
    </div>
    <br>
    --data=<span style="font-style: italic;">M-</span><span
      style="font-style: italic;">PP-S-WWW</span><br>
    <div style="margin-left: 40px;">
      Equivalent to putting the directive "DATA <span
        style="font-style: italic;">M-PP-S-WWW</span>" at the top of the
      input source file.&nbsp; The default for OBC is "DATA
      0-00-0-000".&nbsp; Can be overridden by the directives within
      the source file itself.<br>
    </div>
    <br>
    The formats of the binary output files are identical for Gemini
    OBC vs. LVDC.&nbsp; The Gemini OBC has 3 syllables per memory
    word, whereas the LVDC has 2 syllables per memory word, bus
    syllable 2 is simply cleared to 0 for the LVDC binary output
    files.&nbsp; It's true that the the LVDC has up to 8 memory
    modules, whereas the Gemini OBC has only 1 ... but the OBC has up
    to 6 program modules (which we logically extend to 8) while the
    LVDC has only 1; so we economize and use the same output format
    for both.&nbsp; LVDC syllables are theoretically 14 bits rather
    than 13 bits, but the extra bit is a parity bit that is
    accessible only in hardware, and therefore is not
    supported.&nbsp; Otherwise, the file formats are the same:<br>
    <ul>
      <li>The binary file consists of a sequence of 16-bit
        integers.</li>
      <li>Most of the output integers contain a 13-bit syllable,
        aligned at the least-significant bit of the 16-bit word.</li>
      <li>The output words are ordered so that the first word is for
        syllable 0 of address 0 of sector 0 of module 0.</li>
      <li>Successive output words increment first the word number (0
        to 255) next the syllable number (0,1,2), then the sector (0 to
        15), then the module number (0 to 7).</li>
      <li>At the end are the following additional 32-bit
        integers:</li>
      <ul>
        <li>The contents of the HOP register.&nbsp; The starting HOP
          constant defaults to 0-00-2-000 with HWM=0, as far as
          <span style="font-weight: bold;">yaASM</span> is concerned,
          but can be changed within the source code:&nbsp; Just make
          sure there's a constant named OBCENTRY defined like
          "<span style="font-family: Courier New,Courier,monospace;">OBCENTRY
            HOPC
            LHS</span>", where LHS is an existing left-hand symbol for
          where you want the program execution to start.</li>
        <li>The contents of the accumulator register.&nbsp; This is
          always 0 for files created by <span style="font-weight:
            bold;">yaASM</span>.</li>
        <li>The contents of the PQ register (which is what's accessed
          by the instruction <span style="font-family: Courier
            New,Courier,monospace;">SPQ</span>).&nbsp;
          This is always 0 for files created by <span
            style="font-weight: bold;">yaASM</span>.</li>
      </ul>
    </ul>
    There's no attempt by the assembler to make this binary file
    portable to other computers, so if you assemble such a binary
    file on a computer with a little-endian format (such as so-called
    'x86 CPUs have) and try to emulate it on a computer with a
    big-endian format (such as PowerPC), or vice-versa, you will find
    that it doesn't work.&nbsp; However, if you stay within the 'x86
    family of computers, there should be no problem passing such
    files around among Linux, Windows, and Mac OS X computers at
    will.<br>
    <h3><a name="yaPanel_the_Control_Panel_Emulation_"
        id="yaPanel_the_Control_Panel_Emulation_"></a><img alt=""
        src="GeminiIVPilotPanel.gif" style="width: 633px; height:
        514px;" width="633" height="514" align="right">yaPanel, the
      Control Panel
      Emulation</h3>
    Unlike the Apollo spacecraft (plural), the Gemini
    spacecraft had a simple enough control panel that it makes sense
    to simulate the complete control panel on a single computer
    screen.&nbsp; Of course, since we won't simulate all of the
    Gemini peripherals, many of the controls and readouts won't be
    functional.&nbsp; <a name="yaMDIU_the_MDIU_Emulation"
      id="yaMDIU_the_MDIU_Emulation"></a>Recall that the MDIU comprises
    the MDR readout unit and the MDK keypad unit, as seen in the
    photo at right, to provide a simple display and keypad interface
    to the OBC.&nbsp; <span style="font-weight: bold;"><br>
      <br>
      yaPanel</span> software would provide a simulated MDIU interface
    to the <span style="font-weight: bold;">yaOBC</span>
    simulated-OBC software ... if <span style="font-weight: bold;">yaPanel</span>
    existed.&nbsp; Right now,
    it's merely a fairly-distant gleam in my eye.<br>
    <br>
    Operation of the OBC via the MDIU follows a simple set of
    conventions, as follows:<br>
    <ul>
      <li>Command/data entry into the computer is performed by
        entering a 7-digit string of numbers.</li>
      <li>The first two digits are an "address" (01-99), and the
        final five digits are a "message" (octal or decimal, depending
        on context).&nbsp; Note that the MDR has a 7-digit readout,
        which is parsed into a 2-digit field followed by a 5-digit
        field.</li>
      <li>The digit '9' serves a dual purpose, in that if it is the
        leading digit of the 5-digit message field it is treated as a
        minus-sign.</li>
      <li>If the astronaut makes a data-entry error in using the MDIU
        (see the procedures listed just below), the MDR display shows
        all 0 to indicate that an error occurred.</li>
      <li>When entering digits, pressing the CLEAR key on the MDR
        will erase all of the digits so that entry can be
        restarted.</li>
      <li>When entering digits, it's necessary to wait until a digit
        is displayed before entering the next digit.&nbsp;<br>
      </li>
    </ul>
    Control of the OBC via the MDIU is very similar to control
    of the <a href="yaAGS.html">Apollo AGS via its DEDA</a>.&nbsp;
    Here are the operations which can be performed by the astronaut
    using the MDIU:<br>
    <ul>
      <li>The astronaut can control the OBC by inserting data into
        OBC memory addresses using the MDK and MDR.&nbsp; The procedure
        for doing so is as follows:</li>
      <ol>
        <li>Press the CLEAR button on the MDR.<br>
        </li>
        <li>Enter 7 digits using the numerical keypad on the
          MDK.&nbsp; The first two digits are the address, and the last
          five digits are the data.<br>
        </li>
        <li>Press the ENTER button on the MDR to actually perform the
          operation.</li>
      </ol>
      <li>The astronaut can verify data previously stored in the OBC
        as follows:</li>
      <ol>
        <li>Press the CLEAR button on the MDR.<br>
        </li>
        <li>Enter just the 2 address digits on the MDK.</li>
        <li>Press the READ OUT button on the MDR.</li>
        <li>The requested data will be displayed and updated at
          half-second intervals.</li>
      </ol>
    </ul>
    <img alt="" src="GeminiSwitches.png" style="width: 605px; height:
      341px;" width="605" hspace="10" height="341" align="right">The
    relationship of the "addresses" 1-99 to
    actual physical memory addresses is TBD.&nbsp; (There is no
    reason logically why they can't map to any 99 memory
    locations.&nbsp; However, for efficiency of coding, it's
    reasonable to suppose that they were actually contiguous.&nbsp;
    It's also reasonable to suppose that they resided in the residual
    sector, so that they could be immediately accessed by code in any
    memory sector.)<br>
    <br>
    <a name="PCDP" id="PCDP"></a>As another example, <span
      style="font-weight: bold;">yaPanel</span> would provide a
    simulated
    Pilots' Control and Display Panel (PCDP).&nbsp; The additional
    controls provided by the PCDP are:<br>
    <ul>
      <li>The COMPUTER mode selector—selects between the different
        sub-programs the computer can run, such as "pre-launch",
        "ascent", and so on.<br>
      </li>
      <li>The START switch—tells the computer to actually begin
        executing the computation selected by the COMPUTER
        selector.</li>
      <li>The COMP light—lit while the computation is in
        progress.</li>
      <li>The MALF light—to indicate a malfunction.</li>
      <li>The RESET switch—to reset the computer after a
        malfunction.</li>
      <li>The ON-OFF switch.<br>
      </li>
    </ul>
    <div style="text-align: center;"><br>
    </div>
    <br>
    <img alt="" src="GeminiIVI.png" style="width: 600px; height: 524px;"
      width="600" hspace="10" height="524" align="right"><a name="IVI"
      id="IVI"></a>Then too, consider
    the Incremental Velocity Indicator (IVI) from the command-pilot's
    control panel, as depicted at right.&nbsp; The IVI has a set of
    three 3-digital displays that show the current velocity of the
    spacecraft relative to a previously-set zero reference.&nbsp; (It
    can also be used to show data related to the Auxiliary Tape
    Memory, if any.)&nbsp; The OBC sends pulses to the IVI that
    increment or decrement the displays whenever the velocity
    changes.<br>
    <ol>
      <li>Forward-direction indication lamp.&nbsp; When lit,
        indicates that the delta-V value shown on the forward-aft
        display device (2) is in the forward direction.<br>
      </li>
      <li>Forward-aft display device.&nbsp; Displays the magnitude of
        the forward or aft delta-V from the previously-set zero point,
        in ft./sec.</li>
      <li>Left-direction indication lamp.&nbsp; When lit, indicates
        that the delta-V value shown on the left-right display device
        (4) is in the left direction.</li>
      <li>Left-right display device.&nbsp; Displays the magnitude of
        the leftward or rightward delta-V from the previously-set zero
        point, in ft./sec.<br>
      </li>
      <li>Right-direction indication lamp.&nbsp; When lit, indicates
        that the delta-V value shown on the left-right display device
        (4) is in the right direction.</li>
      <li>Up-down display device.&nbsp; Displays the magnitude of the
        upward or downward delta-V from the previously-set zero point,
        in ft./sec.</li>
      <li>Up-direction indication lamp.&nbsp; When lit, indicates
        that the delta-V value shown on the up-down display device (6)
        is in the up direction.</li>
      <li>Down-direction indication lamp.&nbsp; When lit, indicates
        that the delta-V value shown on the up-down display device (6)
        is in the down direction.</li>
      <li>Down-up rotary switch.&nbsp; Can be used to manually zero
        or otherwise adjust the up-down display device (6).&nbsp;
        Spring-loaded to return to the neutral position.<br>
      </li>
      <li>Left-right rotary switch. Can be used to manually zero or
        otherwise adjust the left-right display device (4).&nbsp;
        Spring-loaded to return to the neutral position.</li>
      <li>Aft-forward rotary switch. Can be used to manually zero or
        otherwise adjust the forward-aft display device (2).&nbsp;
        Spring-loaded to return to the neutral position.</li>
      <li>Aft-direction indication lamp.&nbsp; When lit, indicates
        that the delta-V value shown on the forward-aft display device
        (2) is in the aft direction.</li>
    </ol>
    <span style="font-weight: bold;">yaPanel</span> also
    provides some simulated control-panel indicators related to the
    Time Reference System (TRS), which relate to passage of real time
    rather than being controlled by the OBC.&nbsp; These displays
    include three separate clocks and a stop-watch function.&nbsp; We
    don't provide a simulated TRS as such, but <span
      style="font-weight: bold;">yaPanel</span> is obviously aware of
    the
    passage of real time, and consequently it can provide these
    simulations itself.&nbsp; The operation of these simulated
    devices should be pretty self-explanatory.<br>
    <br>
    <div style="text-align: center;"><img alt="" src="GeminiClocks.png"
        style="width: 600px; height: 482px;" width="600" height="482"><br>
    </div>
    <br>
    <div style="text-align: center;">
      <div style="text-align: left;">
        <h2><a name="Plea_for_Data" id="Plea_for_Data"></a>Plea for
          Data</h2>
        As you will have noted if you've read this far,
        there are some pretty serious gaps in the publicly-accessible
        data about the Gemini computer and its software.&nbsp; If you
        know where to find any more information, please tell me about
        it.&nbsp; Examples of some of the things that would be
        interesting to have include:<br>
        <ul>
          <li>Source code, source code, source code.&nbsp; Any
            computer source code—or for that matter, binary code—that
            ran on the Gemini computer would be useful:</li>
          <ul>
            <li>Flight software.</li>
            <li>Preflight software.</li>
            <li>Test &amp; checkout software.</li>
            <li>Even sample code.</li>
          </ul>
          <li>Manuals explaining the syntax of Gemini
            assembly-language.</li>
          <li>Any documents missing from the <a href="links.html">Document
              Library</a>.</li>
          <li>Developers' notes.</li>
        </ul>
        Another interesting possibility is to locate a tape from
        the Gemini Aux Tape Unit.&nbsp; Since the Aux Tape Unit was
        used to load software for some mission phases in flight, it
        is possible such a tape could still hold actual executable
        OBC software.<br>
        <h2><a name="Reminiscences_and_Factoids_from_the"
            id="Reminiscences_and_Factoids_from_the"></a>Reminiscences
          and
          Factoids from the Original Developers</h2>
        In this section, I
        provide distilled/edited material from personal
        correspondence I've had (directly or indirectly) with
        original OBC developers.&nbsp; The following are thus not
        direct quotes, and you should attribute errors to me rather
        than to my correspondents.<br>
        <br>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From Eugene Mertz:</span></span><br>
        <div style="margin-left: 40px;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);">
                  <p class="MsoNormal"><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">I
                        worked on
                        the Gemini project at IBM in Owego, NY, and
                        Bethesda, MD, from about 1962 through 1968,
                        basically from the beginning to the end of the
                        project, and was responsible for the in-orbit
                        software applications of the onboard computer
                        system.&nbsp; The Gemini software team was
                        organized by function (ascent, rendezvous and
                        in-orbit navigation, and reentry).&nbsp; My
                        responsibilities encompassed the rendezvous and
                        in-orbit, autonomous navigation functions.&nbsp;
                        Our rendezvous group consisted of five
                        people:&nbsp; two analysts, two simulation
                        programmers, and one on-board computer
                        programmer.&nbsp; The other groups were
                        similarly
                        organized.<br>
                      </span></font></p>
                  <p style="color: rgb(0, 0, 0);" class="MsoNormal"><font
                      size="2" face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">Many
                        things
                        were new in the 50s, 60s and 70s.&nbsp; In the
                        late
                        50s, I participated in a panel discussion on
                        local
                        TV to explain to the public what space,
                        satellites,
                        Sputnik, Vanguard, etc., were all about.&nbsp;
                        Looking back on that experience, I believe it
                        was
                        done to alleviate small-town public fear that
                        something bad was about to happen soon.
                        &nbsp;I'm
                        not sure we succeeded.</span></font><br>
                  </p>
                  <p class="MsoNormal"><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">The
                        transcendental equations of relative motion
                        between
                        the Gemini spacecraft and its target vehicle
                        included a series expansion of the Earth's
                        gravitational field (without the South Atlantic
                        Anomaly).<br>
                      </span></font></p>
                  <p class="MsoNormal"><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">The
                        transcendental equations were written by an IBM
                        engineer<big><big>, <small><small>Connie
                                McClure,</small></small></big></big> who
                        was a
                        professor formerly at GW University (I believe)
                        in
                        Washington, DC.&nbsp; He</span></font> <font
                      size="2" face="Arial"><span style="font-size:
                        10pt; font-family: Arial;">also taught
                        orbital mechanics to the team very early in the
                        project.&nbsp; It was a tough
                        course</span></font><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">.&nbsp;
                        I
                        wish I had kept all his
                        notes.</span></font><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">&nbsp;
                        The
                        series expansion was verified and derived by a
                        number of analysts at IBM, other contractors and
                        sub-contractors, and probably
                        NASA.</span></font><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">&nbsp;
                        As I
                        recall, the values of the constants were
                        determined
                        by tracking satellites that were already in
                        orbit.&nbsp; The constants were to change from
                        time
                        to time but finally settled down to those
                        selected
                        in the OBC.</span></font><font size="2"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;">&nbsp;
                        All
                        equations were checked and re-checked by project
                        members several times to be sure they were
                        accurate.&nbsp; Some equations were adapted to
                        the
                        in-orbit Autonomous Navigation function.&nbsp;
                        Many
                        computer hours were expended on IBM mainframes
                        (7090/7094) simulating all mission aspects to
                        "man-rate" the Gemini
                        system.<br>
                      </span></font></p>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">Our
                      mainframe Fortran simulator had a converter that
                      allowed plugging in the actual Gemini flight code
                      to replace the Fortran version in the 7094
                      simulation.&nbsp; This, of course, was used to
                      check the actual flight code for closed-loop
                      timing
                      or other problems.&nbsp; A Mylar punched tape was
                      used to load the Gemini computer memory itself
                      (except for the programs that were stored on the
                      Auxiliary Tape Unit) prior to launch.&nbsp; I
                      recall a situation where the tape reader was
                      lifted
                      up the outside of the launch tower, connected to
                      the Gemini computer (which was already installed
                      in
                      the spacecraft), and a program fix loaded to
                      correct a radar hardware problem.&nbsp; This would
                      NEVER be done today!<br>
                    </span></font><br>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">We
                      started
                      out with FORTRAN II running on the 7090, but when
                      our computer was upgraded to the 7094, I believe
                      we
                      quickly switched to FORTRAN IV.&nbsp; IBM was
                      never
                      shy when they pushed for adopting standards.&nbsp;
                      After all, if their version of the standards was
                      adopted, they had a foot in the door.&nbsp; The
                      switch from FORTRAN II to FORTRAN IV occurred, but
                      it could have been as early as 1963-64, in time
                      for
                      Gemini 7/6.&nbsp; Our facility was always on the
                      forefront of technology.&nbsp; I don't recall the
                      exact date of the switchover.&nbsp; The version
                      used for the catch-up and rendezvous simulation
                      program could have been FORTRAN II.&nbsp; The key
                      is whether or not there are no "machine-dependent
                      features" included in the listing.&nbsp; I can't
                      tell for sure.&nbsp; I know we used punched cards
                      for loading the program, a 1401/1403 for printing,
                      and a special plotter on the "other side of the
                      wall" to show relative trajectories.&nbsp;
                      Wow!&nbsp; What power. [<span style="font-style:
                        italic;">Ed.: There are
                        machine-dependent features, it seems, so the
                        program must either have been FORTRAN II or a
                        mix
                        of II and IV.</span>]</span></font><br>
                  <br>
                  <font size="2" color="navy"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial; color:
                      navy;"><span style="color: rgb(0, 0, 0);">The 7094
                        rendezvous simulator could also accept telemetry
                        data to drive the guidance in open-loop fashion
                        (post flight) to show what really (?) happened
                        during the mission.&nbsp; Closed-loop computer
                        control in flight proved to be the most
                        efficient
                        mode (only 5% above maneuvering fuel
                        plan).&nbsp;</span><br>
                    </span></font><br>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">Here
                      are a
                      few tidbits which I believe are
                      accurate:</span></font><br>
                  <br>
                  <ul style="margin-top: 0in;" type="disc">
                    <li class="MsoNormal" style=""><font size="2"
                        face="arial,helvetica,sansserif"><span
                          style="font-size: 10pt; font-family: Arial;">A
                          translator was used to generate the flight
                          computer code which was then punched into wide
                          (2-inch?) Mylar tape for use in a memory
                          loader.&nbsp; But</span></font> <font
                        size="2" face="Arial"><span style="font-size:
                          10pt; font-family: Arial;">I don't
                          recall exactly what the translator
                          encompassed.&nbsp;</span></font> <font
                        size="2" face="Arial"><span style="font-size:
                          10pt; font-family: Arial;">Perhaps
                          someone else will come forward with
                          clarification.</span></font></li>
                    <li class="MsoNormal" style=""><font size="2"
                        face="arial,helvetica,sansserif"><span
                          style="font-size: 10pt; font-family: Arial;">A
                          lot of
                          coordinate system transformations were
                          performed,
                          especially during rendezvous.</span></font></li>
                    <li class="MsoNormal" style=""><font size="2"
                        face="arial,helvetica,sansserif"><span
                          style="font-size: 10pt; font-family: Arial;">Changing
the
                          flight software required a big
                          shoehorn.&nbsp; Installing a code change might
                          have meant using 300 memory locations.&nbsp;
                          Subsequently removing the change would save
                          only
                          200.</span></font></li>
                  </ul>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">I'm
                      beginning to learn things about the Gemini memory
                      I
                      wish I had known in the 1960s.&nbsp; For example,
                      after many divide instructions were executed in a
                      row (I don't know how many), the memory cores
                      heated up and you would get the wrong answer in
                      the
                      accumulator. &nbsp;This problem was controlled by
                      inserting a no-op instruction between the divides,
                      thus keeping the cores cool enough to always give
                      the right answer.&nbsp; Wow!&nbsp; If I had known
                      this, maybe I would have structured the guidance
                      equations differently.&nbsp; But we had smart OBC
                      programmers who could figure out ways to get
                      around
                      hardware problems, both in the OBC and in external
                      equipment (such as the on-board radar).&nbsp;
                      There
                      were lots of lessons learned in the early days of
                      space flight.&nbsp; And there wasn't much time to
                      spend figuring out how to fix
                      problems.</span></font><br>
                  <br>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">The
                      MARS
                      [type of memory element used] inventor was
                      probably
                      <a
                        href="http://www.spoke.com/info/pFeUHpV/AlbertVinal">Al
                        Vinal</a>.&nbsp;</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">I
                      recall the
                      core device as being called Multi-Aperture
                      Reluctance Switch.</span></font><small><small><font
                        style="font-family: Arial;" size="3" face="Times
                        New Roman"><small><small><span style="font-size:
                              12pt;"><small>Making the MARS devices
                                was an art, not a science.&nbsp; They
                                were
                                made</small></span></small></small></font><font
                        style="font-family: Arial;" size="3" face="Times
                        New Roman"><small><small><span style="font-size:
                              12pt;"><small>using an "aspirin press"
                                and fired in an oven, a tray at a
                                time.</small></span></small></small></font></small></small><br>
                  <br style="color: rgb(0, 0, 0);">
                  <font style="color: rgb(0, 0, 0);" size="2"
                    color="navy" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">The
                      OBC code
                      listings were run through a detailed manual check
                      by a team of OBC programmers and hardware experts,
                      instruction by instruction.&nbsp; All team members
                      had to agree 100%.&nbsp;<br>
                      <br>
                      I recall (?) there was a processing module that
                      used input from OBC compiled instructions and
                      created a punched Mylar output tape.&nbsp; This
                      tape was run on the memory loader [6' x 19" rack
                      of
                      equipment!] to program the
                      OBC.</span></font><br style="color: rgb(0, 0, 0);">
                  <br>
                  <font style="color: rgb(0, 0, 0);" size="2"
                    color="navy" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><span
                        style="font-style: italic;">(On finding a memo
                        describing
                        the three-term</span></span></font><small><span
                      style="font-family: Arial; font-style: italic;">gravitational
potential
                      function describing the</span><span
                      style="font-family: Arial;"><span
                        style="font-style: italic;">oblate Earth while
                        looking
                        for material for this website.)</span></span><span
                      style="font-family: Arial;">It surprised me
                      to find the equation. Three</span><br
                      style="font-family: Arial;">
                    <span style="font-family: Arial;">terms were used
                      for the rendezvous mode, two terms used for the
                      orbital</span> <span style="font-family: Arial;">navigation
                      mode, and up to
                      six terms were used for the "environment"</span><span
                      style="font-family: Arial;">simulation and
                      accuracy comparisons. Obviously (?), the OBC
                      couldn't handle</span> <span style="font-family:
                      Arial;">six terms along with
                      everything else in memory, or the speed required.
                      We</span> <span style="font-family: Arial;">needed
the
                      power of a modern TV remote.</span></small><span
                    class="moz-smiley-s1"><span>:-)</span></span>
                  &nbsp;&nbsp;<br>
                  <font style="color: rgb(0, 0, 0);" size="2"
                    color="navy" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><span
                        style="font-style: italic;"><br>
                        (On the subject of recreating the complete OBC
                        assembly-language source code from Math Flow
                        diagrams.)</span> Charlie Leist, Alden Minnick,
                      and
                      I discussed the possibility of recreating the
                      complete reentry and rendezvous modules but, as a
                      group, rejected the idea because the effort to do
                      so would have been too great.&nbsp; Instead, Alden
                      and Charlie each chose a section of code they felt
                      comfortable (?) coding.&nbsp; Comfort was relative
                      because neither was sure he could recall all the
                      details.&nbsp; A lot of reading of the programming
                      manual and discussion was necessary to recall what
                      it all meant.&nbsp; That's why it took so long to
                      complete the snippets.&nbsp; Further, the I/O
                      other
                      subroutines were missing.&nbsp; They would have
                      had
                      to be "reinvented."&nbsp; We just had the names of
                      the subroutines, not the actual
                      code.</span></font><br style="color: rgb(0, 0,
                    0);">
                  <br style="color: rgb(0, 0, 0);">
                  <font style="color: rgb(0, 0, 0);" size="2"
                    color="navy" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">Consider
this
                      \96 the OBC was the first attempt (to my
                      knowledge) by the company to develop a digital
                      computer to fly men into space.&nbsp; The memory
                      device, the same as was used in OAO, was designed
                      basically for collection of data from the
                      telescope, storing it until it could be sent via
                      telemetry to a ground station.&nbsp; No real
                      computer involved — until
                      Gemini.</span></font><br style="color: rgb(0, 0,
                    0);">
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><br>
                      I met Wally Schirra in Washington, DC, almost 25
                      years to the day after the historic first
                      rendezvous on December 16, 1965.&nbsp; I recall
                      his
                      words, "I remember you."&nbsp; The mission was
                      Gemini 7/6.<br>
                      <br>
                    </span></font> <small><span style="font-family:
                      Arial;">The photos below have nothing
                      to do with Gemini.&nbsp; They depict a Vanguard
                      tracking station using a MiniTrack Mark II
                      installation.&nbsp; I am the middle figure, and to
                      the left and right are L. Passage and K. Watson,
                      respectively.&nbsp; To my knowledge, they were not
                      involved in Gemini.&nbsp; The right-hand photo
                      shows a partially completed half of the antenna,
                      which consisted of two 8-dipole arrays spaced 500
                      feet apart.&nbsp; It was all, including frequency
                      converters, etc., constructed by hand by
                      volunteers.&nbsp; Yes, that is snow on the ground.
                      The photos were taken about four years prior to
                      the
                      Gemini project (following the first successful
                      launch of Vanguard 1 on March 17, 1958).&nbsp; We
                      worked together on some terrestrial projects in
                      the
                      1950s.&nbsp; Many of us were members of the radio
                      club, K2ERQ, and we tracked sightings for Echo
                      (100-foot Mylar balloon) and other
                      satellites.&nbsp; The tracking program was written
                      in FORTRAN by unknown persons at Brown
                      University.&nbsp; We ran the program on an IBM 650
                      computer (drum machine, probably FORTRAN I).&nbsp;
                      I believe the club's interest in satellite
                      tracking
                      and space in general announced that the company
                      was
                      ready, willing, and able to enter the space
                      development.&nbsp; At least, we believe so
                      (according to club
                      lore).</span><small><br>
                    </small></small><font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><br>
                    </span></font>
                  <table summary="" style="text-align: left; width:
                    100%;" cellspacing="2" cellpadding="2" border="0">
                    <tbody>
                      <tr>
                        <td style="vertical-align: top; text-align:
                          center;"><a
                            href="MiniTrackMark-II-StationAtK2ERQ-002.jpg"><img
                              alt="Gene and friends at Vanguard tracking
                              station" title="Click to enlarge."
                              src="thm-MiniTrackMark-II-StationAtK2ERQ-002.jpg"
                              style="border: 2px solid ; width: 252px;
                              height: 200px;"></a><br>
                        </td>
                        <td style="vertical-align: top; text-align:
                          center;"><a
                            href="MiniTrackMark-II-AntennaAtK2ERQ-001.jpg"><img
                              alt="Partially-completed antenna for the
                              tracking station." title="Click to
                              enlarge."
                              src="thm-MiniTrackMark-II-AntennaAtK2ERQ-001.jpg"
                              style="border: 2px solid ; width: 235px;
                              height: 200px;"></a><br>
                        </td>
                      </tr>
                    </tbody>
                  </table>
                  <font size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><br>
                    </span></font></td>
              </tr>
            </tbody>
          </table>
          <br>
        </div>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From Charlie Leist:</span></span>
        <div style="margin-left: 40px;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);">
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        The ATM magnetic tape was 550 feet long and
                        about
                        1 inch wide. The magnetic tape was loaded using
                        test equipment run in the IBM Owego test lab
                        that
                        read a 2000 ft mylar tape with punched holes
                        that
                        contained the memory load information for each
                        program module. The operational program
                        modules&nbsp;had to be placed on the magnetic
                        tape twice in sequence just in case there was a
                        malfunction in loading a program module. The
                        second half of the magnetic tape contained the
                        same memory load information as the first half
                        of
                        the tape. The tape header for each program
                        module
                        was unique so there would be no confusion on
                        what
                        program module to load into the Gemini computer
                        memory.<br>
                        <br>
                      </span></font></div>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        It was my job to generate the 2000 ft punch tape
                        after each module programmer had tested and peer
                        code inspected their operational program module.
                        I do not remember&nbsp;ever having to change a
                        magnetic tape from wear or breakage&nbsp;on a
                        tape unit for any of the flight programs&nbsp;in
                        the test lab. This tape unit was sealed and the
                        magnetic tape not easily changed.<br>
                        <br>
                      </span></font></div>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        The peer code inspection included a scheduled
                        meeting in a conference with the appropriate
                        system engineers and operational programmers.<br>
                        <br>
                      </span></font></div>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        The inspection process included the following
                        reviews:<br style="font-family: Arial;">
                      </span></font></div>
                  <div style="font-family: Arial;"></div>
                  <div style="font-family: Arial;"></div>
                  <ol style="font-family: Arial;">
                    <li><font size="2" color="black"><span
                          style="font-size: 10pt; color: black;">A
                          comparison of
                          every block on a system math flow diagram
                          (developed by the system engineer)&nbsp;with
                          every corresponding&nbsp;block on a detailed
                          math
                          flow diagram (developed by a
                          programmer).</span></font></li>
                    <li><font size="2" color="black"><span
                          style="font-size: 10pt; color: black;">A
                          comparison of
                          every program instruction (assembly listing
                          generated on the IBM 7090&nbsp;computer by the
                          programmer) with every block&nbsp;on&nbsp;the
                          detail&nbsp;flow diagram.</span></font></li>
                  </ol>
                  <div style="font-family: Arial;"></div>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        When no errors were found the program module was
                        deemed ready for flight by the inspection team
                        of
                        system engineers and programmers.<br>
                        <br>
                      </span></font></div>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        This process&nbsp;took several days and was
                        always successful since&nbsp;to my
                        knowledge&nbsp;no flight operational program
                        problems were ever reported.<br>
                        <br>
                      </span></font></div>
                  <font size="2" color="black"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial; color:
                      black;">The
                      time to generate a 2000 ft punch tape took several
                      hours and I spent many long nights in the 7090
                      computer room&nbsp;being sure that no problems
                      occurred in the hole punching
                      equipment.</span></font><font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;"><br>
                      <br>
                    </span></font>
                  <div><font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;">
                        I have often wondered how IBM assembled this
                        team
                        of dedicated Gemini people that came together
                        and
                        did so many creative things.<br>
                        <br>
                        <span style="font-style: italic;">On
                          no-operation
                          (NOP), memory overheating when the wrong
                          instruction sequence is used, and waiting for
                          multiplications or divisions to
                          complete:</span><br>
                      </span></font>
                    <table summary="" style="text-align: left; width:
                      80%; margin-left: auto; margin-right: auto;"
                      cellspacing="2" cellpadding="2" border="1">
                      <tbody>
                        <tr>
                          <td style="vertical-align: top;">
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    I will give you an example of coding
                                    to prevent overheating of memory.
                                    Lets say the equations required the
                                    programmer to make 3 divides in a
                                    row
                                    ( A=B/C,&nbsp;D=E/F, G=H/I).
                                    Conceptually, it would be
                                    programmed&nbsp;as:</span></font></div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    &nbsp;</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;
                                    &nbsp;B &nbsp;&nbsp; Load the
                                    accumulator</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    C &nbsp;&nbsp; Start the
                                    division</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    A&nbsp;&nbsp;&nbsp; Save the
                                    computed
                                    quotient<br>
                                    NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
NOP
                                    did not use any memory locations
                                    and thus would not heat up the
                                    memory.</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;&nbsp;
                                    E</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    F</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    D</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Again
                                    no heat up of the
                                    memory</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;&nbsp;
                                    H</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    I</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    G</span></font></div>
                            </div>
                            <div style="font-family: Courier
                              New,Courier,monospace;">
                              <div>
                                <div style="margin-left: 40px;"><font
                                    size="2" color="black"><span
                                      style="font-size: 10pt; color:
                                      black;">NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Again
                                      no heat of the
                                      memory</span></font></div>
                              </div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    &nbsp;</span></font></div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    You could do as many divides in a
                                    row
                                    as you wanted as long as you put the
                                    NOP instruction after the SPQ
                                    instruction. Those extra NOPs kept
                                    the memory from heating
                                    up.</span></font></div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    &nbsp;</span></font></div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    Now, the real interesting thing
                                    about
                                    the DIVide instruction is that the
                                    answer was only available to the
                                    memory location specified by the SPQ
                                    instruction after 4 instructions
                                    were
                                    executed after the DIV
                                    instruction.&nbsp; So the code
                                    snippet above wouldn't actually have
                                    worked.&nbsp; The example was
                                    <span style="font-style: italic;">really</span>
                                    programmed as
                                    below:<br>
                                  </span></font> &nbsp;<br>
                              </div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;&nbsp;
                                    B</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    C</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    A</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Cool
                                    memory</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;&nbsp;
                                    E</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    F</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP&nbsp;</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    D</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Cool
                                    Memory</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">CLA&nbsp;&nbsp;&nbsp;
                                    H</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">DIV&nbsp;&nbsp;&nbsp;
                                    I</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">NOP</span></font></div>
                            </div>
                            <div style="margin-left: 40px; font-family:
                              Courier New,Courier,monospace;">
                              <div><font size="2" color="black"><span
                                    style="font-size: 10pt; color:
                                    black;">SPQ&nbsp;&nbsp;&nbsp;
                                    G</span></font></div>
                            </div>
                            <div style="font-family: Courier
                              New,Courier,monospace;">
                              <div>
                                <div style="margin-left: 40px;"><font
                                    size="2" color="black"><span
                                      style="font-size: 10pt; color:
                                      black;">NOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Cool
                                      memory</span></font></div>
                              </div>
                            </div>
                            <div>
                              <div><font size="2" color="black"
                                  face="arial,helvetica,sansserif"><span
                                    style="font-size: 10pt; font-family:
                                    Arial; color: black;">
                                    &nbsp;</span></font></div>
                            </div>
                            <div>
                              <div><b><font style="font-weight: normal;"
                                    size="2" color="black"
                                    face="arial,helvetica,sansserif"><span
                                      style="font-size: 10pt;
                                      font-family: Arial; color: black;">
                                      Later on in the Gemini Program,
                                      Jim
                                      Condell noticted that the 3 NOP
                                      instructions between the DIV and
                                      SPQ
                                      were not doing any useful work and
                                      asked Pat Mooney if we the
                                      programmers could use them for
                                      something other than NOPs. Pat
                                      checked with the Computer
                                      designers
                                      and they said YES! This was an
                                      Atta
                                      Boy for Jim on memory use
                                      saving!!</span></font> <b><font
                                      size="2" color="black"
                                      face="Arial"><span
                                        style="font-size: 10pt;
                                        font-family: Arial; color:
                                        black;"><br>
                                      </span></font></b></b></div>
                            </div>
                          </td>
                        </tr>
                      </tbody>
                    </table>
                    <font size="2" color="black"
                      face="arial,helvetica,sansserif"><span
                        style="font-size: 10pt; font-family: Arial;
                        color: black;"><br>
                      </span></font>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif"><span
                          style="font-style: italic;">On
                          scaling of numerical values during
                          calculations:</span>&nbsp;
                        <font><font><font><font size="2" color="black"
                                face="arial,helvetica,sansserif"><font
                                  size="2" color="black"
                                  face="arial,helvetica,sansserif"><font
                                    size="2" color="black"
                                    face="arial,helvetica,sansserif"><font
                                      size="2" color="black"
                                      face="arial,helvetica,sansserif">Scaling
                                      is something the
                                      programmer did by hand
                                      calculations. You got no
                                      help from the assembler on this
                                      topic. Fixed
                                      point scaling of numbers in
                                      Gemini&nbsp;made
                                      the programmer <b>always, always,
                                        always</b> remember where the
                                      decimal
                                      point and binary point was at ALL
                                      times.
                                      Scaling was a most difficult task
                                      in Gemini
                                      programming.</font></font></font></font></font></font></font><br>
                        <br>
                        The assembler read and processed one 80 column
                        punch card (from the punch card deck) at a time
                        that card&nbsp;contained (Left Hand Symbol,
                        operation instruction, instruction address, and
                        comment preceeded by a # sign). There was not a
                        second card that contained more information for
                        a single 80 column card just read&nbsp;by the
                        assembler.</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">&nbsp;</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">The
                        assembler provided a lot of pre and&nbsp;post
                        processed&nbsp;tables before and after the
                        coded program was assigned the binary 39
                        bit&nbsp;code for&nbsp;each
                        instruction.<br>
                      </font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">&nbsp;</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">A
                        program listing generated by the assembler for
                        Re-entry and Ascent (just examples) would be
                        about 3 inches thick&nbsp; each and contained:
                        Pre and Post processed tables for Constants,
                        Variables, Constants and Left hand symbols ( I
                        showed this in my code Snippets)</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">&nbsp;</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">A
                        symbolic card deck (punched from a key punch
                        machine)&nbsp;for either of these programs
                        would contain a complete box of IBM cards for
                        each program&nbsp;(80 columns per card);</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">&nbsp;</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">On
                        power up of the Gemini Computer the first
                        instruction executed would always start at
                        00-0-00&nbsp;(sector zero, instruction zero and
                        address zero).</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">&nbsp;</font></div>
                    <div><font size="2" color="black"
                        face="arial,helvetica,sansserif">In my
                        Gemini Re-entry mode and Touch Predict mode
                        coding in the&nbsp;Sixties (1962 to 1966), I
                        did not hardly ever use comments and probably
                        is&nbsp;why I did use the # in front&nbsp;my
                        Comments in the&nbsp;code Snippets. This was
                        added programming work in key punching and I
                        did see the value added comments. On the other
                        hand, Al was an excellent programmer and used
                        many comments for one to use in following his
                        coding techniques and the use of many Temp01,
                        02, 03, 04, 05 and 06 variables!! When I was
                        reviewing Al's code Snippets it took me 2 1/2
                        hour for just one pass through the code!</font></div>
                    <br>
                    <small style="font-style: italic;"><span
                        style="font-family: Arial;">(On Don O'Neill, the
                        OBC
                        assembler guru.)</span></small> <font size="2"
                      color="black" face="arial"><font face="Arial,
                        Helvetica, sans-serif">When we (the less
                        than 10 OBC programmers) were working coding the
                        operational programs in Owego you could always
                        count on Don&nbsp;stopping by your desk at any
                        time with Assembler in hand. He would stay as
                        long as he thought necessary to be sure you knew
                        another part of the Assembler and its interface
                        with the Gemini Simulator. He told us it was
                        necessay to know every part of the Assembler and
                        how it worked. He said we would be better
                        programmers if we knew how every part of the
                        Assembler operated on your code!!</font></font></div>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <br>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From Dick Fisher:</span></span>
        <div style="margin-left: 40px;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);"><font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">The
                      OAO
                      Program, the Gemini computer, and the Apollo
                      Program
                      were such exciting space ventures that</span></font><font
                    size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">you
                      had to
                      feel privileged to be working on them.&nbsp; I
                      have
                      never been on a program again like Apollo where
                      you
                      were working with so many other companies and you
                      were cheering them on for their successes.<br>
                      <br>
                    </span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">I
                      joined IBM
                      in Harry Branning's Dept. in 1956.&nbsp; Al Vinal
                      was
                      there working on the MARS device.&nbsp; I didn't
                      have
                      much to do with him then as I was in the digital
                      circuits group under Bob Hildenbrandt.&nbsp; Bob
                      had
                      left for Glendale [<font style="color: rgb(0, 0,
                        0);" color="red">an IBM lab located near
                        Endicott,
                        NY]</font> by 1960 when we</span></font> <font
                    size="2" face="Arial"><span style="font-size: 10pt;
                      font-family: Arial;">bid on the OAO
                      so I was the senior circuits guy then in that
                      dept.&nbsp; The OAO was to last a year in orbit
                      and
                      there was no technology with that kind of
                      reliability.&nbsp; Bob Urquhart and I came up with
                      a
                      new circuit technology we</span></font> <font
                    size="2" face="Arial"><span style="font-size: 10pt;
                      font-family: Arial;">called
                      quad-redundancy.&nbsp; Grumman won the spacecraft
                      contract but NASA</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">made
                      them take
                      our design for the memory system instead of
                      Westinghouse, who had bid the memory system with
                      Grumman and made</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">Radiation
                      Inc.
                      (who won the communications part) use our design
                      concept.</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">After
                      I
                      finished the digital circuits design Harry put me
                      on
                      the design of</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">all
                      the memory
                      circuits for Al Vinal.&nbsp; The last time I had
                      checked on the status of the OAO in orbit, it was
                      still performing after three years.&nbsp; I used
                      that
                      same design concept on the switch selector for the
                      Saturn Launch</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">Vehicle
                      in
                      Huntsville as the switch selector had to have the
                      highest reliability as there were four of those
                      boxes
                      on each rocket, one for the Instrument Unit and
                      one
                      in each of the three stages of propulsion and
                      all</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">commands
                      for
                      gimballing of the engines for control of the
                      rocket
                      and for</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">stage
                      separation and ignition of the next stage from the
                      control computer</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">were
                      sent thru
                      the switch selector.&nbsp; IBM got about a 5
                      million
                      dollar contract from that and I got an OCA.&nbsp;
                      I
                      had often wondered where Al Vinal</span></font><font
                    size="2" face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">was
                      and what
                      he was doing since the Gemini program.&nbsp; Its
                      hard
                      to believe he's been dead for the past 16 years
                      [as
                      of 2011] and he died so young.&nbsp;&nbsp; I think
                      the last I had heard of him he and Connie
                      something
                      were working on a new theory of relativity.&nbsp;
                      He
                      was a very bright guy and very patient to work
                      with
                      as I</span></font> <font size="2"
                    face="arial,helvetica,sansserif"><span
                      style="font-size: 10pt; font-family: Arial;">knew
                      nothing
                      of the MARS devices when I first started working
                      with
                      him.</span></font><br>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <br>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From Don O'Neill:</span></span>
        <div style="margin-left: 40px; font-family: Arial;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);"><small><font style="font-style:
                      italic;"><font size="3" lang="0" color="#000000"><small>(In
                          response to
                          "</small></font></font><font
                      style="font-style: italic;"><font size="3"
                        lang="0" color="black"><small>How much
                          programming could you do
                          with 16 instructions and 39
                          bits?</small></font></font><font size="3"
                      lang="0" color="black"><small><span
                          style="font-style: italic;">")</span>&nbsp; As
                        much as a
                        Turing Machine and more!</small></font> <font
                      size="3" lang="0" color="#000000"><small>Limits
                        were
                        imposed only by the lack of an interrupt
                        mechanism,
                        sector addressability, the lack of floating
                        point,
                        and 25-bit plus sign precision. Some may recall
                        when
                        Jim Joachim demanded an interrupt mechanism and
                        the
                        shoe banging imitating the Nikita Kruschev
                        action at
                        the UN.<br>
                        <br>
                        <span style="font-style: italic;">(On the
                          question of
                          "left-hand symbols" vs. "labels" for naming
                          lines of
                          code.)</span>&nbsp;</small></font> <font
                      style="font-family: Arial;" face="arial,helvetica"><font
                        size="3" lang="0" color="black"><small>Left-hand
                          symbols were used for
                          navigation through the code. Variables and
                          constants
                          were named. Left-hand symbols, variable
                          symbol, and
                          constant symbols (preceded with a K signifying
                          a
                          constant that was not to stored into memory
                          altered)
                          might be called labels, but the term label was
                          not
                          used at the time.<br>
                          <br>
                        </small></font></font> <big><font
                        style="font-family: Arial;"><font size="2"
                          color="black"><font size="3" lang="0"
                            color="black"><small>Overall the
                              contemporary criteria for
                              coding standard of excellence can be found
                              in the
                              Software Inspections checklists I have
                              sent
                              you.&nbsp; [<span style="font-style:
                                italic;">The
                                checklists mentioned were ones Don
                                developed while
                                working on SEI at CMU; I don't care to
                                reproduce them
                                here, but if you're familiar with SEI
                                you'll get the
                                idea.</span>]&nbsp; Ron, you might want
                              to conduct a
                              software inspection on one of your
                              procedures
                              [<span style="font-style: italic;">alas!
                                so wise and
                                yet so wrong!</span>] to see how you
                              stack up against
                              the standard of excellence or to see how
                              the standard
                              of excellence stacks up as an actual
                              quality
                              threshold</small>.<br>
                            <br>
                            <small style="font-style: italic;">(On the
                              question
                              of very limited use of subroutines in OBC
                              code.)</small></font></font></font></big></small><font
                    face="arial,helvetica"><font size="2" color="black"
                      face="Geneva"><span style="font-family: Arial;">I
                        do not recall a subroutine
                        mechanism. A number of people on the Gemini
                        Project
                        worked on the XB70 bombing and navigation
                        computer, a
                        drum computer whose instructions were read and
                        executed from a rotating drum so there was no
                        subroutine mechanism possible. In addition, the
                        slavish attention to the Math Flow, literally a
                        flow
                        chart, reinforced linear, sequential thinking.
                        This
                        was reinforced by the fact that there was no
                        interrupt on the Gemini
                        computer.</span></font></font> <font size="2"
                    color="black">All this was literally a deterministic
                    state
                    machine.</font><br>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <br>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From Pat Mooney:</span></span>
        <div style="margin-left: 40px; font-family: Arial;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);"><small><font style="font-style:
                      italic;"><font size="3" lang="0" color="#000000"><small>(In
                          response
                          to</small></font></font> <font size="3"
                      lang="0" color="black"><small><span
                          style="font-style: italic;">being presented by
                          Charlie
                          Leist and Jim
                          Condell</span></small></font></small>—<small><span
                      style="font-style: italic;">who
                      had worked for him</span></small>—<small><font
                      size="3" lang="0" color="#000000"><small><span
                          style="font-style: italic;">with the Gemini
                          Programming
                          Manual</span></small></font></small><small><font
                      size="3" lang="0" color="black"><small><span
                          style="font-style: italic;">in 2011,
                          rather than the 1960's when it was
                          written.</span></small></font></small><small><font
                      size="3" lang="0" color="black"><small><span
                          style="font-style: italic;">)</span>&nbsp;</small></font></small><font><font
                      size="2" color="black"
                      face="arial,helvetica,sansserif">"</font></font><font><font
                      size="2" color="black"
                      face="arial,helvetica,sansserif">Charlie and Jim,
                      I told you two guys
                      to write this manual and to bring it back to me
                      for
                      comment and sign off. I always wondered why you
                      did
                      not follow my direction and how did you get it out
                      of
                      Owego with out my signature? ... Charlie, I am
                      going
                      to review this document, make comments and sign
                      off
                      on it. I expect you fix the errors I
                      find!!</font></font><font><font size="2"
                      color="black" face="arial,helvetica,sansserif">"</font></font></td>
              </tr>
            </tbody>
          </table>
        </div>
        <br>
        <span style="font-style: italic;"><span style="font-weight:
            bold;">From various unidentified team
            members:</span></span>
        <div style="margin-left: 40px; font-family: Arial;">
          <table summary="" style="text-align: left; width: 100%;"
            cellspacing="2" cellpadding="2" border="1">
            <tbody>
              <tr>
                <td style="vertical-align: top; background-color:
                  rgb(204, 255, 255);"><small><small><small><font
                          style="font-family: Arial;" size="3"><small><small><small><span
                                  style="font-size: 12pt;"><small>The
                                    memory element was a
                                    non-destructive readout (NDRO)
                                    device invented for
                                    use in the Orbiting Astronomical
                                    Observatory
                                    (OAO).&nbsp; The design was based on
                                    the
                                    Multi-Aperture Readout Sensing
                                    (MARS)&nbsp;principle.&nbsp; The
                                    MARS device
                                    principal used a two-hole core (as
                                    opposed to
                                    single-hole "donut" then commonly
                                    used in memory
                                    designs).&nbsp; The new principle
                                    was based on
                                    sensing the logical state of a core
                                    at one of the
                                    holes, and restoring the state by
                                    electrically
                                    pulsing the second hole (ed. that's
                                    my limited
                                    understanding) thus achieving the
                                    equivalent of
                                    non-destructive readout -- a
                                    critical requirement for
                                    space
                                    applications.</small></span></small></small></small></font></small></small><br>
                  </small><br>
                  <small><small><font size="3" color="black"><small><small><span
                              style="font-size: 12pt;"><small>The 7090
                                had a fixed point
                                add, subtract, etc.&nbsp; So, one could
                                program the
                                Gemini OBC equations in assembly
                                language and execute
                                them on the 7090 using a simulator.
                                &nbsp;But you had
                                to mask off all 7090 bits over 26 to
                                contain the
                                computation to the Gemini OBC 26-bit
                                format.&nbsp; We
                                did that to check function and
                                accuracy</small>.</span></small></small></font><br>
                      <br>
                      <font size="3" color="black"><small><small><span
                              style="font-size: 12pt;"><small>Computational
                                step size in
                                the simulation was controlled using 7090
                                console
                                keys.&nbsp; A family of results could be
                                run to
                                determine if the Gemini OBC timing was
                                adequate</small>.</span></small></small></font></small></small><br>
                </td>
              </tr>
            </tbody>
          </table>
        </div>
        <br>
        <br>
        <h2><a name="Homage" id="Homage"></a>Homage<br>
        </h2>
        <img style="width: 169px; height: 256px;" alt=""
          src="SpaceWalkOfFamGemini1.jpg" align="right">Part of my
        purpose
        on this web-page is to pay homage to the original Gemini
        flight-software developers.&nbsp; I have little information
        about them, so if you know things about them, feel free to
        pass your information to me. &nbsp; What I <span
          style="font-style: italic;">do</span> know follows:&nbsp;<br>
        <ul>
          <li>Here's a big list of 70-or-so names (and where
            recalled) responsibilities of team members, put together by
            OBC developers Gene Mertz, Charlie Leist, &amp;co.:&nbsp;
            <a href="Documents/GeminiDevelopers.pdf">
              Gemini development team.</a></li>
          <li>And here are a few other names I got from Gene, which
            for some reason or other didn't make it onto his official
            list:</li>
          <ul>
            <li>Marv Czarnik, of McDonnell, interface for rendezvous
              guidance.</li>
            <li>Scarborough (?), programmer (?)</li>
          </ul>
          <li>I'm also informed of the Gemini area of the U.S. Space
            Walk of Fame, which includes an engraved list of names
            (pictured at right).&nbsp; I'm given to understand that
            (sadly) only a few of the names on the monument seem to
            from the IBM Gemini flight-software software-development
            team.</li>
        </ul>
        <br>
      </div>
    </div>
    <hr style="width: 100%; height: 2px;">
    <center><br>
      <span style="color: rgb(84, 89, 93); font-family: sans-serif;
        font-size: 11.05px; font-style: normal; font-variant: normal;
        font-weight: normal; letter-spacing: normal; line-height:
        16.575px; orphans: auto; text-align: center; text-indent: 0px;
        text-transform: none; white-space: normal; widows: 1;
        word-spacing: 0px; -webkit-text-stroke-width: 0px; display:
        inline !important; float: none; background-color: rgb(255, 255,
        255);">
        This page is available under the <a
          href="https://creativecommons.org/publicdomain/zero/1.0/">Creative
Commons
          No Rights Reserved License</a></span><br>
      <i><font size="-1">Last modified by <a
            href="mailto:info@sandroid.org">Ronald Burkey</a> on
          2020-06-20.<br>
          <br>
          <a href="http://www.ibiblio.org"><img style="border: 0px solid
              ; width: 300px; height: 100px;" alt="Virtual AGC is hosted
              by ibiblio.org" src="hosted.png" width="300" height="100"></a><br>
        </font></i></center>
    <br>
    <br>
  </body>
</html>
back to top