VC 20
Hardware
6/84, S. 24-28

Kopplung zwischen zwei VC 20

Wenn Sie auf ein größeres System umsteigen, dann verschleudern Sie nicht Ihren alten VC 20. Nutzen Sie statt dessen seine experimentellen Möglichkeiten, beispielsweise für die bitparallele Datenübertragung. Der folgende Artikel bringt dazu einige Anregungen und eine über zwei VC 20 zu spielende Knobelei.

Auf der Rückseite des VC 20 befindet sich unter anderem der sogenannte USER-PORT mit seinen 24 Anschlüssen. Die Pin-Belegung mit Blick auf den Port zeigt Bild 1. Für die folgenden Experimente werden neben einem (beliebigen) Masseanschluß (GND) und der herausgeführten Betriebsspannung von + 5 V (Pin 2) die acht Ein- beziehungsweise Ausgänge des Ports B, das heißt die Anschlüsse C bis L benötigt. Die übrigen Anschlüsse sind zum Teil nicht beliebig für Experimente frei, da sie für andere Zwecke mit benötigt werden. So führen die Pins 4 bis 6 zum Joystickanschluß, Pin 7 ist für den Lichtgriffel, Pin 8 für den Kassettenschalter und Pin 9 ist ein gepufferter Serienausgang. Zwei weitere Anschlüsse, Pin B und M mit den Bezeichnungen CB 1 und CB 2 sind sogenannte quittierende Leitungen (Handshake-Leitungen).

Bild 1. Pinbelegung des Userports

Über Port B kann ein 8 Bit breites Wort ausgegeben beziehungsweise eingelesen werden. Die Kontrolle des Ports erfolgt über den Baustein 6522, der unter anderem die Richtung des Datenflusses mit Hilfe des Datenrichtungsregisters (37138) festlegt. Nach dem Einschalten des Computers sind alle Leitungen von Port B Eingänge.

Beim Ausgeben soll der Computer an die Pins C bis L (mit den Bezeichnungen PB 0 bis PB 7) eine logische 1 (entspricht +5 Volt) beziehungsweise eine Null (0 Volt) legen. Dazu sind zwei Schritte notwendig:
a) Der ganze Port beziehungsweise einzelne Leitungen von ihm müssen als Ausgänge programmiert werden. Der entsprechende Basic-Befehl heißt POKE 37138,X.
X = 1 : PB 0 ist Ausgang
X = 2 : PB 1 ist Ausgang
X = 4 : PB 2 ist Ausgang (und so weiter bis X = 128)
X = 3 : PB 0 und PB 1 sind Ausgänge
X = 5 : PB 0 und PB 2 sind Ausgänge (und so weiter bis X = 255).

b) Auf die als Ausgänge vorprogrammierten Leitungen wird 1 beziehungsweise 0 gegeben. Der entsprechende Befehl heißt POKE 37136,Y.
Y = 0 : auf allen Leitungen liegt 0.
Y = 1 : nur auf PB 0 liegt 1
Y = 2 : nur auf PB 1 liegt 1
Y = 4 : nur auf PB 2 liegt 1 (und so weiter bis Y = 128)
Y = 3 : auf PB 0 und PB 1 liegt 1 (und so weiter bis Y = 255).

Auch das Einlesen von Port B erfolgt in zwei Schritten:
a) Es muß darauf geachtet werden, daß die anzusprechenden Leitungen nicht als Ausgänge geschaltet sind. Der entsprechende Befehl heißt ebenfalls POKE 37138,X. Für X ist jedoch die zu 255 komplementäre Binärzahl einzusetzen:
X = 255 : keine Leitung ist Eingang (das heißt alle sind Ausgänge)
X = 254 : nur PB 0 ist Eingang
X = 240 : PB 0 … PB 3 sind Eingänge (Rest Ausgänge)
X = 15 : PB 4 … PB 7 sind Eingänge X = 0: alle Leitungen sind Eingänge.
b) Das gesamte angelegte Wort (einschließlich eventuell ausgegebener Einsen) wird eingelesen. Der entsprechende Basic-Befehl heißt PEEK (37136). Dies ergibt Zahlenwerte zwischen 0 und 255. Der Wert 255 bedeutet, daß an allen acht Pins eine logische 1, das heißt + 5 V liegt. Sollen einzelne Leitungen abgefragt werden, so gewinnt man ihre Werte durch logischen Vergleich, den man am besten in einem Unterprogramm durchführt:

