HARDWAREMONTAGES ★ Virtual Net 96 ★

Virtual Net '96 (German)Hardware Montages
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Virtual Net 96 (VN96) Hilfedatei, 1996 by Hage & Steve of Wizcat
Version: 1.0, 20.10.1996
-------------------------------------------------------------------
Inhaltsverzeichnis
--------------------
1.) Einleitung
2.) Allgemeines
2.1) Schaltungen, woher?
2.2) Installation & Bedienung
2.3) Selbstgebaute Schaltungen
3.) Wie schreibe ich eigene Programme?
3.1) Grundlagen
3.2) Das Routinenpack VN96ROUT.ASM
3.3) Asynchron und Synchron
3.4) Das erste Programm
3.5) Synchrone Programmierung
4.) Kontakt zu uns
5.) Schlusswort
-----------------------------------------
1.) Einleitung
----------------
Das Virtual Net 96 ist eine Kombination von Hard- und Software, die von uns
entwickelt wurde um 2 und mehr CPCs zu vernetzen.
Die Hardware besteht ein einer einfachen Transistorstufe pro CPC und einer
2-adrigen Leitung, die von CPC zu CPC 'druchgeschleift' wird. Die Daten
werden seriell an alle CPCs gleichzeitig uebertragen.
Die Software besteht aus Anwendungen oder Spielen, die auf einen von uns ent-
wickelten Routinenpack zugreifen, der es ermoeglicht Daten mit einer Ge-
schwindigkeit von bis zu ca. 60000 Baud zu uebertragen.
Diese Dokumentation fuehrt in das Virtual Net 96 ein und ermoeglicht es ei-
gene Virtual Net 96-Programme zu entwickeln.
Fuer den interessierten Programmierer empfiehlt es sich, dieses Dokument ge-
nau und vollstaendig zu lesen, 'Nur-Anwender' koennen das 3. Kapitel ueber-
springen.
2.) Allgemeines
-----------------
2.1) Schaltungen, woher?
--------------------------
Schaltungen und Leitungen kann man bei uns gegen Unkostenbeitraege bekommen
(oder selbst bauen, s.u.):
* Einzelne Leitung
1e Leitung ;1.50 DM
* Einzelne Schaltung
1e Schaltung ; 4.50 DM
* 'Add-On'
1e Schaltung und 1e Leitung 6.00 DM
* 'Beginner-Set'
2 Schaltungen und 1e Leitung 10.00 DM
2.2) Installation & Bedienung
-------------------------------
Die Schaltungen werden linksbuendig mit dem Schalter nach oben in den
Druckerport gesteckt.
Jeweils 2 uebereinanderliegende Loetstifte gehoeren zusammen und werden
mit einem Ende einer Leitung verbunden. Die gekennzeichnete Ader (Knoten)
wird mit dem oberen Stift verbunden, die Andere mit dem unteren Stift. Das
andere Ende der Leitung wird entsprechend mit einer anderen Schaltung
verbunden. An die verbleibenden 2 Stifte kann wiederum eine andere Schal-
tung angeschlossen werden u.s.w.
Ist der Schalter in der Stellung Links, so ist die Schaltung aktiviert, in
der Stellung rechts ist sie deaktiviert.
WICHTIG: Ist der CPC ausgeschaltet oder laeuft kein VN96-Programm, dann
MUSS die Schaltung UNBEDINGT ausgeschaltet sein (Stellung rechts). Sobald
ein VN96-Programm laeuft, kann die Schaltung eingeschaltet werden und das
Programm uebernimmt den Rest.
2.3) Selbstgebaute Schaltungen
--------------------------------
Fuer Anwender, die mit dem Loetkolben umgehen koennen, hier der Schaltplan
der Schaltungen:
---------------------o--------------------------------------- Data

