Kill the Bit (Personified)
Jesse Downing   08 Oct 2019 (Rev 11 Oct 2019)

Explanation
The code here represents the code for the popular game "Kill the Bit" written
for the Altair 8800 on May 15, 1975 by Dean McDaniel. This code would be flipped
in in binary using switches on the front of the machine, and then once the
program is run, would cause the 8 LEDs representing the accumulator (CPU
register A) to have a "bit" rotate across them. The user would then try to "kill
the bit" by flipping the switch underneath the LED at the correct time. If the
wrong switch is flipped, bits would be added. The game is over when the final
bit is killed. This was one of many such popular demos on the Altair 8800
microcomputer - the first widely available personal computer, and arguably one
of the most important personal computers in all of computing history (as it was
the machine on which Microsoft got its start).

The narrator of this play (if it can be called that) is the personified version
of an Intel 8080 CPU. The format is as follows:

Code (in Octal)         Assembly Code           English Explanation
       NARRATION

This might make zero sense to anyone who's not obsessed with computers or
programming (and might quite frankly make zero sense to many of them), but it's
something I was interested in exploring, as I'm planning on trying to build my
own Altair 8800 from (mostly) new parts once I return to the US.

Program
                       org     0

       PROGRAM INITIALIZED AT LOCATION ZERO

041 000 000     lxi     h,0             initialize counter

       COUNTER IS SET TO ZERO

026 200         mvi     d,080h  set up initial display bit

       REGISTER D IS SET TO HEXADECIMAL 80, OCTAL 200, DECIMAL 128,
       BINARY 10 00 00 00

001 016 000     lxi     b,0eh           higher value = faster

       REGISTER B IS SET TO HEXADECIMAL 0E, OCTAL 037, DECIMAL 15,
       BINARY 00 01 11 11

032             beg:    ldax    d               display bit pattern on
032                     ldax    d               upper 8 address lights
032                     ldax    d
032                     ldax    d

       LOAD THE ACCUMULATOR FROM THE ADDRESS IN D
       LOAD THE ACCUMULATOR FROM THE ADDRESS IN D
       LOAD THE ACCUMULATOR FROM THE ADDRESS IN D
       LOAD THE ACCUMULATOR FROM THE ADDRESS IN D

       (THE BITS HAVE BEEN DISPLAYED)

011                     dad     b               increment display counter

       WHAT'S IN REGISTER B?
       WHAT'S IN REGISTER C?

       ADD B TO H AND C TO L AND MARK THE BIT IF IT BREAKS 16

322 010 000     jnc     beg

       IF IT DOESN'T CARRY, JUMP TO LOCATION 08.
       IF IT CARRIES, CONTINUE.

333 377         in      0ffh            input data from sense switches

       GET THE INPUT OF DEVICE FF.
       LOAD IT INTO REGISTER A.
       (WHAT DO THE SWITCHES SAY?)

252                     xra     d               exclusive or with A

       XOR OF REGISTERS D AND A.
       IF A BIT IN ONE IS ONE THEY BOTH ARE ONE,
       BUT IF THE BITS IN TWO ARE ONE THEY'RE NONE.
       THIS IS XOR. LOAD REGISTER A


017                     rrc                     rotate display right one bit

       AND NOW SHIFT THE ACCUMULATOR ONCE.
       MOVES THE ZEROS, MOVE THE ONES.

127                     mov     d,a             move data to display reg

       MOVE EVERYTHING FROM A TO D

303 010 000     jmp     beg             repeat sequence

       JUMP TO LOCATION 08

                       end

       THIS IS THE END, BUT IT NEVER ENDS.