1000 P = PEEK (37136)
1010 P0 = -((P AND 1) = 1)
1020 P1 = -((P AND 2) = 2)
1030 P2 = -((P AND 4) = 3)
1080 P7 = -((P AND 128) = 128
1090 PRINTP0;P1; ...P7

Das Unterprogramm führt bitweise einen logischen UND-Vergleich durch und prüft, ob das jeweilige Bit mit 1 oder 0 belegt ist.

Anmerkung: In den folgenden Programmen steht P 0 statt PB 0 und so weiter.

Für die folgenden Experimente empfiehlt es sich, eine einfache Ein-/Ausgabeplatine zu bauen, die das lästige Messen mit Spannungsmesser beziehungsweise Logiktester ersetzt. Einen entsprechenden Schaltungsvorschlag zeigt Bild 2.

Bild 2. Die Ein-/Ausgabe-Platine

Die Schaltung ist so ausgelegt, daß die vier Leitungen PB 0 bis PB 3 als Ausgänge und die vier Leitungen PB 4 bis PB 7 als Eingänge für den Computer verwendet werden. Selbstverständlich sind andere Aufteilungen möglich.

Der Anzeigeteil der Platine (entspricht dem Ausgabeteil des Computers) ist mit vier roten LEDs mit Vorwiderstand bestückt. Bei 200 Ohm bleibt selbst bei acht LEDs der Gesamtstrom unter den zulässigen 100 mA.

Im Ausgabeteil der Platine (Eingabeteil des Computers) legen Taster beziehungsweise Schalter die Eingänge auf + 5 V. Bei offenen Tastern taucht ein Problem auf, da der Computer ebenfalls eine 1 einliest. Deshalb wird durch die 1 kOhm-Widerstände das Potential auf logisch 0, das heißt auf zirka 0 V herabgezogen.

Für den Aufbau eignet sich fast jede Experimentierplatine im Europaformat mit Ätzinseln. Die Taster sollten prellfrei sein. Für den User-Port empfiehlt sich der Doppelstecker CINCH 251-12-90-160 Typ 50 24 EE-30 (erhältlich zum Beispiel bei Hofacker). Für die Zwischenverbindungen genügen bei kurzen Strecken ein mehradriges Band beziehungsweise 10 Einzeldrähte. Bei größeren Entfernungen (ab zirka 2 m) empfiehlt sich ein abgeschirmtes Kabel (Mantel auf GND). Bild 3 zeigt zwei verschiedene Baumuster der Platine.

Bild 3. Zwei verschiedene Ein-/Ausgabe-Platinen

Software zur Ein-/Ausgabe

Einen Programmvorschlag für das Ausgeben beziehungsweise Einlesen zeigt Listing 1. Da im obigen Beispiel P 0 bis P 3 als Ausgänge und P 4 bis P7 als Eingänge geschaltet werden sollen, wird zunächst der Befehle POKE 37138, 15 gegeben werden (15 = 8 + 4 + 2 + 1), das heißt Bit 1 bis 4 sind Ausgänge, der Rest Eingänge.

Das Programm bietet in einem Menü zwei Teilprogramme an: Beim Ausgeben wird durch Betätigen der Tasten Z, X, C, V jeweils eine einzelne 1 auf den Computerport gegeben, was durch das Leuchten der entsprechenden LED angezeigt wird.

Beim Einlesen können einzelne oder alle Taster betätigt werden. Der Computer zeigt sowohl PEEK (37136) als Summe als auch die einzelnen Bitwerte an.

Kopplung von zwei VC 20

Will man statt der beschriebenen Ein-/Ausgabeplatinen einen zweiten Computer verwenden, so muß er mit einer neunadrigen Leitung (für 8 Bit und GND) angeschlossen werden. Mit Rücksicht auf das später zu beschreibende Spiel sind im folgenden vier Leitungen für die eine Datenrichtung, die vier anderen für die umgekehrte Richtung vorgesehen. Außerdem sind die Leitungen untereinander gekreuzt (das heißt Bit 1 von Computer A ist verbunden mit Bit 8 vom Computer B). Dies erlaubt es später, für das Computerspiel in beiden Computern das exakt gleiche Programm verwenden zu können.

Die komplette Verbindung zeigt Bild 4. Es werden die gleichen Stecker und Leitungen wie oben benutzt. Für Testzwecke kann das Programm von Listing 2 benützt werden, wenn wechselweise der Programmteil Einlesen beziehungsweise Ausgeben gewählt wird. Es kann jedoch auch (nach POKE 37138, X mit POKE 37136, X ausgegeben und mit PRINT PEEK (37136) im Direktmode gearbeitet werden.

Bild 4. Kopplung von zwei VC 20 über den Userport

Knobelspiel Schere/Stein/Papier

Das Spiel, das zwischen zwei Spielern über zwei miteinander verkoppelte Computer gespielt wird, soll neben seinem Unterhaltungswert den Datenaustausch zwischen zwei Computern zeigen. Weiterhin zeigt es das Arbeiten mit dem logischen Befehlen AND und OR.

Üblicherweise wird das Knobelspiel nach folgenden Regeln gespielt: Die beiden Spielpartner zeigen auf Kommando zwei ausgestreckte Finger, bedeutet Schere, oder die flache Hand (Papier), oder die geballte Faust (Stein). Es gewinnt Schere gegen Papier (die Schere schneidet das Papier), Stein gegen Schere (der Stein schleift die Schere) und Papier gegen Stein (das Papier hüllt den Stein ein). Damit sind Sieg, Unentschieden und Niederlagen möglich. Gesamtsieger ist, wer zuerst drei Einzelspiele gewonnen hat.

Die logische Struktur des Spiels zeigt Bild 5. Man erkennt einen recht großen Aufwand an UND- beziehungsweise ODER-Schaltungen. Dabei ist bei der gezeigten Schaltung noch nicht verhindert, daß ein Spieler gleichzeitig mehrere Eingaben wählt. Außerdem fehlen noch die Zählschaltungen und ein Taktgeber. Wegen des hohen Aufwandes an Logikbausteinen bietet sich eine Computerschaltung mit entsprechendem Programm an. Die Grundstruktur mit den logischen Befehlen statt den UND-Verknüpfungen sieht folgendermaßen aus:

610 IF A1=1 AND B1=1 THEN 710 (Schere A — Schere B)
620 IF A2=1 AND B2=1 THEN 710 (Stein A — Stein B)
640 IF A1=1 AND B3=1 THEN 740 (Schere A — Papier B)
670 IF A1=1 AND B2=1 THEN 770 (Schere A — Stein B)
710 REM UNENTSCHIEDEN : END
740 REM SIEG A : END
770 REM SIEG B: END
Bild 5. Logische Struktur des Knobelspiels

Die bei den statischen Verknüpfungsgliedern folgenden ODER-Schaltungen werden im Computerprogramm dadurch realisiert, daß von drei Stellen aus an die entsprechende Einsprungstelle gesprungen wird.

Der logische Befehl OR wird an anderer Stelle benötigt. Die Zeilen

510 GOSUB 1000 : REM EINLESEN
520 IF B1 = 1 OR B2 = 1 OR B3 = 1 THEN 540
530 GOTO510
540 REM VERGLEICH

erlauben ein Weitergehen im Programm, wenn der Spielpartner B eine beliebige Eingabe, Schere oder Stein oder Papier, gemacht hat.

Anmerkung: Für A 1 bis B 3 steht im Listing P 1 bis P 6 (nach Bild 4).

Vorausgesetzt wurde, daß für beide Computer (als A und B bezeichnet) das exakt gleiche Programm verwendet werden soll (also kein Master- beziehungsweise Slave-Programm). Die jeweilige Ausgabe Schere/Stein/Papier soll als logische 1 über die Ausgänge P 1, P 2 und P 3 ausgegeben werden beziehungsweise vom entgegengesetzten Computer über die Eingänge P 4, P 5 und P 6 eingelesen werden. Um das Spiel synchron zu halten, wird das »o.k.«-Signal benutzt, das über P0 ausgegeben beziehungsweise über P 7 eingelesen wird. Hat zum Beispiel Spielpartner A die o.k.-Taste betätigt, so läuft das Programm erst weiter, wenn auch B sein o.k. signalisiert hat. A kann jetzt Schere, Stein oder Papier wählen. Wieder muß gewartet werden, bis auch B seine Wahl getroffen hat. Der synchrone Verlauf des Spiels wird durch akustische Signale unterstützt. Das vollständige Strukturdiagramm zeigt Bild 6.

Bild 6. Flußdiagramm für das Knobelspiel

Das Programm beginnt mit zwei vorgeschalteten Blöcken, nämlich einer Überprüfung der Hardware und einer Kurzbeschreibung des Spieles. Nach der Aufforderung, die o.k.-Taste zu drücken, geht es weiter, wenn beide Spielpartner dies getan haben.

Es folgt die Aufforderung, eine Taste, bedeutet Schere oder Stein oder Papier, zu wählen. Haben beide Spieler dies getan, so überprüft jeder Computer, wer gewonnen hat beziehungsweise ob das Einzelspiel unentschieden endete. Zwischenergebnis und Zwischenstand werden angezeigt. Jeder Computer addiert für sich die Siegpunkte von Spieler A beziehungsweise B. Nach Erreichen von drei Siegpunkten endet das Programm je nachdem mit einer aufsteigenden beziehungsweise abfallenden Tonfolge. Auf Wunsch kann das Spiel (ohne die Einleitung) wiederholt werden. Drei Hardcopys aus dem Spielverlauf zeigt Bild 7. Das vollständige Programm zeigt Listing 1.

Bild 7. Hardcopy des Spielablaufs
(Albrecht Langenstein)
10 rem knobelspiel
20 print"{clr}"
30 print"     {red}knobelspiel{blu}"
40 print:print" schere stein papier ":print:print
50 print:print"       autor           albrecht langenstein
60 for t=1 to 8000:next
70 poke 37138,15
80 poke 37136,0
90 a=0:b=0
100 rem vorbereitung
110 print"achtung!"
115 print"--------"
120 print"pruefen sie,ob das verbindungskabel steckt.":print
130 print"sonst erst {rvon}beide{rvof}  ":print
135 print"- rechner {rvon}ausschalten{rvof}"
140 print"- kabel einstecken   "
145 print"- programm {rvon}neu laden.{rvof}":print
150 print"monitor geeignet auf- stellen!":print
155 print"bei bildstreifen evt. uhf-modulatoren drehen"
160 print"lautstaerke einstellen"
165 poke 36878,15:poke 36875,219
170 print"   wenn alles ok,       {rvon}leertaste{rvof} druecken!"
180 geta$:ifa$=""then 180
190 ifa$=" "then 200
195 goto 170
200 rem anweisung
205 print"{clr}":print"spielanweisung:"
210 print"---------------"
220 print"waehlen sie schere,   stein oder papier!":print
230 print"schere gewinnt gegen  papier.":print
240 print"papier gewinnt gegen  stein.":print
250 print"stein  gewinnt gegen  schere.":print
260 print"sonst unentschieden.":print
270 print"gesamtsieger ist,wer .zuerst 3 einzelspiele gewonnen hat!"
300 rem start
305 poke 36878,0
310 p0=0:p1=0:p2=0:p3=0
315 print
320 print"wenn ok,taste f1 "
330 geta$:ifa$=""then330
340 ifa$=chr$(133)then350
345 goto 320
350 poke 36878,15:poke 36875,237
352 fort=1 to 150:next
355 poke 36878,0
360 p0=1:x=1:poke 37136,x
365 print"{clr}":print"auf gegner warten!"
370 gosub 1000
380 if p7=1 then 400
390 goto 370
400 rem wahl a
410 print"{clr}"
415 print:print"   bitte waehlen!!":print:print
420 print"     f3...schere ":print:print
422 print"     f5...stein  ":print:print
424 print"     f7...papier ":print:print
426 print:print"entspr.taste druecken!"
430 geta$:ifa$=""then 430
435 ifa$=chr$(134) then 460
440 ifa$=chr$(135) then 470
445 ifa$=chr$(136) then 480
450 goto 400
460 p1=1:x=2:p$="schere"
465 poke37136,x:goto500
470 p2=1:x=4:p$="stein "
475 poke37136,x:goto500
480 p3=1:x=8:p$="papier"
485 poke37136,x:goto500
500 rem ein b
505 poke 36878,15:poke36875,219
510 gosub 1000
520 if p4=1 or p5=1 or p6=1 then 540
530 goto 510
540 poke 36878,0
600 rem vergleich
601 if p6=1 then 605
602 if p5=1 then 606
603 if p4=1 then 607
605 q$="schere":goto  610
606 q$="stein ":goto  610
607 q$="papier":goto  610
610 if p1=1 and p6=1  then 710:rem remis
620 if p2=1 and p5=1  then 710
630 if p3=1 and p4=1  then 710
640 if p1=1 and p4=1  then 740:rem sieg a
650 if p2=1 and p6=1  then 740
660 if p3=1 and p5=1  then 740
670 if p1=1 and p5=1  then 770:rem sieg b
680 if p2=1 and p4=1  then 770
690 if p3=1 and p6=1  then 770
700 rem ergebnis
710 rem remis
712 print"{clr}":print"sie hatten ";p$
714 print:print"ihr gegner ";q$
720 print:print" also unentschieden"
730 goto 800
740 rem sieger selbst
742 print"{clr}":print"sie hatten ";p$
744 print:print"ihr gegner ";q$
750 print:print"sie haben gewonnen! "
760 a=a+1:goto 800
770 rem sieger gegner
772 print"{clr}":print"sie hatten ";p$
774 print:print"ihr gegner ";q$
780 print:print"gegner hat gewonnen!"
790 b=b+1:goto 800
800 rem zaehlen
801 if a=b then 805
802 if a>b then 806
803 if a<b then 807
805 s$=" unentschieden.":goto810
806 s$=" fuer sie!     ":goto810
807 s$=" fuer gegner!  ":goto810
810 print:print:print"spielstand:":print
820 printa;":";b;s$
850 if a=3 then 900
860 if b=3 then 930
870 goto 300
900 rem gesamtsieg
910 print:print"sie haben das spiel":print
915 print"mit";a;":";b;"gewonnen!"
920 gosub 1100
925 goto 950
930 print:print"sie haben das spiel":print
935 print"mit";a;":";b;"verloren!"
940 gosub 1200
945 goto 950
950 print:print
952 print:print:print"  noch einmal? j/n "
955 print:print" j oder n eingeben !"
960 geta$:ifa$=""then 960
965 ifa$="j" then 980
970 ifa$="n" then 1300
975 goto 950
980 print"{clr}"
985 a=0:b=0
990 goto 300
1000 rem peek in
1010 p=peek(37136)
1020 p4=-((p and  16)= 16)
1030 p5=-((p and  32)= 32)
1040 p6=-((p and  64)= 64)
1050 p7=-((p and 128)=128)
1060 return
1100 rem music a
1110 poke 36878,15
1115 forl=1 to 10
1120 for m=180 to 235 step 2
1125 poke 36875,m
1130 for n=1 to 10
1135 next n
1140 next m
1145 poke 36875,0
1150 for m=1 to 100
1155 next m
1160 next l
1165 poke 36878,0
1190 return
1200 rem music b
1210 poke 36878,15
1220 for m=240 to 127 step -1
1230 poke 36875,m
1240 for t=1 to 80:next
1250 next m
1260 poke 36878,0
1290 return
1300 rem schluss
1310 print"{clr}"
1320 print"  ich bedanke mich!":print:print
1330 print" auf wiederspielen!! "
1350 end
Listing 1. Programm für das Knobelspiel zwischen zwei VC 20
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →