‍Kill ‍The ‍Bit


‍Das ‍Programm ‍kennt ‍bestimmt ‍jeder, ‍dieses ‍nette ‍kleine ‍Demonstrationsspielchen ‍für ‍den ‍ALTAIR ‍8800!

‍Von ‍Dean ‍McDaniel ‍aus ‍1975:


‍Nachdem ‍auf ‍der ‍VCFB ‍2018 ‍schon ‍eine ‍Umsetzung ‍für ‍die ‍PDP8 ‍zu ‍bewundern ‍war, ‍wollte ‍ich ‍das ‍auch ‍mal ‍für ‍mich ‍machen ‍und ‍habe ‍es ‍nach ‍PAL8 ‍umgesetzt:


‍    1             / ‍EINE ‍KILL ‍THE ‍BIT ‍VERSION

‍    2             

‍    3       0200  *200

‍    4 ‍00200 ‍7330         CLA ‍CLL ‍CML ‍RAR   /INITIALISIEREN ‍UND ‍LINKES ‍BIT ‍SETZEN

‍    5 ‍00201 ‍7604  LOOP,  CLA ‍OSR   / ‍TASTEN ‍ABFRAGEN

‍    6 ‍00202 ‍3227         DCA ‍VAR01 ‍/ ‍AC ‍FUER ‍SPAETER ‍IM ‍XOR ‍WEGSCHREIBEN

‍    7 ‍00203 ‍1227         TAD ‍VAR01 ‍/ ‍XOR ‍VON ‍VAR01 ‍UND ‍VAR03 ‍IN ‍MEHREREN ‍SCHRITTEN

‍    8 ‍00204 ‍0231         AND ‍VAR03 ‍

‍    9 ‍00205 ‍7041         CIA

‍   10 ‍00206 ‍7104         CLL ‍RAL

‍   11 ‍00207 ‍1227         TAD ‍VAR01

‍   12 ‍00210 ‍1231         TAD ‍VAR03 ‍/ ‍XOR ‍FERTIG

‍   13 ‍00211 ‍7010         RAR       / ‍AKKU ‍ROTIEREN

‍   14 ‍00212 ‍7430         SZL       / ‍WENN ‍BIT ‍IM ‍LINK ‍STARTWERT ‍ADDIEREN

‍   15 ‍00213 ‍1232         TAD ‍START        

‍   16 ‍00214 ‍3231         DCA ‍VAR03 ‍/ ‍AC ‍FUER ‍NAECHSTES ‍XOR ‍SICHERN

‍   17 ‍00215 ‍1226         TAD ‍BREMS

‍   18 ‍00216 ‍3227         DCA ‍VAR01 ‍/ ‍VERZOEGERUNG ‍ZAEHLSCHLEIFE ‍MIT ‍BREMS ‍SETZEN

‍   19 ‍00217 ‍1231         TAD ‍VAR03 ‍/ ‍AKKU ‍FUER ‍ANZEIGE ‍WIEDER ‍LADEN

‍   20 ‍00220 ‍2227  SLOW1, ‍ISZ ‍VAR01 ‍/ ‍ZWEI ‍VERSCHACHTELTE ‍WARTESCHLEIFEN

‍   21 ‍00221 ‍5223         JMP ‍SLOW2

‍   22 ‍00222 ‍5201         JMP ‍LOOP

‍   23 ‍00223 ‍2230  SLOW2, ‍ISZ ‍VAR02

‍   24 ‍00224 ‍5223         JMP ‍SLOW2

‍   25 ‍00225 ‍5220         JMP ‍SLOW1

‍   26             

‍   27 ‍00226 ‍7400  BREMS, ‍7400 ‍/ ‍JE ‍KLEINER ‍UMSO ‍LANGSAMER ‍(7400 ‍SIMH, ‍7760 ‍LAB8/E)

‍   28 ‍00227 ‍0000  VAR01, ‍0000 ‍/ ‍ZAEHLER ‍FUER ‍AEUSSERE ‍WARTESCHLEIFE ‍ODER ‍AC ‍XOR-SPEICHER

‍   29 ‍00230 ‍0000  VAR02, ‍0000 ‍/ ‍ZAEHLER ‍FUER ‍INNERE ‍WARTESCHLEIFE

