Technische Tips und Tricks: Sektor-I/O in Quick von B. Kühnast Diesmal gibt es wieder eine (zugegeben kleine) Library für Quick-User. Der Zweck des ganzen ist das Lesen und Schreiben von Sektoren. Zuerst möchte ich aber die Frage klären, wozu das ganze gut ist. Jede Diskette ist in Sektoren aufgeteilt, die vom Dos verwaltet und zu Dateien zusammengefaßt werden (bzw. die Dateien werden über die Sektoren verteilt). übernimmt man das Verwalten selbst, kann man auf das Dos verzichten. Das bringt zusätzlichen Platz, da für die Verwaltung einige Sektoren verloren gehen. Das Directory allein braucht 8 Sektoren (1024 Bytes = 1K), die Boot- sektoren 3 * 128 = 384 Bytes usw. Außerdem sind Sektoren zu einem ge- wissen Grad vor unerwünschtem Zugriff (und vor Veränderungen) geschützt. Einen Zeichensatz im .FNT-Format kann jeder Fonteditor lesen, wird er in 8 Sektoren gespeichert, muß man sich schon anstrengen. Auch bei den Daten selbst spart man Platz: Ein Zeichensatz braucht 1024 Bytes = 8 Sektoren. Unter Dos werden pro Sektor 3 Bytes für Organisation genutzt, also hat ein Sektor 125 Bytes und schon braucht man 9 Sektoren. Die Library enthält drei Prozeduren: .READSEC(Sektornummer,Puffer) Lädt den angegebenen Sektor in den Pufferspeicher. .WRITESEC(Sektornummer,Puffer) Speichert die Daten aus dem Puffer in den angegebenen Sektor. .CHECKSEC(Puffer) Versucht den Sektor 4 in den angegebenen Puffer zu lesen. Diese Funktion ist nur wegen des XF551- Laufwerks nötig. Im Gegensatz zur 1050 stellt sie die Disketten- dichte nicht automatisch beim Ein- legen einer Diskette fest. Das führt dazu, daß der allererste Sektor nicht immer korrekt einge- lesen wird. Da die Daten dieses Befehls unter Umständen nicht brauchbar sind, kann man als Puffer z. B. Seite 6 benutzen. Soll das Programm mit allen Lauf- werken problemlos funktionieren, muß man diese Prozedur zum Initialisieren aufrufen. Da die ersten drei Sektoren einer Diskette immer Single Density sind, liest die Prozedur den vierten Sektor ein. Das ist alles, was man zum Benutzen der Library wissen muß. Man könnte damit schon einen Sektor-Editor schreiben. Das ist zwar auch in Basic möglich, wird in Quick aber auf jeden Fall schneller. In Basic geschrieben sind auch die Programme, mit denen man eine Boot-Diskette auf Bilder oder Zeichen- sätze untersuchen kann. Auch das wäre in Quick kein Problem. Jetzt zum Aufbau der Prozeduren: --------------------------------------- PROC READSEC IN WORD (+ (ECKIKE KLAMMER) SECNUM,BUFF )+ (ECKIGE KLAMMER) BEGIN POKE(769,1) POKE(770,82) DPOKE(772,BUFF) DPOKE(778,SECNUM) CALL(0,0,0,58451) ENDPROC --------------------------------------- Die anderen Prozeduren sind sehr ähnlich, bis auf einige Bytes. Die Bytes im einzelnen: 769 $301 DUNIT Gerätenummer des angesprochenen Gerätes (1-8). 770 $302 DCOMND Der auszuführende Befehl. 33 $21 Formatieren Single Density 34 $22 Formatieren Medium Density 78 $4E Configuration Block lesen 79 $4F Configuration Block schreiben 80 $50 Sektor schreiben ohne Verify 82 $52 Sektor lesen 83 $53 Status feststellen 87 $57 Sektor schreiben mit Verify 772 $304 DBUFLO/DBUFHI Die Adresse des Puffers (2 Bytes). 778 $30A DAUX1/DAUX2 Die Sektornummer (2 Bytes). Die Befehle bei DCOMND sind nur der Vollständigkeit halber aufgeführt. Beim Formatieren ist zu beachten, daß die Diskette nur ohne Dos genutzt werden kann, da ja die Organisations-Daten fehlen. Der Configuration Block ist für Double Density Laufwerke nötig. Da ich nicht genug Platz habe, alles genau zu erklären, möchte ich auf eine alte Assembler-Ecke hinweisen (ich glaube, in der allerersten User-Mag Ausgabe). Das ganze endet mit einem System-Call (58451,$E453,DSKINV). Diese Betriebssystem-Routine setzt einige Parameter (Sektorlänge, Status:Lesen oder Schreiben,Timeout). Dann ruft er die SIO auf, den Teil des Betriebs- systems, der für die grundsätzlichen Ein/Ausgabefunktionen verantwortlich ist. Der Befehl 80 (siehe DCOMND) funktioniert über diese Routine nicht. Bis zum nächsten Mal.