Commodore DOS

Commodore DOS, alternativt CBM DOS, är operativsystemet för att hantera lagringsmedia på Commodores 8-bitars datorer under 1970-1990-talet. Till skillnad från andra DOS-system före och efter Commodore—vilka laddas från diskett och lagras i datorns RAM-minne vid systemstart, för att sedan exekveras—startade CBM DOS internt i diskettstationen eller hårddisken: operativsystemet är lagrat i ett (eller två) ROM-chip i den aktuella lagringsenheten, och sköttes av en eller fler dedikerade CPU:er (MOS 6502) som också var integrerade i den aktuella enheten.

CBM DOS-versioner
 
Åtminstone sju numrerade versioner av Commodore DOS är kända; följande lista ger information om versionnummer och aktuell lagringsenhet. Om inget annat nämns är diskettstationen 5¼". Markeringen "lp" står för "low profile". Diskettstationer vars modellnummer börjar med 15 använder sig av Commodores unika seriellprotokoll (TALK/LISTEN), alla andra av IEEE-488.

   1.0 – hittas i diskettstationerna 2040 och 3040
   2.0 – hittas i diskettstationerna 4040 och 3040
   2.6 – hittas i diskettstationerna 1540, 1541, SX-64 (inbyggd), 1551, 2031 (+"lp"), samt 4031
   2.7 – hittas i diskettstationerna 8050, 8250 (+"lp"), och SFD-1001
   3.0 – hittas i diskettstationerna 1570, 1571, och  8280 (8280: 8"), samt i hårddiskarna 9060 och 9090
   3.1 – hittas i den inbyggda diskettstationen 1571 i C128D/DCR
 10.0 – hittas i diskettstationen 1581 (3½")

Version 2.6 var den absolut mest använda och kända DOS-versionen, då den användes i Commodore 1541 som sålde i stor mängd till den bästsäljande hemdatorn Commodore 64. Den blev även klonad av ett flertal tredjepartstillverkare.

Teknisk överblick

Katalogstruktur och filtyper
Disketterna kunde med CBM DOS innehålla upp till 144 filer (med undantag för 8050/8250 samt 1581). Filnamn kunde innehålla maximalt 16 tecken. Diskettens katalogstruktur skrevs på ett reserverat spår (18), vilket är mittspåret på en enkelsidig diskett med 35 spår. Det finns ingen möjlighet för underkataloger och filnamnen tvingades därför i teorin att vara unika (vilket innebär att om en fil med ett specifikt namn existerar så kan man inte skapa en fil med samma namn, och en fil kan heller inte döpas om till detta filnamn); emellertid kunde man, genom att skriva direkt till katalogstrukturens block, skapa flera filer med samma namn, även om detta försvårade eller gjorde det omöjligt att läsa filerna. Filer med samma namn har vanligen ingen funktion mer än att informera eller visuellt skapa ramar för filhanteringen. Ett populärt trick som användes av till exempel The Final Cartridge III var att skapa filer som döptes till "----------------" av typen DEL< i katalogstrukturen, och filer kunde då ordnas runt dessa linjer för att skapa filgrupperingar. Många spelutvecklare, warez-grupper och hackers ur demoscenen använde andra mer eller mindre utstuderade tekniker.

Det finns även en listig egendomlighet i filnamnen: filnamnen kan innehålla shift+space-tecken, och om en listad katalogstruktur visas i Commodore BASIC så kommer återstoden av filnamnet dyka upp efter filnamnet i kataloglistningen och BASIC kommer inte att anse det vara en del av filnamnet. Detta användes för att skapa saker som SAVE "PROGRAM(shift+space),8,1:",8,1 vilket dyker upp i katalogen som, exempelvis, 32 "PROGRAM",8,1:  PRG. När användaren sedan flyttar pekaren till början av en rad i listningen och skriver LOAD, och därmed skriver över filstorleken på den linjen och trycker på ENTER, kommer BASIC att tolka detta som LOAD "PROGRAM",8,1: ..., och ignorera allt efter kolon.

En annan listighet är hur null byte kan skrivas i ett filnamn för att användas för att avbryta en listning efter att BASIC laddar denna. Om det finns tre null bytes så försvåras en listning i BASIC. Många maskinkodsprogrammerare kom att experimentera med null bytes i olika försök att hindra BASIC-programmerare att se och använda deras kod.

I BASIC så kan man få tillgång till katalogstrukturen som ett icke exekverbart BASIC-pseudoprogram med LOAD "$",8 följt av LIST. Den första raden har en meningslös radnumerering (0), och visar diskettens namn och ID samt en kort kod för vilken DOS-version som skapat katalogen (koderna skilde sig enbart om diskettformatet var inkompatibla, "2A" användes oftast för 5.25"-DOS-versioner, "3A" av 3.5"-1581). Raderna efter denna innehåller information om filstorlek (i block) samt filernas "pseudoradnummer", följt av filnamnet inom citationstecken och en treteckens kodtyp. De tre sista raderna visar antalet icke allokerade block på disketten (åter igen som ett "pseudoradnummer", följt av "BLOCKS FREE").

Intressant är även att om man på Commodore 64 skriver in LOAD "$",8,1 så fylls skärmen med "skräptecken" istället för att ladda in katalogen i BASIC RAM. Detta beror på att diskettstationen ger katalogen startadressen $0401 (1025), vilket motsvarar BASIC-start på Commodore PET, men korresponderar med skärmminnet på C64.

Om man listar katalogen med LOAD "$",8 så skriver man även över eventuella BASIC-program i RAM. DOS Wedge och ett antal andra tredjepartstillverkade insticksmoduler (cartridge) som Epyx FastLoad, Action Replay och The Final Cartridge III tillåter emellertid att man listar disketters innehåll utan risk för att radera ett aktuellt BASIC-program. Commodore 128 BASIC 7.0 inkluderar kommandona DIRECTORY och CATALOG, (kopplade till F3 vid start) som har samma funktion.

Följande filtyper är stödjs:

SEQ
 Sekventiella filer är datafiler som kan läsas linjärt. Många ordbehandlare och andra Office-liknande program använder denna typ av filer för att spara data. En sekventiell fil är analog med en "flat file" i Linux eller UNIX, då den inte har någon speciell intern struktur.
PRG
 Liknar SEQ-filer, men har en programheader bestående av de första två byten (en "little endian"-kodad 16-bitsadress). Alla maskinkodsprogram och BASIC-program sparas som PRG, och kan laddas till minnet med BASIC-kommandot LOAD (eller via KERNAL LOAD).
REL
 Relativa filer är filer med fast bestämda storlekar. Till skillnad från andra filformat stödjer REL-filer äkta "random access" till valfri del av filen.
USR
 Användardefinierade filer. Dessa liknar fysiskt sett SEQ-filer. De är tänkta att innehålla exekverbar kod för diskettstationens egen processor. Det är okänt om detta användes i någon utsträckning. Några program som använder ickestandardiserad lågnivåstruktur på diskett sparade data som USR, vilket kom att tolkas som en typ av markör för användaren: "låt bli mig, försök inte kopiera eller radera". GEOS' "VLIR-filer visas som USR-filer.
DEL
 Icke dokumenterade internt använda filtyper. Liknar SEQ. CBM DOS kan inte skapa denna filtyp, utan den måste skapas genom direkt manipulering av filstruktur- och innehåll.

Det förekommer också filer med en asterisk (*) tillagd i katalogen (exempelvis *SEQ) vilket indikerar att filen inte stängdes efter att den skrevs. Oftast händer detta när ett program kraschar och lämnar en eller flera filer öppna på disketten. Om inte en manuellt tillagd CLOSE direkt körs i en fil som var öppen, kommer diskettens "block allocation map" (BAM) inte bli uppdaterad, vilket lämnar filsystemets struktur inkonsistent. *DEL är en speciell typ av filer som skrivs till filer som raderats; sådana filer syns inte i en kataloglistning, men går att rädda med hjälp av speciell mjukvara om inte annan data ännu skrivits över den.

En fil med asterisk kallas ofta för "splat", och kan normalt sett inte nås (men kan öppnas i ett "modify mode"). Försök att använda DOS-kommandot scratch för att radera en sådan fil kan ändra om i fillänkningen och därmed göra mer skada än nytta. Den enda praktiska metoden att radera en "splat"-fil är att öppna den i "modify mode" (och fixa filen), eller att validera disketten (se DOS-kommandot validate nedan).

Filer som följs av < (exempelvis PRG<) är låsta, och kan inte raderas. Det finns inga CMD DOS-kommandon för att sätta eller återställa detta, men många tredjepartsprogram skrevs för att göra detta möjligt. Dessa program läser vanligen katalogen genom kommandon för direkt åtkomst, gör nödvändiga ändringar i rådatan, och skriver tillbaka det hela till disketten igen.

Filåtkomst
Att komma åt filer är vanligen en uppgift för datorn. Datorns KERNAL ROM innehåller primitiva rutiner för att komma åt filer, och BASIC ROM innehåller support på en högre nivå för att nå filer genom BASIC-syntaxen. Den enda komponent som verkligen har med CMD DOS att göra är filnamnshantering med kommandona OPEN och LOAD/SAVE. 

Att öppna en fil på en diskettstation eller hårddisk från Commodore innebär en del parametrar som är vagt analoga med filöppningsprocedurer i andra miljöer. Eftersom DOS faktiskt körs på en egen enhet, och inte datorn, måste filöppningssekvensen innehålla tillräckligt med information för att säkerställa en entydig tolkning. En typisk filöppningssekvens i BASIC lyder:

OPEN 3,8,4,"0:ADDRESSBOOK,S,W"

Referenser

Tryckta källor
Immers, Richard; Neufeld, Gerald G. (1984). Inside Commodore DOS. The Complete Guide to the 1541 Disk Operating System. DATAMOST, Inc & Reston Publishing Company, Inc. (Prentice-Hall). .
Englisch, Lothar; Szczepanowski, Norbert (1984). The Anatomy of the 1541 Disk Drive. Grand Rapids, MI: Abacus Software (translated from the original 1983 German edition, Düsseldorf: Data Becker GmbH). .
Lundahl, Reijo (1986). 1541-Levyasema. Amersoft. 

Commodore 64
Operativsystem