Mit NASM FAT12 Images erstellen

9 Jun 2006

Gestern und heute habe ich an einer Makrosammlung für NASM gebastelt, die es ermöglicht ohne die Zuhilfenahme weiterer Tools ein FAT12 Image zu erstellen. Zu benutzen ist das in etwa so:

%include "fat12.inc"

; Die Standardeinstellung erzeugt ein Image für 1,44MB Disketten. Mehr Tuning gibt es in fat12.inc.
fat_start

; erzeugt eine Datei namens README.TXT
fat_file "readme.txt", "README TXT"
; erzeugt eine Datei namens README.TXT
fat_file "wasauchimmer.txt", "BLUBB TXT"
; erzeugt eine Datei namens MEINFOTO.JPG
fat_file "Urlaub 2006 - Strand.jpg", "MEINFOTOJPG"
fat_end

Das ganze kann man dann einfach mit nasm -o disk.img -f bin diskimage.asm assemblieren.

fat_start beginnt ein Diskettenimage. Es hat einen Optionalen Parameter, der die Anzahl der reservierten Sektoren angibt. Wenn kein Parameter angegeben wird, wird ein Bootloader mit passendem Bootpartitionblock erstellt. Wenn dort ein Parameter angegeben wird, muss der Bootpartitionblock selbst gebastelt werden. Als Vorlage kann dazu das Makro default_boot_sector in fat12.inc dienen.

fat_file fügt eine Datei in das Image ein. Der erste Parameter ist der Pfad zu der Datei, die eingefügt werden soll. Der zweite Parameter gibt den Namen der Datei auf dem Image an. Dieser Name muss ein 8.3-Name sein. Das heisst die ersten 8 Zeichen sind der Teil vor dem Punkt, die letzten 3 Zeichen sind die Erweiterung. Der Name muss immer 11 Zeichen lang sein, und nicht genutzte Bytes müssen mit Leerzeichen gefüllt werden. Hier gibt es keine Überprüfung auf fehlerhafte Eingaben. Mehr zu den Dateinamen gibt es auch in der FAT Spezifikation. Bei den Dateigrößen muss darauf geachtet werden, dass diese Dateien auf die Diskette passen. Es gibt auch hier keine Fehlerüberprüfung.

fat_end muss ganz zum Schluss aufgerufen werden, damit das Diskimage und die einzelnen Sektionen bis zum Ende aufgefüllt werden.

Noch ein Hinweis zum Code: Da eine FAT-Formatierte Diskette/Partition in 3 Teile aufgeteilt ist (root-Directory, FAT, und Datenteil) musste ich einige Tricks anwenden, weil die Anordnung wie die Teile definiert werden, anders ist, als die Ordnung auf der Diskette. So schreibe ich zuerst die Datei in die Datensektion, damit ich die Größe feststellen kann, und erstelle erst dann den Eintrag in der FAT, die auf dem Image allerdings davor liegt. Damit dies gelingt, nutze ich die Multisection-Unterstützung im bin-Format. Das Makro fat_start, sieht vereinfacht so aus:

%macro fat_start 0
section .root_dir
section .fat
section .file_data
%endmacro

Damit lege ich die Reihenfolge der Sektionen fest und nun kann ich im weiteren Code in beliebiger Reihenfolge in die Sektionen schreiben, ohne diese Anordnung wieder zu verlieren. Diese Sammlung von Makros ist eine sehr ungetestete Alpha-Version. Zum Beispiel waren bis vor wenigen Minuten Dateien deren Größe modulo 1024 kleiner als 512 ist nicht unterstützt. 8)

Den Download gibt es unter Auf meiner Todolist stehen unter anderem:

  • Viele Zahlen, die noch "hardwired" sind, müssen in Makros verpackt werden.
  • Lange Dateinamen
  • FAT16
  • Verzeichnisse
  • Fehlerüberprüfung

Vielleicht gibt es demnächst ja ein Update von mir. Wenn jemand anders damit erfolgreich rumexperimentiert und mit dem den Makros irgendwas spektakuläres anstellt, würde ich mich freuen davon zu hören. Verbesserungsvorschläge und Bugreports sind auch willkommen. Und wenn es einfach nur funktioniert, freue ich mich noch mehr über Kommentare. 😉

Den Code gibt es unter Den Rest des Beitrags lesen »

Advertisements

Bootsektor mit GCC

2 Jun 2006

Gleich als Einstimmung auf die Art der weiteren Posts gibt es von mir etwas relativ exotisches, das keinen praktischen Nutzen hat: Einen Bootsektor, der komplett in C geschrieben ist. Es werden nur der GCC und LD aus den Binutils verwendet. Es gibt dabei zwei Herausforderungen:

  1. Mit möglichst wenig Code in den Protected Mode zu gelangen, denn der GCC ist nur für den Protected Mode geeignet.
  2. Den Linker dazu zu bringen, eine 512 Byte große Datei zu erzeugen.

Den Rest des Beitrags lesen »