Gebrauchsanweisung
Start
Welchen Spectrum hast Du?
Wenn Du einen 48K, Spectrum+, 128K mit Heatsink oder einen grauen +2 hast, stelle sicher, dass der Jumper J3 entfernt ist (der Jumper der am nächsten zum JTAG und Edge Connector ist) Wenn Du einen +3 oder schwarzen +2 hat muss Jumper J3 gesteckt sein 128K Geräte müssen USR 0 Modus für die BASIC Unterstützung verwenden, was automatisch gestartet wird. Zurzeit sind die BASIC Erweiterungen nicht mit dem 128K Editor kompatibel. (Im USR0 Modus hat man vollen Zugriff auf den 128er Speicher und 128K Spiel funktionieren).
Konfiguration
In der Standard-Konfiguration wird DHCP verwendet um ein IP-Adresse zu erhalten. Wenn Du keinen DHCP Server hast oder eine statische Adresse verwenden willst, benutze folgenden Befehl:
%ifconfig
Du kannst auch den NMI verwenden um ins Konfigurationsmenü zu gelangen (überbrücke kurz S1 mit etwas metallischen oder bau einen Schalter ein)
Konfiguration des Datei System
Du benötigst einen Fileserver (Das „tnfsd“ - ein Installer dafür wird vorbereitet). Es gibt einen öffentlichen Fileserver den Du benutzen kannst: vexed4.alioth.net. Um ein Datei System zu verbinden benutze den %mount Befehl. Zum Beispiel
%mount 0,"vexed4.alioth.net"
Vermutlich würdest Du das gerne automatisch machen. Du kannst die automatische Verbindung mit diesem Befehl einrichten
%fsconfig
Folgendes Menü erscheint:
Drücke „A“ um ein neues Dateisystem hinzuzufügen – zum Beispiel um „tnfs://vexed4.alioth.net“ als das Standard-Dateisystem hinzufügen:
- Drücke „A“ – Set a filesystem
- Drücke „0“ und Enter um Dateisystem #0 auszuwählen
- Gib‘ tnfs://vexed4.alioth.net ein
- Drücke D um die Änderungen zu Speichern
Wenn der Spectrum resettet wird, wird der Server „vexed4.alioth.net“ verbunden
Wenn es Probleme bei der Verbindung mit einem Fileserver gibt (z.B. falls der Fileserver gerade nicht läuft) kannst Du BREAK drücken während der Spectrum versucht die Verbindung herzustellen um den Vorgang abzubrechen.
Kurz Anleitung zu den BASIC Befehlen
Im Dateisystem bewegen
%mount
%mount <fsnum>,“<url>“ – Ein Dateisystem verbinden. Beispiele:
%mount 0,"vexed4.alioth.net" %mount 0,"192.168.0.1" %mount 1,"tnfs://192.168.0.1" %mount 3,"tnfs://example.com/games"
Die URL arbeitet genauso wie man es erwartet. Wenn es es ein Dateisystem für ein DivIDE gibt, wäre der Befehl so etwas wie %mount 0,“ide://0 (oder etwas ziemlich ähnliches).
%umount
%umount <fsnum> - Ein Dateisystem trennen. Beispiele:
%umount 0
%cat
%cat „<fsp>“ – Zeigt die Inhalte eines Verzeichnisses an. Beispiel:
%cat %cat "foobar" %cat "0:/foo/bar/baz"
Der Pfad funktioniert wie ein Uniy-Pfad, der Trenner zwischen den Verzeichnissen ist ein „/“. Wie erwartet bedeutet „.“ den aktuellen Pfad und „..“ den übergeordneten Pfad.
%cd
%cd „<fsp>“ – Verzeichnis wechseln. Beispiele:
%cd "/" %cd "games" %cd "/programs/basic" %cd ".."
%fs
%fs <fsnum> - Wechsle das Dateisystem
%fs 1
Das Standard Dateisystem ist 0.
Lesen und Schreiben von Dateien
%load
%load „fsp“ [CODE Adresse] – Eine Datei laden. Beispiele:
%load "manic" %load "image" CODE 16384 %load "/foo/bar/baz.zx" %load ""
Der Befehl %load „“ würde das BASIC Programm „boot.zx“ laden. (Wenn im %fsconfig Menü die Autoboot-Option ausgewählt wurde, versucht der Spectrum nach einem Reset„0:/boot.zx“ zu laden).
%save
%save „<fsp>“ [CODE Adresse} – Eine Datei speichern. Beispiele:
%save "program" %save "image" CODE 16384,6912 %save "program" LINE 1
%aload
%aload „<fsp>“ CODE Adresse – Beliebige Dateien laden. Beispiel:
%aload "machinecode" CODE 32768
Der Unterschied zwischen %load und %aload ist das %aload auch Dateien ohne „header“ lädt. Die normalen Dateien sind als TAP Archive formatiert, d.h. sie haben die gleichen „header“ wie Dateien die auf eine Kassette gespeichert werden – sie enthalten die Adresse wohin die Daten geladen werden soll und die Art der Datei – als Beispiel „Program“ oder „Bytes. Der %aload Befehl kann alle Dateien laden. Darum muss man immer die Adresse mit angeben wohin die Datei geladen werden soll, da kein Header vorhanden ist, der die Daten enthält.
Daher ist %aload notwendig wenn Du eine Datei laden willst die Du am PC erstellt hast (z.B. mit einem Cross Assembler) und die nicht als TAP Datei gespeichert wurde.
%tapein
%tapein „<fsp>“ – Lade eine .TAP Datei. Beispiel:
%tapein "jsw.tap" LOAD ""
%tapein wird benötigt um eine Kassette zu „simulieren“. Danach muss immer LOAD „“ (oder ähnlich) benutzt werden um die virtuelle Kassette tatsächlich zu starten.
%loadsnap
%loadsnap „<fsp>“ – Lade einen .SNA Snaphot. Beispiel:
%loadsnap "matchday.sna"
Dieser Befehl arbeitet sowohl mit 48K als auch mit 128K snapshots.
Öffnen und Schließen von Dateien
Es gibt eine Reihe von Befehlen die mit ZX BASIC Streams benutzt werden. Diese arbeiten mit Dateien, Verzeichnissen und Netzwerk Sockets. Hier ein Beispiel und eine kurze Beschreibung:
10 %open #4,"file","r" 20 %oneof 100 30 INPUT #4,a$ 40 PRINT a$ 50 GO TO 30 100 %close #4
Dieses Programm öffnet eine Datei mit Namen „file“, liest die Inhalte und gibt diese am Bildschirm aus. Die erste Zeile:
10 %open #4,"file","r"
Öffnet die Datei mit Namen „file“ zum Lesen. Zeile 20 ist für die End-Of-Life Bedingung. Sie bedeutet das zu Zeile 100 gesprungen wird wenn ein EOF angetroffen wird. Zeile 30, 40 und 50 sind Standard ZX BASIC Befehle um den Datenstrom zu lesen und die Ergebnisse am Bildschirm anzuzeigen. Endlich wird Zeile 100 erreicht wo die Datei geschlossen wird. (Es ist sehr wichtig dass das gemacht wird!).
Öffnen und Schließen von Sockets
Es ist sehr einfach mit einer Netzwerkverbindung ähnliche Sachen zu machen. Zum Beispiel:
10 %connect #4,"spectrum.alioth.net",80 20 %oneof 100 30 PRINT #4;"GET HTTP/1.0" 40 PRINT #4 50 INPUT #4;a$ 60 PRINT a$ 70 GO TO 50 100 %close #4
Mit Code der sehr ähnlich zum ersten Beispiel ist, kann man sich zu einer anderen Maschine verbinden wenn man ein TCP Socket benutzt. Der Syntx von %connect lautet:
%connect #<stream>,"address",port
Hier ein sehr einfaches Beispiel ein in BASIC geschriebenen Servers:
10%listen #4,2000 20%accept #5,4 30 INPUT #5;a$ 40 PRINT #5;"You sent me: ";a$ 60%close #5 70%close #4
Du kannst das von einem PC aus versuchen indem Du „telnet“ benutzt:
telnet <ip-address-of-spectrum> 2000
Zum Beispiel:
serendipity:~ winston$ telnet 172.16.0.41 2000 Trying 172.16.0.41... Connected to 172.16.0.41. Escape character is '^]'. hello You sent me: hello Connection closed by foreign host.
Ein komplexeres Beispiel: ein Server der bis zu 3 gleichzeitige Verbindungen handeln kann auf Port 2000:
1 DIM c(4) 10%listen #4,2000 20%control #5 30 PRINT #5;"p" 40 PRINT "Waiting..." 45 INPUT #5;a;a$ 50 IF a<>0 THEN GO TO 200 60 LET a$=INKEY$ 70 IF a$="x" THEN GO TO 700 80 GO TO 45 200 IF a=4 THEN GO TO 400 210 IF a$="disconn" THEN GO TO 600 220 INPUT #a;c$ 230 PRINT "Strm ";a;": ";c$ 240 IF c$="rnd" THEN PRINT #a;RND: GO TO 40 250 IF c$="foo" THEN PRINT a;"Foo bar baz": GO TO 40 260 IF c$="quit" THEN PRINT #a;"Adios":GO TO 600 300 PRINT #a;"I didn't understand that" 310 GO TO 40 400 FOR i=1 TO 4 410 IF c(i)=0 THEN LET chan=i+5: GO TO 500 420 NEXT i 430 PRINT "Out of streams" 440 STOP 500 PRINT "Accepted connection on stream ";chan 510%accept #chan,4 520 LET c(i)=1 530 GO TO 40 600 PRINT "Closing #";a 605%close #a 610 LET c(a-5)=0 620 GO TO 40 700 PRINT "The program has finished" 710%close #5 715 PRINT "Closing socket" 720%close #4 730 PRINT "Closing connections" 740 FOR i=1 TO 4 750 IF c(i)=1 THEN %close #i+5 760 NEXT i
Um es vom PC zu versuchen verwende „telnet <ip-vom-spectrum> 2000. Du kannst „rnd“, „quit“ oder „foo“ eintippen.
Erwähnenswerte Teile des Programms:
10 %listen #4,"2000"
Wenn diese Zeile ausgeführt wird beginnt der Spectrum Port 2000 (tcp) zu überwachen. Wenn eine Verbindung ankommt muss noch etwas erledigt werden: sie muss akzeptiert werden. Dafür wird der %accept Befehl benutzt. Jedoch blockiert %accept das Warten auf eine Verbindung (in anderen Worten: die Ausführung des Programms wird während des Wartens gestoppt). Um ohne Warten fortfahren zu können, gibt es einen Control Channel, der es erlaubt den Status des Socket zu überwachen. Er wird so geöffnet:
20 %control #5
Nun ist Stream #5 der Control Channel. Man kann in dem Stream so schreiben und lesen:
30 PRINT #5;"p" 50 INPUT #5;a;a$
Zeile 30 sagt dem Control Channel “erzähle mir ob an einem Socket Daten warten“ (das schließt Sockets ein die im „Hören“-Status sind. In Zeile 50 kommen 2 Dinge an: Die Stream Nummer auf welchem Daten bereit stehen und Info über die Art der Daten (Daten die zur Verfügung stehen kann eine Verbindung sein die akzeptiert werden soll, das beenden einer Verbindung oder nur Buchstaben zum Lesen). Wenn der Stream #4 ist, wissen wir das es eine neue Verbindung sein muss die akzeptiert werden soll weil Stream 4 der Port ist der „zuhört“. Wenn die Variable A eine 0 enthält hat kein Socket wartende Daten.
510 %accept #chan,4
In dieser Zeile akzeptieren wir schließlich eine neue Verbindung. Der %accept Befehl akzeptiert die Verbindung und erstellt einen neuen Stream für Daten die in dieser Verbindung gelesen und geschrieben werden. Die Syntax von %accept lautet:
%accept #stream,listening-stream
Stream 4 ist der zuhörende Stream in diesem Fall. Die Variable #chan ist die Nummer des neuen Stream der geöffnet werden soll.
Maschinen Code
Wenn Du Programme in C schreiben willst, gibt es einen Guide mit Beispielen. Sockets werden auf die gleiche Weise benutzt wie in Unix oder Windows – wenn Du bereits weißt wie man Netzwerkprogramme für moderne Betriebssystem schreibt wirst Du keine Probleme haben. Wenn Du noch nie die BSD Socket Library verwendet hast – dafür gibt es Tutorials.
Die Anleitung ist hier (English)