📄 unitread.pas
字号:
unit Unitread;
interface
uses
SysUtils, WinTypes,WINPROCS, Messages, Classes, Graphics, Controls,
StdCtrls, Dialogs;
type
TRegs=packed record
edi, esi, ebp, RESERVED, ebx, edx, ecx, eax:Longint;
wFlags, es, ds, fs, gs, ip, cs, sp, ss:WORD;
end;
PRegs=^TRegs;
TDISKRW = packed record
len,res:byte;
SecCount,BufferOffset,BufferSegment:word;
SecLow,SecHigh:longint;
end;
PDISKRW=^TDISKRW;
function WJSReadDisk16(drv:byte;var DiskRW:TDISKRW):boolean;export;
function WJSWriteDisk16(drv:byte;var DiskRW:TDISKRW):boolean;export;
implementation
function RM_Int (bIntNum:byte;var RegStruct:TRegs):boolean;
var
r:boolean;
label END1;
begin
r:=false;
asm
pusha
push es
mov ax, 0300h { DPMI Simulate Real Mode Int }
mov bl, bIntNum { Number of the interrupt to simulate }
mov bh, 01h { Bit 0 = 1; all other bits must be 0 }
xor cx, cx { No words to copy }
les di, RegStruct
int 31h { Call DPMI }
jc END1 { CF set if error occurred }
mov r, TRUE
END1:
pop es
popa
end;
result:=r;
end;
function WJSReadDisk16(drv:byte;var DiskRW:TDISKRW):boolean;
var
callStruct:TRegs;
DiskRW_Bak,Buffer_Bak:longint;
DiskRW_WIN_SEG,DiskRW_DOS_SEG:word;
DiskRW_WIN:PDiskRW;
Buffer_WIN_SEG,Buffer_DOS_SEG:word;
Buffer_WIN:Pchar;
begin
fillchar(callStruct,sizeof(callstruct),0);
DiskRW_Bak:=GlobalDosAlloc(sizeof(TDiskRW));
DiskRW_WIN_SEG:=LOWORD(DiskRW_Bak);
DiskRW_DOS_SEG:=HIWORD(DiskRW_Bak);
DiskRW_WIN:=ptr(DiskRW_WIN_SEG,0);
Buffer_Bak:=GlobalDosAlloc(512*DiskRW.SecCount);
Buffer_WIN_SEG:=LOWORD(Buffer_Bak);
Buffer_DOS_SEG:=HIWORD(Buffer_Bak);
Buffer_WIN:=ptr(Buffer_WIN_SEG,0);
move(DiskRW, DiskRW_WIN^ ,sizeof(TDiskRW));
DiskRW_WIN^.BufferOffset:=0;
DiskRW_WIN^.BufferSegment:=Buffer_DOS_SEG;
{ callStruct.eax := $0201;
callStruct.ecx := $0001;
callStruct.edx := drv;
callStruct.ebx := 0;
callStruct.es := HIWORD(Dos);
result := RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
move( ptr(LOWORD(Dos),0)^ , ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^ , 512);
GlobalDosFree (LOWORD(Dos)); }
callStruct.eax := $4200;
callStruct.edx := drv;
callStruct.esi := 0;
callStruct.ds := DiskRW_DOS_SEG;
result:=RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
if result then
move( Buffer_WIN^ , ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^ , 512*DiskRW.SecCount);
GlobalDosFree (Buffer_WIN_SEG);
move(DiskRW_WIN^ ,DiskRW, sizeof(TDiskRW));
GlobalDosFree (DiskRW_WIN_SEG);
end;
function WJSWriteDisk16(drv:byte;var DiskRW:TDISKRW):boolean;
var
callStruct:TRegs;
DiskRW_Bak,Buffer_Bak:longint;
DiskRW_WIN_SEG,DiskRW_DOS_SEG:word;
DiskRW_WIN:PDiskRW;
Buffer_WIN_SEG,Buffer_DOS_SEG:word;
Buffer_WIN:Pchar;
begin
fillchar(callStruct,sizeof(callstruct),0);
DiskRW_Bak:=GlobalDosAlloc(sizeof(TDiskRW));
DiskRW_WIN_SEG:=LOWORD(DiskRW_Bak);
DiskRW_DOS_SEG:=HIWORD(DiskRW_Bak);
DiskRW_WIN:=ptr(DiskRW_WIN_SEG,0);
Buffer_Bak:=GlobalDosAlloc(512*DiskRW.SecCount);
Buffer_WIN_SEG:=LOWORD(Buffer_Bak);
Buffer_DOS_SEG:=HIWORD(Buffer_Bak);
Buffer_WIN:=ptr(Buffer_WIN_SEG,0);
move(DiskRW, DiskRW_WIN^ ,sizeof(TDiskRW));
move(ptr(DiskRW.BufferSegment,DiskRW.BufferOffset)^, Buffer_WIN^, 512*DiskRW.SecCount);
DiskRW_WIN^.BufferOffset:=0;
DiskRW_WIN^.BufferSegment:=Buffer_DOS_SEG;
callStruct.eax := $4300;
callStruct.edx := drv;
callStruct.esi := 0;
callStruct.ds := DiskRW_DOS_SEG;
result:=RM_Int ($13, callStruct) and (callstruct.wflags and 1<>1);
GlobalDosFree (Buffer_WIN_SEG);
move(DiskRW_WIN^ ,DiskRW, sizeof(TDiskRW));
GlobalDosFree (DiskRW_WIN_SEG);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -