[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]