‍   30 ‍00231 ‍4000  VAR03, ‍4000 ‍/ ‍AC ‍SPEICHER ‍ANFANGSWERT ‍4000

‍   31 ‍00232 ‍4000  START, ‍4000 ‍/ ‍UNGELIEBTER ‍STARTWERT

‍   32             $


‍Um ‍auf ‍dem ‍Simulator ‍und ‍der ‍LAB8/E ‍vernünftige ‍Blinkgeschwindigkeiten ‍zu ‍haben, ‍habe ‍ich ‍eine ‍BREMS ‍Konstante ‍eingeführt. ‍Mit ‍Werten ‍von ‍7760 ‍für ‍die ‍LAB8/E ‍und ‍Werten ‍von ‍7400 ‍für ‍simh ‍auf ‍der ‍PiDP8, ‍sieht ‍die ‍Geschwindigkeit ‍ähnlich ‍aus. ‍Dabei ‍ist ‍mir ‍aufgefallen, ‍daß ‍die ‍Nutzung ‍des ‍MQ ‍Registers ‍parallel ‍zum ‍AC ‍Register ‍zwar ‍nett ‍aussieht ‍(auf ‍der ‍PiDP8), ‍aber ‍dann ‍nicht ‍mehr ‍ohne ‍weiteres ‍auf ‍allem ‍PDP8en ‍läuft. ‍Meine ‍zuerst ‍genutzten ‍MQ ‍Microinstructions ‍kannte ‍PAL8 ‍nicht. ‍So ‍wurde ‍ich ‍darauf ‍aufmerksam, ‍daß ‍das ‍MQ ‍Register ‍bei ‍Maschinen ‍vor ‍der ‍8/e ‍nur ‍im ‍Zusammenhang ‍mit ‍der ‍EAE ‍Option ‍funktioniert. ‍Die ‍Darstellung ‍des ‍Bits ‍im ‍MQ ‍kann ‍man ‍aber ‍auch ‍einfach ‍weglassen ‍oder ‍durch ‍NOP ‍ersetzen.


‍Den ‍Code ‍habe ‍ich ‍mit ‍Cut+Paste ‍in ‍ein ‍unter ‍OS/8 ‍gestartetes ‍

‍.R ‍PIP

‍*KILL.PA<TTY:


‍kopiert ‍und ‍mit ‍^Z ‍und ‍^C ‍beendet. ‍Jetzt ‍lag ‍das ‍KILL.PA ‍auf ‍dem ‍dem ‍vom ‍os8diskserver ‍gemounteten ‍Image ‍und ‍konnte ‍mit ‍

‍.PAL ‍KILL.PA/G

‍kompiliert ‍und ‍gestartet ‍werden.


‍Soweit ‍so ‍gut, ‍und ‍nun? ‍Was ‍ich ‍gerne ‍machen ‍möchte, ‍ist ‍zwei ‍PDP8en ‍seriell ‍zu ‍koppeln ‍und ‍aus ‍dem ‍Kill ‍The ‍Bit ‍ein ‍kleines ‍Netzwerkspiel ‍zu ‍machen. ‍Mal ‍abwarten ‍ob ‍ich ‍zu ‍der ‍Gelegenheit ‍komme… ‍


‍27.10.2019  Nachdem ‍ich ‍nun ‍die ‍ganze ‍Hardware ‍von ‍Gerold ‍bekommen ‍habe, ‍stand ‍mir ‍eine ‍zweite ‍PDP8 ‍zur  Verfügung. ‍Daher ‍habe ‍ich ‍die ‍schnell ‍zum ‍Laufen ‍gebracht, ‍der ‍fehlte ‍nur ‍eine ‍heile ‍RUN ‍LED. ‍Dann ‍habe ‍ich ‍eine ‍serielle ‍Karte ‍M8655 ‍eingebaut ‍und ‍ein ‍Kreuzkabel ‍gelötet. ‍Das ‍verbindet ‍nun ‍die ‍M8655 ‍in ‍der ‍lab/8e ‍mit ‍der ‍Karte ‍in ‍der ‍pdp8/m. ‍Senden ‍und ‍Empfangen ‍sind ‍gekreuzt.


