[Back to DOS SWAG index] [Back to Main SWAG index] [Original]
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,$3F; 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;
[Back to DOS SWAG index] [Back to Main SWAG index] [Original]