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 le presenta en su versión original ★ 
 ★ Dieser Text wird in seiner ursprünglichen Fassung Ihnen 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

CPCrulez[Content Management System] v8.75-desktop/c
Page créée en 067 millisecondes et consultée 815 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.