In Computer-Dateisystemen ist ein Blockbelegungsplan (BAM – Block Availability Map) eine Datenstruktur, die dazu dient, Speicherblöcke auf einem Datenträger zu erfassen, die als frei (für neue Daten verfügbar) gelten. Sie wird zusammen mit einem Verzeichnis verwendet, um Dateien auf einem Datenträger (ursprünglich nur Disketten, später auch Festplatten) zu verwalten. Bei zu Commodore DOS (CBM DOS) kompatiblen Diskettenlaufwerken war die BAM eine Datenstruktur, die in einem reservierten Bereich der Diskette gespeichert wurde (wobei Größe und Position von den physikalischen Eigenschaften der Diskette abhingen). Für jede Spur bestand die BAM aus einer Bitmap der verfügbaren Blöcke sowie (in der Regel) einer Zählung der verfügbaren Blöcke. Diese Zählung wurde in einem einzelnen Byte gespeichert, da alle Formate 256 oder weniger Blöcke pro Spur aufwiesen. Das Zählbyte entsprach schlicht der Summe aller gesetzten Bits (1-Bits) in der Bitmap für die jeweilige Spur. Die folgende Tabelle veranschaulicht den Aufbau der BAM für das Laufwerk Commodore 1541.
Die BAM enthält ein Verzeichnis des freien und belegten Speicherplatzes der Diskette. Wenn das System Information auf einer Diskette speichern will, so wird automatisch die BAM vom DOS abgefragt, ob und wie viel Speicherplatz noch frei ist. Im Falle einer Speicherung wird die BAM anhand der neuen Werte korrigiert, d. h. ,der von den neuen Daten benotigte Speicherplatz wird als belegt gekennzeichnet. Wird jedoch bei der Abfrage festgestellt, dass die zur Speicherung vorgesehene Datenmenge zu groß ist, so wird eine Fehlermeldung ausgegeben. Die BAM wird beim Formatieren einer Diskette erstellt und beim Initialisieren der Diskette in den DOS-Speicher geschrieben. Die BAM ist auf der Diskette auf Spur 18, Sektor 0 gespeichert und belegt einen Speicherplatz von 128 Bytes. Alle die BAM betreffenden Änderungen werden zuerst im DOS-Speicher (in der Floppy) registriert und beim SAVEen (Abspeichern) eines Programms bzw. beim CLOSEn (Schließen) eines seqentiellen Files auf die Disketten-BAM geschrieben.
Bei Datenträgern mit höherer Kapazität (siehe unten) würde die Tabelle entsprechend umfangreicher ausfallen.
| Total Byte | Bitmap Byte 1 | Bitmap Byte 2 | Bitmap Byte 3 | |
|---|---|---|---|---|
| Spur 1 | Blöcke verfügbar | Blöcke 0–7 | Blöcke 8–15 | Blöcke 16–23 |
| Spur 2 | Blöcke verfügbar | Blöcke 0–7 | Blöcke 8–15 | Blöcke 16–23 |
| ... | ... | ... | ... | ... |
| Spur 35 | Blöcke verfügbar | Blöcke 0–7 | Blöcke 8–15 | Blöcke 16–23 |
Beim Commodore-1541-Format (einseitig beschriebene Disketten) wurde die Bitmap in 3 Bytes untergebracht, da dieses Format 17 bis 20 Sektoren pro Spur aufwies (man beachte, dass 3 Bytes mindestens 20 Bits fassen können). Ebenso verwendete das Laufwerk Commodore 1571 3 Bytes für die Bitmap jeder Spur; die BAM war jedoch doppelt so groß, da bei der Formatierung als zweiseitige Diskette die doppelte Anzahl an Spuren vorhanden war. Im Gegensatz dazu nutzte das Diskettenlaufwerk Commodore 1581 5 Bytes für die Bitmap, da das Format 40 Blöcke pro Spur vorsah (man beachte, dass 5 Bytes 40 Bits fassen können). Unabhängig vom Format signalisierte ein Bit mit dem Wert 1, dass der Block verfügbar (frei) war, während ein Bit mit dem Wert 0 anzeigte, dass der Block nicht verfügbar (belegt) war; die Bitmap-Daten wurden dabei in der Reihenfolge Low-Byte zuerst gespeichert. Das erste Byte enthielt also die Belegungsinformationen für die Blöcke 0 bis 7, das zweite Byte für die Blöcke 8 bis 15 und so weiter. Innerhalb eines Bytes war die Bitmap so angeordnet, dass das niederwertigste Bit (Low-Bit) an erster Stelle stand. So repräsentierte das erste Byte beispielsweise Block 0 durch das niederwertigste Bit und Block 7 durch das höchstwertigste Bit.
Auch Speichergeräte von Creative Micro Designs, die für den Einsatz mit CBM-Computern vorgesehen waren, verwendeten eine Block Availability Map (BAM), die denselben Zweck erfüllte. Allerdings enthielten diese Geräte (FD-2000, FD-4000 und CMD-HD kein Zähler-Byte, und die Bit-Reihenfolge innerhalb der Bytes war umgekehrt (High-Bit zuerst). Trotz dieser Umkehrung der Bits (im Vergleich zu den CBM-Formaten) erfolgte die Speicherung der Bytes weiterhin in derselben Reihenfolge (Low-Byte zuerst).
| Bitmap Byte 1 | Bitmap Byte 2 | ... | Bitmap Byte 32 | |
|---|---|---|---|---|
| Spur 1 | Blöcke 0–7 | Blöcke 8–15 | ... | Blöcke 248–255 |
| Spur 2 | Blöcke 0–7 | Blöcke 8–15 | ... | Blöcke 248–255 |
| ... | ... | ... | ... | ... |
Dies ist der Aufbau der BAM einer Diskette im 1541- bzw. 1571-Format (BAM format/directory header (1571 mode) Track 18, Sector 0)
| Byte dezimal | Byte hexdezimal | Beschreibung | Inhalt |
|---|---|---|---|
| 0 | $00 | Spurnummer für Directory | 18 ($12) |
| 1 | $01 | Startsektor für Directory | 1 ($01) |
| 2 | $02 | Formatkennzeichen | "A" bei 1541/1570/1571 |
| 3 | $03 | Flag für doppelseitige Disketten | $00 = einseitige Disk (1541) $80 = doppelseitige Disk (1571) |
| 4 | $04 | Anzahl der freien Blöcke von Spur 1 | |
| 5 | $05 | Belegung für Sektor 0-7 | Bit=0: Sektor belegt Bit=1: Sektor frei |
| 6 | $06 | Belegung für Sektor 8-15 | Bit=0: Sektor belegt Bit=1: Sektor frei |
| 7 | $07 | Belegung für Sektor 16-20 (Sektoren 21-23 nicht vorhanden) | Bit=0: Sektor belegt Bit=1: Sektor frei |
| 8-143 | $08-$8F | Bedeutung wie Byte 4-7, aber für Spuren 2-35 | |
| 144-159 | $90-$9F | Diskettenname, der bei der Formatierung angegeben wurde aufgefüllt mit "Shift Space" 160 ($A0) | |
| 160-161 | $A0-$A1 | jeweils "Shift Space" | 160 ($A0) |
| 162-163 | $A2-$A3 | Diskettenidentifikation (ID), die bei der Formatierung angegeben wurde | |
| 164 | $A4 | "Shift Space" | 160 ($A0) |
| 165 | $A5 | DOS-Version mit der gearbeitet wird | 2 = CBM DOS V2.6 (spätere Versionen werden nicht aktualisiert!) |
| 166 | $A6 | Kopie von Byte 2 | bei 1541: "A" bei 8050: "C" |
| 167-170 | $A7-$AA | jeweils "Shift Space" | 160 ($A0) |
| 171-179 | $AB-$B3 | Modus | $00=1541 $A0=1571 |
| 180-220 | $B4-$DC | unbenutzt | 0 |
| 221-237 | $DD-$ED | bei 1541 unbenutzt; bei 1571: Anzahl der freien Blöcke für Spur 36-52 | |
| 238 | $EE | bei 1541 unbenutzt; bei 1571: Anzahl der freien Blöcke für Spur 53 | |
| 239-244 | $EF-$F4 | bei 1541 unbenutzt; bei 1571: Anzahl der freien Blöcke für Spur 54-59 | |
| 245-250 | $F5-$FA | bei 1541 unbenutzt; bei 1571: Anzahl der freien Blöcke für Spur 60-65 | |
| 251-255 | $FB-$FF | bei 1541 unbenutzt; bei 1571: Anzahl der freien Blöcke für Spur 66-70 |