dos_compilers/Microsoft MASM v5/INC/DOS.INC
2024-07-04 12:37:35 -07:00

481 lines
7.3 KiB
Plaintext

; DOS Interface Macros - Version 1.0 - for Microsoft Macro Assembler 5.0
; (C) Copyright Microsoft Corporation, 1987.
.XCREF
.XLIST
IF1
; Internal
__LdAdr MACRO reg,adr
IFE TYPE (adr)
mov reg,adr
ELSE
IF TYPE (adr) EQ 1
mov reg,OFFSET adr
ELSE
IF TYPE (adr) EQ 2
mov reg,adr
ELSE
IF TYPE (adr) EQ 4
lds reg,adr
ELSE
.ERR
%OUT Illegal argument
ENDIF
ENDIF
ENDIF
ENDIF
ENDM
; Internal
__LdSeg MACRO dest,src
IFE TYPE (src)
mov ax,src
mov dest,ax
ELSE
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
ELSE
IFIDNI <kind>,<new>
mov ah,5Bh
ELSE
mov ah,3Ch
ENDIF
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
ELSE
IF TYPE (dub) EQ 4
mov cx,dub[2]
mov dx,dub[0]
ELSE
IF TYPE (dub) EQ 0
sub cx,cx
mov dx,dub
ELSE
.ERR
%OUT Illegal argument
ENDIF
ENDIF
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
.CREF
.LIST