mdos.mac

来自「汇编&c语言code」· MAC 代码 · 共 1,638 行 · 第 1/3 页

MAC
1,638
字号

;   FILENAME: MDOS.MAC
;
;   Copyright (c) 1988, 1990 by Borland International, Inc.
;
;   DESCRIPTION: This include file contains various macros that may
;   be used to communicate with DOS. This include file uses Masm mode
;   syntax. For documentation on each of the macros in this file see the
;   file DOSMAC.DOC.
;
;   NOTE: In order to use this macro file you must also include the files:
;   MMACROS.MAC, KBD.INC, and DOS.INC in your module.


Terminate10Program  macro
    DosCall <DOS_PROGRAM_TERMINATE>
endm

ReadKBDEcho macro
    DosCall <DOS_READ_KBD_ECHO>
endm

CharacterOutput macro   Character
    ifb <Character>
        display "Caller must provide Character parameter to CharacterOutput."
        err
    else
        mov     dl, Character
        DosCall <DOS_WRITE_CHARACTER>
    endif
endm

AuxiliaryInput  macro
    DosCall <DOS_AUXILIARY_INPUT>
endm

AuxiliaryOutput macro   Character
    ifb <Character>
        display "Caller must provide Character parameter to AuxiliaryOutput."
        err
    else
        mov     dl, <Character>
        DosCall <DOS_AUXILIARY_OUTPUT>
    endif
endm

PrinterOutput   macro   Character
    ifb <Character>
        display "Caller must provide Character parameter to PrinterOutput."
        err
    else
        mov     dl, <Character>
        DosCall <DOS_PRINTER_OUTPUT>
    endif
endm

ConsoleIO   macro   Value
    ifb <Value>
        display "Caller must provide the Value parameter to ConsoleIO."
        err
    else
        mov     dl, Value
        DosCall <DOS_CONSOLE_IO>
    endif
endm

UnfilteredCharInput macro
    DosCall <DOS_UNFILTERED_INPUT>
endm

CharInputNoEcho macro
    DosCall <DOS_CHARACTER_INPUT>
endm

WriteString macro   StringSeg, StringOfs
    ErrMsg  macro
        display "You must provide the string address parameters to WriteString."
        err
    endm

    ifb <StringSeg>
        ErrMsg
    else
        ifb <StringOfs>
            ErrMsg
        else
            ifidni  <StringSeg>, <ds>
                ; Do nothing
            else
                LoadSegment <ds>, <StringSeg>
            endif
            mov     dx, StringOfs
            DosCall DOS_WRITE_STRING
        endif
    endif
endm

BufferedInput   macro   StringSeg, StringOfs
    ErrMsg  macro
        display "Caller must provide the address parameters to BufferedInput."
        err
    endm

    ifb <StringSeg>
        ErrMsg
    else
        ifb <StringOfs>
            ErrMsg
        else
            ifidni  <ds>, <StringSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <StringSeg>
            endif
            mov     dx, StringOfs
            DosCall <DOS_BUFFERED_INPUT>
        endif
    endif
endm

GetInputStatus  macro
    DosCall <DOS_GET_INPUT_STATUS>
endm

ResetInputBuffer    macro   Function, StringSeg, StringOfs
    ifb <Function>
        display "Caller must provide the Function parameter to ResetInputBuffer."
        err
    else
        ifb <StringSeg>
            mov     al, Function
        else
            ifb <StringOfs>
                display "Caller must provide the StringOfs parameter to ResetInputBuffer."
                err
            else
                ifidni  <ds>, <StringSeg>
                    ; Do nothing
                else
                    LoadSegment <ds>, <StringSeg>
                endif
                mov     dx, StringOfs
            endif
        endif
        DosCall <DOS_RESET_INPUT>
    endif
endm

ResetDisk   macro
    DosCall <DOS_DISK_RESET>
endm

ChangeDrive macro   Drive
    ifb <Drive>
        display "You must provide the Drive parameter to ChangeDrive."
        err
    else
        mov     dl, Drive
        DosCall DOS_CHANGE_DISK_DRIVE
    endif
endm

OpenFCBFile macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to OpenFCBFile."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_OPEN_FCB_FILE>
        endif
    endif
