mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
524 lines
9.1 KiB
524 lines
9.1 KiB
; DOS Interface Macros - Version 1.0 - for Microsoft Macro Assembler 5.0
|
|
; (C) Copyright Microsoft Corporation, 1987, 1988.
|
|
|
|
.XCREF
|
|
.XLIST
|
|
IF1
|
|
; Internal
|
|
__LdAdr MACRO reg, adr
|
|
IF (.TYPE (adr)) AND 00010000b ;; Register
|
|
mov reg, adr
|
|
ELSEIF (.TYPE (adr)) AND 00000100b ;; Constant
|
|
mov reg, adr
|
|
ELSEIF TYPE (adr) EQ 1 ;; Bytes
|
|
mov reg, OFFSET adr
|
|
ELSEIF TYPE (adr) EQ 2 ;; Near pointer
|
|
mov reg, adr
|
|
ELSEIF TYPE (adr) EQ 4 ;; Far pointer
|
|
lds reg, adr
|
|
ELSE
|
|
.ERR
|
|
%OUT Illegal argument
|
|
ENDIF
|
|
ENDM
|
|
|
|
; Internal
|
|
__LdSeg MACRO dest, src
|
|
IFIDNI <src>, <es> ;; Segment register
|
|
mov ax, src
|
|
mov dest, ax
|
|
ELSEIFIDNI <src>, <ss>
|
|
mov ax, src
|
|
mov dest, ax
|
|
ELSEIFIDNI <src>, <ds>
|
|
mov ax, src
|
|
mov dest, ax
|
|
ELSEIFIDNI <src>, <ds>
|
|
mov ax, src
|
|
mov dest, ax
|
|
ELSEIF (.TYPE (src)) AND 00000100b ;; Constant
|
|
mov ax, src
|
|
mov dest, ax
|
|
ELSE ;; Memory or general register
|
|
mov dest, src
|
|
ENDIF
|
|
ENDM
|
|
|
|
; 01h, 07h, 08h, 0Ch
|
|
@GetKey MACRO echo, cc, clear
|
|
LOCAL funct, disp
|
|
IFDIF <echo>, <0>
|
|
IFDIF <cc>, <0>
|
|
funct = 01h
|
|
ELSE
|
|
funct = 07h
|
|
disp = 02h
|
|
ENDIF
|
|
ELSE
|
|
IFDIF <cc>, <0>
|
|
funct = 08h
|
|
ELSE
|
|
funct = 07h
|
|
ENDIF
|
|
ENDIF
|
|
IFB <clear>
|
|
mov ah, funct
|
|
ELSE
|
|
IFIDN <clear>, <0>
|
|
mov ah, funct
|
|
ELSE
|
|
mov ah, 0Ch
|
|
mov al, funct
|
|
ENDIF
|
|
ENDIF
|
|
int 21h
|
|
IFDEF disp
|
|
mov dl, al
|
|
mov ah, disp
|
|
int 21h
|
|
ENDIF
|
|
ENDM
|
|
|
|
; 0Ah
|
|
@GetStr MACRO ofset, terminator, limit, segmnt
|
|
__LdAdr dx, <ofset>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 0Ah
|
|
mov si, dx
|
|
IFNB <limit>
|
|
mov BYTE PTR [si], limit
|
|
ENDIF
|
|
int 21h
|
|
inc si
|
|
mov bl, [si]
|
|
sub bh, bh
|
|
inc si
|
|
IFNB <terminator>
|
|
mov BYTE PTR [bx+si], terminator
|
|
ENDIF
|
|
ENDM
|
|
|
|
; 02h
|
|
@DispCh MACRO ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10
|
|
mov ah, 02h
|
|
IRP char, <ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10>
|
|
IFB <char>
|
|
EXITM
|
|
ENDIF
|
|
mov dl, char
|
|
int 21h
|
|
ENDM
|
|
ENDM
|
|
|
|
; 05h
|
|
@PrtCh MACRO ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10
|
|
mov ah, 05h
|
|
IRP char, <ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10>
|
|
IFB <char>
|
|
EXITM
|
|
ENDIF
|
|
mov dl, char
|
|
int 21h
|
|
ENDM
|
|
ENDM
|
|
|
|
; 09h
|
|
@DispStr MACRO ofset, segmnt
|
|
__LdAdr dx, <ofset>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 9
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Fh
|
|
@Read MACRO ofset, bytes, handle, segmnt
|
|
IFNB <handle>
|
|
mov bx, handle
|
|
ELSE
|
|
sub bx, bx
|
|
ENDIF
|
|
mov cx, bytes
|
|
__LdAdr dx, <ofset>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 3Fh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 40h
|
|
@Write MACRO ofset, bytes, handle, segmnt
|
|
IFNB <handle>
|
|
mov bx, handle
|
|
ELSE
|
|
mov bx, 1
|
|
ENDIF
|
|
mov cx, bytes
|
|
__LdAdr dx, <ofset>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 40h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Ch
|
|
@MakFil MACRO path, atrib, segmnt, kind
|
|
IFB <atrib>
|
|
sub cx, cx
|
|
ELSE
|
|
mov cx, atrib
|
|
ENDIF
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
IFIDNI <kind>, <tmp>
|
|
mov ah, 5Ah
|
|
ELSEIFIDNI <kind>, <new>
|
|
mov ah, 5Bh
|
|
ELSE
|
|
mov ah, 3Ch
|
|
ENDIF
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Dh
|
|
@OpenFil MACRO path, access, segmnt
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ax, 3D00h + (access AND 0FFh)
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Eh
|
|
@ClosFil MACRO handle
|
|
mov bx, handle
|
|
mov ah, 3Eh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 41h
|
|
@DelFil MACRO path, segmnt
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 41h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 56h
|
|
@MoveFil MACRO old, new, segold, segnew
|
|
__LdAdr dx, <old>
|
|
__LdAdr di, <new>
|
|
IFNB <segold>
|
|
__LdSeg ds, <segold>
|
|
ENDIF
|
|
IFNB <segnew>
|
|
__LdSeg es, <segnew>
|
|
ENDIF
|
|
mov ah, 56h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 4Eh
|
|
@GetFirst MACRO path, atrib, segmnt
|
|
IFNB <atrib>
|
|
mov cx, atrib
|
|
ELSE
|
|
sub cx, cx
|
|
ENDIF
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 4Eh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 4Fh
|
|
@GetNext MACRO
|
|
mov ah, 4Fh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 2Fh
|
|
@GetDTA MACRO
|
|
mov ah, 2Fh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 1Ah
|
|
@SetDTA MACRO buffer, segmnt
|
|
__LdAdr dx, <buffer>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 1Ah
|
|
int 21h
|
|
ENDM
|
|
|
|
; Internal
|
|
__LdDub MACRO dub
|
|
IF TYPE (dub) EQ 2
|
|
sub cx, cx
|
|
mov dx, dub
|
|
ELSEIF TYPE (dub) EQ 4
|
|
mov cx, dub[2]
|
|
mov dx, dub[0]
|
|
ELSEIF TYPE (dub) EQ 0
|
|
sub cx, cx
|
|
mov dx, dub
|
|
ELSE
|
|
.ERR
|
|
%OUT Illegal argument
|
|
ENDIF
|
|
ENDM
|
|
|
|
; 42h
|
|
@GetFilSz MACRO handle
|
|
mov bx, handle
|
|
sub cx, cx
|
|
sub dx, dx
|
|
mov ax, 4202h
|
|
int 21h
|
|
push dx
|
|
push ax
|
|
sub dx, dx
|
|
mov ax, 4200h
|
|
int 21h
|
|
pop ax
|
|
pop dx
|
|
ENDM
|
|
|
|
; 42h
|
|
@MovePtrAbs MACRO handle, distance
|
|
IFNB <distance>
|
|
__LdDub <distance>
|
|
ENDIF
|
|
mov bx, handle
|
|
mov ax, 4200h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 42h
|
|
@MovePtrRel MACRO handle, distance
|
|
IFNB <distance>
|
|
__LdDub <distance>
|
|
ENDIF
|
|
mov bx, handle
|
|
mov ax, 4201h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 39h
|
|
@MkDir MACRO path, segmnt
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 39h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Ah
|
|
@RmDir MACRO path, segmnt
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 3Ah
|
|
int 21h
|
|
ENDM
|
|
|
|
; 3Bh
|
|
@ChDir MACRO path, segmnt
|
|
__LdAdr dx, <path>
|
|
IFNB <segmnt>
|
|
__LdSeg ds, <segmnt>
|
|
ENDIF
|
|
mov ah, 3Bh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 47h
|
|
@GetDir MACRO buffer, 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
|
|
|
|
; 19h
|
|
@GetDrv MACRO
|
|
mov ah, 19h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 0Eh
|
|
@SetDrv MACRO drive
|
|
mov dl, drive
|
|
mov ah, 0Eh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 36h
|
|
@ChkDrv MACRO drive
|
|
IFNB <drive>
|
|
mov dl, drive
|
|
ELSE
|
|
sub dl, dl
|
|
ENDIF
|
|
mov ah, 36h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 4Ch
|
|
@Exit MACRO return
|
|
IFB <return>
|
|
mov ah, 4Ch
|
|
ELSE
|
|
mov ax, 4C00h + (return AND 0FFh)
|
|
ENDIF
|
|
int 21h
|
|
ENDM
|
|
|
|
; 4Bh
|
|
@Exec MACRO path, parms, segpath, segparms, overlay
|
|
__LdAdr dx, <path>
|
|
__LdAdr bx, <parms>
|
|
IFNB <segpath>
|
|
__LdSeg ds, <segpath>
|
|
ENDIF
|
|
IFNB <segparms>
|
|
__LdSeg es, <segparms>
|
|
ENDIF
|
|
IFB <overlay>
|
|
mov ax, 4B00h
|
|
ELSE
|
|
mov ax, 4B03h
|
|
ENDIF
|
|
int 21h
|
|
ENDM
|
|
|
|
; 4Dh
|
|
@GetRet MACRO
|
|
mov ah, 4Dh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 31h
|
|
@TSR MACRO paragraphs, return
|
|
mov dx, paragraphs
|
|
IFB <return>
|
|
mov ah, 31h
|
|
ELSE
|
|
mov ax, 3100h + (return AND 0FFh)
|
|
ENDIF
|
|
int 21h
|
|
ENDM
|
|
|
|
; 49h
|
|
@FreeBlok MACRO segmnt
|
|
IFNB <segmnt>
|
|
__LdSeg es, <segmnt>
|
|
ENDIF
|
|
mov ah, 49h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 48h
|
|
@GetBlok MACRO graphs
|
|
LOCAL tryit
|
|
mov bx, graphs
|
|
tryit: mov ah, 48h
|
|
int 21h
|
|
jc tryit
|
|
ENDM
|
|
|
|
; 4Ah
|
|
@ModBlok MACRO graphs, segmnt
|
|
IFNB <segmnt>
|
|
__LdSeg es, <segmnt>
|
|
ENDIF
|
|
mov bx, graphs
|
|
mov ah, 4Ah
|
|
int 21h
|
|
ENDM
|
|
|
|
; 2Ah
|
|
@GetDate MACRO
|
|
mov ah, 2Ah
|
|
int 21h
|
|
ENDM
|
|
|
|
; 2Bh
|
|
@SetDate MACRO month, day, year
|
|
mov cx, year
|
|
mov dh, month
|
|
mov dl, day
|
|
mov ah, 2Bh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 2Ch
|
|
@GetTime MACRO
|
|
mov ah, 2Ch
|
|
int 21h
|
|
ENDM
|
|
|
|
; 2Dh
|
|
@SetTime MACRO hour, minutes, seconds, hundredths
|
|
mov ch, hour
|
|
mov cl, minutes
|
|
mov dh, seconds
|
|
mov dl, hundredths
|
|
mov ah, 2Dh
|
|
int 21h
|
|
ENDM
|
|
|
|
; 30h
|
|
@GetVer MACRO
|
|
mov ah, 30h
|
|
int 21h
|
|
ENDM
|
|
|
|
; 35h
|
|
@GetInt MACRO interrupt
|
|
mov ax, 3500h + (interrupt AND 0FFh)
|
|
int 21h
|
|
ENDM
|
|
|
|
; 25h
|
|
@SetInt MACRO interrupt, vector, segmnt
|
|
IF TYPE (vector) GE 0FFFEh
|
|
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
|
|
|
|
ENDIF ; Pass 1
|
|
.CREF
|
|
.LIST
|