お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"フロッピーディスクの直接アクセス"





// DOSのINT25, INT26に相当するルーチンと、そのサンプルとして1ドラ
//イブでのフロッピーディスクコピープログラムをコンソールアプリで作って
//みました。以下のプログラムを2本に切り分け、同じディレクトリにおき、
//DELPHIからFDCOPY.DPRを開いてコンパイルしてください。
//確認は、DELPHI2.0です。
// なお、AドライブからAドライブへのコピーですから、DOS/Vマシン
//で、1.44Mタイプ専用の(手抜き)プログラムです。カレントディレク
//トリに'FDCOPY.TMP'というイメージファイルができます。
// #169 では、キーワードを付け忘れましたので再アップです。

------------------------------- FDCOPY.DPR -------------------------
program FDCOPY;

{$APPTYPE CONSOLE}

uses Windows, Absio ;

const   Nsect = 36 ;
const   Drv = 0 ;                           { A Drive Only }
const   FileName = 'FDCOPY.TMP' ;
const   Length = 18432 ;
const   SectNum = 2880 ;

function ChkFDD : Bool ;
var
   Buf : array [1..2048] of Char ;
   Sect : Integer ;
begin
    Result := True ;
    absread( Drv, 1, 0, Buf ) ;
    Sect := Ord( Buf[21]) * 256 + Ord( Buf[20] ) ;
    if Sect <> SectNum then begin
        Write( 'フロッピーが 1.44 Mタイプではありません!' ) ;
        Result := False ;
    end ;
end ;

var
    fl : file ;
    i : Integer ;
    LSect : Integer ;
    Sect : Integer ;
    Ask : String ;
    Buf : Array [1..Length] of Char ;
begin
    Write('コピー元フロッピーを A ドライブにいれてリターン');
    ReadLn( Ask ) ;

    if Not ChkFDD then Exit ;

    AssignFile( fl, FileName ) ;
    ReWrite( fl, 1 ) ;

    for i:= 0 to 79 do begin
        Lsect := i * NSect ;
        absread( Drv, Nsect, Lsect, Buf ) ;
        BlockWrite( fl, Buf, Length ) ;
    end ;
    CloseFile( fl ) ;

    Write('コピー先フロッピーを A ドライブにいれてリターン');
    ReadLn( Ask ) ;

    if Not ChkFDD then Exit ;

    AssignFile( fl, FileName ) ;
    Reset( fl, 1 ) ;

    for i := 0 to 79 do begin
        Lsect := i * NSect ;
        BlockRead( fl, Buf, Length ) ;
        abswrite( Drv, Nsect, Lsect, Buf ) ;
    end ;
    CloseFile( fl ) ;

end.

--------------------------- ABSIO.PAS -------------------------------

unit Absio ;

interface

uses Windows ;

function absread(   drive: Integer ;    { Drive 0:A 1:B 2:C .....}
                    nsects : Integer ;  { 読み込むセクター数 }
                    lsects : Integer ;  { 読込開始セクター番号 }
                    var Buffer          { 読込バッファ }
                ) : Word;

function abswrite(  drive: Integer ;    { Drive 0:A 1:B 2:C .....}
                    nsects : Integer ;  { 書込むセクター数 }
                    lsects : Integer ;  { 書込開始セクター番号 }
                    var Buffer          { 書込バッファ }
                 ) : Word;

implementation

const
    VWIN32_DIOC_DOS_IOCTL = 1 ;
    VWIN32_DIOC_DOS_INT25 = 2 ;
    VWIN32_DIOC_DOS_INT26 = 3 ;

type
  TDevIOCtrlRegs = packed record
    EBX: DWord;
    EDX: DWord;
    ECX: DWord;
    EAX: DWord;
    EDI: DWord;
    ESI: DWord;
    Flg: DWord;
  end;

{ フロッピーディスクの入力(int 25h) ルーチン }
function absread ;
var
  hDevice: THandle;
  Reg: TDevIOCtrlRegs;
  cb: DWord;
begin
  hDevice := CreateFile( '\\.\vwin32', 0, 0, nil, 0, 0, 0 );
  with Reg do begin
    EAX := drive ;
    EBX := DWORD(@Buffer) ;
    ECX := nsects ;
    EDX := lsects ;
  end;
  DeviceIOControl( hDevice, VWIN32_DIOC_DOS_INT25,
                   @Reg, SizeOf( Reg ), @Reg, SizeOf( Reg ),
                   cb, nil );
  result := ( Reg.EAX and $ffff );
  CloseHandle( hDevice );
end;


{ フロッピーディスクの出力(int 26h) ルーチン }
function abswrite ;
var
  hDevice: THandle;
  Reg: TDevIOCtrlRegs;
  cb: DWord;
begin
  hDevice := CreateFile( '\\.\vwin32', 0, 0, nil, 0, 0, 0 );
  with Reg do begin
    EAX := drive ;
    EBX := DWORD(@Buffer) ;
    ECX := nsects ;
    EDX := lsects ;
  end;
  DeviceIOControl( hDevice, VWIN32_DIOC_DOS_INT26,
                   @Reg, SizeOf( Reg ), @Reg, SizeOf( Reg ),
                   cb, nil );
  result := ( Reg.EAX and $ffff );
  CloseHandle( hDevice );
end;

end.

---------- END of Program -------------------------------------------

                                                    QZB02574 Dr.陳

Original document by Dr.陳           氏 ID:(QZB02574)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum