Contributor: MARIUS ELLEN 
function PathTest(Pth:pchar):word;
assembler;
asm
 CLD; LES DI,Pth
 XOR AX,AX
 MOV CX,0FFFFH
 REPNE SCASB; NOT CX; JCXZ @NoAst; DEC DI; MOV DX,DI; STD
 MOV BX,CX; MOV SI,DI; MOV AL,'.'; REPNE SCASB; JNE @U
 OR AH,fcExtension
 INC DI; MOV DX,DI
@U: MOV CX,BX; MOV DI,SI; MOV AL,'\'; REPNE SCASB; JE @F
 MOV CX,BX; MOV DI,SI; MOV AL,':'; REPNE SCASB; JNE @G
@F: INC DI
@G: INC DI
 CMP DX,DI; JE @NoNam
 OR AH,fcFileName
@NoNam: MOV CX,BX; MOV DI,SI; MOV AL,'\'; REPNE SCASB; JNE @NoPth
 OR AH,fcDirectory
@NoPth: MOV CX,BX; MOV DI,SI; MOV AL,':'; REPNE SCASB; JNE @NoDrv
 OR AH,fcDrive
@NoDrv: MOV CX,BX; MOV DI,SI; MOV AL,'?'; REPNE SCASB; JNE @NoQst
 OR AH,fcWildcards
@NoQst: MOV CX,BX; MOV DI,SI; MOV AL,'*'; REPNE SCASB; JNE @NoAst
 OR AH,fcWildcards
@NoAst: MOV AL,AH
 XOR AH,AH
end;
function PathBuild(Dst,Pth,Nam,Ext:PChar):PChar;
assembler;
asm
 CLD
 PUSH DS
 XOR AL,AL
 XOR CX,CX; LES DI,Ext
 MOV DX,ES; AND DX,DX; JE @NoExt
 DEC CX; REPNE SCASB;
 NOT CX; DEC CX
@NoExt: PUSH CX
 XOR CX,CX; LES DI,Nam
 MOV DX,ES; AND DX,DX; JE @NoNam
 DEC CX; REPNE SCASB
 NOT CX; DEC CX
@NoNam: PUSH CX
 XOR CX,CX; LES DI,Pth
 MOV DX,ES; AND DX,DX; JE @NoPth
 DEC CX; REPNE SCASB
 NOT CX; DEC CX
@NoPth:
 LES DI,Dst
 MOV BX,DI
 LDS SI,Pth
 REP MOVSB
 LDS SI,Nam
 POP CX
 REP MOVSB
 LDS SI,Ext
 POP CX
 REP MOVSB
 STOSB
 MOV DX,ES
 MOV AX,BX
 POP DS
end;
procedure PathSplit(Pth,Dir,Nam,Ext:pchar);
assembler;
asm
 PUSH DS
 LES DI,Pth; CLD
 MOV CX,0FFFFH
 XOR AL,AL; REPNE SCASB; NOT CX; DEC DI; MOV BX,DI; STD
 MOV SI,CX; MOV DX,DI; MOV AL,'.'; REPNE SCASB; JNE @U
 INC DI; MOV BX,DI
@U: MOV CX,SI; MOV DI,DX; MOV AL,'\'; REPNE SCASB; JE @F
 MOV CX,SI; MOV DI,DX; MOV AL,':'; REPNE SCASB; JNE @G
@F: INC DI
@G: INC DI
 LDS SI,Pth; CLD
 MOV CX,fsDirectory
 SUB DI,SI; CMP DI,CX; JA @3; XCHG DI,CX
@3: LES DI,Dir; MOV AX,ES; AND AX,AX; JE @NoDir
 REP MOVSB; XOR AL,AL; STOSB
@NoDir: ADD SI,CX
 MOV CX,fsFilename
 MOV AX,BX; SUB AX,SI; CMP AX,CX; JA @4; XCHG AX,CX
@4: LES DI,Nam; MOV AX,ES; AND AX,AX; JE @NoNam
 REP MOVSB; XOR AL,AL; STOSB
@NoNam: ADD SI,CX
 MOV CX,fsExtension
 MOV AX,DX; SUB AX,SI; CMP AX,CX; JA @5; XCHG AX,CX
