Lazarus AP · a resurrection in software

You are watching a Space Shuttle computer think.

Every Shuttle flew with five IBM AP-101 computers — machines slower than a musical greeting card — that steered two thousand tons of spacecraft by voting among themselves. Their programs were written in HAL/S, a language invented for spaceflight and used almost nowhere else.

Below, one small program runs on an emulated AP-101S, one instruction at a time. The program was written this week — but the compiler that turned it into machine code is the real Shuttle compiler, recovered and brought back to life. Nothing here is a mock-up: every number you'll see is the machine actually working.

</>  Read the source on GitHub The emulator, the tools, the recovered flight code and the defect report — all of it, open. GPL v2.
▶ Run the emulator yourself, right now The AP-101S compiled to WebAssembly — 228 KB of Space Shuttle computer executing in your browser. Step through real flight code, run the five-computer vote, no install.
New to this?Watch a real 1970s space computer run, one step at a time, with plain-English narration. Curious how spacecraft don’t crashFive computers, one bad answer, and the vote that catches it. ProgrammerGenuine flight routines executing, compared against modern math — and the toolchain that runs them. Historian / engineerSourced conventions, a defect report, and every claim traced to IBM’s own manual.

The machine

The AP-101S had about 1 MB of memory and no screen of its own. Five of them ran in lockstep on each orbiter; if one disagreed, the others voted it out mid-flight. This emulator was built from IBM’s original 1,300-page manual, one cited page at a time.

The language

HAL/S looks a little like Fortran with wings. The source of the program below is nine lines: print a greeting, loop three times printing a vote, print a sign-off. The Shuttle’s real flight software was about 400,000 lines of it.

The resurrection

The Shuttle’s compiler survived as punch-card-era source code, restored by the Virtual AGC project. We rebuilt it, compiled a brand-new program with it, and linked it with a tool written for this project. What you’re watching is the result: 401 instructions, the complete run.

The run, narrated

Right now:

