dos_compilers/Microsoft MASM v5/SAMPLES/MACRO.DOC
2024-07-04 12:37:35 -07:00

661 lines
18 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Calling Macros in DOS.INC and BIOS.INC
You are responsible for saving and restoring registers used in
macros. The "Registers used" field identifies registers to save.
Macros that accept address parameters use internal macros that
allow you to specify addresses in several ways. The macro
automatically identifies the type of the argument and handles it
appropriately. For example, assume the following declarations:
String DB "test$"
pString DW Str
fpString DD Str
Given these values, the macro @DispStr (which displays the string
at DS:DX) has the following effects:
Kind of argument Example Value loaded
Label of byte variable @DispStr String DS:OFFSET String
Near pointer variable @DispStr pString DS:pString
Far pointer variable @DispStr fpString fpString[2]:fpString[0]
Constant @DispStr 0 DS:0
Pointer in register @DispStr si DS:SI
Near Pointer with segment @DispStr pString,es ES:pString
Constant with segment @DispStr 0,es ES:0
Register with segment @DispStr di,es ES:DI
Note that if a far pointer or a segment is given, DS must be
saved before the macro call and restored afterward. Segments may
be given as registers, constants, or word variables.
In syntax, parameters enclosed in brackets are optional.
Paramaters sometimes have a leading symbol to indicate that the
argument must have a certain type, as shown below:
Leading Symbol Example Limitation
# #return Must be constant
& &vector Must be offset address as described above
$ $terminator May be constant or register, but not memory
Parameters with no leading symbol may be constants, registers, or
variables. Parameters are 16-bit except where noted in the description.
Symbols must be previously defined before they can be passed as
arguments to most of the DOS macros. Generally this means that
data must be declared before code in the source file.
DOS Macro Syntax and Description
KEYBOARD INPUT
@GetKey (01h, 07h, 08h, 0Ch)
Gets a keystroke from the keyboard
Syntax: @GetKey [#echo] [,[#break] [,#clearbuf]]
Arguments: echo = nonzero to echo keystroke - default yes
break = nonzero to accept Control-C - default yes
clearbuf = nonzero to clear keyboard buffer - default no
(Arguments may be omitted to get defaults)
Return: ASCII code of key in AL
Registers used: AX used for all, DL used if echo on and ctrl-c off
@GetStr (0Ah)
Gets a string from the keyboard
Syntax: @GetStr &buffer [,[$terminator] [,[#limit] [,segment]]]
Arguments: buffer = Offset of buffer where string will be stored
Byte 1 = Maximum length of string (before call)
Byte 2 = Actual length of string (after call)
Byte 3+ = Bytes of string
terminator = Terminating byte - usually null (0) or $ (24h)
limit = Maximum length of string (if not given as
argument, must be in buffer before macro call)
segment = Segment of buffer (DS if not given)
Return: Pointer to string in SI, length of string in BX
Registers used: AX, DX, BX, SI
OUTPUT
@DispCh (02h)
Displays one or more characters to screen
Syntax: @DispCh char [,char]...
Arguments: char = 8-bit ASCII code
Return: Code in AL
Registers used: AX and DL
@PrtCh (05h)
Prints one or more characters to LPT1
Syntax: @PrtCh char [,char]...
Arguments: char = 8-bit ASCII code
Return: Code in AL
Registers used: AX and DL
@DispStr (09h)
Displays a $-terminated string
Syntax: @DispStr &address [,segment]
Arguments: address = Address of string terminated by "$" (24h)
segment = Segment of address string (DS if not given)
Return: None
Registers used: AX and DS
DEVICE I/O
@Read (3Fh)
Reads data from a file or device
Syntax: @Read &buffer, length [,[handle] [,segment]]
Arguments: buffer = Offset of buffer where data will be stored
length = Length of data in bytes
handle = File or device handle; if none given,
keyboard (handle 0) is assumed
segment = Segment of address string (DS if not given)
Return: If carry clear, bytes read in AX
Registers used: Always AX, DX, BX, and CX; DS if segment changed
@Write (40h)
Writes data to a file or device
Syntax: @Write &buffer, length, [,[handle] [,segment]]
Arguments: buffer = Offset of buffer where data is stored
length = Length of data in bytes
handle = File or device handle; if none given, screen
(handle 1) is assumed
segment = Segment of address string (DS if not given)
Return: If carry clear, bytes written in AX
Registers used: Always AX, DX, BX, and CX; DS if segment changed
FILE CONTROL
@MakeFil (3Ch, 5Ah, 5Bh)
Creates a file
Syntax: @MakeFil &path [,[attrib] [,[segment] [,#kind]]]
Arguments: path = ASCIIZ string of file
attrib = File atrribute (0 is default if none given)
segment = Segment of address string (DS if not given)
kind = If none given, a file is always created even if
one already exists. Under DOS 3+ "tmp" can be
given to create a unique file or "new" to create
file only if one doesn't already exist.
Return: If carrry clear, file handle in AX
Registers used: Always AX, DX, and CX; DS if segment changed
@OpenFil (3Dh)
Opens a file for input or output
Syntax: @OpenFil &path, #access [,segment]
Arguments: path = ASCIIZ string of file
access = File access code
segment = Segment of address string (DS if not given)
Return: If carrry set, error code in AX
Registers used: Always AX and DX; DS if segment changed
@ClosFil (3Eh)
Closes an open file handle
Syntax: @ClosFil handle
Arguments: handle = Previously opened file handle
Return: If carrry set, error code in AX
Registers used: AX and BX
@DelFil (41h)
Deletes a specified file
Syntax: @DelFil &path [,segment]
Arguments: path = Offset of ASCIIZ filespec
segment = Segment of path (DS if none given)
Return: If carrry set, error code in AX
Registers used: AX and DX; DS if segment changed
@MoveFil (56h)
Moves or renames a file by changing its path specification.
Syntax: @MoveFil &old, &new [,[segold] [,segnew]]
Arguments: old = Offset of file spec to be renamed
new = Offset of new file spec
segold = Segment of old name (DS if none given)
segnew = Segment of new name (ES if none given)
Return: If carry set, error code in AX
Registers used: AX, DX, and DI; DS and ES if corresponding segments changed
@GetFirst (4Eh) and @GetNext (4Fh)
Parses file specifications (optionally including wild cards) into
file names
Syntax: @GetFirst &path [,[attribute] [,segment]]
@GetNext
Arguments: path = Offset of ASCIIZ filespec (can have wild cards)
attribute = File attribute to search for (0 for normal if
none given)
segment = Segment of path (DS if none given)
Return: If carrry set, error code in AX
Registers used: @GetFirst = AX, CX, and DX; DS if segment changed
@GetNext = AX only
@GetDTA (1Ah) and @SetDTA (2Fh)
Gets or sets the Disk Transfer Address (DTA)
Syntax: @GetDTA
@SetDTA &buffer [,segment]
Arguments: buffer = Offset of new DTA buffer
segment = Segment of new DTA buffer (DS if none given)
Return: @GetDTA = ES:BX points to DTA
@SetDTA = None
Registers used: AX for both; DS and DX for @SetDTA; ES and BX for @GetDTA
@GetFilSz (42h)
Gets the file size by moving the file pointer to end of the file.
Note that the file pointer is reset to zero. Thus this macro should
not be called during operations that move the pointer.
Syntax: @GetFilSz handle
Arguments: handle = Previously opened file handle
Return: If carrry clear, file length in DX:AX
Registers used: AX, BX, CX, and DX
@MovePrtAbs and @MovePtrRel (42h)
Moves the file pointer in an open file. The pointer can be moved to
an absolute position, or relative to its current position.
Syntax: @MovePrtAbs handle [,distance]
@MovePrtRel handle [,distance]
Arguments: handle = Previously opened file handle
distance = Distance to move pointer - must be a 16-bit
constant or a 16- or 32-bit variable; or
leave blank and set distance in CX:DX before
macro call
Return: If carrry clear, file pointer position in DX:AX
Registers used: AX, BX, CX, and DX
DIRECTORY CONTROL
@MkDir, (39h), @RmDir (3Ah), and @ChDir (3Bh)
Creates, deletes, or changes to the specified directory
Syntax: @MkDir &path [,segment]
@RmDir &path [,segment]
@ChDir &path [,segment]
Arguments: path = Offset of ASCIIZ string to
segment = Segment of path (DS if none given)
Return: If carrry set, error code in AX
Registers used: AX and DX; DS if segment changed
@GetDir (47h)
Returns the current directory of the specified drive
Syntax: @GetDir &path [,[drive] [,segment]]
Arguments: buffer = Offset of buffer to receive ASCIIZ directory
drive = 8-bit drive number - 0=current, 1=A, 2=B, etc.
(0 if none given)
segment = Segment of path (DS if none given)
Return: If carrry set, error code in AX
Registers used: AX, SI, and DL; DS if segment changes
DRIVE CONTROL
@GetDrv (0Eh) and @SetDrv (19h)
Gets or sets the current drive
Syntax: @GetDrv
@SetDrv drive
Argument: drive = 8-bit drive number (0=A, 1=B, etc.)
Return: @GetDrv = Drive number in AL (0=A, 1=B, etc.)
@SetDrv = Number of drives in AL
Registers used: AX for both; DL for @SetDrv
@ChkDrv (36h)
Gets various data about a disk
Syntax: @ChkDrv [drive]
Argument: drive = 8-bit drive number (0=current,A=1, B=2, etc.);
if none given, current assumed
Return: AX = Sectors per cluster (-1 if drive invalid)
BX = Available clusters
CX = Bytes per sector
DX = Clusters per drive
Registers used: AX, BX, CX, and DX
PROCESS CONTROL
@Exit (4Ch)
Exits to DOS with return code
Syntax: @Exit [#return]
Argument: return = 8-bit code to return to DOS; if none given,
AL is used
Return: None
Registers used: AX
@Exec (4Bh)
Executes a child process or an overlay
Syntax: @Exec path, params [,[segpath] [,[segparams] [,overlay]]]
Arguments: path = Offset of ASCIIZ filespec to be executed
params = Offset of process parameter block
segpath = Segment of filespec (DS if none given)
segparams = Segment of parameter block (ES if none given)
overlay = If not defined, normal process executed;
if defined, overlay executed
Return: If carry set, error code
Registers used: AX, SI, and DI; DS and ES if corresponding segments given
@GetRet (4Dh)
Gets the return code of a child process
Syntax: @GetRet
Argument: None
Return: Return code in AX
Register used: AX
@TSR (31h)
Terminates a program, but leaves it resident in memory
Syntax: @TSR paragraphs [,#return]
Arguments: return = Code to return to DOS; if none, AL used
paragraphs = Memory in paragraphs (16 bytes) to
allocate for resident program
Return: None
Registers used: AX and DX
MEMORY CONTROL
@FreeBlok (49h)
Frees a block of memory
Syntax: @FreeBlok [segment]
Argument: segment = Starting address of memory to be freed;
if none, ES address assumed
Return: If carry set, error code in AX
Register used: AX; ES if segment given
@GetBlok (48h)
Allocates a block of memory
Syntax: @GetBlok paragraphs
Argument: paragraphs = Paragraphs (16 bytes) of memory wanted
Return: AX and ES = Segment address of allocated memory
BX = Paragraphs actually allocated (may be
less than requested if memory is short)
Register used: AX and BX
@ModBlok (48h)
Modifies an allocated block of memory
Syntax: @ModBlok paragraphs [,segment]
Argument: paragraphs = Paragraphs (16 bytes) of memory wanted
segment = Starting address of memory to be freed;
if none, ES address assumed
Return: If carry set, error code in AX, else:
ES = Segment address of allocated memory
BX = If carry is clear, paragraphs allocated
Register used: AX and BX; ES if segment given
MISCELLANEOUS
@GetDate (2Ah) and @SetDate (2Bh)
Gets or sets the system date
Syntax: @GetDate
@SetDate month, day, year
Arguments: year = 16-bit year (1980-2099)
month = 8-bit month (1-12)
day = 8-bit day (1-31)
Return: For @GetDate:
AL = Day of week (0 = Sunday, 1 = Monday, etc.)
CX = Year (1980-2099)
DL = Month (1-12)
DH = Day (1-31)
For @SetDate:
AL = If date was valid 0, else -1
Registers used: AX, CX, and DX
@GetTime (2Ch) and @SetTime (2Dh)
Gets or sets the system time
Syntax: @GetTime
@SetTime hour,minute,second,hundredth
Arguments: hour = 8-bit hour (0-23)
minute = 8-bit hour (0-59)
second = 8-bit hour (0-59)
hundredth = 8-bit hour (0-99)
Return: For @GetTime:
CL = Hour (0-23)
CH = Minute (0-59)
DL = Second (0-59)
DH = Hundredth (0-99)
For @SetTime:
AL = If time was valid 0, else -1
Registers used: AX, CX, and DX
@GetVer (30h)
Gets the DOS version
Syntax: @GetVer
Argument: None
Return: AL = Major version (0 for versions prior to 2.0)
AH = Minor version
BH = OEM serial number
BL:CX = 24-bit user number
Register used: AX, BX, and CX
@GetInt (35h) and @SetInt (25h)
Gets or sets the vector for a specified interrupt routine
Syntax: @GetInt #interrupt
@SetInt #interrupt, &vector [,segment]
Arguments: interrupt = 8-bit interrupt number
vector = Offset of interrupt routine
segment = Segment of routine - if none given, DS assumed
for data; segment ignored for code labels
Return: @GetInt = None
@SetInt = ES:BX points to interrupt routine
Registers used: AX for both; ES and BX for @GetInt; DS and DS for @SetInt
BIOS Macro Syntax and Description
MODE, PAGE, AND COLOR CONTROL
@GetMode (I 10h F 0Fh)
Gets the current video mode and page
Syntax: @GetMode
Arguments: None
Return: AL = Mode
AH = Width in characters
BH = Page
Registers used: AX and BH
@SetMode (I 10h F 00h)
Gets the current video mode and page
Syntax: @SetMode mode
Arguments: mode = 8-bit video mode
Return: none
Registers used: AX
@SetColor (I 10h F 0Bh)
Sets the background color
Syntax: @SetColor color
Arguments: color = 8-bit background color (0-15);
border color in text modes
Return: none
Registers used: AX and BX
@SetPalet (I 10h F 0Bh)
Sets the color palette
Syntax: @SetPalet color
Arguments: color = 8-bit color palette (0-1 for modes 5 and 6)
Return: none
Registers used: AX and BX
@SetPage (I 10h F 05h)
Sets the video page
Syntax: @SetPage page
Arguments: page = 8-bit page number; 0-3 for modes 2 and 3
Return: none
Registers used: AX
CHARACTER AND CURSOR CONTROL
@GetCur (I 10h F 04h)
Gets the cursor position and size
Syntax: @GetCur [page]
Arguments: page = 8-bit page with cursor (if none, 0 assumed)
Return: DL = Column
DH = Row
CL = Starting scan line
CH = Ending scan line
Registers used: AX, DX, CX, and BH
@SetCurPos (I 10h F 02h)
Sets the cursor position
Syntax: @SetCurSz [column] [,[row] [,page]]
Arguments: column = 8-bit column; if none, DL used
row = 8-bit row; if none, DH used
page = 8-bit page with cursor (if none, 0 assumed)
Return: none
Registers used: AX, DX, and BH
@SetCurSz (I 10h F 01h)
Sets the cursor size and shape by specifying active scan lines. The
CGA adapter the lines are 0-7. The monochrome adapter has lines 0-13.
Syntax: @SetCurSz startline, endline
Arguments: startline = 8-bit starting scan line (default CGA=6; MA=12)
endline = 8-bit ending scan line (default CGA=7; MA=13)
Return: none
Registers used: AX and CX
@GetChAtr (I 10h F 08h)
Gets the character and attribute at the cursor location
Syntax: @GetChAtr [page]
Arguments: page = 8-bit page to check (if none, 0 assumed)
Return: AH = Attribute
AL = ASCII character
Registers used: AX and BH
@PutChAtr (I 10h F 09h) and @PutCh (I 10h F 0Ah)
Puts one or more characters and attributes at the current cursor
position. For @PutCh, the current attribute is used in text modes
and any specified attribute is ignored.
Syntax: @PutChAtr [character] [,[attrib] [,[page] [,count]]]
Arguments: character = 8-bit ASCII character to put; if none, AL used
attrib = 8-bit attribute to put; if none, BL used
page = 8-bit page to put on (if none, 0 assumed)
count = Number to put (if none, 1 assumed)
Return: AH = Attribute
AL = ASCII character
Registers used: AX, BX, CX
@Scroll (I 10h F 06h and 07h)
Scrolls a specified window up or down
Syntax: @Scroll dist [,[attr] [,[uprow [,[upcol [,[dnrow] [,dncol]]]]]
Arguments: dist = 8-bit number of lines to scroll; positive
scrolls down; negative scrolls up; 0 clears
attr = 8-bit attribute for blank lines (if none, 07h)
uprow = Upper left row (if none, CH used)
upcol = Upper left column (if none, CL used)
dnrow = Lower right row (if none, DH used)
dncol = Lower right column (if none, DL used)
Return: none
Registers used: AX, CX, DX, and BH
@Cls (I 10h F 06, 08h, and 02h)
Clears the screen of the current page
Syntax: @Cls
Arguments: None
Return: None
Registers used: AX, BX, CX, and DX