@5: LES DI,Ext; MOV AX,ES; AND AX,AX; JE @NoExt
 REP MOVSB; XOR AL,AL; STOSB
@NoExt: POP DS
end;
procedure PathSplitName(Pth,Dir,NamExt:pchar);
assembler;
asm
 PUSH DS
 LES DI,Pth; CLD
 MOV CX,0FFFFH
 XOR AL,AL; REPNE SCASB; NOT CX; DEC DI; STD
 MOV SI,CX; MOV BX,DI; MOV AL,'\'; REPNE SCASB; JE @F
 MOV CX,SI; MOV DI,BX; MOV AL,':'; REPNE SCASB; JNE @G
@F: INC DI
@G: INC DI
 LDS SI,Pth; CLD
 MOV CX,fsDirectory
 SUB DI,SI; CMP DI,CX; JA @3; XCHG DI,CX
@3: LES DI,Dir; MOV AX,ES; AND AX,AX; JE @NoDir
 REP MOVSB; XOR AL,AL; STOSB
@NoDir: ADD SI,CX
 MOV CX,fsFilename+fsExtension
 MOV AX,BX; SUB AX,SI; CMP AX,CX; JA @4; XCHG AX,CX
@4: LES DI,NamExt; MOV AX,ES; AND AX,AX; JE @NoNam
 REP MOVSB; XOR AL,AL; STOSB
@NoNam: POP DS
end;
{
Is't a pitty you did not include some cacheable reads/writes in your unit
ENHDOS. Also some functions could be included using USES windos. (Or my own
bputils ;-) Here's some cacheable stuff (also protected mode).
}
function fLargeRead(Handle:word;MemPtr:pointer;Size:longint):longint;
{read Size bytes from a file to Seg:0, return bytes read}
assembler;
var Sg:word absolute Handle;
asm
 PUSH DS
 MOV CX,8000ドル
 MOV BX,Handle
 MOV AX,SelectorInc
 MOV DI,Size.word[2]
 MOV SI,Size.word[0]
 MOV Sg,AX
 LDS DX,MemPtr
 AND DX,DX; JE @St
 MOV AX,267
@Er: {Halt(error)}
 POP DS
 PUSH AX
 CALL bpHaltNr
@Re: AND DI,DI; JNE @Do
 CMP SI,CX; JA @Do; MOV CX,SI
@Do: MOV AH,3ドルF; INT 21H; JC @Er
 SUB SI,AX; SBB DI,0
 SUB AX,CX; JNE @Eo
 ADD DX,CX; JNC @St
 MOV AX,DS; ADD AX,Sg; MOV DS,AX
@St: MOV AX,DI; XOR AX,SI; JNE @Re
@Eo: POP DS
 MOV AX,Size.word[0]; SUB AX,SI
 MOV DX,Size.word[2]; SBB DX,DI
@eX:
end;
function fLargeWrite(Handle:word;MemPtr:pointer;Size:longint):longint;
{write Size bytes to a file from Seg:0, return bytes written}
assembler;
var Sg:word absolute Handle;
asm
 PUSH DS
 MOV CX,8000ドル
 MOV BX,Handle
 MOV AX,SelectorInc
 MOV DI,Size.word[2]
 MOV SI,Size.word[0]
 MOV Sg,AX
 LDS DX,MemPtr
 AND DX,DX; JE @St
 MOV AX,267
 JMP @Er
@Wr: MOV AX,101
@Er: {Halt(error)}
 POP DS
 PUSH AX
 CALL bpHaltNr
@Re: AND DI,DI; JNE @Do
 CMP SI,CX; JA @Do; MOV CX,SI
@Do: MOV AH,40ドル; INT 21H; JC @Er
 SUB SI,AX; SBB DI,0
 SUB AX,CX; JNE @Wr
 ADD DX,CX; JNC @St
 MOV AX,DS; ADD AX,Sg; MOV DS,AX
@St: MOV AX,DI; XOR AX,SI; JNE @Re
@Eo: POP DS
 MOV AX,Size.word[0]; SUB AX,SI
 MOV DX,Size.word[2]; SBB DX,DI
@eX:
end;
 

AltStyle によって変換されたページ (->オリジナル) /