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