;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ASSEMBLE.MAC ;; ;; SAMPLE MACRO LIBRARY FOR THE IBM PC MACRO ASSEMBLER ;; ;; (C) COPYRIGHT 1983 ;; ;; BY ;; ;; JERRY D. STUCKLE ;; ;; ;; ;; (88) by LUCIEN GISCLONG ET ALAIN BOURET / PUBLIC DOMAIN RELEASE ;; ;; 01/05/88 13:48:23 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;***************************************************************************;; ;; MACRO: DOSCALL ;; ;; DESCRIPTION: SET UP AND EXECUTE REQUESTED DOS FUNCTION CALL ;; ;; PARAMATERS: FUNCTION TO BE CALLED ;; ;; INPUT: NONE ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX ;; ;;***************************************************************************;; DOSCALL MACRO FUNCTION MOV AH,FUNCTION ;GET FUNCTION IN AH INT 21H ;DOS CALL ENDM ;;***************************************************************************;; ;; MACRO: SAVE ;; ;; DESCRIPTION: SAVE REGISTERS ON THE STACK ;; ;; PARAMATERS: REGISTERS TO BE SAVED ;; ;; INPUT: NONE ;; ;; OUTPUT: REGISTERS SAVED ON STACK ;; ;; REGISTERS USED: NONE ;; ;;***************************************************************************;; SAVE MACRO R1,R2,R3,R4,R5,R6,R7,R8,R9,R10 IRP RX, ;REPEAT FOR EACH PARM IFNB ;IF THIS PARM NOT BLANK PUSH RX ;SAVE THE REGISTER ENDIF ;END IFNB ENDM ;END IRP ENDM ;;***************************************************************************;; ;; MACRO: RESTORE ;; ;; DESCRIPTION: RESTORE REGISTERS FROM STACK ;; ;; PARAMATERS: REGISTERS TO BE RESTORED (TRANSPARENT, IN REVERSE ORDER) ;; ;; INPUT: NONE (IN NORMAL ORDER) ;; ;; OUTPUT: RESTORED REGISTERS ;; ;; REGISTERS USED: NONE ;; ;;***************************************************************************;; RESTORE MACRO R1,R2,R3,R4,R5,R6,R7,R8,R9,R10 IRP RX, ;REPEAT FOR EACH PARM IFNB ;IF THIS PARM NOT BLANK POP RX ;POP THE REGISTER ENDIF ;END IFNB ENDM ;END IRP ENDM ;;***************************************************************************;; ;; MACRO: MOVES ;; ;; DESCRIPTION: MULTIPLE BYTE MOVE ;; ;; PARAMATERS: TO LOCATION, FROM LOCATION, LENGTH (OPT.) ;; ;; INPUT: SOURCE STRING ;; ;; OUTPUT: DESTINATION STRING ;; ;; REGISTERS USED: CX,SI,DI (ES ASSUMED POINTING TO DESTINATION SEGMENT) ;; ;;***************************************************************************;; MOVES MACRO TO,FROM,LNGTH LOCAL MOVELP CLEAR CH ;CLEAR LENGTH REG IFB ;IF NO LENGTH REQUESTED MOV CX,LENGTH TO ;USE LENGTH OF TO STRING ELSE ;IF LENGTH REQUESTED MOV CX,LNGTH ;USE LENGTH IN MACRO ENDIF IFDIF , ;IF DI NOT SPECIFIED FOR TO LEA DI,TO ;LOAD TO ADDRESS INTO DI ENDIF IFDIF , ;IF SI NOT SPECIFIED FOR FROM LEA SI,FROM ;LOAD FROM ADDRESS INTO SI ENDIF CLD ;CLEAR DIRECTION FLAG REP MOVSB ;MOVE THE DATA ENDM ;;***************************************************************************;; ;; DS:DX ON THE NEW DTA OR PATH ;; ;; REGISTERS USED: DX ;; ;;***************************************************************************;; SETDTA MACRO PATH IFNB LEA DX,PATH ENDIF SAVE AX DOSCALL 1AH ;DOS PRINT STRING FUNCTION RESTORE AX ENDM ;;***************************************************************************;; ;; MACRO: SETINT ;; ;; DESCRIPTION: SET INTERRUPT VECTOR ;; ;; PARAMATERS: INTERRUPT VECTOR, INTERRUPT ROUTINE ADDRESS ;; ;; INPUT: NONE ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,DX ;; ;;***************************************************************************;; SETINT MACRO INTERRUPT,ROUTINE MOV AL,INTERRUPT ;GET INTERRUPT TO BE SET LEA DX,ROUTINE ;GET ADDRESS OF ROUTINE DOSCALL 25H ;CALL DOS ENDM ;;***************************************************************************;; ;; MACRO: CLEAR ;; ;; DESCRIPTION: CLEAR REGISTERS ;; ;; PARAMATERS: UP TO 10 REGISTERS TO BE CLEARED ;; ;; INPUT: N/A ;; ;; OUTPUT: REQUESTED REGISTERS SET TO BINARY 0'S ;; ;; REGISTERS USED: NONE ;; ;;***************************************************************************;; CLEAR MACRO R1,R2,R3,R4,R5,R6,R7,R8,R9,R10 IRP RX, ;REGISTER LIST IFNB ;FOR EACH REGISTER IN LIST XOR RX,RX ;CLEAR THE REGISTER ENDIF ;END OF IFIDN ENDM ;END OF IRP ENDM ;MACRO END ;;***************************************************************************;; ;; MACRO: CVD ;; ;; DESCRIPTION: CONVERT BINARY NUMBER TO ASCII DECIMAL NUMBER ;; ;; PARAMATERS: OUTPUT LABEL, INPUT LABEL ;; ;; INPUT: WORD BINARY NUMBER ;; ;; OUTPUT: 4 BYTE DECIMAL NUMBER ;; ;; REGISTERS USED: AX,BX,DX,DI ;; ;;***************************************************************************;; CVD MACRO DEST,ORG LOCAL CVBP,CVDE IFDIF , ;IF BINARY VALUE NOT IN AX MOV AX,WORD PTR ORG ;MOVE ORIGIN TO AX ENDIF LEA DI,DEST ;GET ADDRESS OF DESTINATION MOV BL,100D ;DIVISOR TO BL DIV BL ;DIVIDE BY 100 MOV BH,AH ;SAVE REMAINDER IN BH CALL CVDP ;CONVERT HIGHORDER TO DECIMAL MOV AL,BH ;GET REMAINDER CALL CVDP ;CONVERT LOW ORDER TO DECIMAL JMP SHORT CVDE ;JUMP AROUND PROC CVDP PROC NEAR AAM ;CONVERT TO PACKED DECIMAL OR AX,3030H ;CONVERT TO ASCII MOV [DI],AH ;STORE HIGH ORDER BYTE INC DI ;POINT TO NEXT BYTE MOV [DI],AL ;STORE LOW ORDER BYTE INC DI ;POINT TO NEXT BYTE RET ;RETURN TO CALLER CVDP ENDP CVDE LABEL NEAR ENDM ;;***************************************************************************;; ;; MACRO: CLS ;; ;; DESCRIPTION: CLEAR THE DISPLAY SCREEN ;; ;; PARAMATERS: NONE ;; ;; INPUT: NONE ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,DX ;; ;;***************************************************************************;; CLS MACRO LOCAL CLS1,CLSD SHOWSTRING CLSD ;DISPLAY THE DOS2 STRING JMP SHORT CLS1 ;GO AROUND THE STRING DATA CLSD DB 1BH,'[2J$' ;DATA FOR DOS CALL CLS1 LABEL NEAR ENDM ;;***************************************************************************;; ;; MACRO: COLOR ;; ;; DESCRIPTION: SETS DISPLAY COLOR ;; ;; PARAMATERS: FOREGROUND COLOR, BACKGROUND COLOR ;; ;; INPUT: NONE ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,DX ;; ;;***************************************************************************;; COLOR MACRO FOREGROUND,BACKGROUND LOCAL COLD,COL1 SHOWSTRING COLD ;DISPLAY THE COLOR STRING JMP SHORT COL1 ;GO AROUND THE STRING COLD DB 1BH,'[' ;START OF STRING IFIDN , ;IF NORMAL REQUEST DB '0' ;NORMAL FOREGROUND ELSE IFIDN , ;IF BOLD REQUEST DB '1' ;BOLD FOREGROUND ELSE IFIDN , ;IF UNDERSCORED DB '4' ;UNDERSCORE FOREGROUND ELSE IFIDN , ;IF BLINK REQUEST DB '5' ;BLINK FOREGROUND ELSE IFIDN , ;IF REVERSE REQUEST DB '7' ;REVERSE VIDEO ELSE IFIDN , ;IF INVISABLE REQUEST DB '8' ;INVISABLE (NO-SHOW) ELSE IFIDN , ;IF BLACK REQUEST DB '30' ;BLACK FOREGROUND ELSE IFIDN , ;IF RED REQUEST DB '31' ;RED FOREGROUND ELSE IFIDN , ;IF GREEN REQUEST DB '32' ;GREEN FOREGROUND ELSE IFIDN , ;IF YELLOW REQUEST DB '33' ;YELLOW FOREGROUND ELSE IFIDN , ;IF BLUE REQUEST DB '34' ;BLUE FOREGROUND ELSE IFIDN , ;IF MAGENTA REQUEST DB '35' ;MAGENTA FOREGROUND ELSE IFIDN , ;IF CYAN REQUEST DB '36' ;CYAN FOREGROUND ELSE IFIDN , ;IF WHITE REQUEST DB '37' ;WHITE FOREGROUND ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IFNB ;IF WE HAVE FOREGROUND... IFNB ;AND BACKGROUND COLORS DB ';' ;PUT IN A SEPERATOR ENDIF ENDIF IFIDN , ;IF BLACK REQUEST DB '40' ;BLACK BACKGROUND ELSE IFIDN , ;IF RED REQUEST DB '41' ;RED BACKGROUND ELSE IFIDN , ;IF GREEN REQUEST DB '42' ;GREEN BACKGROUND ELSE IFIDN , ;IF YELLOW REQUEST DB '43' ;YELLOW BACKGROUND ELSE IFIDN , ;IF BLUE REQUEST DB '44' ;BLUE BACKGROUND ELSE IFIDN , ;IF MAGENTA REQUEST DB '45' ;MAGENTA BACKGROUND ELSE IFIDN , ;IF CYAN REQUEST DB '46' ;CYAN BACKGROUND ELSE IFIDN , ;IF WHITE REQUEST DB '47' ;WHITE BACKGROUND ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF COL1 LABEL NEAR ;SKIP AROUND DATA ENDM ;;***************************************************************************;; ;; MACRO: CURSOR ;; ;; DESCRIPTION: SAVE OR SET CURRENT CURSOR TYPE, BLANK CURSOR ON SCREEN ;; ;; PARAMATERS: FUNCTION (SAVE,SET OR ERASE), DATA OR DATA ADDRESS ;; ;; INPUT: CURSOR START AND END LINES (SET ONLY) ;; ;; OUTPUT: CURSOR START AND END LINES (SAVE ONLY) ;; ;; REGISTERS USED: AX,CX (DS USED AND RESTORED) ;; ;;***************************************************************************;; CURSOR MACRO FUNCTION,AREA IFIDN , ;IF CURSOR ERASE REQUESTED MOV AH,1 ;SET CURSOR MODE MOV CX,0F0FH ;START AND END ON LINE 15 INT 10H ;GO DO A VIDEO INTERRUPT ELSE IFIDN , ;IF CURSOR SAVE REQUEST PUSH DS ;SAVE DS MOV AX,40H ;GET SEGMENT 40H IN AX MOV DS,AX ;AND PUT IT IN DS MOV CX,DS:60H ;GET CURRENT CURSOR MODE POP DS ;RESTORE DS MOV AREA,CX ;AND MOVE CURSOR MODE TO AREA ELSE IFIDN , ;IF CURSOR SET REQUEST MOV CX,AREA ;GET CURSOR MODE IN CX MOV AH,1 ;SET CURSOR MODE INT 10H ;GO DO VIDEO INTERRUPT ENDIF ENDIF ENDIF ENDM ;;***************************************************************************;; ;; MACRO: SHOWSTRING ;; ;; DESCRIPTION: PRINT AN ASCII STRING ON THE SCREEN ;; ;; PARAMATERS: LABEL OF STRING TO BE PRINTED ;; ;; INPUT: ASCII STRING, ENDING WITH A $ ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,DX ;; ;;***************************************************************************;; SHOWSTRING MACRO STRING IFNB LEA DX,STRING ENDIF DOSCALL 9 ;DOS PRINT STRING FUNCTION ENDM ;;***************************************************************************;; ;; MACRO: GETDATE ;; ;; DESCRIPTION: GETS CURRENT DATE INTO DESTINATION ;; ;; PARAMATERS: DESTINATION, TYPE OF DATE (CHAR OR BIN) ;; ;; INPUT: NONE ;; ;; OUTPUT: MM/DD/YY (CHAR) OR MDYY (BIN) ;; ;; REGISTERS USED: AX,BX,CX,DX,DI ;; ;;***************************************************************************;; GETDATE MACRO DEST,TYPE LOCAL GDTE,GTDP IFIDN , ;IF CHARACTER REQUEST DOSCALL 2AH ;GET DATE FUNCTION CALL LEA DI,DEST ;GET ADDRESS OF DESTINATION MOV AL,DL ;GET DAY IN AL CALL GDTP ;CONVERT BYTE TO ASCII MOV WORD PTR [DI],'/' ;MOVE IN / INC DI ;POINT TO NEXT BYTE MOV AL,DH ;GET MONTH IN AL CALL GDTP ;CONVERT BYTE TO ASCII MOV WORD PTR [DI],'/' ;MOVE IN / INC DI ;POINT TO NEXT BYTE MOV AX,CX ;GET YEAR IN AL MOV BL,100D ;MOVE IN DIVISOR DIV BL ;DIVIDE BY 100 MOV AL,AH ;REMAINDER TO AL CALL GDTP ;CONVERT BYTE TO ASCII JMP SHORT GDTE ;JUMP AROUND PROC GDTP PROC NEAR AAM ;CONVERT TO PACKED DECIMAL ADD AX,3030H ;CONVERT TO ASCII MOV BYTE PTR [DI],AH ;STORE HIGH ORDER BYTE INC DI ;POINT TO NEXT BYTE MOV BYTE PTR [DI],AL ;STORE LOW ORDER BYTE INC DI ;POINT TO NEXT BYTE RET ;RETURN TO CALLER GDTP ENDP GDTE LABEL NEAR ELSE IFIDN , ;IF BINARY REQUEST DOSCALL 2AH ;GET CURRENT DATE MOV BYTE PTR DEST,DL ;MOVE DAY TO DESTINATION MOV BYTE PTR [DEST+1],DH ;MOVE MONTH TO DESTINATION MOV WORD PTR [DEST+2],CX ;MOVE YEAR TO DESTINATION ENDIF ENDIF ENDM ;;****************************************************************************;; ;; SETDATE ,, - Set the date. ;; ;; is 1..31. ;; ;; is 1..0CH. ;; ;; is 1980..2099. ;; ;; On return: AL = 00 = sucess, 0FFH = failure. ;; ;;****************************************************************************;; SETDATE MACRO DAY,MO,DAY ; Set the date. SAVE CX,DX,AH MOV AH,2BH MOV DL,DAY MOV DH,MO MOV CX,YR INT 21H RESTORE CX,DX,AH ENDM ;;***************************************************************************;; ;; MACRO: GETTIME ;; ;; DESCRIPTION: GET CURRENT TIME INTO DESTINATION ;; ;; PARAMATERS: DESTINATION, TYPE (CHAR OR BIN) ;; ;; INPUT: NONE ;; ;; OUTPUT: HH:MM:SS:HH (CHAR) OR HMSH (BIN) ;; ;; REGISTERS USED: AX,BX,CX,DX,DI ;; ;;***************************************************************************;; GETTIME MACRO DEST,TYPE LOCAL GTMP,GTME IFIDN , ;IF CHARACTER REQUEST DOSCALL 2CH ;GET CURRENT TIME LEA DI,DEST ;GET DESTINATION ADDRESS MOV AL,CH ;MOVE HOURS TO AL CALL GTMP ;AND CONVERT TO ASCII MOV WORD PTR [DI],':' ;PUT IN : INC DI ;POINT TO NEXT BYTE MOV AL,CL ;MOVE MINUTES TO AL CALL GTMP ;AND CONVERT TO ASCII MOV WORD PTR [DI],':' ;PUT IN : INC DI ;POINT TO NEXT BYTE MOV AL,DH ;MOVE SECONDS TO AL CALL GTMP ;AND CONVERT TO ASCII MOV WORD PTR [DI],':' ;PUT IN : INC DI ;POINT TO NEXT BYTE MOV AL,DL ;MOVE HUNDRETHS TO AL CALL GTMP ;AND CONVERT TO ASCII JMP SHORT GTME ;JUMP AROUND PROC GTMP PROC NEAR AAM ;CONVERT TO PACKED DECIMAL ADD AX,3030H ;CONVERT TO ASCII MOV BYTE PTR [DI],AH ;STORE HIGH ORDER BYTE INC DI ;POINT TO NEXT BYTE MOV BYTE PTR [DI],AL ;STORE LOW ORDER BYTE INC DI ;POINT TO NEXT BYTE RET ;RETURN TO CALLER GTMP ENDP GTME LABEL NEAR ELSE IFIDN , ;IF REQUEST FOR BINARY TIME DOSCALL 2CH ;GET CURRENT TIME MOV BYTE PTR DEST,CH ;MOVE HOURS TO DESTINATION MOV BYTE PTR DEST+1,CL ;MOVE MINUTES TO DESTINATION MOV BYTE PTR DEST+2,DH ;MOVE SECONDS TO DESTINATION MOV BYTE PTR DEST+3,DL ;MOVE HUNDRETHS TO DESTINATION ENDIF ENDIF ENDM ;;***************************************************************************;; ;; MACRO: SETTIME ;; ;; DESCRIPTION: SET CURRENT TIME ;; ;; PARAMATERS: HOURS, MINUTES, SECONDS,HUNDRETHS ;; ;; INPUT: TIME TO BE SET ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,CX,DX ;; ;;***************************************************************************;; SETTIME MACRO HOURS,MINUTES,SECONDS,HUNDRETHS IFNB ;IF HOURS SPECIFIED MOV CH,HOURS ;MOVE HOURS TO CH ELSE ;IF HOURS NOT SPECIFIED CLEAR CH ;CLEAR CH ENDIF IFNB ;IF MINUTES SPECIFIED MOV CL,MINUTES ;MOVE MINUTES TO CL ELSE ;IF MINUTES NOT SPECIFIED CLEAR CL ;CLEAR CL ENDIF IFNB ;IF SECONDS SPECIFIED MOV DH,SECONDS ;MOVE SECONDS TO DH ELSE ;IF SECONDS NOT SPECIFIED CLEAR DH ;CLEAR DH ENDIF IFNB ;IF HUNDRETHS SPECIFIED MOV DL,HUNDRETHS ;MOVE HUNDRETHS TO DL ELSE ;IF HNDRETHS NOT SPECIFIED CLEAR DL ;CLEAR DL ENDIF DOSCALL 2DH ;CALL DOS TO SET TIME ENDM ;;***************************************************************************;; ;; MACRO: LOCATE ;; ;; DESCRIPTION: POSITION CURSOR ON SCREEN ;; ;; PARAMATERS: ROW, COLUMN ;; ;; INPUT: BINARY ROW AND COLUMN LOCATION, IF NOT IN MACRO CALL ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX,DX ;; ;;***************************************************************************;; LOCATE MACRO ROW,COLUMN LOCAL LOC1,LOCD MOV AL,ROW ;GET BINARY ROW AAM ;CONVERT TO PACKED DECIMAL ADD AX,3030H ;CONVERT TO ASCII MOV BYTE PTR [LOCD+2],AH ;HIGH ORDER ROW TO STRING MOV BYTE PTR [LOCD+3],AL ;LOW ORDER ROW TO STRING CLEAR AH ;CLEAR AH AGAIN MOV AL,COLUMN ;GET COLUMN IN AL AAM ;CONVERT TO PACKED DECIMAL ADD AX,3030H ;CONVERT TO ASCII MOV BYTE PTR [LOCD+5],AH ;HIGH ORDER COLUMN TO STRING MOV BYTE PTR [LOCD+6],AL ;LOW ORDER COLUMN TI STRING SHOWSTRING LOCD ;POSITION THE CURSOR JMP SHORT LOC1 ;JUMP AROUND STRING LOCD DB 1BH,'[ ; H$' ;POSITION CURSOR STRING LOC1 LABEL NEAR ENDM ;;***************************************************************************;; ;; MACRO: DISPLAY CHARACTER ;; ;; DESCRIPTION: PRINT AN ASCII CHARACTER ;; ;; PARAMETERS: CHARACTER TO BE PRINTED ;; ;; INPUT: CHARACTER IN AL ;; ;; OUTPUT: NONE ;; ;; REGISTERS USED: AX ;; ;;***************************************************************************;; SHOWCAR MACRO CAR IFNB MOV DL,CAR ENDIF DOSCALL 2 ;DOS PRINT STRING FUNCTION ENDM ;;***************************************************************************;; ;; MACRO: GET CHAR WITH ECHO ;; ;; INPUT: NONE ;; ;; OUTPUT: AL = CHAR ;; ;; REGISTERS USED: AX ;; ;;***************************************************************************;; GETREPECHO MACRO MOV AH,1H DOSCALL 1 ;DOS PRINT STRING FUNCTION ENDM ;;***************************************************************************;; ;; MACRO: GET CHAR WITHOUT ECHO ;; ;; INPUT: NONE ;; ;; OUTPUT: AL = CHAR ;; ;; REGISTERS USED: AX ;; ;;***************************************************************************;; GETREPNONECHO MACRO MOV AH,08H DOSCALL 21H ENDM ;;----------------------------------------------------------------------- ;; TERMINATE - End program and return to caller. ;;----------------------------------------------------------------------- TERMINATE MACRO ; End of program. INT 20H ENDM ;;----------------------------------------------------------------------- ;; OUTPROG - End program and return to caller. ;;----------------------------------------------------------------------- OUTPROG MACRO MOV AH,4CH DOSCALL 21H ;sortie normale programme ENDM ;;----------------------------------------------------------------------- ;; RWABS ,,, ;; - 'R' for read, 'W' for write. ;; - drive number. ;; - number of sectors to transfer. ;; - Begining logical sector number. ;; Read and write absolute sectors. ;; Note: 1) Status information is returned in flags, After the ;; flags are sampled they should be poped off the stack ;; with a POPF. ;; 2) DS:DX must point to the DTA before this call. ;;----------------------------------------------------------------------- RWABS MACRO RW,DRIVE,NOFSECT,BEG ; R/W absolute disk sector. SAVE BX,CX,DX MOV AL,DRIVE MOV CX,NOFSECT MOV DX,BEG IFIDN ,<'R'> INT 25H ENDIF IFIDN ,<'W'> INT 26H ENDIF RESTORE BX,CX,DX ENDM ;;----------------------------------------------------------------------- ;; ADDTODOS - Add the current proc to DOS. ;; Note: is a label at the highest memory address ;; used by your code. ;;----------------------------------------------------------------------- ADDTODOS MACRO DOSEND ; Add a procedure to DOS. MOV DX,DOSEND INC DX INT 27H ENDM ;;----------------------------------------------------------------------- ;; DOSRS232 ;; Sends or receives a to/from the standard RS232 port. ;; If is specified then it is sent to the RS232 port. ;; If is not specified then a character is read into AL. ;; OUTPUT: If receiving data AL will contain the byte received. ;; All registers saved. ;;----------------------------------------------------------------------- DOSRS232 MACRO CHAR SAVE AH,DL IFB MOV AH,3 ; Receive a character from the RS232 port. ELSE MOV AH,4 ; Send a character to the RS232 port. ENDIF INT 21H RESTORE AH,DL ENDM ;;----------------------------------------------------------------------- ;; PRINT - Send to the standard printer. ;; No registers destroyed. ;;----------------------------------------------------------------------- PRINT MACRO CHAR ; Send a character to the printer. SAVE AH,DL MOV DL,CHAR MOV AH,5 INT 21H RESTORE AH,DL ENDM ;;----------------------------------------------------------------------- ;; INPUTSTR ,,[] ;; - Length of input buffer. ;; - Offset from to message buffer. ;; - Optional segment for input buffer. ;; Input a string ending with a RETURN from the standard ;; input device. ;; No registers destroyed except DS:DX which points to ;; input buffer on output. ;; On exit: DS:DX will have :. ;; Byte 1 of buffer = Size of buffer. ;; Byte 2 of buffer = Number of bytes read w/o c/r. ;; Byte 3 of buffer = Start of text read. ;;----------------------------------------------------------------------- INPUTSTR MACRO LEN,BUFOFF,BUFSEG ; Get a line of text. PUSH AH IFNB MOV DX,BUFSEG MOV DS,DX ENDIF MOV DX,BUFOFF MOV [DX],LEN MOV AH,0AH INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; POLLSTDIN - Check the status of the standard input device. ;; On exit: AL = 0FFH - Character is available. ;; 00H - Character not available. ;; Note: This routine executes an INT 23H if a ctl-brk ;; is detected. ;; No registesrs destroyed. ;;----------------------------------------------------------------------- POLLSTDIN MACRO ; Poll the standard input device. PUSH AH MOV AH,0BH INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; CLRSTDIN - Clear standard input buffer then execute ;; function . ;; may be 1 - Keyboard input. ;; 6 - Direct Console I/O. ;; 7 - Direct Console Input w/o Echo. ;; 8 - Console Input w/o Echo. ;; A - Buffered Keyboard Input. ;; No registers destroyed except AX. ;;----------------------------------------------------------------------- CLRSTDIN MACRO FUNC ; Clear the standard input device. MOV AL,FUNC MOV AH,0CH INT 21H ENDM ;;----------------------------------------------------------------------- ;; DISKRESET - Flushes all file buffers. ;;----------------------------------------------------------------------- DISKRESET MACRO ; Reset the disk. PUSH AH MOV AH,0DH INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; PICKDRIVE - Select the default disk drive. ;; Input: 0 = Drive A, 1 = Drive B, etc. ;; Output: AL = number of drives. Minimum=2. ;; No registers destroyed. ;;----------------------------------------------------------------------- PICKDRIVE MACRO DRIVE ; Pick the default disk drive. SAVE DL,AH MOV DL,DRIVE MOV AH,0EH INT 21H RESTORE DL,AH ENDM ;;----------------------------------------------------------------------- ;; FINDRIVE - Determine the default drive. ;; Output: AL = 0 = Drive A, 1 = Drive B, etc. ;; No registers destroyed except AL. ;;----------------------------------------------------------------------- FINDRIVE MACRO ; Find the default disk drive. PUSH AH MOV AH,19H INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; ALLOCTAB - Get pointer to FAT ID byte. ;; If is specified then the pointer to the FAT ID ;; for drive is returned. ;; If is not specified then a pointer to the FAT ID ;; byte for the default drive is returned. ;; Output: [DS:BX] = FAT ID byte. ;; DX = Number of allocation units. ;; AL = Number of sectors per allocation unit. ;; CX = Size of the physical sector. ;;----------------------------------------------------------------------- ALLOCTAB MACRO DRIVE PUSH AH IFB MOV AH,1BH ; Get FAT ID for default drive. ELSE MOV AH,1CH ; Get FAT ID for specified drive. MOV DL,DRIVE ENDIF INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; CHANGEINT ,, - If and are specified then ;; interupt vector is set to :. If and ;; are not specified then interupt vector is ;; returned in ES:BX. ;; All registers saved except ES and BX when a GET VECTOR ;;----------------------------------------------------------------------- CHANGEINT MACRO INT,SEG,OFF PUSH AX MOV AL,INT IFNB MOV AH,25H ; Set interupt vector. MOV DX,SEG MOV DS,DX MOV DX,OFF ELSE MOV AH,35H ; Get interupt vector. ENDIF INT 21H POP AX ENDM ;;----------------------------------------------------------------------- ;; VERIFY - Set or reset the verify flag. ;; may be either 'ON', 'OFF' or 'QUERY'. ;; For 'OFF' and 'ON' all regs are ;; saved. For 'QUERY' AL returns 00 if off, 01 if on. ;; OUTPUT: If is 'QUERY' then: AL = 0 for verify off ;; 1 for verify on ;; All registers saved if is not 'QUERY' else AL destroyed. ;;----------------------------------------------------------------------- VERIFY MACRO FLAG IFIDN ,<'OFF'> ; TURN VERIFY SWITCH OFF. SAVE AX,DL XOR DL,DL XOR AL,AL MOV AH,2EH INT 21H RESTORE DL,AX ENDIF IFIDN ,<'ON'> ; TURN VERIFY SWITCH ON. SAVE AX,DL XOR DL,DL MOV AL,1 MOV AH,2EH INT 21H RESTORE DL,AX ENDIF IFIDN ,<'QUERY'> ; QUERY VERIFY SWITCH. PUSH AH MOV AH,54H INT 21H POP AH ENDIF ENDM ;;----------------------------------------------------------------------- ;; GETDTA - Get DTA (Data Transfer Area). On return - ES:BX has address ;; of DTA. ;;----------------------------------------------------------------------- GETDTA MACRO ; Get address of DTA. PUSH AH MOV AH,2FH INT 21H POP AH ENDM ;;----------------------------------------------------------------------- ;; VERSION - Get PC-DOS version number. ;; OUTPUT: AL = major version number, ;; AH = minor version number. ;; If AL = 0 then assume pre DOS 2.0 ;;----------------------------------------------------------------------- VERSION MACRO ; Get PC-DOS version number. MOV AH,30H INT 21H ENDM ;;----------------------------------------------------------------------- ;; KEEP ,, - Terminate this program but stay resident. ;; = The return code for this program. ;; = The begining address of the program. ;; = The last byte plus one used by the program. ;; This number is divided by 16 to determine the memory ;; size in paragraphs required. ;; Registers may not be passed for and . ;;----------------------------------------------------------------------- KEEP MACRO RC,BEG,FIN MOV AL,RC MOV DX,(FIN-BEG)/16 MOV AH,31H INT 21H ENDM ;;----------------------------------------------------------------------- ;; CTL_BRK - Read or write the current CTL-BRK state. ;; - Is either 'ON', 'OFF' or not specified. ;; If flag is not specified then current CTL-BRK state is ;; returned in DL. ;; All registers saved if is specified elss DL is destroyed. ;;----------------------------------------------------------------------- CTL_BRK MACRO FLAG ; R/W CTRL-BREAK status flag. PUSH AX MOV AH,33H IFB XOR AL,AL ELSE MOV AL,1 ENDIF IFNB IFIDN ,<'OFF'> XOR DL,DL ENDIF IFIDN ,<'ON'> MOV DL,1 ENDIF ENDIF INIT 21H POP AX ENDM ;;**************************************************************************** DOCRLF MACRO SHOWCAR 0DH SHOWCAR 0AH ENDM ;control return + linefeed ;;**************************************************************************** DOCR MACRO SHOWCAR 0DH ENDM ;control return ;;**************************************************************************** DOLF MACRO SHOWCAR 0AH ENDM ;linefeed ;;**************************************************************************** DOBEEP MACRO SHOWCAR 07H ENDM ;beep ;;**************************************************************************** DOBSPACE MACRO NB SAVE CX XOR CX,CX MOV CX,1 IFNB MOV CX,NB ENDIF LOOP1: SHOWCAR 08H LOOP LOOP1 RESTORE CX ENDM ;backspace ;;**************************************************************************** SOUND MACRO FREQ,DURA ; IFNB IFNB SAVE AX,CX,DX CLI MOV DX,DURA IN AL,61H AND AL,0FEH AGAIN: OR AL,2 OUT 61H,AL MOV CX,FREQ WAIT1: LOOP WAIT1 AND AL,0FDH OUT 61H,AL MOV CX,FREQ WAIT2: LOOP WAIT2 DEC DX ;one square wave cycle now complete JNZ AGAIN ;tone produced for desired duration STI RESTORE AX,CX,DX ENDIF ENDIF ENDM ;sound fr‚quence dur‚e ;;****************************************************************************