endm

CloseFCBFile    macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to CloseFCBFile."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_CLOSE_FCB_FILE>
        endif
    endif
endm

FindFirstFCB    macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to FindFirstFCB."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_FIND_FIRST_FCB>
        endif
    endif
endm

FindNextFCB macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to FindNextFCB."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_FIND_NEXT_FCB>
        endif
    endif
endm

DeleteFCBFile   macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to DeleteFCBFile."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_DELETE_FCB_FILE>
        endif
    endif
endm

SequentialFCBRead   macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to SequentialFCBRead."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_SEQUENTIAL_READ>
        endif
    endif
endm

SequentialFCBWrite  macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to SequentialFCBWrite."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_SEQUENTIAL_WRITE>
        endif
    endif
endm

CreateFCBFile   macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to CreateFCBFile."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_CREATE_FCB_FILE>
        endif
    endif
endm

RenameFCBFile   macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to RenameFCBFile."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_RENAME_FCB_FILE>
        endif
    endif
endm

GetDrive    macro
    DosCall <DOS_GET_DISK_DRIVE>
endm

SetDTA  macro   DTASeg, DTAOfs
    ErrMsg  macro
        display "You must provide the DTASeg:DTAOfs parameters to SetDTA."
        err
    endm

    ifb <DTASeg>
        ErrMsg
    else
        ifb <DTAOfs>
            ErrMsg
        else

            ; First check if the parameter is a register. If it is then
            ; push it and pop the value into ds. If not check if it's a
            ; constant or variable and act accordingly.

            ifidni  <ds>, <DTASeg>
                ; Do nothing
            else
                LoadSegment <ds>, <DTASeg>
            endif
            mov     dx, DTAOfs              ; Get offset of DTA
            DosCall DOS_SET_DTA             ; Set new DTA address
        endif
    endif
endm

DefaultDiskAllocation   macro
    DosCall <DOS_DEFAULT_DRIVE_INFO>
endm

DiskAllocation  macro   Drive
    ifb <Drive>
        display "Caller must provide Drive parameter to DiskAllocation."
        err
    else
        mov     dl, Drive
        DosCall <DOS_DRIVE_INFO>
    endif
endm

RandomFCBRead   macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to RandomFCBRead."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_RANDOM_READ>
        endif
    endif
endm

RandomFCBWrite  macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to RandomFCBWrite."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_RANDOM_WRITE>
        endif
    endif
endm

GetFCBFileSize  macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to GetFCBFileSize."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_GET_FILE_SIZE>
        endif
    endif
endm

SetFCBFileRecord    macro   FCBSeg, FCBOfs
    ErrMsg  macro
        display "Caller must provide FCB address to SetFCBFileRecord."
        err
    endm

    ifb <FCBSeg>
        ErrMsg
    else
        ifb <FCBOfs>
            ErrMsg
        else
            ifidni  <ds>, <FCBSeg>
                ; Do nothing
            else
                LoadSegment <ds>, <FCBSeg>
            endif
            mov     dx, FCBOfs
            DosCall <DOS_SET_RECORD_NUMBER>
        endif
    endif
endm

SetVector   macro   Vector, VectorSeg, VectorOfs
    ErrMsg  macro
        display "You must provide the Vector, VectorSeg and VectorOfs parameters to SetVector."
        err
    endm

    ifb <Vector>
        ErrMsg
    else
        ifb <VectorSeg>
            ErrMsg
        else
            ifb <VectorOfs>
                ErrMsg
            else
                ifidni  <ds>, <VectorSeg>
                    ; Do nothing
                else
                    LoadSegment <ds>, <VectorSeg>
                endif
                mov     dx, VectorOfs
                mov     al,Vector        ; Load the number of the vector
                DosCall DOS_SET_VECTOR
            endif
        endif
    endif
endm

CreatePSP   macro   PSPSeg
    ifb <PSPSeg>
        display "Caller must provide PSPSeg parameter to CreatePSP."
        err
    else
        mov     dx, <PSPSeg>
        DosCall <DOS_CREATE_PSP>
    endif
endm

RandomFCBBlockRead  macro   FCBSeg, FCBOfs, Count

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?