‍Dann ‍habe ‍ich ‍mich ‍hingesetzt ‍und ‍folgendes ‍geschrieben:


‍    1             / ‍EINE ‍KILL ‍THE ‍BIT ‍VERSION ‍FUER ‍2 ‍PDP8 ‍RECHNER ‍MIT

‍    2             / ‍SERIELLEN ‍SCHNITTSTELLEN ‍AN ‍03/04 ‍UND ‍EINEM ‍KREUZKABEL

‍    3       0200  *200

‍    4 ‍00200 ‍7300         CLA ‍CLL ‍/CML ‍RAR   /INITIALISIEREN ‍UND ‍LINKES ‍BIT ‍SETZEN

‍    5 ‍00201 ‍6032         KCC               /INITIALISIEREN ‍DER ‍SERIELLEN ‍SCHNITTSTELLE

‍    6 ‍00202 ‍7604  LOOP,  CLA ‍OSR   / ‍TASTEN ‍ABFRAGEN

‍    7 ‍00203 ‍3251         DCA ‍VAR01 ‍/ ‍AC ‍FUER ‍SPAETER ‍IM ‍XOR ‍WEGSCHREIBEN

‍    8 ‍00204 ‍1251         TAD ‍VAR01 ‍/ ‍XOR ‍VON ‍VAR01 ‍UND ‍VAR03 ‍IN ‍MEHREREN ‍SCHRITTEN

‍    9 ‍00205 ‍0253         AND ‍VAR03 ‍

‍   10 ‍00206 ‍7041         CIA

‍   11 ‍00207 ‍7104         CLL ‍RAL

‍   12 ‍00210 ‍1251         TAD ‍VAR01

‍   13 ‍00211 ‍1253         TAD ‍VAR03 ‍/ ‍XOR ‍FERTIG

‍   14 ‍00212 ‍7010         RAR       / ‍AKKU ‍ROTIEREN

‍   15 ‍00213 ‍7430         SZL       / ‍BIT ‍IM ‍LINK ‍?

‍   16 ‍00214 ‍5222         JMP ‍SEND1 ‍/ ‍WENN ‍BIT ‍IM ‍LINK ‍ZU ‍1 ‍SENDEN ‍SPRINGEN

‍   17 ‍00215 ‍3253         DCA ‍VAR03 ‍/ ‍AC ‍RETTEN

‍   18 ‍00216 ‍6046         TLS       / ‍0 ‍SENDEN

‍   19 ‍00217 ‍6041  WRITE, ‍TSF

‍   20 ‍00220 ‍5217         JMP ‍WRITE

‍   21 ‍00221 ‍5226         JMP ‍READ

‍   22 ‍00222 ‍3253  SEND1, ‍DCA ‍VAR03  /AC ‍RETTEN

‍   23 ‍00223 ‍7101         CLL ‍IAC    /LINK=0 ‍AC=1 ‍

‍   24 ‍00224 ‍6046         TLS        /1 ‍SENDEN

‍   25 ‍00225 ‍5217         JMP ‍WRITE  /TSF ‍VON ‍OBEN ‍NUTZEN ‍UND ‍DANN ‍ZU ‍READ ‍SPRINGEN

‍   26 ‍00226 ‍6031  READ,  KSF

‍   27 ‍00227 ‍5226         JMP ‍READ

‍   28 ‍00230 ‍6036         KRB

‍   29 ‍00231 ‍7440         SZA        /SPRINGE ‍WENN ‍0 ‍GELESEN

‍   30 ‍00232 ‍7220         CLA ‍CML    /WENN ‍1 ‍GELESEN ‍LINK=1 ‍und ‍AC=0 ‍(SIEHE ‍CLL ‍OBEN)

‍   31 ‍00233 ‍7430         SZL        /LINK ‍VON ‍GEGENSEITE ‍HERGESTELLT, ‍TESTEN ‍OB ‍GESETZT

‍   32 ‍00234 ‍1254         TAD ‍START  /KEIN ‍STARTWERT ‍ADDIEREN ‍WENN ‍LINK ‍0

‍   33 ‍00235 ‍1253         TAD ‍VAR03  /EIGENES ‍AC ‍ADDIEREN      

