📄 dos.inc
字号:
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 + -