⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dos.inc

📁 mas for 8086 microprocessor
💻 INC
📖 第 1 页 / 共 3 页
字号:
ENDM

; 42h
@MovePtrRel MACRO handle:REQ, distance
    IFNB    <distance>
        __LdDub <distance>
    ENDIF
    mov     bx, handle
    mov     ax, 4201h
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @MkDir path [,segment]
;
;             @RmDir path [,segment]
;
;             @ChDir path [,segment]
;
;  Summary:   Creates, deletes, or changes to the specified directory
;
;  Arguments: <path>        Offset of ASCIIZ string containing
;                           directory. Must be offset address.
;
;             <segment>     Segment of path; DS if none given.
;
;  Returns:   If carry: set, error code in AX
;
;  Modifies:  AX, DX; DS if segment changed
;
;  Uses:      Interrupt 21h Function 39h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@MkDir MACRO path:REQ, segmnt
    __LdAdr dx, <path>
    IFNB    <segmnt>
        __LdSeg ds, <segmnt>
    ENDIF
    mov     ah, 39h
    int     21h
ENDM

; 3Ah
@RmDir MACRO path:REQ, segmnt
    __LdAdr dx, <path>
    IFNB    <segmnt>
        __LdSeg ds, <segmnt>
    ENDIF
    mov     ah, 3Ah
    int     21h
ENDM

; 3Bh
@ChDir MACRO path:REQ, segmnt
    __LdAdr dx, <path>
    IFNB    <segmnt>
        __LdSeg ds, <segmnt>
    ENDIF
    mov     ah, 3Bh
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetDir buffer [,[drive] [,segment]]
;
;  Summary:   Returns the current directory of the specified drive
;
;  Arguments: <buffer>      Offset of buffer to receive ASCIIZ
;                           directory. Must be an offset address.
;
;             <drive>       8-bit drive number (0 = current, 1 = A,
;                           2 = B, ...; 0 if none given).
;
;             <segment>     Segment of path; DS if none given.
;
;  Returns:   If carry: set, error code in AX
;
;  Modifies:  AX, SI, DL; DS if segment changes
;
;  Uses:      Interrupt 21h Function 47h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetDir MACRO buffer:REQ, drive, segmnt
    IFNB    <drive>
        mov     dl, drive
    ELSE
        sub     dl, dl
    ENDIF
    __LdAdr si, <buffer>
    IFNB    <segmnt>
        __LdSeg ds, <segmnt>
    ENDIF
    mov     ah, 47h
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetDrv
;
;             @SetDrv drive
;
;  Summary:   Gets or sets the current drive
;
;  Argument:  <drive>     8-bit drive number (0 = A, 1 = B, ...)
;
;  Returns:   For @GetDrv, drive number in AL (0 = A, 1 = B, ...);
;             for @SetDrv, number of drives in AL
;
;  Modifies:  AX for both; DL for @SetDrv
;
;  Uses:      Interrupt 21h Function 19h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetDrv MACRO
    mov     ah, 19h
    int     21h
ENDM