‍   34 ‍00236 ‍3253         DCA ‍VAR03 ‍/ ‍AC ‍FUER ‍NAECHSTES ‍XOR ‍SICHERN

‍   35 ‍00237 ‍1250         TAD ‍BREMS

‍   36 ‍00240 ‍3251         DCA ‍VAR01 ‍/ ‍VERZOEGERUNG ‍ZAEHLSCHLEIFE ‍MIT ‍BREMS ‍SETZEN

‍   37 ‍00241 ‍1253         TAD ‍VAR03 ‍/ ‍AKKU ‍FUER ‍ANZEIGE ‍WIEDER ‍LADEN

‍   38 ‍00242 ‍2251  SLOW1, ‍ISZ ‍VAR01 ‍/ ‍ZWEI ‍VERSCHACHTELTE ‍WARTESCHLEIFEN

‍   39 ‍00243 ‍5245         JMP ‍SLOW2

‍   40 ‍00244 ‍5202         JMP ‍LOOP

‍   41 ‍00245 ‍2252  SLOW2, ‍ISZ ‍VAR02

‍   42 ‍00246 ‍5245         JMP ‍SLOW2

‍   43 ‍00247 ‍5242         JMP ‍SLOW1

‍   44             

‍   45 ‍00250 ‍7760  BREMS, ‍7760 ‍/ ‍JE ‍KLEINER ‍UMSO ‍LANGSAMER ‍(7400 ‍SIMH, ‍7760 ‍LAB8/E)

‍   46 ‍00251 ‍0000  VAR01, ‍0000 ‍/ ‍ZAEHLER ‍FUER ‍AEUSSERE ‍WARTESCHLEIFE ‍

‍   47 ‍00252 ‍0000  VAR02, ‍0000 ‍/ ‍ZAEHLER ‍FUER ‍INNERE ‍WARTESCHLEIFE

‍   48 ‍00253 ‍4000  VAR03, ‍4000 ‍/ ‍AC ‍SPEICHER ‍ANFANGSWERT ‍4000

‍   49 ‍00254 ‍4000  START, ‍4000 ‍/ ‍UNGELIEBTER ‍STARTWERT

‍   50             $


‍Hatte ‍reichlich ‍Glück ‍beim ‍ersten ‍Entwurf ‍und ‍mußte ‍nur ‍einen ‍Fehler ‍finden. ‍Da ‍es ‍in ‍dieser ‍Version ‍keinen ‍Startwert ‍gibt, ‍muss ‍man ‍an ‍einer ‍der ‍Maschinen ‍nach ‍dem ‍Start ‍erst ‍ein ‍BIT ‍erzeugen. ‍Hier ‍das ‍laufende ‍Ergebnis:


‍Damit ‍bin ‍ich ‍erstmal ‍zufrieden. ‍Das ‍es ‍so ‍einfach ‍geht ‍freut ‍mich ‍sehr, ‍mmmh, ‍was ‍man ‍da ‍noch ‍draus ‍machen ‍kann? ‍






;KILLBITS.PRN

;  Kill the Bit game by Dean McDaniel, May 15, 1975

;

;  Object: Kill the rotating bit. If you miss the lit bit, another

;          bit turns on leaving two bits to destroy. Quickly

;          toggle the switch, don't leave the switch in the up

;          position. Before starting, make sure all the switches

;          are in the down position.


0000        org     0

0000 210000    lxi     h,0       ;initialize counter

0003 1680      mvi     d,080h    ;set up initial display bit

0005 010E00    lxi     b,0eh     ;higher value = faster

0008 1A   beg: ldax    d         ;display bit pattern on

0009 1A        ldax    d         ;...upper 8 address lights

000A 1A        ldax    d

000B 1A        ldax    d

000C 09        dad     b         ;increment display counter

000D D20800    jnc     beg

0010 DBFF      in      0ffh      ;input data from sense switches

0012 AA        xra     d         ;exclusive or with A

0013 0F        rrc               ;rotate display right one bit

0014 57        mov     d,a       ;move data to display reg

0015 C30800    jmp     beg       ;repeat sequence

0018           end




Here is the program in octal for easier entry into the Altair:

000: 041 000 000 026 200 001 016 000

010: 032 032 032 032 011 322 010 000

020: 333 377 252 017 127 303 010 000