Instruction tape — the program, one step at a time

    Each line is one machine instruction: its address in memory, its name, and what it does. The green line is the one executing now.

    Registers — the computer’s short-term memory

    CC ADDR

    Eight slots the CPU thinks with. A value that just changed turns amber — watch R6 count the loop.

    Mission console — what the program prints

    Text appears here at the exact instruction the program wrote it — the same characters, columns and all, that the real toolchain produces.

    For the record

    On August 2, 2026 at 12:09 PDT, Keith Adler ran the Space Shuttle’s own square-root routine — RUNASM/SQRT.asm, flown on every mission of the program — on this emulator, assembled by the genuine flight assembler. Input 2.0; answer 1.4142135… (0x4116A09E), exact to the last bit: the same answer it gave Columbia.

    Atlantis closed out the fleet on July 21, 2011. As far as this project can establish, these instructions had scarcely executed anywhere since — and never before in this resurrection.

    The machine vs. the phone in your pocket

    AP-101S (Shuttle, 1980s) A recent iPhone
    Speed~1 million instructions/sectens of billions/sec — roughly a million× faster
    Memory1 MB — every byte accounted for8 GB — ~8,000× more
    Weight~25 kg per computer, five aboard~170 g
    Power~550 W of spacecraft electricitysips from a pocket battery
    Displaynone — green text on borrowed CRTsmillions of pixels
    Jobfly a 2,000-ton spacecraft, never crashalmost everything, may crash

    The asymmetry is the point: the Shuttle’s computers were a thousand times weaker than a musical greeting card is today — and carried 400,000 lines of flight software with a defect rate modern teams still study. Slowness was survivable. Wrongness was not.

    Three stories about this technology

    The scrub heard round the world

    April 10, 1981: the very first Shuttle launch stopped at T−20 minutes because the fifth, backup computer refused to listen to the other four. A subtle timing skew — about a 1-in-67 chance on any given power-up — had shifted the primaries’ clock by 40 milliseconds. Young and Crippen climbed out; the world’s most scrutinized software bug got fixed; STS-1 flew two days later. Timing between cooperating computers is exactly what our clock-skew tests probe.

    The vote

    Four primary computers ran in lockstep, comparing answers hundreds of times a second; force-summing hydraulics let the majority physically overpower a wrong actuator command. A sick machine shows a signature you can see in this project’s own five-GPC demo: the healthy majority each point at the failure — and the failed one votes against the world.

    Software by the pound

    The original AP-101B remembered with woven magnetic cores — memory you could hold, bits you could point at. Too small to hold all of a mission’s software at once, so crews reloaded programs from tape between flight phases. The 1990s AP-101S upgrade (the machine emulated here) swapped cores for chips and doubled memory — to one megabyte, roughly a two-second MP3.

    The vote — all five computers, live

    This is the part the single-program console can’t show: five emulated AP-101s running at once, exchanging their answers over shared serial buses in the pattern the orbiter’s used. One of them — GPC 2 — has been given a corrupted sensor. Watch it compute 13 where everyone else computes 42, watch the values cross the buses into every machine’s mailboxes, and watch the healthy majority vote it out while the force-voting actuator physically ignores its command.

    What you are watching is a reconstruction. The buses, the listen mode, the sync discretes and the timeout behaviour are emulated from IBM’s and Rockwell’s documentation, and they are cited. But the redundancy-management software itself — the code that actually decided which computer to believe — lived in the primary flight software, which is not among the recovered artifacts. This demonstrates the mechanism the orbiter used. It does not run the orbiter’s own voting code, because nobody outside NASA has it.

    Force-voted actuator — the hydraulics have the last word

    Four command ports, one per computer. The surface follows the majority; a port that keeps disagreeing is physically bypassed.

    Why five computers? Why vote at all?

    Because one computer can be wrong without knowing it. A cosmic ray flips a bit; a memory cell fails; a sensor lies — and a single machine will confidently steer you into the ground, because from the inside, a wrong answer feels exactly like a right one. Two computers can detect a disagreement but can’t tell who’s right. Three or more can out-vote the liar. The Shuttle flew four in lockstep — enough to survive one failure and still keep voting after it — plus a fifth running different software entirely, in case the bug was in the software all four shared. You watched the principle above: GPC 2 never knew it was wrong. The vote knew.

    Who could run this software, and where?

    In flight: only the five GPCs aboard each orbiter. But most executions happened on the ground. IBM’s Houston teams ran builds nightly in the Software Production Facility at Johnson Space Center; the SAIL (Shuttle Avionics Integration Lab, Houston) flew every mission first on real avionics hardware wired to simulators; crew trainers ran it daily; Owego ran it on test rigs. When the fleet retired in 2011, the machines that could execute this code went to museums — which is why an emulator like this one is now, as far as we know, the only place these instructions still run.

    The source, and the machine code it became

    Three real programs, each one traced instruction by instruction. Two things move together: the statement a programmer wrote, and the code the compiler turned it into. Neither mapping is ours — the compiler emitted a table saying which addresses belong to which statement, the linker emitted another saying which routine owns which address, and this panel only reads them.

    When the badge turns amber the processor has left the program entirely and is down inside the flight runtime library — NASA’s own code, linked in behind every WRITE. That is where nearly all of the time goes.

    Source

    
        

    Where the processor is

      Printer output so far

      What this software actually did

      The routines on this page are pieces of a much larger job. The Shuttle’s primary flight software — about 400,000 lines of HAL/S and assembly — was not one program but a set of them, and the crew switched between them in flight by typing OPS numbers on the keyboard you saw above. Each “operational sequence” loaded the software for one phase of the mission, because a megabyte of memory could not hold the whole flight at once.

      OPS 1 · AscentFrom solid-rocket ignition to orbit insertion: steering the stack through max-Q, throttling the main engines, separating boosters and tank, and flying the abort options if an engine failed. Eight and a half minutes, no second chances.
      OPS 2 · On orbitAttitude control with the RCS jets, pointing for experiments and communications, star-tracker alignments of the inertial platform, rendezvous and proximity operations. This is where the vector and matrix routines earn their keep.
      OPS 3 · Entry and landingThe deorbit burn, then guidance through a hypersonic glide — energy management, roll reversals, autoland to the runway. The orbiter flew as a 100-ton glider with one attempt at the runway.
      OPS 8/9 · Systems & groundSystems management, payload operations, checkout on the ground before flight, and the fault-detection displays the crew called up when something rang an alarm.

      Underneath all of it ran the same machinery you have been watching: the computers voting, the crew typing at DEU keyboards, and the runtime library doing the arithmetic. When guidance needed the angle between the orbiter’s nose and its velocity vector, it called a dot product. When it needed a pure heading, it normalized. When it composed one frame of reference into another, it multiplied 3×3 matrices. Those exact routines run again in the table below — not a re-creation, the code itself.

      Ambition worth stating plainly: the Shuttle’s complete flight software is not public, and much of it never will be. What survives — the compiler, the assembler, the runtime library, the computer’s own manual — is what this project has resurrected, and it is enough to run real programs on a faithful machine.

      The flight math lab

      The Shuttle’s runtime library survives as original AP-101S assembly — 205 routines, of which 202 assemble today with the genuine flight assembler. These are the 35 verified so far — single- and double-precision, one- and two-argument: each was assembled, linked, and executed on this emulator, and its answer compared against the same function on a modern machine. The “calls” column matters — when SINH runs, the exponential underneath it is the Shuttle’s own EXP; ASINH reaches down through its LOG and its SQRT. The library is running as a library.

      RoutineWhat it doesInputFlight answerModernMatch
      SQRTsquare root21.41421321.4142136OK
      EXPe^x12.71828172.7182818OK
      LOGnatural log20.693147240.69314718OK
      TANtangent0.50.546302440.54630249OK
      ATANarctangent10.785398130.78539816OK
      SINHhyperbolic sine11.17520141.1752012OK
      COSHhyperbolic cosine11.54308031.5430806OK
      TANHhyperbolic tangent10.761594180.76159416OK
      ACOSarccosine0.51.04719731.0471976OK
      ACOSHinverse hyperbolic cosine21.31695751.3169579OK
      ASINHinverse hyperbolic sine10.881373470.88137359OK
      ATANHinverse hyperbolic tangent0.50.549305920.54930614OK
      EATAN2two-argument arctangent1, 20.46364760.46364761OK
      EMODfloating remainder7, 311OK
      EPWREx raised to a power2, 1010241024OK
      EPRODproduct of an array[2,3,4]2424OK
      ESUMsum of an array[1.5,2.5,3]77OK
      EMAXlargest of an array[3,9,4]99OK
      EMINsmallest of an array[3,9,4]33OK
      DSQRTsquare root, double precision21.41421361.4142136OK
      DEXPe^x, double precision12.71828172.7182818OK
      DLOGnatural log, double precision20.693147180.69314718OK
      DSINHhyperbolic sine, double precision11.17520051.1752012OK
      DTANHhyperbolic tangent, double precision10.761594120.76159416OK
      DACOSarccosine, double precision0.51.04719731.0471976OK
      DATANHinverse hyperbolic tangent, double precision0.50.549306140.54930614OK
      DMODfloating remainder, double precision7, 311OK
      SNCSsine and cosine together — the orbiter's trigonometry0.5[0.479425, 0.877583][0.479426, 0.877583]OK
      VV6dot product — the angle between two directions[1,2,3]·[4,5,6]3232OK
      VV10unit vector — normalizing a heading[3,4,0][0.6, 0.8, 0][0.6, 0.8, 0]OK
      VX6cross product — the perpendicular, right-hand rulex̂ × ŷ[0, 0, 1][0, 0, 1]OK
      MM123×3 determinantdiag(2,3,4)2424OK
      MM143×3 matrix inverse — undoing a rotationdiag(2,4,5)[0.5, 0, 0, 0, 0.25, 0, 0, 0, 0.2][0.5, 0, 0, 0, 0.25, 0, 0, 0, 0.2]OK
      MM63×3 matrix multiply — composing rotations[[1..9]] × 2I[2, 4, 6, 8, 10, 12, 14, 16, 18][2, 4, 6, 8, 10, 12, 14, 16, 18]OK
      VV3vector subtract[5,7,9]-[1,2,3][4, 5, 6][4, 5, 6]OK

      Differences appear in the seventh decimal place — the limit of the machine’s 24-bit hexadecimal fractions, not an error. Reproduce any row with tools/resurrect.py SQRT:2.0, which finds the routine’s dependencies, writes a driver, assembles it with ASM101S, links it, runs it, and checks the answer.

      The code that actually flew

      Scalar mathematics is one thing. These three are flight operations — the shapes of computation the orbiter used to know where it was pointing:

      RoutineWhat it does InputFlight answer
      VV6S3vector dot product [1,2,3] · [4,5,6] 32
      VV10S3UNIT VECTOR (normalize) [3, 4, 0] [0.6, 0.8, 0]
      MM6S33×3 matrix multiply [[1,2,3],[4,5,6],[7,8,9]] × 2I 2 4 6 8 10 12 14 16 18
      VX6S3cross product x̂ × ŷ [0, 0, 1]
      MM14S33×3 matrix inverse diag(2, 4, 5) diag(0.5, 0.25, 0.2)

      That is the complete attitude toolkit: dot for angles, cross for perpendiculars, normalize for headings, multiply to compose rotations, invert to undo them. A dot product gives the angle between where you are pointing and where you want to point; normalizing turns a direction into a pure heading; a 3×3 multiply composes rotations. VV10S3 reaches down through the flight SQRT to do its job — vector code calling library code calling the square root, every layer of it recovered NASA assembly.

      The crew station — keyboard and CRT

      This is how astronauts talked to the computers. There was no keyboard on a GPC — the crew typed on Display Electronics Unit keyboards, and every keystroke travelled a serial data bus to whichever computer was driving that screen. The panel below replays a real session on this emulator: each key you see light up was queued in the DEU, polled across the display bus by a bus-control program, and delivered into the GPC’s memory — the numbers under “GPC heard” are read out of that memory, not the keyboard.

      CRT — DEU display

      Painted by the GPC over the bus. On the orbiter these were green monochrome CRTs; three of them, any of which could be assigned to any computer with the GPC/CRT key.

      DPS keyboard — 32 keys

      Crew sequences read like commands: OPS 201 PRO selects a major mode; ITEM 36 +12 EXEC sets item 36 to 12.

      GPC heard (over the bus)

      Run it live in a terminal: cargo run --bin lazap-dps — type on your own keyboard and watch the emulated GPC poll your keystrokes.

      Defect report — filed against a retired spacecraft

      These are defects in the flight system itself. Three of the four are the original engineers’ own admissions, printed in the Principles of Operation under headings that read ANOMALY NOTE — documented, shipped, and flown for thirty years. Written the way you would file them today.

      Did any of this actually bite in flight? Honestly: there is no public record of a Shuttle mission failing because of these. Two reasons, both worth understanding. First, the flight software was written around them — comparisons used tolerances, block moves avoided the exclusion zone, ON ERROR was not relied on for matrix inversion. Second, and more to the point, this is precisely what four voting computers are for: a fault that corrupts one machine’s arithmetic gets outvoted before it reaches an actuator. These are latent defects in a system engineered on the assumption that latent defects exist. That is the actual lesson — not that the hardware was bad, but that it was known to be imperfect and flown safely anyway.

      AP-101S-1Floating-point COMPARE reports false equalityHIGH
      Component
      CPU floating-point compare (CE / CER / CED / CEDR)
      Status
      Documented by IBM — Principles of Operation §8.11, ANOMALY NOTE
      Description
      Two unequal numbers compare equal when their fractions differ by exactly X’80 0000’ after prealignment. IBM prints three worked examples of its own hardware getting this wrong.
      Evidence
      423F FFFF 0000 1234 vs 423F FFFF 0080 1234 → “equal”; the correct answer is “less than”
      Impact
      Flight code branching on the equality of two nearly-identical scalars takes the wrong branch. Guidance software compares magnitudes constantly.
      Reproduce
      Execute a CED on the manual’s own operand pairs.
      Workaround
      Compare against a tolerance, never for equality.
      Flight materiality
      Moderate. Needs two values differing by exactly one bit pattern; disciplined numerical code already avoids equality tests on scalars.
      AP-101S-2A masked DMA interrupt silently destroys arithmetic error detectionHIGH
      Component
      CPU interrupt system, DMA store-protect handling
      Status
      Documented by IBM — Figure 2-20 anomaly note
      Description
      IBM’s own words: a masked DMA store-protect interrupt “will set the condition code to a binary 10 and clear the carry and overflow bits… This can result in erroneous GPC operation.” Worse, it “clears any fixed point overflow, floating point underflow, and floating point overflow interrupts… This can result in a lost arithmetic interrupt.”
      Evidence
      An overflow that did occur is erased before the program is ever told about it
      Impact
      The most serious item here: arithmetic error detection that silently fails, triggered by unrelated I/O activity. Condition codes are corrupted mid-computation, so a comparison made before the event and used after it decides on garbage.
      Reproduce
      Timing-dependent — needs a DMA store-protect violation inside an instruction that raises an arithmetic interrupt.
      Workaround
      None documented. The manual states the behaviour and moves on.
      Flight materiality
      Highest of these. A rare timing coincidence, but the effect is precisely the failure mode redundancy exists to catch — and precisely the kind a single computer could not.
      AP-101S-3Block move corrupts data at one specific address overlapMEDIUM
      Component
      CPU, MOVE HALFWORD (MVH)
      Status
      Documented by IBM — §9.4 ANOMALY NOTE
      Description
      MVH “will not correctly move data when the expanded source address is exactly one greater than the expanded destination address and the most significant bit of R1 and R2 are not equal.”
      Evidence
      A legal instruction with legal operands, silently wrong result
      Impact
      Silent data corruption; the programmer is expected to remember the exclusion zone.
      Reproduce
      Move a block with source = destination + 1 across differing sector-bit settings.
      Workaround
      The manual’s own: move fullwords, offset by two halfwords — faster, and avoids the trap.
      Flight materiality
      Low in practice, high if forgotten. Narrow and avoidable, but nothing in the hardware stops you walking into it.
      HALS-FC-1ON ERROR handlers never fire for a singular matrixMEDIUM
      Component
      HAL/S-FC compiler and the flight runtime’s matrix inverse (MM14S3)
      Status
      Confirmed against the flight software’s own error handler (“DELETE ON ERROR SUPPORT”, 1978) by the Virtual AGC project
      Description
      A program may register ON ERROR for the singular-matrix condition (group 4, number 27) and the compiler accepts it — but the handler can never run. Dispatch to user handlers happens only because the compiler emits its own re-check after the call; for matrix inversion it emits none, since singularity cannot be cheaply re-tested.
      Evidence
      The routine falls through to an identity-matrix fallback instead
      Impact
      Error handling that compiles, reads correctly in the source, passes review, and is silently dead. The program proceeds with an identity matrix believing it holds an inverse.
      Reproduce
      Invert a singular 3×3 with a handler registered; observe the fallback rather than the handler.
      Workaround
      Test the determinant yourself before inverting.
      Flight materiality
      Moderate — and the most modern-feeling defect on the list.
      ASM101S-1Three flight routines no longer assembleTOOLING
      Component
      The recovered ASM101S assembler and macro library — modern reconstructions, not flight articles
      Status
      Found by this project’s census of the runtime library
      Description
      202 of 205 routines assemble; CSTRUC, VV8D3 and VV8S3 do not.
      Evidence
      (Pass -1, Severity 4) INVALID CC OPERAND FOR INTRINSIC — raised by the AEXIT macro when an intrinsic returns a condition code, yet VV8S3’s own header declares OUTPUT CC
      Impact
      Those three cannot be rebuilt from source today. The loss is in the recovered tooling, not the flight code.
      Reproduce
      ASM101S.py --library RUNASM/VV8S3.asm
      Workaround
      None yet.
      Flight materiality
      None in flight — these routines flew for thirty years. This is a defect in our ability to rebuild them.

      Items 1 through 3 were open the entire time the Shuttle flew, and are open now. Item 4 is open in any surviving copy of the compiler.

      For completeness, this project’s own defects are tracked in the same file. A resurrection that only lists other people’s bugs is not being honest — but ours belong in an appendix, not alongside the flight system’s. Two so far, both fixed. The first was an MVH decrement-order bug that dropped the leading halfword of every block move, caught by a Shuttle physics program and closed with a regression test.

      The second is the more instructive one. A linked image shipped with another program’s symbol table — LAZARUS carrying a byte-identical copy of the hello fixture’s. Nothing failed. The emulator reads only the runtime entry points from that file and those were genuinely shared, so every test stayed green while the panel above this one attributed LAZARUS’s instructions to CSECTs that do not exist in it. A project whose entire claim is provenance had a file quietly asserting the wrong provenance. It was rebuilt from LAZARUS’s own object deck, and CI now rejects any symbol table that duplicates another or names a CSECT its object deck never declared.

      How long did it take?

      Getting the right answer was never the hard part. Getting it in time was. The guidance loop ran at 40 Hz — a new answer every 25 milliseconds, forever, with no option to run late.

      These times are the compiler’s own. HAL/S-FC carried a table of per-instruction execution times and printed a TIME: figure beside generated code; this emulator now adds up the same numbers as it runs. One caveat, and it is a real one: the compiler printed the values without a unit. Microseconds is the conventional reading for this hardware and is what the frame column assumes, but we have not confirmed it, so treat that column as indicative rather than settled.

      ProgramInstructions Time unitsOf one 40 Hz frame
      HELLO6,613 10,97044%
      176-P physics534 1,9727.9%
      LAZARUS401 1,2214.9%
      MM14 — 3×3 inverse100 4661.9%
      VV10 — unit vector80 2901.2%
      SQRT38 850.3%

      Read the top row again. Printing eight short lines of text costs close to half a guidance frame — because almost all of it is the character formatting you watched earlier. Inverting a 3×3 matrix, the operation that undoes a rotation, costs about a fiftieth of one. That ratio is the whole argument for why flight software does not print things.

      What is not here

      A resurrection is worth what its boundaries are worth. Everything above is real and checked. These are the things this project does not have, stated plainly so nothing on this page is mistaken for more than it is.

      The primary flight software

      The Shuttle’s own flight programs — roughly 400,000 lines of HAL/S and assembly, the OPS sequences described above — have never been publicly released. What runs here is the runtime library those programs called: the mathematics, the character handling, the I/O. Ascent guidance, entry guidance and the digital autopilot are not here. Nothing on this page flies a spacecraft.

      The redundancy-management code

      The five-computer vote is emulated from documentation, not recovered from NASA. The buses and the mechanism are real; the software that decided which computer to trust went with the flight software.

      Timing, to one unresolved question

      Execution times are now modelled — taken from the HAL/S-FC compiler’s own EXECUTION_TIMES table, the one that printed TIME: in Shuttle compile listings. What is not settled is the unit: the compiler prints bare numbers. Microseconds is the conventional assumption and the one used below, but this project has not confirmed it against the hardware manual, so every frame figure here carries that caveat.

      170 of the 205 routines

      202 of the 205 recovered runtime routines assemble. Forty have runnable images and thirty-five are checked against modern mathematics on every build. The rest await test harnesses for double-precision and integer arrays. Five more images run but carry no record of the inputs they were built with, so they are listed as unverified rather than counted.

      The toolchain that made all this

      The rebuilt HAL/S-FC compiler and ASM101S assembler are no longer on the machine that ran them; they were built in temporary space that has since been cleared. The compiled artifacts are committed and are what everything here stands on, but nothing can be recompiled without rebuilding the toolchain from source. It is why only one program on this page can be followed line by line.

      Hardware truth

      No AP-101S was available to test against. Correctness here means agreement with IBM’s documentation, with a second independent emulator, and with modern mathematics — not with silicon.

      Run all of it yourself

      Everything on this page is a program you can run. The emulator is one Rust project; the historical toolchain is Python. No network, no accounts, no cloud — the whole Shuttle computing world fits in a repository — this one.

      Start here

      git clone https://github.com/keithadler/lazarus-ap.git
      cd lazarus-ap
      cargo test                          # 194 tests
      cargo run --bin lazap -- roms/hello/hello.fcm

      Watch and explore

      cargo run --bin lazap-dps          # crew station: type at the DPS keyboard, watch the CRT
      cargo run --bin lazap-set          # the five-computer vote, live in your terminal
      cargo run --bin lazap-set -- --kill 1   # kill a computer and watch the others outvote its silence

      Run flight software

      cargo run --bin lazap -- roms/hello/hello.fcm        # a HAL/S program, byte-identical to the reference
      echo "42, 3.14" | cargo run --bin lazap -- roms/read_write/read_write.fcm
      cargo run --bin lazap -- roms/lazarus/LAZARUS.fcm    # written for this project, compiled by the real Shuttle compiler

      Resurrect a NASA routine

      tools/resurrect.py SQRT:2.0 EXP:1.0 EPROD:2,3,4
      # finds the routine's dependencies, writes a driver, assembles it with the
      # genuine ASM101S, links it, runs it, and checks the answer against math.h

      Look inside

      cargo run --bin lazap-trace -- roms/lazarus/LAZARUS.fcm   # the JSON trace behind this page
      cargo run --bin lazap-call -- roms/nasa/VV6RUN.fcm --at 11E
      cargo test                          # 191 tests: every instruction, the vote, the flight math

      This page is a single self-contained file — it runs from a repository, from a laptop, or from GitHub Pages with nothing but a browser.

      The people

      The language builders

      Intermetrics, founded in 1969 by veterans of MIT’s Instrumentation Laboratory — the Apollo guidance-software team — designed HAL/S for NASA. The name honors that lineage (many trace it to MIT’s J. Halcombe “Hal” Laning, a pioneer of compiled arithmetic), and the language carried Apollo’s hard lessons into the Shuttle era: real-time constructs, vector math, and no room for undefined behavior.

      The machine & software teams

      IBM Federal Systems in Owego, New York built the AP-101 hardware; IBM’s Houston group wrote the primary flight software — the team later made famous by the essay “They Write the Right Stuff” for a process so careful its error rate became an industry legend. Jack Garman — the NASA engineer who made the famous “go” call on Apollo 11’s 1202 alarm — later helped run Shuttle software and wrote the definitive account of the STS-1 bug.

      The resurrectionists

      Ron Burkey’s Virtual AGC project spent decades recovering spaceflight software — including the HAL/S compiler source and the AP-101S manuals this project is built from. Don Schmidt’s nsts-sim-gpc pioneered AP-101S emulation. Lazarus AP stands on their shoulders: every instruction here cites IBM’s manual, every divergence is cross-checked against their work, and the goal is the most complete resurrection of this machine ever assembled — hardware, languages, toolchain, and now its stories.

      What this resource is

      Everything on this page is one living system: an AP-101S emulator built from IBM’s manual; the genuine HAL/S compiler and AP-101S assembler, rebuilt and running; a linker written to replace the one piece history didn’t preserve; five machines voting; and the Shuttle’s own runtime mathematics next in line to run again. The aim is simple to say and long to do: the most complete resurrection of the Space Shuttle’s computing world ever assembled.

      What you just watched

      A program conceived in 2026, compiled by software written for the Space Shuttle in the 1970s, executed faithfully by an emulator reconstructed from the flight computer’s manual — every WRITE crossing the same runtime machinery astronauts’ displays depended on. Four hundred and one instructions to say hello, count to three, and hand back control. The Shuttle did the same thing, three hundred thousand times a second, all the way to orbit.