Commodore DOS
A Commodore DOS vagy CBM DOS a Commodore 8 bites architektúrájú mikroszámítógépeiben használt, lemezkezelésre képes operációs rendszer (DOS) volt. A legtöbb DOS rendszertől eltérően, melyek lemezről töltődtek be a számítógép saját RAM-jába és onnan futottak, a CBM DOS a számítógépen kívül, a lemezmeghajtó csak olvasható memóriájában (ROM) foglalt helyet, és onnan futtatták a dedikált MOS 6502-es processzorcsalád tagjai. Ezért a Commodore 8 bites számítógépei és lemezmeghajtói közti adatátvitel jobban emlékeztetett egy helyi hálózati összeköttetésre, mint a tipikus diszk/gazdagép átvitelekre.
A CBM DOS verziói
szerkesztésLegalább hét különböző számozású Commodore DOS-változatról tudunk, az alábbi lista megadja a verziószámokat és a hozzájuk tartozó lemezes egységeket. Ha külön nem jelezzük, a meghajtók 5¼ hüvelykes formátumúak. Az „lp” kód a „low profile” (alacsony profilú) egységekre utal. A 15-tel kezdődő modellszámú meghajtók a Commodore által egyedileg kifejlesztett CBM-488 soros (TALK/LISTEN) protokollokkal kommunikálnak, az összes többi a párhuzamos IEEE-488-at használja.
- 1.0 – a 2040 és 3040 floppymeghajtókban
- 2.0 – a 4040 és 3040 floppymeghajtókban
- 2.5 – a 8050 floppymeghajtókban
- 2.6 – a 1540, 1541, a beépített SX-64 floppymeghajtókban, a 1551, 2031 (+"lp"), és 4031 floppymeghajtókban
- 2.7 – a 8050, 8250 (+"lp") és SFD-1001 floppymeghajtókban
- 3.0 – a 1570, 1571 és 8280 floppymeghajtókban (8280: 8 hüvelykes), valamint a 9060 és 9090 merevlemezes meghajtókban
- 3.1 – a C128D/DCR mikroszámítógép beépített 1571 floppymeghajtóiban
- 10.0 – a 1581-ben (3½ hüvelykes)
A 2.6-os volt a legelterjedtebb és legismertebb DOS-verzió, mivel ezt használták a C64 mikroszámítógéphez tartozó 1541 floppy drive-okban.
Az 1571-esben a relatív fájlok hibás kezelését javító verzió is V3.0 néven futott. Ezért kizárólag a verziószám alapján nem lehet megkülönböztetni a két változatot.
Technikai áttekintés
szerkesztés1541-es könyvtár- és fájltípusok
szerkesztésAz 1541-es Commodore flopilemez legfeljebb 144 fájlt tartalmaz egy lapos névtérben (nincsenek alkönyvtárak); a lemez „tartalomjegyzékét” („directory”) az erre fenntartott 18-as sávon tárolták, ami a 35-sávos egyoldalú lemez középső, a fizikai behatásoktól legvédettebb sávja volt. A fájlnév hosszúsága legfeljebb 16 bájt, elvileg egyedi; a könyvtárhoz való közvetlen hozzáféréssel létre lehet hozni azonos fájlneveket – bár az ilyen fájlok elérése utána problematikus. Az azonos fájlnevek általában semmi más célt nem szolgáltak, mint a tartalomjegyzék listájának informatív vagy trükkös formázását. A The Final Cartridge III által is használt népszerű trükk volt "----------------"
névvel és DEL<
típussal jelölt fájlok hozzáadása a tartalomjegyzékhez úgy, hogy a vonalak segítségével csoportosítsák a fájlneveket. A játékfejlesztők, warez csoporttagok, demoscene-hackerek stb. további ügyes trükköket is elkövettek a könyvtárbejegyzésekkel.
A fájlnevek tartalmazhatnak shift+space karaktert ($A0
), és ha a tartalomjegyzéket BASIC-ből listázzák, a fájlnév $A0
karakteren túli része a többitől idézőjellel elválasztva listázódik, ami miatt a BASIC nem tekinti a fájlnév részeként. Így lehetőség nyílt olyan könyvtárbejegyzések létrehozására, mint SAVE "PROGRAMshift,8,1:",8,1
, ami aztán a listában például így jelenik meg: 32 "PROGRAM",8,1: PRG
. Ha a felhasználó a sor elejére vitte a kurzort és felülírta a fájlméretet a LOAD
szóval és megnyomta az Entert, a BASIC úgy értelmezte a sort, hogy LOAD "PROGRAM",8,1: ...
, ami a program memóriába töltését idézte elő. A kettőspont utáni rész nem kerül végrehajtásra, mivel a LOAD parancs futtatja a programot, és nem tér vissza a parancsértelmezőhöz.
A fájlnévbe ágyazott nullbájt megszakítja a listázást, három nulla bájt pedig nagyon nehézzé teszi a BASIC megoldásaival a listázást. Egyes gépi kódú programozók szándékosan nulla értékű bájtokat szúrtak bele kódjaikba, megnehezítve a BASIC-programozók számára, hogy belepiszkáljanak azokba.
A C64 BASIC-jében a tartalomjegyzék egyfajta nem futtatható, pszeudo-BASIC programkódként töltődött be – kihasználva, hogy a BASIC-ben a sorok számozása valójában tetszőleges, a kiírási sorrendet nem befolyásolja, azt a láncolt lista adja meg –, a LOAD "$0",8
(vagy LOAD "$1",8
dupla meghajtó esetén), majd a LIST
parancs kiadásával. Az első sor sorszáma 0 vagy 1 (a meghajtó számát jelöli), következik inverz („reverse”) videomódban kiírva a lemez neve, azonosítókódja és a formázáshoz használt DOS-verzió kódja (csak az inkompatibilis lemezformátumok miatta DOS-verziók különböztethetők meg, a legtöbb 5.25 inches verzió a "2A"-t használta, a 3.5 inches 1581-es meghajtó a "3D"-t). A további sorok pszeudo-sorszámként kiíratva a fájl méretét tartalmazzák (lemezblokkokban mérve), majd a fájl nevét idézőjelben és a hárombetűs fájltípus-kódot. Az utolsó sor (szintén pszeudo-sorszámként kiíratva) a lemez szabad blokkjainak számát mutatja, melyet a "BLOCKS FREE." felirat követ.
A Commodore 64-en a LOAD "$",8,1
a tartalomjegyzék BASIC RAM-ba való töltése helyett teliszemeteli a képernyőt. Ez azért van, mert a „,1” miatt gépi kódként tölti be a listát, aminek a betöltési címe a $0401 (1025) lesz, ami ugyan a Commodore PET-en a BASIC memóriaterületének eleje, de a C64-en az alapértelmezett képernyőmemória második karakterét adja.
A tartalomjegyzék betöltése a standard LOAD "$",8
paranccsal felülírja a memóriában lévő BASIC programot. A DOS Wedge program és számos, külső cég által fejlesztett cartridge és bővítő, mint az Epyx FastLoad, az Action Replay és a Final Cartridge III lehetővé tették a tartalomjegyzék listázását olyan parancsokkal, melyek a memóriában lévő BASIC program felülírása nélkül, a képernyőmemóriába töltötték be a directoryt. A Commodore 128-on futó BASIC 7.0 tartalmaz DIRECTORY
vagy CATALOG
parancsot (indításkor az F3 gombhoz bekötve), ami ugyanezt a feladatot látja el.
A következő fájltípusok támogatottak:
SEQ
- A szekvenciális (soros elérésű) adatfájl lineárisan olvasható az elejétől a végéig. A
SEQ
fájlokat például szövegszerkesztők dokumentumainak vagy szöveges fájljainak tárolására lehet használni. A szekvenciális fájl hasonló a Linux/UNIX rendszereken ismert simafájl (flat file) szerkezettel, amennyiben nem rendelkezik speciális belső szerkezettel. Nincs arra mód, hogy egy szekvenciális fájl tetszőleges helyére pozicionáljunk, mivel a Commodore DOS-ban nem létezik a Unix-szerű operációs rendszerekben találhatólseek
kernelhívás.
PRG
- A
PRG
fájlok általában futtatható programkódot tartalmaznak, bár adattárolásra is használhatók. APRG
fájlok első két bájtját a kernal[1] "load file"-rutinja beolvassa, és a betöltési cím meghatározására használja fel (little endian bájtsorrend szerint tárolódik).
REL
- A relatív fájl olyan szekvenciális fájl, amiben egy indexelési mechanizmus „side-sector”-ok (mellérendelt szektorok) segítségével lehetővé teszi a rekord-orientált hozzáférést. A rekordok legfeljebb 254 bájtosak lehetnek és 1-gyel kezdődő sorszámozás alapján lehet hozzájuk férni, így valódi véletlen elérésű fájlokról van szó.
USR
- A felhasználói fájl belső szerkezete megegyezik a szekvenciális fájléval. A Commodore eredeti célja a fájltípussal a DOS-fejlesztés elősegítése volt, mivel a fájl tartalma bemásolható volt a meghajtó pufferjébe, a lemezmeghajtó mikroprocesszora általi későbbi végrehajtásra. Nem ismeretes, hogy bárki használta volna ezt a funkcionalitást. Egyes, nem standard alacsony szintű lemezhozzáférést használó alkalmazások USR formátumban mentettek adatokat, amit a felhasználó számára amolyan „hagyj békén, ne próbálj másolni vagy törölni” jelzésnek szántak. Például a GEOS operációs rendszer "VLIR" fájljai is
USR
kóddal jelennek meg.
DEL
- Dokumentálatlan, belső felhasználású fájltípus, a szekvenciális fájlhoz hasonló szerkezetű. Ilyen fájlt csak a lemez tartalomjegyzékének közvetlen manipulációjával lehet létrehozni.
A tartalomjegyzékben a fájltípus melletti csillag (*
) jelenléte (például *SEQ
) a fájl írás utáni szabálytalan lezárására utal. Amikor a lemezegység utasítást kap egy írásra megnyitott fájl lezárására, a hozzárendelt puffer kiíródik a lemezre, és a szabad blokkokat nyilvántartó block availability map (BAM) frissül a felhasznált blokkokkal. Ha egy program lefagyása miatt vagy más okból (például a felhasználó kiveszi a lemezt a fájl bezárása előtt) egy fájl „elárvul” („orphan file”, „poison” vagy „splat” file), a puffer nem íródik ki, ezért a BAM nem pontosan tükrözi vissza a lemezhasználatot, ami adatvesztés veszélyével jár. Az elárvult fájlokat általában nem lehet megnyitni (csak „módosítás – modify” módban), és a DOS scratch
parancsával való törlés fájlrendszer-sérülést, például keresztcsatolt fájlokat hozhat létre. A probléma praktikus megoldása a fájl „modify” módban való megnyitása (és javítása) vagy a DOS validate
parancsával a lemez helyrehozása; ez a parancs újraépíti a BAM-ot és eltávolítja a sérült fájlokat a tartalomjegyzékből. A hírhedt save-with-replace bug ilyen fájlok létrejöttével járhat.
A *DEL
speciális bejegyzés, ami a tartalomjegyzékben a kitörölt fájlokhoz tartozik. Az ilyen fájlok nem látszanak a normál könyvtárlistában, adatblokkjaikat és könyvtárbejegyzésüket pedig a később létrehozandó fájlok felülírják. Egyes segédprogramok lehetővé teszik az ilyen állományok visszaállítását, ha adatblokkjaik és könyvtárbejegyzéseik még nem lettek felülírva. A DEL
fájlokat gyakran használták fel bannerek vagy megjegyzés-szekciók a tartalomjegyzékbe való beszúrására.
A fájltípusok, melyek neve mögött <
áll (például PRG<
) „zárolva vannak” és nem törölhetők, bár olvasásra meg lehet nyitni őket. Nincs olyan Commodore DOS parancs, amivel kifejezetten ezt az állapotot be lehet állítani vagy törölni lehet, bár számos lemezkezelő segédprogram lehetővé teszi ezt. Az ilyen programok általában közvetlen hozzáféréssel beolvassák a tartalomjegyzéket, elvégzik a szükséges módosításokat a nyers adatokon, majd visszaírják a lemezre.
Fájl-hozzáférés
szerkesztésA fájlokhoz való hozzáférés a gazdaszámítógép feladata. A számítógép kernal ROM-ja tartalmazza fájlok eléréséhez szükséges alacsony szintű rutinokat, a BASIC ROM pedig a BASIC szintaxissal való eléréshez szükséges magasabb absztrakciós szintet. A DOS szintjén megjelenő komponensek a fájlnevek elemzésével és a másodlagos címekkel foglalkoznak. Az alábbiakban a teljesség kedvéért áttekintést adunk az alapvető BASIC fájlkezelési parancsokról.
A Commodore lemezmeghajtón történő fájlmegnyitás maga után vonja néhány olyan paraméter kezelését, melyek nagyjából megfeleltethetők más környezetek fájlmegnyitási procedúráinak. Mivel a DOS ténylegesen a lemezmeghajtó kontrollerén fut, a fájlmegnyitási műveletnek elegendő információt kell átadnia ahhoz, hogy az egyértelmű interpretáció lehetséges legyen. Egy tipikus BASIC nyelvű parancs egy soros fájl írására a következőképpen nézhet ki:
OPEN 3,8,4,"0:ADDRESSBOOK,S,W"
Az OPEN
igét követő paraméterek értelmezése a következő:
- 3
- Ez a paraméter, a „fájl száma” (file number) logikailag azonosítja a megnyitott fájlt a számítógép operációs rendszere számára a megnyitott fájlok között, a Unix-szerű operációs rendszerek fájlleírójához (file descriptor) hasonlóan. Ez a paraméter sosem kerül elküldésre a lemezmeghajtóhoz, így a drive operációs rendszere nem is tud róla. A fájl száma 1–254 között lehet, a programozó végzi a hozzárendelést és egyedinek kell lennie (ha több fájl egyidejű megnyitására van szükség). Miután a fájl megnyitásra került, minden olvasási és írási művelet ezt a fájlszámot használja. Assembly nyelvű programokban erre az értékre gyakran mint „logikai címre” (LA, logical address) hivatkoznak, a fájl számát tároló memóriacímre utaló mnemonik elnevezéséből.
- 8
- Ez a paraméter, az eszköz száma (device number) azonosítja a számítógéphez csatlakoztatott valamely perifériát. A 0–3 közötti számok sorban a billentyűzetre, a kazettás egységre, az RS-232 interfészre és a videokimenetre utalnak, melyeket a kernal ROM közvetlenül vezérel. A 4 és afölötti számú eszközök a perifériabuszra csatolt eszközökre utalnak, például nyomtatókra vagy lemezmeghajtókra. Lemezmeghajtók esetén az eszköz száma az eszköz kontrollerét címzi meg, nem közvetlenül írja-olvassa a lemezt. Hagyományosan az első hajlékonylemezes meghajtó száma 8, a másodiké 9, legfeljebb 15-ig. Ez a számozási konvenció a Commodore PET/CBM modellekben használt IEEE-488, avagy általános célú interfészbusz (general purpose interface bus, GPIB) sajátja volt. Assembly nyelvű programokban erre az értékre gyakran mint „fizikai címre” (FA vagy PA – physical address) utalnak, ismét csak az eszköz számát tároló mnemonik alapján.
- 4
- Ez a paraméter, a „másodlagos cím” (secondary address), ami 0–15 értéket vehet fel, az eszköz kontrollerével felépített specifikus kommunikációs csatornára utal, és minden alkalommal elküldésre került az eszközhöz, amikor azt a perifériabuszon való „hallgatásra” vagy „beszédre” utasítják. Ahogy a fájlszámnál is látható volt, a másodlagos címet a programozó határozza meg, és az adott eszközzel való kommunikáció során egyedi azonosítónak számít. A 0–14 közötti címeket adatküldésre használják, míg a 15-ös, a „parancscsatorna” (command channel) az eszköz kontrollere számára parancsok kiküldésére való (például a lemezen egy fájl átnevezésére), ha az eszköz képes az adott művelet végrehajtására. Lemezmeghajtók esetén a 0–14 közötti címek a kontroller egy-egy pufferéhez vannak rendelve, így egy adott lemez adott fájljával létesítenek kapcsolatot; ahogy fent említettük, a lemezmeghajtó nem tud a fájl számáról, ezért csak a másodlagos cím segítségével tudja megkülönböztetni az azonos időben nyitva lévő fájlokat. Másrészről viszont a gazda operációs rendszer nem törődik a másodlagos címmel; fájleléréskor minden alkalommal elküldésre kerül a lemezmeghajtónak, de egyébként a host nem használja ezt. Assembly nyelvű programokban erre az értékre általában SA (secondary address) néven hivatkoznak.
- COMMAND STRING (parancs karakterlánca)
- A
"0:ADDRESSBOOK,S,W"
paraméterek együttesét a Commodore cég dokumentációiban command string („parancs karakterlánca”) néven említik. Ezt a karakterláncot az eszköz kontrollere értelmezi. A lemezes egység esetében a karakterlánc szerkezete formálisan a drive mechanizmus számával kezdődik (0:
, nem összetévesztendő az eszköz számával), folytatódik a fájlnévvel (ADDRESSBOOK
), fájltípussal (S
, szekvenciális a példában) és a hozzáférés üzemmódjával – access mode – (W
, a példában írásra megnyitva). A gyakorlatban a paraméterek közül némelyik elhagyható. Minimálisan a fájlnév megadása szükséges, ha a fájlt olvasásra kívánjuk megnyitni.
- Az eszköz száma azonosítja a lemezegység kontrolleréhez kötött lemezes mechanizmust, ilyen szempontból analóg a SCSI kontrollerek Logical unit numberéhez (LUN) – például az OMTI SASI kontrollerekéhez, melyek az 1980-as években az ST-412/ST-506 merevlemezekkel működtek együtt. Hajlékonylemezes egységeknél az első mechanizmus a 0: drive, a második az 1:.Elterjedt megoldás volt az eszközszám elhagyása a szóló flopiegységekkel való kommunikáció során, hiszen a 0: az alapértelmezett szám az ilyen eszközöknél; mivel azonban a szám kihagyása a DOS-ban időnként furcsa hibákat volt képes előidézni, ezért nem ez volt a javasolt gyakorlat (egy sima kettőspont is elég volt, ami a 0:-tal egyenértékűként már elég a hiba elkerülésére). Kivétel a szabály alól az Lt. Kernal merevlemezes alrendszer, melyben a meghajtó száma a logikai egységekre utal (logical units, virtual drives, melyek egyetlen fizikai eszközön kerülnek létrehozásra), ami miatt szükséges a 4: vagy 10: jellegű szintaxis használata, ha a megnyitandó fájl nem a 0-s logikai eszközön található, ami ekvivalens a kétmeghajtós flopieszközök 0-s drive-mechanizmusával.
A fájlok betöltése és kimentése a LOAD
, illetve SAVE
BASIC parancsokkal is elvégezhető. Használhatók különböző, a fájlnevekhez tartozó módosítók, például a SAVE "FILE",8
a BASIC programot PRG
(program) fájlként menti, míg a SAVE "0:FILE,SEQ,WRITE",8,1
parancs szekvenciális elérésű fájlként. Ha a második címet nem adjuk meg, vagy 0-nak választjuk (például LOAD "FILE",8
), akkor a fájlt a BASIC memóriaterületére tölti be, illetve onnan írja lemezre (ami a C64-en alapértelmezésben $0801). Ha a másodlagos cím nem nulla (pl. LOAD "FILE",8,1
), a programot a fájlban meghatározott címre tölti be (a PRG fejléce, azaz az első két bájtja által meghatározott helyre) – ez a parancs sokkal gyakoribb gépi kódú programok betöltésekor.
A betöltés relokációja, áthelyezése (load relocation) először a VIC-20-ban jelent meg, ami képes volt a memóriabővítő típusától függően különböző memóriacímekről használni a BASIC RAM-ot. A korábbi Commodore PET sorozat nem támogatta a relokációt, ezért a LOAD "FILE",8
és LOAD "FILE",8,1
ugyanazt eredményezte: a fájl ugyanoda töltődött be, ahonnan elmentésre került. A betöltődés relokációja magán a gépen történik meg, ami kivétel az alól a szabály alól, hogy a másodlagos cím a lemezmeghajtón belül értelmeződik. Mivel a PET képtelen a relokációra, a későbbi Commodore gépekre írt BASIC programokat szektorszintű szerkesztőprogrammal, vagy a PET beépített assembly monitorprogramjával kell módosítani betöltődés után.
A LOAD "*",8,1
betölti a lemezen található első programot a fájlban meghatározott memóriaterületre. Ez a platform talán legnépszerűbb betöltő utasítása, ami a kereskedelemben kapható legtöbb szoftver elindítására alkalmas. Érdekesség, hogy a * joker karakter csak akkor tölti be biztosan a tartalomjegyzékben szereplő legelső nevet, ha a lemezről nem fértünk hozzá más fájlokhoz; a legutoljára használt fájl neve ugyanis a memóriában marad, és az ezutáni LOAD "*",8,1
parancs ezt a fájlt fogja betölteni a legelső helyett. (Azonban a LOAD "0:*",8,1
vagy LOAD ":*",8,1
parancsok mindig az első fájlt fogják betölteni a diszkről.)
A kétlemezes egységek tartalomjegyzékét a LOAD "$0", 8
, illetve LOAD "$1", 8
paranccsal lehet betölteni. A "0:$"
és "1:$"
nem a tartalomjegyzékre hivatkozik, hanem a lemezen található, ténylegesen "$"
-nak elnevezett fájlra. Lehetőség van részleges könyvtárlistázásra kettőspont és sablon megadásával, például a LOAD "$0:K*=P",8
a K betűvel kezdődő, PRG típusú fájlokat listázza csak. Az ilyen részleges listák is tartalmazzák a kezdeti lemeznév-sort és a záró „BLOCKS FREE” sort.
A save-with-replace hiba
szerkesztésA Commodore DOS-ban lehetőség van „mentés felülírással” (Save-with-Replace) parancs kiadására, feleslegessé téve, hogy a felülírandó fájlt először SCRATCH
-csel töröljék. Ez úgy volt megvalósítva, hogy egy @
karaktert tettek a fájlnév elé az OPEN
vagy SAVE
műveletnél – például SAVE "@MY PROGRAM",8
. Évekig rebesgették, hogy a 4040 drive-tól kezdve hibás volt a parancs implementációjában. Először ezt tagadták, később pénzdíjat ajánlottak annak, aki be tudja bizonyítani a hiba létezését.[2] 1985 elejére a Compute! magazin azt tanácsolta olvasóinak, hogy ne használják a parancsot.[3] Ugyanebben az évben különböző szerzők egymástól függetlenül publikáltak a hibáról[2][4][5][6] bizonyítva a Save-with-Replace bug valódiságát és bemutatva a módszereket, melyekkel az előidézhető.
A hibás viselkedést mutató eszközök közé tartozott az egylemezes 1541 és a kétlemezes 4040; a 8050-ben és a 8250-ben nem jelentkezett a hiba.[2] Egyesek úgy vélték, hogy a hiba elkerülhető volt a 0:
meghajtószám explicit megadásával a mentés során,[4] de később kimutatták, hogy bármely, meghajtószám nélküli művelet kiválthatta a hibás működést.[7] A hiba onnan eredet, hogy az érintett DOS-implementációk a korábbi Commodore PET kétlemezes meghajtók, pl. a 8050-es DOS-ának módosított változatai voltak. Emiatt az egylemezes rendszereken is létezett egyfajta „1:
fantom eszköz”, ami bizonyos körülmények között egy fölösleges puffert foglalt le. Mivel a Save-with-Replace parancs mind az öt lemezpuffert felhasználta, és mivel a fantom puffer lefoglalása nem a specifikációknak megfelelően történt, ezért bizonyos körülmények között véletlenszerű adatok kerülltek kiírásra a lemezrel.
1986 szeptemberében Philip A. Slaymaker megjelentetett egy cikket,[8] melyben nagy részletességgel leírja a hibát, továbbá patchet ad az 1541 drive ROM-jához; az EPROM-égetővel felszerelt olvasók házilagosan képesek lehettek új EPROM-ot égetve kicserélni az eszközben lévő hibás verziót. A Commodore-nak tudomására jutottak Slaymaker eredményei, és bár hivatalosan sohasem javították az eredeti 1541-ben található ROM-ot, az 1571-es ROM Revision 5-jében, valamint az 1541-c és 1541-II drive-okban is már javítva volt a hiba. Bár a Commodore által nem támogatott megoldás, lehetőség volt az 1541-II firmware-jét (de nem az 1541-c-ét) az eredeti 1541 drive-ban használni, így az 1541-es eredeti lemezmeghajtót is hibamentessé lehetett tenni ily módon.
Parancscsatorna
szerkesztésAhogy korábban is említettük, magát a Commodore DOS-t a parancscsatornán (command channel) keresztül lehet elérni, a fájlok eléréséhez hasonló szintaktikával. A DOS-nak történő parancskiadás, majd a státus- és hibaüzenetek lekérése a 15 másodlagos címmel történő fájlnyitással történik, például így:
OPEN 1,8,15
Az eszköz státusának lekéréséhez és kiírásához például a következő kód használható:
OPEN 1,8,15:INPUT#1,E,E$,T,S:PRINT E,E$,T,S:CLOSE 1
A fönti példában az E
tárolja a hiba számát (értéke nulla lesz helyes működés esetén), E$
a hiba rövid szöveges leírása lesz, T
azt a sávot (track) jelzi, ahol a hiba előfordult a lemezen, az S
pedig a sávon belüli szektor számát. Ha nem lép fel hiba, 00,OK,00,00 lesz a négy változó értéke. Megjegyzendő, hogy az INPUT#
ún. „run mode” (futás közben használható) parancs, tehát nem adható ki program futtatása nélkül közvetlenül. A lemezműveleteket végző programok jellemzően induláskor megnyitják a parancscsatornát és egészen a program futásának végéig nyitva is tartják.
A Commodore BASIC 4.0 és magasabb verziói tartalmaznak egy DS$
pszeudováltozót, ami közvetlenül használható a drive státusának lekérésére. Ez korábbi DOS-verziókban nem működik, azoknál a fent leírt módszerrel manuálisan kell kiolvasni a státust. Közvetlenül bekapcsolás után a státusban a DOS verziószámát adja vissza az eszköz, például az 1541-esen ezt: 73,CBM DOS V2.6 1541,00,00. Az Error code 73 minden modellben létezik, ennek segítségével fel lehet ismerni, hogy az eszköz ki- és bekapcsolásra került.
DOS parancsok
szerkesztésParancs | Leírás | BASIC 1.x és 2.x implementáció | DOS Wedge implementáció | BASIC 3.0+ implementáció |
---|---|---|---|---|
New | Lemez formattálása; felkészítés a használatra, bármely rajta lévő korábbi tartalom törlésével. A kétbetűs azonosító paraméter elhagyása esetén csak gyorsan törli a fájlokat a már formázott lemezről. | OPEN 15,8,15,"N0:disk name,identifier":CLOSE 15
|
@N0:disk name,identifier
|
HEADER "disk name",identifier
|
Scratch | Egy fájl törlése a lemezről (vagy több fájl törlése, joker karakterek alkalmazása esetén) | OPEN 15,8,15,"S0:file name":CLOSE 15
|
@S0:file name
|
SCRATCH "file name"
|
Rename | Átnevez egy fájlt a lemezen. Első helyen az új név áll (kivéve a BASIC 3.0+ kódban)! | OPEN 15,8,15,"R0:new name=old name":CLOSE 15
|
@R0:new name=old name
|
RENAME "old name" TO "new name"
|
Initialize | Reseteli az eszközt és beolvassa a lemez BAM-ját a belső memóriába. Ritkán szükséges, mivel ezt a drive magától is elvégzi – kivéve, ha a lemezt véletlenül egy megegyező azonosítójú (ID) lemezre cserélünk ki. |
|
@I0:
|
DCLEAR (BASIC 7.0+ only)
|
Validate | Összehasonlítja a BAM-ot a tartalomjegyzékkel, lefoglalja a ténylegesen használt blokkokat, felszabadítja a nem használt blokkokat, törli a szabálytalanul lezárt fájlokat a tartalomjegyzékből. Megfeleltethető a Microsoft operációs rendszerek CHKDSK/ScanDisk eszközeinek. |
|
@V0:
|
COLLECT
|
Copy | Egy fájlról másolatot hoz létre ugyanazon a lemezen (esetleg kétlemezes eszköz másik lemezén), más fájlnévvel. Az új név áll első helyen (kivéve a BASIC 3.0+ kódban)! Ha kétlemezes eszköz nem áll rendelkezésre, különböző segédprogramokkal lehet csak másik lemezre fájlokat másolni. | OPEN 15,8,15,"C0:new name=0:existing name":CLOSE 15
|
@C0:new name=0:existing name
|
COPY"existing name"TO"new name"
|
Duplicate | Teljes lemezről másolat készítése. Csak kétlemezes eszközökön hozzáférhető, vagy segédprogramok használatával. A céllemez száma kerül előre, a forráslemez hátra (kivéve a BASIC 3.0+ kódban). |
|
@D1=0
|
BACKUP D0 TO D1
|
Léteznek még parancsok a RELative típusú fájlokban való keresésre (RECORD#
), különböző blokkszintű elérést biztosító parancsok (BLOCK-READ
, BLOCK-WRITE
, BUFFER-POINTER
), blokkok foglaltságának kezelése (BLOCK-ALLOCATE
, BLOCK-FREE
), a drive memóriájának manipulációja, közvetlen programvégrehajtás a drive processzorán (MEMORY-WRITE
, MEMORY-READ
, MEMORY-EXECUTE
, BLOCK-EXECUTE
), valamint felhasználó által definiálható függvények (USER
és &
parancsok). Az elméletileg a felhasználó által definiálható függvényeket később elhasználták a DOS 1.0-nál későbbi verziói új funkcionalitásának elérésére.
Fordítás
szerkesztés- Ez a szócikk részben vagy egészben a Commodore DOS című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Jegyzetek
szerkesztés- ↑ így hívják a Commodore-terminológiában a kernelt
- ↑ a b c Whittern, Charles H. (1985. július 1.). „SAVE with Replace Exposed!!”. The Transactor 6 (1), 20. o.
- ↑ „The Great Commodore Save/Replace Debate”, Compute!, 1985. február 1., 10. oldal (Hozzáférés: 2013. október 6.)
- ↑ a b Slaymaker, P. A.. „Save With Replace: Debugged At Last / Part 1”, Compute!, 1985. október 1., 79. oldal (Hozzáférés: 2013. október 16.)
- ↑ Slaymaker, P. A.. „Save-With-Replace: Debugged At Last / Part 2”, Compute!, 1985. november 1., 111. oldal (Hozzáférés: 2013. október 30.)
- ↑ Editors. "Save@: Gerry Neufield's Theory on an Old Bug". Info № 9, December 1985/January 1986.
- ↑ Excerpt of e-mail from Philip A. Slaymaker also archived at Groups.Google
- ↑ Philip A. Slaymaker. "Eliminating SAVE@ and Other 1541 Bugs". The Transactor Vol. 7 № O2, September 1986, pp. 33–35.
- Megjegyzések
- 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). ISBN 0-8359-3091-2.
- 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). ISBN 0-916439-01-1.
- (finnül) Lundahl, Reijo (1986). 1541-Levyasema. Amersoft. ISBN 951-35-3206-2
További információk
szerkesztés- C64 Wiki: Commodore 1541
- Szczepanowski: A VC-1541-es lemezegység programozása, Novotrade 1985, ISBN 963-02-3984-1
- Commodore könyvek: Perifériák