; 0Eh
@SetDrv MACRO drive:REQ
    mov     dl, drive
    mov     ah, 0Eh
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @ChkDrv [drive]
;
;  Summary:   Gets various data about a disk
;
;  Argument:  <drive>     8-bit drive number (0 = current, A = 1,
;                         B = 2, ...); if none given, current assumed
;
;  Returns:   AX     Sectors per cluster; -1 if drive invalid
;             BX     Available clusters
;             CX     Bytes per sector
;             DX     Clusters per drive
;
;  Modifies:  AX, BX, CX, DX
;
;  Uses:      Interrupt 21h Function 1Ch
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ChkDrv MACRO drive
    IFNB    <drive>
        mov     dl, drive
    ELSE
        sub     dl, dl
    ENDIF
    mov     ah, 1Ch
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @Exit [return]
;
;  Summary:   Exits to DOS with return code
;
;  Argument:  <return>     8-bit code to return to DOS; if none given,
;                          AL is used. If given, must be a constant.
;
;  Returns:   No return value
;
;  Modifies:  AX
;
;  Uses:      Interrupt 21h Function 4Ch
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@Exit MACRO return
    IFB     <return>
        mov     ah, 4Ch
    ELSE
        mov     ax, 4C00h + (return AND 0FFh)
    ENDIF
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @TSR paragraphs [,return]
;
;  Summary:   Terminates a program, but leaves it resident in memory
;
;  Arguments: <paragraphs>     Memory in paragraphs (16 bytes) to
;                              allocate for resident program.
;             <return>         Code to return to DOS; if none, AL used.
;                              Must be a constant.
;
;  Returns:   No return value
;
;  Modifies:  AX, DX
;
;  Uses:      Interrupt 21h Function 31h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@TSR MACRO paragraphs:REQ, return
    mov     dx, paragraphs
    IFB     <return>
        mov     ah, 31h
    ELSE
        mov     ax, 3100h + (return AND 0FFh)
    ENDIF
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @FreeBlock [segment]
;
;  Summary:   Frees a block of memory
;
;  Argument:  <segment>     Starting address of memory to be freed; if
;                           none given, ES address assumed
;
;  Returns:   If carry: set, error code in AX
;
;  Modifies:  AX; ES if segment given
;
;  Uses:      Interrupt 21h Function 49h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@FreeBlock MACRO segmnt
    IFNB    <segmnt>
        __LdSeg es, <segmnt>
    ENDIF
    mov     ah, 49h
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetBlock paragraphs [, retry]
;
;  Summary:   Allocates a block of memory
;
;  Argument:  <paragraphs>     Paragraphs (16 bytes) of memory wanted
;             <retry>          If nonzero, allocate largest block
;                              available
;
;  Returns:   AX     If carry: clear, the segment of the allocated
;                    memory. If carry: set, an error code
;             BX     Paragraphs actually allocated. If <retry> is not
;                    zero, it may be less than requested.
;
;  Modifies:  AX, BX
;
;  Uses:      Interrupt 21h Function 48h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetBlock MACRO graphs:REQ, retry:=<0>
    LOCAL   tryit
    mov     bx, graphs
    tryit:  mov     ah, 48h
    int     21h

    IF      retry
    jc  tryit
    ENDIF
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @ModBlock paragraphs [,segment]
;
;  Summary:   Modifies an allocated block of memory
;
;  Arguments: <paragraphs>     Paragraphs (16 bytes) of memory wanted.
;
;             <segment>        Starting address of memory to be freed; if
;                              none given, ES address assumed.
;
;  Returns:   If carry is set, the error code is returned in AX;
;               otherwise, the ES register contains the segment address of
;               allocated memory. If carry is clear, the BX register contains
;               the number of paragraphs allocated.
;
;  Modifies:  AX, BX; ES if segment given
;
;  Uses:      Interrupt 21h Function 4Ah
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ModBlock MACRO graphs:REQ, segmnt
    IFNB    <segmnt>
        __LdSeg es, <segmnt>
    ENDIF
    mov     bx, graphs
    mov     ah, 4Ah
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetDate
;
;  Summary:   Gets the system date
;
;  Arguments: None
;
;  Returns:   AL     Day of week (0 = Sunday, 1 = Monday, ...)
;             CX     Year (1980-2099)
;             DH     Month (1-12)
;             DL     Day (1-31)
;
;  Modifies:  AX, CX, DX
;
;  Uses:      Interrupt 21h Function 2Ah
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetDate MACRO
    mov     ah, 2Ah
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @SetDate month, day, year
;
;  Summary:   Sets the system date
;
;  Arguments: <month>     8-bit month (1-12)
;
;             <day>       8-bit day (1-31)
;
;             <year>      16-bit year (1980-2099)
;
;  Returns:   AL     If date was valid 0, else -1
;
;  Modifies:  AX, CX, DX
;
;  Uses:      Interrupt 21h Function 2Bh
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@SetDate MACRO month:REQ, day:REQ, year:REQ
    mov     cx, year
    mov     dh, month
    mov     dl, day
    mov     ah, 2Bh
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetTime
;
;  Summary:   Gets the system time
;
;  Arguments: None
;
;  Returns:   CH     Hour (0-23)
;             CL     Minute (0-59)
;             DH     Second (0-59)
;             DL     Hundredth (0-99)
;
;  Modifies:  AX, CX, DX
;
;  Uses:      Interrupt 21h Function 2Ch
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetTime MACRO
    mov     ah, 2Ch
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @SetTime hour,minute,second,hundredth
;
;  Summary:   Sets the system time
;
;  Arguments: <hour>          8-bit hours (0-23)
;
;             <minute>        8-bit minutes (0-59)
;
;             <second>        8-bit seconds (0-59)
;
;             <hundredth>     8-bit hundredth of seconds (0-99)
;
;  Returns:   AL     If time was valid 0, else -1
;
;  Modifies:  AX, CX, DX
;
;  Uses:      Interrupt 21h Function 2Dh
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@SetTime MACRO hour:REQ, minutes:REQ, seconds:REQ, hundredths:REQ
    mov     ch, hour
    mov     cl, minutes
    mov     dh, seconds
    mov     dl, hundredths
    mov     ah, 2Dh
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetVer
;
;  Summary:   Gets the DOS version
;
;  Arguments: None
;
;  Returns:   AL        Major version (0 for versions prior to 2.0)
;             AH        Minor version
;             BH        OEM serial number
;             BL:CX     24-bit user number
;
;  Modifies:  AX, BX, CX
;
;  Uses:      Interrupt 21h Function 30h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetVer MACRO
    mov     ah, 30h
    int     21h
ENDM

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Syntax:    @GetInt interrupt
;
;             @SetInt interrupt, vector [,segment]
;
;  Summary:   Gets or sets the vector for a specified interrupt
;             routine
;
;  Arguments: <interrupt>     8-bit interrupt number. Must be a
;                             constant.
;
;             <vector>        Offset of interrupt routine.
;
;             <segment>       Segment of routine; if none given, DS
;                             assumed for data; segment ignored for
;                             code labels.
;
;  Returns:   For @GetInt, ES:BX points to interrupt routine;
;             for @SetInt, no return value
;
;  Modifies:  AX for both; ES and BX for @GetInt; DS and DX for
;             @SetInt
;
;  Uses:      Interrupt 21h Function 35h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@GetInt MACRO   interrupt:REQ
    mov     ax, 3500h + (interrupt AND 0FFh)
    int     21h
ENDM

; 25h
@SetInt MACRO interrupt:REQ, vector:REQ, segmnt
    IF  (TYPE (vector) EQ NPVOID) OR (TYPE (vector) EQ FPVOID)
        mov     dx, OFFSET vector
        mov     ax, SEG vector
        mov     ds, ax
    ELSE
        __LdAdr dx, <vector>
        IFNB    <segmnt>
            __LdSeg ds, <segmnt>
        ENDIF
    ENDIF
    mov     ax, 2500h + (interrupt AND 0FFh)
    int     21h
ENDM

⌨️ 快捷键说明

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