NEXTOR PR 03 12

From Z80 Machines Wiki
Jump to: navigation, search

3.12.ドライブレターをドライバとデバイスにマップする(_MAPDRV、7Ch)

パラメータ:C = 7CH(_MAPDRV)
             A =物理ドライブ(0 = A:、1 = B:など)
             B =実行するアクション
                 0:ドライブをアンマップする
                 1:ドライブをデフォルト状態にマップする
                 2:特定のマッピングデータを使用してドライブをマッピングする
             HL =マッピングデータを含む8バイトバッファのアドレス(B = 2の場合) 
結果:A =エラーコード 

デバイスベースのドライバ内で、ドライブ番号をデバイス番号、論理ユニット番号、および開始絶対デバイスセクタ番号の特定の組み合わせにマッピングできます。ドライブマッピングをデフォルトの状態(起動時の状態)に戻したり、ドライブのマッピングを完全に解除したりすることもできます。この機能はMSX-DOS 1モードでいくつかの制限があります(下記参照)。


入力時にB = 0の場合、ドライブはマップ解除されます。これは、その瞬間からドライブが利用できなくなり、それにアクセスしようとすると "Invalid drive"エラーが発生することを意味します。ドライブがすでにマップ解除されている場合は、何も起こらず、エラーも返されません。

入力でB = 1の場合、ドライブはデフォルト状態に戻ります。起動時にドライブの割り当てが解除されている(ドライバに割り当てられていない)、またはMSX-DOSドライバまたはドライブベースのドライバのドライブに割り当てられている場合、ドライブは同じ状態に戻ります。起動時にドライブがデバイスベースのドライバに割り当てられていた場合は、起動時に実行される自動マッピング手順と同じ規則を使用して、このドライブに対して自動割り当て手順が実行されます(自動マッピング手順については、ただしNEXTOR.DATファイルは検索されません。関連付けられているドライバにリムーバブルデバイスが存在するかどうか、および他のドライブの状態によっては、起動時と同じマッピングを持つドライブでもそうでなくてもかまいません。

B = 1を指定してこの関数を呼び出した結果の自動マッピング手順が失敗した場合(適切なデバイスまたはパーティションがないため)、以前のマッピング状態に関係なく、ドライブはマッピング解除されます。この場合、.IDEVLエラーが返されます。 入力でB = 2の場合、ドライブはHLによってバッファポインタに提供されたマッピングデータに従ってマッピングされます。この方法を使用すると、起動時にマップされていないドライブや別のドライバにマップされているドライブであっても、システムドライブをデバイスベースのドライバにマップすることができます。マッピングデータバッファの内容は次のとおりです。

 +0:ドライバスロット番号 
 +1:ドライバセグメント番号
     ドライバがNextorカーネルROMに組み込まれている場合はFFh
    (現在のバージョンでは常にFFhである必要があります) 
 +2:機器番号 
 +3:論理ユニット番号 
 +4から+7:開始セクター

指定されたドライバが存在しないかデバイスベースのドライバではない場合、.IDRVRエラーが返されます。指定されたデバイス番号と論理ユニット番号を持つデバイスがドライバに存在しない場合、.IDEVLエラーが返されます。このような場合、以前のドライブマッピングは変更されません。

指定されたドライブがH:でRAMディスクが存在する場合、.RAMDXエラーが返されます。

「開始セクタ」パラメータは、ドライブのセクタゼロとして使用されるデバイスの絶対セクタ番号です。通常、これは_GPART関数の呼び出しを介して取得されたデバイスパーティションの開始セクタです。ただし、指定されたセクタから始まる実際の(そしてNextorによって認識される)ファイルシステムの存在についてのチェックは行われません。有効なファイルシステムが見つからない場合、_MAPDRV関数は成功しますが、ドライブへの次のアクセスは "Not a DOS disk"というエラーを返します。

また、メディアを挿入していないリムーバブルデバイスにドライブを割り当てることもできます。この場合、_MAPDRV関数は成功しますが、ドライブへの次のアクセスは "Disk offline"エラーを返します。

2つのドライブを、ドライバ、デバイス、論理ユニット、および開始セクタの同じ組み合わせにマップすることはできません。これは、同期していないセクタバッファを処理した結果生じるデータ破損を防ぐためです。この場合、.IDEVLエラーが返されます。特定のマッピングのドライブレターを変更するには、最初に古いドライブレターをマップ解除する必要があります。

また、ドライブをMSX-DOSドライバまたはドライブベースのドライバに明示的にマッピングすることはできません。 ドライブのマッピング状態を変更する前に、そのドライブに関連して開いているファイルハンドルはすべてこの関数によって閉じられます。これは、これらのファイルハンドルごとにCLOSE関数呼び出しを呼び出すのと同じです。そのため、そのドライブにダーティバッファがあり、それらをデバイスにフラッシュするときにエラーが発生すると、ディスクエラーが発生する可能性があります。

MSX-DOS 1モードで起動した場合、この機能には以下の制限が適用されます。

  • 指定されたドライブは、起動時にデバイスベースのドライバにマップされている必要があります。ブート時に、マップされていないドライブ、またはMSX-DOSドライバまたはNextorドライブベースのドライバにマップされているドライブのマッピングを変更することはできません。
  • 新しいマッピング情報は、異なるパーティションやデバイスを指定することがありますが、ドライバスロットは起動時にドライブに割り当てられたものと同じである必要があります。システムにNextorカーネルが1つしかない場合、これは問題になりません。これらの制限は、Nextorアーキテクチャによって課されています。