Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

559 lines
20 KiB

; PAGE ,132
SUBTTL DOS - Message Retriever - SYSTEM CONTROL file
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DOS -- Message Retriever
;; (c) Copyright 1988 Microsoft
;;
;; File Name: SYSMSG.INC
;; ----------
;;
;; Description: Message retriever functions are included into source code
;; ------------ by referencing a MSG_SERVICES macro. That macro is defined
;; here as well as the logic to include necessary .ASM and .INC
;; files.
;;
;;
;; Documentation Reference:
;; ------------------------
;; DOS -Message Retriever I0 Document - Feb. ?? 1987
;; DOS -Message Retriever I1 Document - Mar. ?? 1987
;; DOS -Message Retriever I2 Document - Mar. ?? 1987
;; DOS -Final Functional Specification Document - Mar ?? 1987
;;
;; Procedures Contained in This File:
;; ---------------------------------
;; None
;;
;; Include Files Required:
;; -----------------------
;; MSGSERV.INC := All message services
;; ???? := ????
;;
;; External Procedure References:
;; ------------------------------
;; None
;;
;; Linkage Instructions:
;; --------------------
;; None
;;
;; Change History:
;; ---------------
;; CREATED March, 1987 RPS
;;
;; Psuedocode:
;; -----------
;; None
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
INCLUDE VERSIONA.INC ;;AN003;;
FALSE = 0 ;;
TRUE = NOT FALSE ;; List message services and flags
;;
; Control Characters For Message Skeleton file
NULL EQU 00H ;; Null
BELL EQU 07H ;; Bell
TAB EQU 09H ;; Tab
LF EQU 0AH ;; Line Feed
HOME EQU 0BH ;; Home
FORMFD EQU 0CH ;; Form Feed
CR EQU 0DH ;; Carriage Return
COLON EQU 3AH ;; Colon
; SYSDISPMSG and SYSGETMSG Equates
MSG_SER_CLASS EQU 00H ;; Message Service Class (reserved)
EXT_ERR_CLASS EQU 01H ;; DOS Extended error class
PARSE_ERR_CLASS EQU 02H ;; Parse error class
UTILITY_MSG_CLASS EQU 0FFH ;; Utility message class
NO_HANDLE EQU 0FFFFH ;; No handle specified (Use DOS functions 01H-09H only)
NO_REPLACE EQU 0000H ;; No replacable parameters
; SUBLIST Equates
Sublist_Length EQU 11 ;; Length of sublist structure
Reserved EQU 0 ;; Reserved byte field
Left_Align EQU 0 ;;00xxxxxx
Right_Align EQU 80h ;;10xxxxxx
Char_type EQU 0 ;;axxx0000 - Character type
Char_Field_Char EQU 0 ;;a0000000
Char_Field_ASCIIZ EQU 10h ;;a0010000
Unsgn_Bin_Type EQU 01h ;;axxx0001 - Unsigned Binary to Decimal character
Unsgn_Bin_Byte EQU 11h ;;a0010001
Unsgn_Bin_Word EQU 21h ;;a0100001
Unsgn_Bin_DWord EQU 31h ;;a0110001
Sgn_Bin_Type EQU 02h ;;axxx0010 - Signed Binary to Decimal character
Sgn_Bin_Byte EQU 12h ;;a0010010
Sgn_Bin_Word EQU 22h ;;a0100010
Sgn_Bin_DWord EQU 32h ;;a0110010
Bin_Hex_Type EQU 03h ;;axxx0011 - Unsigned Binary to Hexidecimal character
Bin_Hex_Byte EQU 13h ;;a0010011
Bin_Hex_Word EQU 23h ;;a0100011
Bin_Hex_DWord EQU 33h ;;a0110011
Date_Type EQU 04h ;;axxx0100 - Date to character using current country format
Date_MD EQU 14h ;;a0010100
Date_MDY_2 EQU 24h ;;a0100100
Date_MDY_4 EQU 34h ;;a0110100
Time_Cty_Type EQU 05h ;;axxx0101 - Time to character using current country format
Time_HHMM_Cty EQU 05h ;;a0000101
Time_HHMMSS_Cty EQU 15h ;;a0010101
Time_HHMMSSHH_Cty EQU 25h ;;a0100101
Time_24_Type EQU 06h ;;axxx0110 - Time to character using 24 hour format
Time_HHMM_24 EQU 06h ;;a0000110
Time_HHMMSS_24 EQU 16h ;;a0010110
Time_HHMMSSHH_24 EQU 26h ;;a0100110
$M_EXTPAR_Type EQU 08h ;;axxx1000 - Special case for extended parse replace format
NO_INPUT EQU 00H ;; No input characters
DOS_KEYB_INP EQU 01H ;; DOS INT 21H - AH=01H := Keyboard Input
DOS_DIR_CON_INP EQU 07H ;; DOS INT 21H - AH=07H := Direct Console Input Without Echo
DOS_CON_INP EQU 08H ;; DOS INT 21H - AH=08H := Console Input Without Echo (Check CTL-BK)
DOS_BUF_KEYB_INP EQU 0AH ;; DOS INT 21H - AH=0AH := Buffered Keyboard Input
DOS_CLR_KEYB_BUF EQU 0CH ;; DOS INT 21H - AH=0CH := Clear keyboard buffer
DOS_WRITE_HANDLE EQU 40H ;; DOS INT 21H - AH=40H := Write to a DOS handle
DOS_DISP_STRING EQU 09H ;; DOS INT 21H - AH=09H := Display $ terminated string
DOS_DISP_CHAR EQU 02H ;; DOS INT 21H - AH=02H := Display Character
LOWEST_4CH_VERSION EQU 0002H ;; First DOS version to allow AH = 4CH Exit (VERSION 2.00)
DOS_GET_DBCS_INFO EQU 6300H ;; DOS INT 21H - AX=6507H := Get DBCS Vector Table
DOS_GET_EXT_ERROR EQU 59H ;; DOS INT 21H - AH=59H := Get Extended Error
DOS_GET_EXT_ERROR_BX EQU 00H ;; DOS INT 21H - BX=0000H := Version 0
DOS_EXTENDED_OPEN EQU 6C00H ;AN003; DOS INT 21H - AX=6C00H := Extended Open
NO_CRIT_OPEN EQU 2000H ;AN003; Extended Open Mode bit
NOT_EX_FAIL_EX_OPEN EQU 0101H ;AN003; Extended Open Flag
DOS_LSEEK_FILE EQU 4200H ;AN003; DOS INT 21H - AX=4200H := LSEEK file
DOS_READ_BYTE EQU 3FH ;AN003; DOS INT 21H - AH=3FH := Read byte block
DOS_CLOSE_FILE EQU 3EH ;AN003; DOS INT 21H - AH=3EH := Close file handle
IFSFUNC_INSTALL_CHECK EQU 0500H ;AN006; IFSFUNC Installation Check
IFS_GET_ERR_TEXT EQU 0502H ;AN006; IFSFUNC Get Extended Error Text
IFSFUNC_INSTALLED EQU 0FFH ;AN006; Return code if IFSFUNC is installed
EXT_ERR_39 EQU 39 ;; Insufficent Disk Space EXTENDED ERROR (changed from hex to decimal - eg d201)
ERROR_CLASS_39 EQU 01H ;; Error Class = 1
ACTION_39 EQU 04H ;; Suggested Action = 4
LOCUS_39 EQU 01H ;; Locus = 1
DOS_GET_COUNTRY EQU 38H ;; DOS INT 21H - AH=38H := Get Country Dependant Information
DOS_GET_VERSION EQU 30H ;; DOS INT 21H - AH=30H := Get DOS Version number
DOS_IOCTL_GET_INFO EQU 4400H ;; DOS INT 21H - AH=4400H := I/O control for devices
DOS_IOCTL_SET_INFO EQU 4401H ;; DOS INT 21H - AH=4401H := I/O control for devices
DOS_GET_EXT_PARSE_ADD EQU 122EH ;; DOS INT 2FH - AX=122EH := Get Extended/Parse error address
DOS_GET_EXTENDED EQU 00 ;; DOS INT 2FH - AX=122EH - DL=00 := Get Extended address
DOS_GET_PARSE EQU 02 ;; DOS INT 2FH - AX=122EH - DL=02 := Get Parse address
DOS_GET_CRITICAL EQU 04 ;; DOS INT 2FH - AX=122EH - DL=04 := Get Critical address
DOS_GET_FILE EQU 06 ;; DOS INT 2FH - AX=122EH - DL=06 := Get File system dependant
DOS_GET_ADDR EQU 08 ;; DOS INT 2FH - AX=122EH - DL=08 := Get Address of READ_DISK_PROC
DOS_SET_ADDR EQU 09 ;; DOS INT 2FH - AX=122EH - DL=09 := Set Address of READ_DISK_PROC
LOW_NIB_MASK EQU 0FH ;; Mask out the high byte
DOS_CLR_KEYB_BUF_MASK EQU 0C0H ;; Check if high nibble is C Hex
$M_CON_INP EQU -1 ;; If DOS INT 21H Function 06H - DL := 0FFH for input
$M_CRIT_LO EQU 19 ;; First Extended Error considered CRITICAL
$M_CRIT_HI EQU 39 ;; Last Extended Error considered CRITICAL (EG - D191)
$M_AM EQU "a" ;; Time format AM indicator
$M_PM EQU "p" ;; Time format PM indicator
$M_NEG_SIGN EQU "-" ;; Signed decimal number format negative indicator
$M_DEF_TIME_FORM EQU 1 ;; Default Time format - 24 hour
$M_DEF_DATE_FORM EQU 0 ;; Default Time format - 0 := USA format
$M_DEF_TIME_SEP EQU ":" ;; Default Time separator - ":"
$M_DEF_DATE_SEP EQU "-" ;; Default Time separator - "-"
$M_DEF_DECI_SEP EQU "." ;; Default Time hundreds separator - "."
$M_TIMEDATE_PAD EQU "0" ;; Time/Date PAD character - "0" (ie 12:03p)
$M_MAX_2_YEAR EQU 99 ;; Maximum 2 digit year
$M_SINGLE_CHAR EQU 1 ;; A single character is this long ^
$M_SPECIAL_CASE EQU 30H ;; Special case for replacable parameters %0
$M_UNLIM_W EQU 0 ;; Unlimited width character
$M_COMMA EQU "," ;; Default Thousand separate
$M_CR_LF EQU 0A0DH ;; Default CR/LF
$M_SPACE_HYP EQU "- " ;; Default Space/Hyphan
$M_SPACE EQU " " ;; Default Space
$M_NULL EQU 0 ;; Null
$M_FIRST_THOU EQU 3 ;; Location of first thousand separator
$M_SECOND_THOU EQU 6 ;; Location of second thousand separator
$M_THIRD_THOU EQU 9 ;; Location of third thousand separator
$M_BASE10 EQU 10 ;; Base 10 for arthmetic
$M_BASE16 EQU 16 ;; Base 16 for arthmetic
$M_CLASS_NOT_EXIST EQU 0 ;; Does class exist?
$M_TERMINATING_FLAG EQU -1 ;; Is there any more classes?
$M_ADDR_SZ_NEAR EQU 2 ;; Size to increment if NEAR
$M_ADDR_SZ_FAR EQU 4 ;; Size to increment if FAR
$M_SL EQU DS:[SI] ;; Refer to SUBLIST as $M_SL
$M_NO_HANDLE EQU -1 ;; No handle flag
$M_TEMP_BUF_SZ EQU 64 ;; Size of temporary buffer ;AN003;
$M_NEXT_DBCS_VECTOR EQU 2 ;; Amount to increment to get next vector
$M_DBCS_TERM EQU 0000 ;; DBCS vector table terminating flag
$M_SPECIAL_MSG_NUM EQU 0FFFFH ;; Special generic message number
$M_CRLF_SIZE EQU 2 ;; Size of the CR LF message
$M_NO_CRLF_MASK EQU 10000000B ;; Mask to supress CR LF
$M_ONE_REPLACE EQU 1 ;; Indicate one replacement
$M_CRIT_ERR_MASK EQU 00000001B ;; Mask to allow EOF/EOI Crit error
;;
$M_ALIGN_MASK EQU 10000000b ;; Mask for align
$M_TYPE_MASK EQU 00001111b ;; Mask for types
$M_SIZE_MASK EQU 00110000b ;; Mask for types
$M_TIME_MASK EQU 00000001b ;; Mask for TIME
$M_DATE_MASK EQU 00010000b ;; Mask for TIME
$M_BYTE EQU 00010000b ;; BYTE indicator
$M_WORD EQU 00100000b ;; WORD indicator
$M_DWORD EQU 00110000b ;; DWORD indicator
; Standard reserved DOS handles
STDIN EQU 0000H ;; Standard Input device handle
STDOUT EQU 0001H ;; Standard Output device handle
STDERR EQU 0002H ;; Standard Error Output device handle
STDAUX EQU 0003H ;; Standard Auxiliary device handle
STDPRN EQU 0004H ;; Standard Printer device handle
ifdef BILINGUAL
; BILINGUAL equates
EXT_MSG_ADJ EQU 90
PARSE_MSG_ADJ EQU 11
UTILITY_MSG_ADJ EQU 8000
endif
; Reserved Message Service equates
NEARmsg = TRUE ;; \
NOVERCHECKmsg = FALSE ;; |
MSGDATA = FALSE ;; |
FARmsg = FALSE ;; |
GETmsg = FALSE ;; |
LOADmsg = FALSE ;; |
DISPLAYmsg = FALSE ;; } Set default cases
SETSTDIO = FALSE ;; |
NOCHECKSTDIN = FALSE ;; |
NOCHECKSTDOUT = FALSE ;; |
DISK_PROC = FALSE ;; | ;AN003;
INPUTmsg = FALSE ;; |
CHARmsg = FALSE ;; |
NUMmsg = FALSE ;; |
TIMEmsg = FALSE ;; |
DATEmsg = FALSE ;; /
IF1 ;;
COMR = FALSE ;; COMMAND.COM Cases (resident)
COMT = FALSE ;; (transient)
ENDIF ;;
$M_STRUC = TRUE ;; Internal message service defaults
$M_LOAD = TRUE ;;
$M_SUBS = TRUE ;;
$M_REPLACE = TRUE ;;
$M_REPL_DONE = FALSE ;;
$M_CHAR_ONLY = TRUE ;;
$M_PARSE_FLAG = TRUE ;;
$M_EXT_ERR_FLAG = TRUE ;;
$M_MSGDATA_ONLY = TRUE ;;
$M_END = FALSE ;;
$M_EXT_CLS = TRUE ;;
$M_PAR_CLS = TRUE ;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_POPF Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$M_POPF MACRO
LOCAL $M_MYRET
JMP $+3
$M_MYRET LABEL NEAR
IRET
PUSH CS
CALL $M_MYRET
ENDM
; This Macro was removed from sysmsg.inc. We had to remove this
; macro and put it into it's own include file in order to clear up
; some assembly errors. MS MASM will not allow a public declaration
; during the second pass of the assembler. IBM MASM will allow this.
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_DECLARE Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
;$M_DECLARE macro numcls ;
; $M_DCOUNT = 0 ;
; REPT numcls ;
; $M_DCOUNT = $M_DCOUNT + 1 ;
; $M_DECLARE2 %$M_DCOUNT ;
; ENDM ;
;
; IF COMR
; IFNDEF $M_RT2 ; If Resident table is not in this assembly,
; EXTRN $M_RT2:BYTE ; Must be external
; ELSE
; PUBLIC $M_RT2
; ENDIF ;
; ELSE
; IFNDEF $M_RT ; If Resident table is not in this assembly,
; EXTRN $M_RT:BYTE ; Must be external
; ELSE
; PUBLIC $M_RT
; ENDIF ;
; ENDIF
;
; $M_CHECK $M_GET_MSG_ADDRESS ; If this subroutine is not in this assembly,
; $M_CHECK $M_MSGSERV_1 ; If this subroutine is not in this assembly,
; $M_CHECK $M_MSGSERV_2 ; If this subroutine is not in this assembly,
;
;ENDM ;
; ;
;$M_DECLARE2 macro innum ;
; IF NOT COMR ; IF Not resident COMMAND.COM
; IF NOT COMT ; IF Not transient COMMAND.COM
; IFNDEF $M_CLS_&innum ; IF class is not in this assembly,
; IF FARmsg ;
; EXTRN $M_CLS_&innum:FAR ; Must be external
; ELSE ;
; EXTRN $M_CLS_&innum:NEAR ; Must be external
; ENDIF ;
; ELSE ; ELSE
; PUBLIC $M_CLS_&innum ; Label PUBLIC
; ENDIF ;
; ELSE ; ELSE
; IFDIF <$M_CLS_&innum>,<$M_CLS_1> ; IF NOT $M_CLS_1 or
; IFDIF <$M_CLS_&innum>,<$M_CLS_2> ; IF NOT $M_CLS_2 then
; IFNDEF $M_CLS_&innum ; IF class is not in this assembly,
; IF FARmsg ;
; EXTRN $M_CLS_&innum:FAR ; Must be external
; ELSE ;
; EXTRN $M_CLS_&innum:NEAR ; Must be external
; ENDIF ;
; ELSE ; ELSE
; PUBLIC $M_CLS_&innum ; Label PUBLIC
; ENDIF ;
; ENDIF ;
; ENDIF ;
; ENDIF ;
; ELSE ; ELSE
; IFDIF <$M_CLS_&innum>,<$M_CLS_1> ; IF NOT $M_CLS_1 or
; IFDIF <$M_CLS_&innum>,<$M_CLS_2> ; IF NOT $M_CLS_2 then
; IFNDEF $M_CLS_&innum ; IF class is not in this assembly,
; IF FARmsg ;
; EXTRN $M_CLS_&innum:FAR ; Must be external
; ELSE ;
; EXTRN $M_CLS_&innum:NEAR ; Must be external
; ENDIF ;
; ELSE ; ELSE
; PUBLIC $M_CLS_&innum ; Label PUBLIC
; ENDIF ;
; ENDIF ;
; ENDIF ;
; ENDIF ;
;ENDM ;
; ;
;$M_CHECK macro parm ;
; IFNDEF parm ; IF class is not in this assembly,
; IF FARmsg ;
; EXTRN parm:FAR ; Must be external
; ELSE ;
; EXTRN parm:NEAR ; Must be external
; ENDIF ;
; ELSE
; IF COMR
; ELSE
; PUBLIC parm
; ENDIF
; ENDIF ;
;ENDM ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
;IF2 ;
; $M_DECLARE %$M_NUM_CLS ; Declare any class not in this assembly
;ENDIF ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Message Retreiver requests
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
MSG_UTILNAME Macro utilname ;
;
INCLUDE &utilname.CTL ; Include the control file for the utility
$M_STRUC = TRUE ;
INCLUDE MSGSERV.ASM ; Get structure definitions
;
ENDM ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MSG_SERVICES Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
MSG_SERVICES Macro varlist ; MACRO used in source routine
;
$M_SERVICE = FALSE ; Reset service flag
IRP var,<varlist> ; FOR each variable in the list
$M_INCLUDE = TRUE ; Reset include flag
; For each service predefined
IRP serv,<MSGDATA,LOADmsg,NOVERCHECKmsg,DISPLAYmsg,GETmsg,INPUTmsg,CHARmsg,NUMmsg,TIMEmsg,DATEmsg,NEARmsg,FARmsg,COMR,COMT>
IFDIF <var>,<serv> ; IF it IS a service (defined above)
ELSE ;
IFDIF <var>,<MSGDATA> ; IF it is NOT the message data space request
$M_MSGDATA_ONLY = FALSE ; Instruct the assembler to include all services
ENDIF ; ENDIF
IRP repl,<CHARmsg,NUMmsg,TIMEmsg,DATEmsg> ; IF it is a replace service
IFIDN <var>,<repl> ;
$M_REPLACE = TRUE ; Set replace flag
ENDIF ;
ENDM ;
serv = TRUE ; Let the assembler know about the service
$M_SERVICE = TRUE ; Let the macro know it was a service
$M_INCLUDE = FALSE ; Let the macro know it wasn't a class
ENDIF ; ENDIF
ENDM ; NEXT service
MSG_SERVICES2 <varlist>
; Continue further checks (If we add any more predefined
; function to the above IRP command, it generates a
; syntax error. We must continue the processing in another
; MACRO called MSG_SERVICES2)
IF $M_INCLUDE ; IF message class was requested
$M_INC var ; Include it as a message class
ENDIF ; ENDIF
ENDM ; NEXT variable
;
IF $M_SERVICE ; IF it any services were requested THEN
INCLUDE MSGSERV.ASM ; THEN include module to get service
ENDIF ; ENDIF
ENDM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MSG_SERVICES2 Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
MSG_SERVICES2 Macro varlist2 ; MACRO used in source routine
;
; FOR each variable in the list
IRP var2,<varlist2>
; For each service predefined
IRP serv2,<SETSTDIO,NOCHECKSTDIN,NOCHECKSTDOUT,DISK_PROC>
;AN003; IF it IS a service (defined above)
IFDIF <var2>,<serv2>
ELSE ;
serv2 = TRUE ; Let the assembler know about the service
$M_SERVICE = TRUE ; Let the macro know it was a service
$M_INCLUDE = FALSE ; Let the macro know it wasn't a class
ENDIF ; ENDIF
ENDM ; NEXT service
ENDM ; NEXT variable
ENDM ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_INC Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
$M_INC Macro ext ;
;
INCLUDE &ext ;
;
ENDM ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_BUILD_PTRS Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
$M_BUILD_PTRS Macro nummsg ;
;
$M_INDEX = 0 ;
IF COMR ; IF this is resident COMMAND.COM
$M_MAKE_COMR ;
ELSE ; ELSE
IF COMT ; IF this is transient COMMAND.COM
$M_MAKE_COMT ;
ELSE ; ELSE
;
$M_INDEX = 0 ;
$M_COUNT = 0 ; Build normal utilities
;
REPT nummsg ;
$M_COUNT = $M_COUNT + 1 ;
$M_MAKE %$M_COUNT ;
ENDM ;
ENDIF ;
ENDIF ;
ENDM ;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_MAKE Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
$M_MAKE Macro $m_append ;
IF FARmsg ;
CALL FAR PTR $M_CLS_&$m_append ; Get addressibilty to class &$M_APPEND (ES:DI)
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX+2,ES ; Move into first avaliable table location
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
ELSE ;
CALL $M_CLS_&$m_append ; Get addressibilty to class &$M_APPEND (ES:DI)
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
ENDIF ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
ENDM ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_MAKE_COMR Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
$M_MAKE_COMR macro ;
;
CALL $M_CLS_3 ; Get addressibilty to class A
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
CALL $M_CLS_4 ; Get addressibilty to class B
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
CALL $M_CLS_5 ; Get addressibilty to class C
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
CALL $M_CLS_6 ; Get addressibilty to class D
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
CALL $M_CLS_7 ; Get addressibilty to class E
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
ENDM ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; $M_MAKE_COMT Macro
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
$M_MAKE_COMT macro ;
;
;; CALL $M_CLS_8 ; Get addressibilty to class A
CALL $M_CLS_3 ; Get addressibilty to class F
MOV WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ;
$M_INDEX = $M_INDEX + 4 ; Set next available table location
;
ENDM ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;