---------------------|-----------------o--------------------- GND
; | ; |
; / ; |
; Schalter /---| ;|
;/ ; |
; | ; |
Widerstand | ; |
10k o-------+ ;|
; | / | ;|
+-----+ |/ ;| ;|
+-----| |-----< | ;|
| +-----+ | ;| ;|
| ; | --------|---------o
| ; | ;|
| ; Transistor | ;|
| ; BC 547C | ;|
| ; | ;|
______ ; ____
Strobe ; Busy GND
(Pin 1) ;(Pin 11) (Pin 19-26)
Die Pins beziehen sich auf den Druckerport.
Unsere Schaltungen und Leitungen weisen ein eintheitliches Design auf. Um
Kompatibilitaet beim Eigenbau einer Schaltung zu wahren, ist es sinnvoll,
diese Norm einzuhalten:
* Die Verbindung von der Schaltung zur Leitung wird durch 1mm-Loetstifte
hergestellt. Um das Signal durchschleifen zu koennen, sollten es 4
Stifte sein (2 Data- und 2 GND-Stifte).
* Der Data-Stift sollte oben angebracht sein (naeher am Monitor), der
GND-Stift unten (um Verpolungen zu vermeiden)
* Die Leitungen enden in 1mm-L tstiftbuchsen und jeweils eine der beiden
Adern sollte gekennzeichnet sein (an beiden Enden der Leitung die
gleiche Ader).
* Schalterstellung: Rechts: aus, Links: ein
Falls sich jemand nicht vorstellen kann, wie eine Schaltung aussehen sollte
besteht die Moeglichkeit, sich bei uns Schaltungen/Leitungen auszuleihen.
3.) Wie schreibe ich eigene Programme?
----------------------------------------
3.1) Grundlagen
-----------------
Die Datenleitung hat 2 Zustaende, Eins und Null. Dieser Zustand kann
ueber das 6. Bit der Eingabeadresse #F500 (Busy) abgefragt werden, z.B:
IF INF(&F500) > 64 THEN PRINT "Eins!" ELSE PRINT "Null!"
Oder in Z80:
LD B,#F5
IN A,(C)
CP 64
JR NC,eins
JR null
Dieser Zustand ist bei allen vernetzten CPCs immer gleich, d.h. entweder
bei allen Eins oder bei allen Null.
Ein CPC kann die Leitung ueber das 7. Bit der Ausgabeadresse #EF00 beein-
flussen. Das folgende Beispiel zeigt, wie:
OUT &EF00,128 ' Leitung auf Eins legen
OUT &EF00,0 ' Leitung auf Null legen
Und auch hier ein Beispiel in Z80:
LD BC,#EF80 ' Leitung auf Eins legen
OUT (C),C
LD B,#EF00 ' Leitung auf Null legen
OUT (C),A
Aber was passiert, wenn ein CPC die Leitung auf Eins legen will und ein
anderer will die Leitung auf Null legen? Wider Erwarten loest sich die
Konstruktion nicht unter Stichflammen und Explosionen in Rauch auf.
Der Normalzustand der Leitung ist Eins. Sobald jedoch ein oder mehrere CPCs
eine Null auf die Leitung geben, ist die gesamte Leitung Null, d.h. Null hat
immer Vorrang und eventuelle Einsen von anderen CPCs werden ignoriert.
Andersherum: Erst wenn ALLE CPCs wieder Einsen auf die Leitung geben, wird
bei einer Abfrage auch eine Eins herauskommen.
Nur so ist eine Unidirektionale Uebertragung moeglich und ausserdem ist
dieser Sachverhalt fuer Synchronisationen sehr nuetzlich. Dazu spaeter mehr.
Wichtig ist jedoch: An allererster Stelle (am Besten schon im BASIC-Lader)
eines jeden VN96-Programms MUSS die Leitung auf Eins gelegt werden. Da die
Druckerschnittstelle normalerweise (z.B. nach der Initialisierung durch
einen Reset) eine Null ausgibt wuerde eine eingeschaltete Schaltung das
Netz blockieren. Der Anwender sollte aber die Schaltung einschalten koennen,
sobald ein VN96-PRogramm laeuft. Also: Die Leitung so schnell wie moeglich
auf Eins legen, sobald das Programm laeuft.
Eine Uebertragung laeuft nun so ab, daa alle CPCs, die empfangen wollen eine
Eins auf die Leitung geben und der CPC, der sendet, kann dann die Leitung
entsprechend den zu uebertragenden Bits beeinflussen. Doch diese Routinen
muessen nicht mehr geschrieben werden, es gibt ja...
3.2) Das Routinenpack VN96ROUT.ASM
------------------------------------
Die Routinen im Routinenpack VN96ROUT.ASM (der dieser Doc beiliegt und von
dem es immer die neueste Version kostenlos bei uns gibt) sind:
vnsnd Byte senden
vnrec Byte empfangen
vnsndb Block senden
vnrecb Block empfangen
vnzero Auf Null warten
vnone Auf Eins warten
vnzeri Auf Null warten ohne Timeout
vnonei Auf Eins warten ohne Timeout
vnwait Bestimmte Zeit warten
vnwais Auf Abfrageroutine warten
Wichtig: Alle Routinen des VN96-Routinenpack veraendern den Interrupt-
;Zustand nicht. Doch waehrend eine VN96-Routine ausgefuehrt wird,
;MUESSEN die Interrupte gesperrt (DI) sein.
Hier die Routinen im Detail:
Routine: 'vnsnd', sendet ein Byte
---------------------------------------
Einsprung: A=Byte, das gesendet werden soll
Aussprung: A, BC zerstoert
Bemerkungen: Byte wird sofort und ohne Ueberpruefung der Leitung ge-
; sendet.
--------------------------------------------------------------------------
Routine: 'vnrec', empfaengt ein Byte
------------------------------------------
Einsprung: -
Aussprung: CY=0 --> Empfang ok, A=Empfangenes Byte
; CY=1 --> Timeout error
; A, BC, DE zerstoert
Bemerkungen: Wird innerhalb von ca. 1s kein Byte empfangen, kehrt die
; Routinen mit CY=1 zurueck.
--------------------------------------------------------------------------
Routine: 'vnsndb', sendet einen Datenblock
------------------------------------------------
Einsprung: HL=Zeiger auf Datenblock
; DE=Laenge des Blocks in Bytes
Aussprung: A, BC, DE, HL zerstoert
Bemerkungen: Datenblock wird sofort und ohne Ueberpruefung der Leitung
; gesendet (inklusive Laenge).
--------------------------------------------------------------------------
Routine: 'vnrecb', empfaengt einen Datenblock
---------------------------------------------------
Einsprung: HL=Zeiger auf Buffer
Aussprung: CY=0 --> Empfang ok, (HL)=Empfangener Datenblock
; DE=Laenge des Blocks
; CY=1 --> Timeout error
; A, BC, DE, HL zerstoert
Bemerkungen: Wird innerhalb von ca. 1s kein Byte empfangen oder setzt
die Uebertragung fuer 1s aus, kehrt die Routinen mit CY=1
; zurueck.
--------------------------------------------------------------------------
Routine: 'vnzero', wartet auf Null-Zustand
------------------------------------------------
Einsprung: -
Aussprung: CY=0 --> Leitung ist Null
; CY=1 --> Timeout error
; A, B, DE zerstoert
Bemerkungen: Wird innerhalb von ca. 1s keine Null empfangen, kehrt die
; Routinen mit CY=1 zurueck.
--------------------------------------------------------------------------
Routine: 'vnone', wartet auf Eins-Zustand
-----------------------------------------------
Einsprung: -
Aussprung: CY=0 --> Leitung ist Eins
; CY=1 --> Timeout error
; A, B, DE zerstoert
Bemerkungen: Wird innerhalb von ca. 1s keine Eins empfangen, kehrt die
; Routinen mit CY=1 zurueck.
--------------------------------------------------------------------------
Routine: 'vnzeri', wartet auf Null-Zustand ohne Timeout
-------------------------------------------------------------
Einsprung: -
Aussprung: Leitung ist Null
; A, B, DE zerstoert
Bemerkungen: Die Routine kehrt erst zurueck, wenn die Leitung Null ist.
--------------------------------------------------------------------------
Routine: 'vnonei', wartet auf Eins-Zustand ohne Timeout
-------------------------------------------------------------
Einsprung: -
Aussprung: Leitung ist Eins
; A, B, DE zerstoert
Bemerkungen: Die Routine kehrt erst zurueck, wenn die Leitung Eins ist.
--------------------------------------------------------------------------
Routine: 'vnwait', wartet eine bestimme Zeit
--------------------------------------------------
Einsprung: HL=Wartezeit in 7.63us-Schritten
Aussprung: A, HL zerstoert
Bemerkungen: Warten HL*7.63 Mikrosekunden.
; Grobe Faustregel: 9 HL-Zyklen sind eine Rasterzeile.
--------------------------------------------------------------------------
Routine: 'vnwais', wartet auf Abfrage-Routine
---------------------------------------------------
Einsprung: -
Aussprung: -
Bemerkungen: Wartet die Zeit ab, die die Routinen vnzero, vnone, vnzeri
; und vnonei benoetigen, um eine Leitungsaenderung fest-
; zustellen.
--------------------------------------------------------------------------
3.3) Asynchron und Synchron
-----------------------------
Grundsaetzlich werden bei Datenuebertragungen zwei verschiedene Techniken
unterschieden: Asynchron und Synchron.
Asynchron bedeutet einfach gesagt: Wenn nichts passiert, wird nichts ueber-
tragen. Ein Beispiel hierfuer waere ein Chat-Programm: Die Leitung liegt
normalerweise auf Eins. Erst wenn einer der Chat-Teilnehmer eine Taste
drueckt, kommt Leben in die Leitung und die Taste wird an die anderen Rechn-
ner uebertragen. Dann geht die Leitung erneut auf Eins und es herrscht
wieder Ruhe.
Nun, wieso ist der Standartzustand Eins und nicht Null? Theoretisch koennte
man den Standartzustand ja frei waehlen. Dies ist aber der Knackpunkt des
VN96: Wie oben schon erwaehnt kann kein CPC die Leitung mehr beeinflussen,
wenn einer oder mehrere der Anderen die Leitung auf Null legen.
Synchron bedeutet: Die Teilnehmer des VN96 besitzen eine feste Reihenfolge
und die Daten werden staendig reihum ausgetauscht. Beispiel: Die Tron-
Variante 'Last Action Point' von Steve of Wizcat. Nach einer Synchronisa-
tions-Phase werden waehrend des Spiels reihum Bytes uebertragen, die die
Joystickbewegungen der einzelnen Spieler beinhalten. Zuerst senden Spieler
1 sein Byte an alle anderen, dann Spieler 2 u.s.w. bis jeder Spieler die
Daten aller anderen hat. Dann machen sich alle an die Arbeit (Berechnungen
und Grafik). Danach geht das Ganze wieder von vorne los.
Doch hier tritt ein Problem auf. Meistens benoetigen die unterschliedlichen
Rechner eine unterschliedliche Zeit um ihre Arbeiten auszufuehren. Es muss
also vor der den Uebertragung synchronisiert werden. Hierfuer gibt es eine
einfache und dennoch sehr wichtige Loesung die bei nahezu jedem VN96-
Programm zu Anwendung kommt und als Synchronisations-Phase bezeichnet wird:
Nach der Uebertragung der Daten legen alle CPCs die Leitung auf Null und be-
ginnen ihre Berechnungen. Ist einer der CPCs fertig, legt er die Leitung auf
Eins. Die Leitung wird aber nicht auf Eins gehen, solange nicht ALLE CPCs
dies tun. Also wartet er ab, bis die Leitung auf Eins geht. Aus dieser
Warteschleife werden dann alle CPCs synchron zurueckkehren sobald auch der
letze CPC die Leitung auf Eins gelegt hat. Dann kann die neue Uebertragung
beginnen.
3.4) Das erste Programm
-------------------------
Als Beispiel fuer eine Asynchrone Uebertragung wurde oben bereits ein Chat-
programm erwaehnt. Hier wird nun ein solches Programm Schritt fuer Schritt
entwickelt.
Das Prinzip ist folgendes: Will ein CPC ein Zeichen uebermitteln, so sendet
er ein Art Startbit in dem er die Leitung auf Null legt. Dadurch wird allen
anderen CPCs klar, dass sie ein Byte zu erwarten haben. Der Sende-CPC legt
dann die Leitung wieder auf Eins und sendet sein Zeichen.
Wie oben schon erwaehnt muss als Allererstes die Leitung auf Eins gelegt
werden um das Netz nicht zu blockieren:
; ORG #A000
chatstart: LD BC,#EF80 ; Leitung auf Eins legen
; OUT (C),C
Danach kommt die Hauptschleife, die zuerst Prueft, ob ein anderer CPC ein
Zeichen senden will:
mainloop: LD B,#F5 ; Leitung abfragen
; IN A,(C)
; CP 64 ; Leitung Null
; JR C,recabyte ; Ja, --> Zeichen empfangen
Ist die Leitung Null, wird zu einer Routine verzweigt, die das Zeichen em-
pfaengt und ausgibt. Ansonsten wird die Tastatur auf Zeichen abgefragt:
; CALL #BB09 ; Zeichen da?
; JR C,sndabyte ; Ja, --> Zeichen senden
; JR mainloop
Liegt ein Zeichen von der Tatatur vor, so wird zur Senderoutine verzweigt,
ansonsten geht das Ganze von vorne los.
Hier nun der Teil des Programms, der die Zeichen entgegennimmt. Die Routine
greift dabei auf Routinen aus dem Routinenpack VN96ROUT.ASM zu:
recabyte: DI ; Interrupte sperren
; CALL vnone ; Auf Eins warten
; JR C,mainloop ; Timeout error, --> zur Hauptschleife
; CALL vnrec ; Byte empfangen
; JR C,mainloop ; Timeout error, --> zur Hauptschleife
; CALL #BB5A ; Zeichen ausgeben
; JR mainloop ; Zurueck zur Hauptschleife
Zuerst wird das Ende des Startbits abgewartet und dann das Zeichen empfang-
en und ausgegeben. Hier nun der Sendeteil:
sndabyte: DI ; Interrupte sperren
; LD I,A ; Zeichen sichern
; LD BC,#EF00 ; Startbit senden
; OUT (C),C
; LD HL,1500 ; Warten, bis Startbit erkannt wird
; CALL vnwait
; LD BC,#EF80 ; Startbit zuruecknehmen
; OUT (C),C
; CALL vnwais ; Auf Abfrageroutine vnone warten
; LD A,I ; Zeichen senden
; CALL vnsnd
; LD A,I ; Zeichen ausgeben
; CALL #BB5A
; JR mainloop ; Zurueck zur Hauptschleife
Hier wird das Startbit gesendet und dann das Zeichen. Die erste Warteschlei-
fe ist noetig um den anderen CPCs Zeit zu geben, die Hauptschleife zu ver-
lassen, die ja mitten ein einem #BB09-Aufruf stecken koennten. Die zweite
Warteschleife (vnwais) gibt den anderen CPCs Zeit aus ihren vnone-Routinen
zurueckzukehren. Eine Synchronisation ist hier ausnahmsweise nicht notwen-
dig, da normalerweise alle CPCs die gleiche Zeit benoetigen um ein Zeichen
auszugeben.
3.5) Synchrone Programmierung
-------------------------------
Als Beispiel fuer eine synchrone Programmierung dient uns das bereits er-
waehnte 'Last Action Point', welches die einfachste Art der Synchronen
Programmierung benutzt. Es gibt noch andere Techniken der Synchronen pro-
grammierung, aber wer die von LAP verstanden hat, kann sich andere Methoden
leicht herleiten.
Da bei der synchronen Programmierung die CPCs eine feste Reihenfolge haben,
muessen sich die CPCs zuerst ueber diese einig werden. Dies wird durch eine
asynchrone 'Unterhaltung' der CPCs vor dem Spiel erreicht, die Chat-Phase.
Die Reihenfolge der CPCs wird hierbei festgelegt, indem jeder CPC fuer sich
eine Zufallszahl berechnet, die ueber eine Warteschleife eine entsprechende
Wartezeit ergibt. Dies ist zwar nicht sehr sauber, jedoch ziemlich einfach.
In der Ausgangssituation sind auf allen CPCs die Programme geladen und die
Leitung ist auf Eins. Auf einem beliebigen CPC wird dann das Spiel durch
Tastendruck gestartet. Dieser CPC sendet ein Startbit (vgl. 3.4), mit dem
die Chat-Phase beginnt. Jeder CPC beginnt nun seine Warteschleife herunter-
zuzaehlen und sobald ein CPC bei Null angekommen ist sendet er ein Startbit
gefolgt von seinen Spielerdaten (z.B. Name, Punktezahl u.s.w.). Damit die
Daten auch ankommen, muessen die anderen CPCs staendig die Leitung ueber-
pruefen, waehrend sie ihre Warteschleife ausfuehren. Jetzt kommen die ein-
zelnen CPCs nach und nach alle bei Null an und senden ihre Daten und
waehrend dieser Uebertragung werden aufsteigend Nummern vergeben, die dann
spaeter die Reihenfolge festlegen.
Um diese Chat-Phase beenden zu koennen, muessen die Zufallszahlen in ihrer
Groesse beschraenkt sein. Sobald die Zeit vergangen ist, die der groessten
moeglichen Zufallszahl entspricht, kann die Chat-Phase beendet werden, da
sich kein weiterer CPC melden wird.
An diese Chat-Phase schliesst eine Synchronisations-Phase an, die in den
Synchronen Betrieb einleitet (vgl. 3.3).
4.) Kontakt zu uns
--------------------
Falls Fragen auftauchen, Anlass zu Kritik besteht, um Schaltungen und
Software zu bekommen oder einfach just for fun, hier unsere Adressen:
* Hage of Wizcat
Abt-Rudolfstr. 46
73479 Pfahlheim
E-Mail: Wolfgang_Stengel@p4.f3101.n2487.z2.sesom.nbg.de
* Steve of Wizcat
Ihnbergstr. 9/1
73479 Pfahlheim
E-Mail: Christian.Stengel@T-Online.de
* World Wide Web: http://www.home.pages.de/~vn96
;http://home.t-online.de/home/christian.stengel
5.) Schlusswort
-----------------
Also los, Leute, besorgt oder baut euch Schaltungen und programmiert ein
Spiel oder eine Anwendung! Durch kein anderes System ist es moeglich, ein
Netzwerk mit so geringen Mitteln aufzubauen und es gibt selten Spiele, die
allein mehr Spass machen als mit mehreren Spielern. Also belebt den CPC,
nutzt diese Chance, aus dem CPC etwas einmaliges herauszuholen, das VN96.
Hage & Steve of Wizcat.
------------------------------------------------------------------------------

★ YEAR: 1996
★ AUTEURS: Hage & Steve of Wizcat

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Hardware » Montage - Virtual Net 96 (English)
» Hardware » Alimentation pour Amstrad
» Hardware » Book Montages Extension Peripheriques du CPC 13.1 : 8255 avec décodeur d'adresses simple
» Hardware » CPM-Schalter (CPC Amstrad International)
» Hardware » Einbau der VORTEX-Speichererweiterungs-platine in das Tastaturgehäuse des CPC 464 vonstatten geht (Schneider Aktiv)
» Hardware » Book Montages Extension Peripheriques du CPC 13 : Interfaces E/S Paralleles
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 166 millisecondes et consultée 2393 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.