Commodore DOS ( CBM DOSとも呼ばれる)は、コモドールの8ビットコンピュータで使用されるディスクオペレーティングシステムです。他のほとんどのDOSは、ディスクからコンピュータのRAMにロードされてそこで実行されますが、CBM DOSはドライブ内部で実行されます。DOSはドライブ内部のROMチップに格納され、1つまたは複数の専用のMOS 6502ファミリーCPUによって実行されます。そのため、コモドールの8ビットコンピュータとディスクドライブ間のデータ転送は、一般的なディスク/ホスト間の転送よりも、ローカルエリアネットワーク接続に近いものとなっています。
少なくとも 7 つの異なる番号のバージョンの Commodore DOS が存在することが知られています。以下のリストは、バージョン番号と関連するディスク ドライブを示しています。特に明記されていない限り、ドライブは 5¼ インチ フォーマットです。「lp」コードは「ロープロファイル」ドライブを示します。モデル番号が 15 で始まるドライブは、Commodore 独自のシリアル IEEE-488 バス (IEC バス)シリアル (TALK/LISTEN) プロトコルを介して接続します。その他はすべてパラレルIEEE-488を使用します。
バージョン2.6は、 C64システムの一部として1541で使用されていたため、DOSバージョンの中で最も一般的に使用され、広く知られていた。
注:相対ファイルに関するバグを修正した1571用の改訂版ファームウェアもV3.0として識別されています。そのため、バージョン番号だけでは2つのバージョンを区別することはできません。
1541 Commodore フロッピー ディスクには、フラットな名前空間 (サブ ディレクトリなし) で最大 144 個のファイルが格納されます。ディレクトリは、ハブから 35 トラックの片面ディスクの端までの中間にある予約トラック 18 に格納されます。ファイル名は最大 16バイトの長さで、理論的には一意です。ディレクトリ構造に直接アクセスする方法を使用すると、ファイルの名前を別のファイルの名前に変更することは可能ですが、そのようなファイルにアクセスするのは困難または不可能な場合があります。同じ名前のファイルは通常、ファイルの情報提供や視覚的な管理以外には役に立ちません。たとえばThe Final Cartridge IIIで使用された一般的なトリックの 1 つは、ディレクトリに特定"----------------"のタイプのファイルを追加し、その後、その行を中心にファイルを再配置してグループを形成することでした。多くのゲーム開発者、ウェアーズグループのメンバー、デモシーンハッカーも、より巧妙なカスタム ディレクトリ エントリを使用しました。DEL<
ファイル名にはシフトスペース文字($A0)を含めることができます。ディレクトリ一覧をBASICから表示する場合、その$A0文字以降のファイル名の部分は、ファイル名の最初の部分から引用符で区切られているように見え、BASICはそれを完全なファイル名の一部とはみなしません。この機能を使用すると、 のようなディレクトリエントリを作成できます。これは、ディレクトリ一覧に、たとえば のように表示されます。SAVE "PROGRAM⇧ Shift–space Commodore–DUDE",8,132「プログラム」、8、1 PRG[ 1 ] ユーザーがカーソルを行頭に移動し、ファイルサイズの上に単語を入力して を押すと、 BASIC はそれを と解釈し、プログラムがメモリにロードされます。 LOAD の後のコマンドはコンピュータが無視するため、コロンまたはセカンダリ アドレスの後のものは実行されません。[ 2 ] または、ユーザーは-を押して、プログラムを自動的に実行することもできます。[ 3 ]LOADRETURNLOAD"PROGRAM",8,1...⇧ ShiftRUN/STOPLOADRUN
ファイル名にヌルバイトが埋め込まれていると、BASICによる読み込み後にリスト表示が中断されます。ヌルバイトが3つある場合は、BASICによるリスト表示が困難になります。多くの機械語プログラマーは、BASICプログラマーが自分のコードにアクセスして改ざんするのを難しくするために、ヌルバイトを意図的に使用していました。
BASICでは、ディレクトリには、(またはデュアルドライブの場合は) の後に を付けて、実行不可能な擬似BASICプログラムとしてアクセスできます。最初の行には、行番号0または1(ドライブ番号を示す)があり、ディスクの名前とID、およびディスクが作成されたDOSバージョンの略記コードが逆ビデオで表示されます(コードは、DOSバージョンが互換性のないディスクフォーマットを使用している場合にのみ異なります。「2A」はほとんどの5.25インチDOSバージョンで使用され、「3D」は3.5インチ1581で使用されます)。この後の行には、擬似「行番号」としてファイルのサイズ(ディスクブロック単位)があり、その後に引用符で囲まれたファイル名と3文字のタイプコードが続きます。最後の行には、ディスク上の未割り当てブロック数(これも擬似「行番号」として)が表示され、その後に「BLOCKS FREE」という単語が表示されます。LOAD"$0",8LOAD"$1",8LIST
Commodore 64では、 と入力すると、ディレクトリが BASIC RAM にロードされる代わりに、画面に大量のゴミが表示されます。これは、ドライブがディレクトリに$ 0401 (1025) というロード アドレスを割り当てるためです。このアドレスはCommodore PETの BASIC の開始アドレスに相当しますが、C64 のデフォルトの画面メモリ (画面の最初の行の 2 番目の文字から始まる) に対応します。LOAD"$",8,1
コマンドでディレクトリを表示すると、メモリ内の BASIC プログラムが上書きされます。DOS Wedgeや、Epyx Fast Load、Action Replay、The Final Cartridge IIIなどのサードパーティ製カートリッジやエクステンダーでは、現在の BASIC プログラムを破壊することなくディレクトリをスクリーン メモリにロードする特別なコマンドを使用してディスク ディレクトリを表示できます。Commodore BASIC の一部のバージョンには、同じ機能を実行するコマンドが含まれています。LOAD"$",8DIRECTORYCATALOG
以下のファイル形式がサポートされています。
SEQSEQファイルは、ワープロソフトなどのエディタで作成された文書やテキストファイルを保存するのに一般的に使用されます。シーケンシャルファイルは、LinuxやUNIXのフラットファイルと同様に、特別な内部構造を持ちません。UNIX系オペレーティングシステムにあるようなカーネル呼び出しがないため、シーケンシャルファイル内の任意の位置に移動することはできません。lseekPRGPRGファイルは通常、実行可能なプログラムコードを含みますが、データファイルとしても使用できます。ファイルの最初の2バイトは、カーネルのPRG「ロードファイル」ルーチンによって読み取られ、ロードアドレスを決定するために使用されます(リトルエンディアン形式で格納されます)。RELUSRUSR。DELディレクトリ一覧でファイルタイプの先頭にアスタリスク(* *)が付いている場合(例:)、*SEQ書き込み後にファイルが正しく閉じられなかったことを示します。書き込み用に開かれたファイルを閉じるようにドライブに指示すると、関連付けられたバッファがディスクにフラッシュされ、ブロック可用性マップ(BAM)が更新されて、どのブロックが使用されたかが正確に反映されます。プログラムのクラッシュやその他の問題(ユーザーがファイルを開いている間にディスクを取り外すなど)によって「孤立ファイル」(「ポイズンファイル」または「スプラットファイル」とも呼ばれる)が発生すると、バッファはフラッシュされず、BAMはディスクの使用状況を正確に反映しないため、ディスクが破損する危険性があります。ポイズンファイルは通常アクセスできません(ただし、「変更」モードで開くことはできます)。DOSscratchコマンドを使用してファイルを削除しようとすると、クロスリンクなどのファイルシステムの破損が発生する可能性があります。これらのファイルを削除する唯一の実用的な方法は、ファイルを「変更」モードで開いて修正するか、ディスクを検証することです(validate下記のDOSコマンドを参照)。後者の方法では、BAMが再構築され、ディレクトリから有害なファイル参照が削除されます。悪名高い「置換保存」バグにより、スプラットファイルが作成される可能性があります。
*DELは、削除されたファイルのディスク上のディレクトリエントリに書き込まれる特殊なタイプです。このようなファイルは通常のディレクトリ一覧には表示されず、そのデータブロックとディレクトリエントリは、後から作成されるファイルによって再利用されます。一部のユーティリティプログラムでは、データブロックとディレクトリエントリが他のファイルによってまだ上書きされていない場合、このようなファイルの「削除解除」が可能です。 は、DEL filesディレクトリ一覧にバナーやコメントセクションを挿入するためによく使用されます。
ファイルタイプに`--` が<付いているもの(例: `./file.json` )は「ロック」されており、削除することはできませんが、読み取り用に開くことは可能です。この状態を明示的に設定または解除する Commodore DOS コマンドはありませんが、多くのサードパーティ製ユーティリティがこれを可能にするように作成されています。これらのユーティリティは通常、直接アクセスコマンドを使用してディレクトリを読み込み、生データに必要な変更を加え、変更内容をディスクに書き戻します。PRG<
ファイルへのアクセスは主にホストコンピュータ側の問題です。コンピュータのカーネルROMにはファイルアクセスに必要な基本的なルーチンが格納されており、BASIC ROMにはBASIC構文を用いたファイルアクセスのためのより高レベルの抽象化レイヤーが格納されています。DOS自体に関わるコンポーネントは、ファイル名の解析とセカンダリアドレスです。このセクションでは、完全性を期すために、必要なBASICコマンドの概要を説明します。
Commodoreディスクユニットでファイルを開くには、他の環境でのファイルオープン手順と大まかに類似した多数のパラメータを処理する必要があります。DOSは実際にはドライブコントローラ内で動作しているため、ファイルオープンシーケンスは、明確な解釈を保証するために十分な情報をドライブに渡す必要があります。BASICでシーケンシャルファイルに書き込むための典型的なステートメントは次のようになります。
OPEN3,8,4,"0:ADDRESSBOOK,S,W"OPEN動詞に続くパラメータは以下のとおりです。
"0:ADDRESSBOOK,S,W"と呼ばれ、アクセス先のデバイスのコントローラによって解釈されます。ディスクドライブの場合、正式なコマンド文字列の構造は、ドライブメカニズム番号(デバイス番号と混同しないように注意)、ファイル名()、ファイルタイプ(この例ではシーケンシャル)、およびアクセスモード(この例では書き込み用に開く)で構成されます。実際には、これらのパラメータの一部は省略できます。少なくとも、読み取り用にファイルを開く場合は、ファイル名のみが必要です。0:ADDRESSBOOKSWLOADファイルは、コマンドとコマンドを使用してロードおよび保存することもできますSAVE。ファイル名指定子もここで使用できます。たとえば、はBASICプログラムを(プログラム)ファイルに保存し、はBASICプログラムをシーケンシャルファイルに保存します。セカンダリ アドレスが指定されていない場合、または0として指定されている場合(例:)、ファイルはBASICメモリ領域(C64ではデフォルトで$ 0801から始まります)から保存/ロードされます。セカンダリ アドレスがゼロ以外の値として指定されている場合(例:)、プログラムはファイル自体で指定されたアドレス(ファイルの最初の2バイトであるPRGヘッダー)からロードされます。この形式のコマンドは、マシンコード プログラムをロードする場合によく使用されます。SAVE"FILE",8PRGSAVE"0:FILE,SEQ,WRITE",8,1LOAD"FILE",8LOAD"FILE",8,1
ロード再配置は、VIC-20で初めて導入されました。このマシンは、インストールされているメモリ拡張に応じて、BASIC RAM を複数の異なる場所から開始できたためです。古いCommodore PETシリーズは再配置をサポートしていなかったため、同じ効果がありました。つまり、ファイルは保存されたメモリ領域と同じ場所にロードされました。ロード再配置はホストで行われ、セカンダリ アドレスがデバイス内部でのみ使用されるという上記の説明の例外となります。PET はファイルを再配置できないため、後期の Commodore マシンで作成された BASIC プログラムは、セクタ エディタを使用してヘッダー バイトを変更して修正する必要があります。また、ロード後に PET の内蔵マシン語モニタを使用して、BASIC プログラムのリンク アドレスを変更することも可能です。LOAD"FILE",8LOAD"FILE",8,1
このコマンドは、指定されたファイルメモリ位置からディスク上の最初のプログラムをロードします。これは、プラットフォームで最もよく使われるロードコマンドの1つであり、例えば、ほとんどの商用ソフトウェアを起動する方法です。注目すべき点は、ワイルドカード展開は、そのディスク上の他のファイルが以前にアクセスされていない場合にのみ、最初のカタログ名を選択するということです。最後に使用されたファイル名はメモリに保持され、後続のコマンドは最初のファイルではなく、そのファイルをロードします。(ただし、またはは常にディスク上の最初のファイルをロードします。)LOAD"*",8,1LOAD"*",8,1LOAD"0:*",8,1LOAD":*",8,1
2 台のドライブを持つユニットのディスクのディレクトリには、ととしてアクセスします。と はディレクトリ自体にはアクセスせず、 という名前のドライブ上の実際のファイルにアクセスします。 コロンとテンプレートを追加することで、部分的なディレクトリを読み込むことができます。たとえば、 は、名前が K で始まり、タイプが PRG のファイルのみを表示する部分的なディレクトリを読み込みます。このような部分的なディレクトリにはすべて、最初のディスク名行と最後の "BLOCKS FREE" 行が含まれています。LOAD"$0",8LOAD"$1",8"0:$""1:$""$"LOAD"$0:K*=P",8
Commodore DOS には「Save-with-Replace」コマンドもあり、既存のファイルを最初に削除する必要なく、既存のファイルに上書き保存できますSCRATCH。これは、または操作@中にファイル名の前にシンボルを追加することによって行われます。たとえば、。 4040 ドライブから始まり、何年もの間、このコマンドの実装にバグがあるという噂が広まりました。最初は、一部の評論家によって否定されました。バグの存在を証明するために賞が贈られました。[ 4 ] 1985 年初頭までに、Compute!誌は読者にこのコマンドの使用を避けるようアドバイスしました。[ 5 ]その年、さまざまな著者が独立して記事を発表し、Save-with-Replace バグが実在すること、およびそれをトリガーする方法を含めました。[ 4 ] [ 6 ] [ 7 ] [ 8 ]OPENSAVESAVE"@MY PROGRAM",8
影響を受けたデバイスには、シングルドライブの 1541 とデュアルドライブの 4040 が含まれていました。8050 と 8250 ではこの問題は発生しませんでした。[ 4 ]一部の評論家は、0:保存時に常にドライブ番号を明示的に指定することでこのバグを回避できると示唆しましたが、[ 6 ]後に、ドライブ番号なしのディスク操作でもこのバグが発生するのに十分であることが示されました。 [ 9 ]このバグは、影響を受けた DOS 実装が、8050 などの以前の Commodore PET デュアルドライブに含まれる DOS の修正バージョンであったことに起因していました。これ1:により、シングルドライブ システムで「ファントム ドライブ」が作成され、特定の条件下で不要なバッファが割り当てられることになりました。Save-with-Replace コマンドは 5 つのドライブ バッファすべてを使用し、「ファントム」バッファを割り当てる方法が仕様を満たしていなかったため、ディスクにスクランブルされたデータが書き込まれる可能性がありました。
1986 年 9 月、Philip A. Slaymaker は、バグの原因を詳細に説明し、1541 ドライブ ROM へのパッチを提供する記事[ 10 ]を発表しました。EPROMバーナーを備えたリーダーは、ドライブに交換できる独自のパッチ ROM を作成することができました。Commodore は Slaymaker の発見を認識し、オリジナルの 1541 の ROM の公式アップデートはリリースしませんでしたが、1571 ROM のリビジョン 5、および 1541-c と 1541-II ドライブの ROM でバグを修正しました。Commodore ではサポートされていませんが、EPROM を使用することで、1541-II ファームウェア (1541-c のファームウェアは除く) をオリジナルの 1541 ドライブで使用することもでき、そのドライブのバグも修正されることが知られています。
前述のとおり、Commodore DOS 自体には、ファイルへのアクセスに使用される構文と同様の構文を使用して、「コマンドチャネル」を介してアクセスします。DOS にコマンドを発行し、コマンドに応じて生成されたステータス メッセージやエラー メッセージを取得するには、セカンダリ アドレスとして 15 を使用してデバイスにファイルを開きます。例:
OPEN1,8,15デバイスの状態を取得して表示するには、次のようにコーディングできます。
OPEN1,8,15:INPUT#1,E,E$,T,S:PRINTE,E$,T,S:CLOSE1上記の例では、Eにはエラー番号(エラーが存在する場合。エラーがない場合はゼロ)が格納され、E$にはエラーの簡潔なテキスト説明、Tにはエラーが発生したディスクトラック、にはエラーが参照するSトラック上のセクターが格納されますT。エラーが存在しない場合は、 と同等の値になります。00,OK,00,004つの変数に格納されます。なお、これINPUT#は実行モード専用の動詞です。また、ディスクコマンドを多数発行するプログラムでは、プログラムの開始時にデバイスのコマンドチャネルにファイルを開き、プログラムが終了するまで閉じないのが一般的です。
Commodore BASIC バージョン 4.0 以降では、上記のコードの代わりにドライブの状態を取得するために使用できる擬似変数 が用意されていますDS$。この予約変数は以前のバージョンの BASIC では使用できないため、上記のようにコマンド チャネルを手動で読み取る必要があります。電源投入またはリセット直後には、DOS リビジョンが返されることに注意してください。たとえば、1541 の場合は が返されます。73,CBM DOS V2.6 1541,00,00エラーコード73はすべてのドライブモデルに共通しており、ドライブが電源オン状態にリセットされたかどうかを判断するために使用できます。
RELative 型ファイルでのシークを行うコマンド ( RECORD#)、複数のブロックレベルの直接アクセス コマンド ( BLOCK-READ、BLOCK-WRITE、BUFFER-POINTER)、ブロック管理 ( BLOCK-ALLOCATE、BLOCK-FREE)、ドライブ メモリの操作およびドライブのプロセッサ上でのプログラム コードの実行 ( MEMORY-WRITE、MEMORY-READ、MEMORY-EXECUTE、BLOCK-EXECUTE)、およびユーザー定義可能な関数 (USERおよび&コマンド) もあります。理論的にはユーザー定義可能な関数の一部は、DOS バージョン 1.0 以降で新しい機能にアクセスするために再利用されました。