Zusatz zur Assembler-Ecke #7 ------------------------------ - Density-Erkennung - Eigene Programme als Boots - Struktur von Binär-Files - Verwaltung der Disk unter DOS 2.x von Tim-Philipp Müller Zuerst die Boot-Programme. Zuerst liest das OS beim Booten der Diskette den Sektor 1 ein. Dabei haben die Bytes 0-5 folgende Bedeutung: Byte Bedeutung 0 immer 0 (unbenutzt) 1 Anzahl der zu bootenden Sektoren 2,3 Adresse,an die geladen werden soll 4,5 Initialisierungs-Adresse Nach dem Einlesen aller Sektoren an die angegebene Adresse, wird zu ADRESSE+6, also direkt hinter den Bootblock gesprungen. Dort sollte eine Routine liegen, die den Bootvorgang fortführt, etc... Diese Routine gibt dann per RTS die Kontrolle an das Betriebssystem zurück. Dabei bedeutet ein gesetztes Carry-Flag einen Boot-Error, und ein gelöschtes, daß alles gut verlaufen ist. War alles okay, springt das OS nun über die Init-Adresse (die in DOSINI $C,$D übertragen wird) zum Programm, das DOSVEC $A,$B auf die endgültige Einsprungs- Adresse setzen sollte und die Kontrolle per RTS ans OS zurückgibt. Dieses ruft dann nach Beendigung des Bootvorgangs das Programm über DOSVEC auf (wurde der Vektor vom Init-Programm nicht gesetzt, landet man im Selbsttest). Bei einem Warmstart wird das Programm über DOSINI wieder aufgerufen. TRICK 17: Man kann nun durch das Boot- Programm einige Register ändern, Routinen initalisieren (z.B.für Software-Freezer) etc.., dann eine andere Disk einlegen lassen, und einen Boot-Fehler bei der Rückkehr zum OS signalisieren. Dann wird die andere Disk ganz normal gebootet.... nur mit den veränderten Werten im Speicher. TRICK 18: Der Bibo-Assembler bietet im Monitor die Möglichkeit,einen beliebigen Speicherbereich in beliebige Sektoren zu schreiben. Man muß sein Programm also nur assemblieren und die ersten 6 Bytes als Header schreiben. Atmas-II Anhänger müssen sich eben schon vorher ein Unterprogramm schreiben, das den entsprechenden Speicherbereich in die Sektoren schreibt und dieses dann vom Monitor aufrufen. --------------------------------------- VERWALTUNG EINER DISKETTE UNTER DOS 2.X --------------------------------------- Nur so: Eine Single Density (SD)-Diskette hat 720 Sektoren a 128 Bytes. Eine Medium Density (MD)-Diskette hat 1040 Sektoren a 128 Bytes. Eine Double Density (DD)-Diskette hat 720 Sektoren a 256 Bytes. Eine Quad Density (QD)-Diskette ist quasi 'zwei Disketten in Double Density'. Dabei bedeutet eine Sektor- Nummer größer 720 die Seite Nummer 2. Verwaltungs-Sektorbelegung: 1-3 Bootroutine,die DOS.SYS lädt $168 VTOC 1 $169-$170 Directory $400 VTOC 2 (nur MD) (Sektor 0 gibt es physikalisch nicht.) ----- AUFBAU DER DIRECTORY Jedes File belegt 16 Bytes in der Direcory. Daraus folgt, daß in SD und MD 64 Files (8*128/16) und in DD 128 Files verwaltet werden können. Die Bytes haben jeweils folgende Bedeutung: Byte Bedeutung $0 Status: $00 Ende der Directory $03 Normalzustand bei MD, wenn Datei Sektoren von 721-1039 belegt. $42 Normalzustand $43 Geöffnete Datei $62 Datei ist gesichert $80 Datei ist gelöscht 1,2 Länge der Datei 3,4 Erster Sektor der Datei 5-12 Filename der Datei (Atascii) 13-15 Extender der Datei (Atascii) Die Länge der Datei ist in keiner Weise von den Angaben in Byte 1 und 2 abhängig. Diese Bytes dienen nur zur Directory- Anzeige. ----- AUFBAU DER DATEIEN Alle Files sind sequentiel aufgebaut, das heißt, jeder Sektor zeigt auf den nächsten Sektoren. Deshalb genügt in der Directory ja auch der Startsektor. Aufbau der File-Sektoren: Byte 0-124 Datenbytes Byte 125 Bit 2-6: Stellung des Files (0-63) in Dir., um höhere Sicherheit zu erlangen. Bit 0+1: HIGH-Byte der nächsten Sektor- Nummer Byte 126 LO-BYTE des nächsten Sektor Byte 127 Anzahl der Datenbytes Normalerweise steht Byte 127 auf $7D (125). Durch einen 'Append'-Befehl werden evtl. freie Daten des letzten Sektors der Datei allerdings nicht aufgefüllt, sondern der nächste freie Sektor benutzt. Theoretisch sind also $3FF Sektoren zu belegen. Da eine MD-Disk aber 1040 Sektoren hat, sind die Sektoren 1025 bis 1039 (1024: VTOC2!) frei....!!! Bei Quad Density verzichtet man darauf, die Stellung des File in der Directory anzugeben, da man bei doppelt soviel Sektoren mit 2 Bit fürs Hi-Byte nicht mehr hinkommt, und nimmt dann das ganze Byte als HI-Byte des nächsten Sektors. Ist der nächste Sektor der Sektor 0 (der nicht existiert), wird dadurch das Ende des Files gekennzeichnet. Stimmt während des Lesens des Files bei SD und MD die Directory-Positionsnummer nicht, wird ein ERROR 164 ausgegeben. ----- VTOC (VOLUME TABLE OF CONTENTS) Die VTOC gibt an, welche Sektoren der Disk noch frei sind (und einige weitere Infos). Sie wird bei SD genauso verwaltet wie bei DD und liegt dort in Sektor $168. Die ersten 10 Bytes geben spezielle Infos und haben folgende Bedeutung: Byte Bedeutung 0 DOS-Version (DOS 2.x =2) 1,2 Anzahl der benutzbaren Sektoren bei SD+DD: 707 $2C3 bei MD: 1010 $3F2 3,4 Anzahl der noch freien Sektoren 5-9 Dummy-Bytes, immer $0 Die nun folgenden Bytes 10-99 geben an, welche Sektoren noch frei sind. Für jeden Sektor existiert ein Bit. Ist dieses gelöscht, ist der Sektor belegt. Hier eine Übersicht: Byte ---10--- ---11--- ---12--- Bit 76543210 76543210 76543210 Sektor- 00000000 00111111 11112222 Nummer 01234567 89012345 67890123 0......7 8.....15 16....23 und so weiter für alle 720 Sektoren. In MD wird die höhere Sektorzahl folgendermaßen bewältigt: Die Info-Bytes stammen aus Sektor $168. In Sektor $400 wird eine 2.VTOC eingerichtet, wobei die Bytes 0-121 nach dem gleichen Muster wie oben die Belegung der Sektoren 48-1023 angeben (Bytes 0-83 sind identisch mit den Bytes 16-99 der VTOC 1). Die Belegung der Sektoren 0-47 ist jedoch nachwievor nur aus der VTOC 1 zu erfahren. Bytes 122 und 123 aus Sektor $400 geben noch die Anzahl der freien Sektoren an, die mit Hilfe der VTOC 2 zusätzlich verwaltet werden können. Die Gesamtzahl der freien Sektoren entspricht also der Addition der Frei- Werte der beiden VTOC. ----------- DENSITY-ERKENNUNG Die Density-Erkennung kann bequem über das Status-Kommando der Floppy erfolgen. Vorher sollte allerdings ein Sektor aus Track 1 eingelesen werden (aber nicht Sektor 1-3), damit die Floppy das Format erkennt (nur die 1050 stellt sich automatisch darauf ein, wenn eine Disk eingelegt wird). Nach Status-Kommando: SD MD DD DSTAT $2EA Bit 7 $80 0 1 0 Bit 5 $20 0 0 1 --------------------------------------- ------ *.COM, *.OBJ und *.BIN -Files Byte 0+1: beide $FF Byte 2+3: Anfangsadresse der Daten Byte 4+5: Endadresse der Daten Nun folgen ENDADR-ANFANGSADR+1 Bytes. Danach können weitere Datenblöcke wie diese folgen, wobei die zwei $FF-Bytes fehlen können. Während des Ladens können Bytes in die Vektoren RUNAD $2E0,$2E1 und INITAD $2E2,$2E3 geladen werden. RUNAD gibt die Adresse an, zu der nach dem Laden der Daten gesprungen wird. INITAD gibt eine Initialisierungs- adresse an, zu der sofort beim Laden der Daten gesprungen wird (z.B. für Titelbilder). Nach einem RTS wird der Ladevorgang fortgesetzt. Good Byte