Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-1


				TITLE   SORT FILTER FOR DOS
				        PAGE    ,132                    ;
				;**********************************************************
				;*
				;*   UTILITY NAME:         sort
				;*
				;*   SOURCE FILE NAME:     sort.asm
				;*
				;*   UTILITY FUNCTION:
				;*
				;*         External non-resident utility, written in Assembler.
				;*         Reads from the standard input device until end-of-file,
				;*         sorts the data (up to 64k) and writes the results to
				;*         the standard output device.  Input and output can be
				;*         redirected.
				;*
				;*   INPUT (Command line)
				;*
				;*           SORT [/R] [/+ n]
				;*
				;*          /R   - Sort in reverse order
				;*          /+n  - Start sorting in column "n" , default 1
				;*
				;*   OUTPUT:
				;*         Sorted data will be written to the standard output device.
				;*
				;*   ERROR CONDITIONS:
				;*         Incorrect DOS version
				;*         Insufficient disk space on target
				;*         Insufficient memory to allocate SORT buffer
				;*         Invalid parameter
				;*
				;*   INTERNAL REFERENCES:
				;*         Main
				;*
				;*   SOURCE HISTORY:
				;*         Modification History:
				;*         3-18-83 MZ   (Microsoft)
				;*                      Fix CR-LF at end of buffer
				;*                      Fix small file sorting
				;*                      Fix CR-LF line termination bug
				;*                      Comment the Damn source
				;*
				;*         6-23-86 RW (IBM)
				;*                      Add DOS 3.30 support for multiple languages
				;*                      Inclusion of common DOS VERSION check equate
				;*
				;*  ;AN000; Code added in DOS 4.0
				;*         5-19-87 RW (IBM) (DOS 4.0)
				;*                      Addition of IBM Parser Service Routines
				;*                      Addition of DOS Message Retriever Service Routines
				;*                      Add code page file tag support
				;*
				;*  ;AN001; Code added in DOS 4.0
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-2


				;*  ;AN002; DCR 191
				;*         9-18-87 BL (IBM) (DOS 4.0)
				;*                      Added Extended Attribute support for code page checking
				;*                       and file type checking.
				;*  ;AN003; PTM 1805
				;*         10-19-87 BL (IBM) (DOS 4.0)
				;*
				;*  ;AN004; PTM
				;*         01-29-87 BL (IBM) (DOS 4.0)
				;*                      Ran tool INSPECT on .lst file for optimizations
				;**********************************************************
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-3


				        PAGE   ;
				;-------------------------
				;---    Macro definitions
				;-------------------------
				BREAK   MACRO   subtitle
				        SUBTTL  subtitle
				        PAGE
				ENDM
				
				
				
				sys     MACRO   name            ;system call macro
				        MOV     AH,name
				        INT     21h
				        ENDM
				
				
				
				save    MACRO   reglist         ;push those registers
				IRP reg,<reglist>
				        PUSH    reg
				ENDM
				ENDM
				
				
				
				restore MACRO   reglist         ;pop those registers
				IRP reg,<reglist>
				        POP     reg
				ENDM
				ENDM
				
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-4


				        PAGE   ;
				;-------------------------------
				;---    Equates
				;-------------------------------
 = 0000				FALSE   EQU     0
 = FFFF				TRUE    EQU     NOT FALSE
 = 0100				MAXREC  EQU     256                     ;MAXIMUM NUL RECORD SIZE
				
 = 0000				SPACE   EQU     0                       ;Offset zero in the allocated block
 =				BUFFER  EQU     MAXREC                  ;Offset MAXREC in the allocated block
				
 = 0000				RETCODE_NOERROR equ 0                   ;AN000; DOS return code (errorlevel)
 = 0001				RETCODE_ERROR   equ 1                   ;AN000; DOS return code (errorlevel)
				
 = 0000				NO_CODEPAGE     equ 0                   ;AN000; Tag for files with no codepage
				
 = 3303				GetCPSW         equ  3303h              ;AN000; Int 021h function calls
 = 5702				GetExtAttr      equ  5702h              ;AN000;
 = 5704				SetExtAttr      equ  5704h              ;AN000;
				;-----------------------
				;--     Parser equates
				;-----------------------
 =-0001				EOL     EQU    -1                       ;AN000; Indicator for End-Of-Line
 = 0000				NOERROR EQU     0                       ;AN000; Return Indicator for No Errors
				 
 = 0000				FarSW   equ     0                       ;AN000;
 = 0000				DateSW  equ     0                       ;AN000;
 = 0000				TimeSW  equ     0                       ;AN000;
 = 0000				FileSW  equ     0                       ;AN000;
 = 0000				CAPSW   equ     0                       ;AN000;
 = 0000				CmpxSW  equ     0                       ;AN000;
 = 0001				NumSW   equ     1                       ;AN000;
 = 0000				KeySW   equ     0                       ;AN000;
 = 0001				SwSW    equ     1                       ;AN000;
 = 0001				Val1SW  equ     1                       ;AN000;
 = 0000				Val2SW  equ     0                       ;AN000;
 = 0000				Val3SW  equ     0                       ;AN000;
 = 0000				DrvSW   equ     0                       ;AN000;
 = 0000				QusSW   equ     0                       ;AN000;
				
				;-----------------------
				;--     Message equates
				;-----------------------
 = 0000				STDIN   equ     0
 = 0001				STDOUT  equ     1
 = 0002				STDERR  equ     2
				
 = 0002				Msg_NoMem       equ     2               ;AC003;
 = 0004				Msg_NoDisk      equ     4               ;AC003;
 = 0005				Msg_sort        equ     5               ;AN003;
 = 0003				Msg_switch      equ     3               ;AN003;
				
				;------------------------------
				; EXTENDED ATTRIBUTE Equates
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-5


				;------------------------------
 = 0002				EAISBINARY            equ     02h        ;AN001;  ea_type
 = 8000				EASYSTEM              equ     8000h      ;AN001;  ea_flags
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-6


				        PAGE   ;
				;---------------------;
				.list                 ;
				;---------------------;
				
				MSG_UTILNAME <SORT>                     ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-7
DOS - Message Retriever - MSGSTR.INC Module                 

			     C1	$M_SUBLIST_STRUC STRUC					     ;;AN000;;
			     C1								     ;;
 0000  0B                    C1	    $M_S_SIZE	     DB        11			     ;;AN000;; SUBLIST size  (PTR to next SU
				BLIST)
 0001  00                    C1	    $M_S_RESV	     DB        0			     ;;AN000;; RESERVED
 0002  00000000              C1	    $M_S_VALUE	     DD        ?			     ;;AN000;; Time, Date or PTR to data ite
				m
 0006  00                    C1	    $M_S_ID	     DB        ?			     ;;AN000;; n of %n
 0007  00                    C1	    $M_S_FLAG	     DB        ?			     ;;AN000;; Data-type flags
 0008  00                    C1	    $M_S_MAXW	     DB        ?			     ;;AN000;; Maximum field width
 0009  00                    C1	    $M_S_MINW	     DB        ?			     ;;AN000;; Minimum field width
 000A  00                    C1	    $M_S_PAD	     DB        ?			     ;;AN000;; Character for Pad field
			     C1								     ;;
 000B                        C1	$M_SUBLIST_STRUC ENDS					     ;;AN000;;
			     C1	$M_CLASS_ID STRUC					     ;;AN000;;
			     C1								     ;;
 0000  FF                    C1	    $M_CLS_ID	     DB        -1			     ;;AN000;; Class identifer
 0001  0004                  C1	    $M_COMMAND_VER   DW        EXPECTED_VERSION 	     ;;AN003;; COMMAND.COM version check
 0003  00                    C1	    $M_NUM_CLS_MSG   DB        0			     ;;AN000;; Total number of message in cl
				ass
			     C1								     ;;
 0004                        C1	$M_CLASS_ID ENDS					     ;;
			     C1	$M_ID STRUC						     ;;AN000;;
			     C1								     ;;
 0000  FFFF                  C1	    $M_NUM	     DW        -1			     ;;AN000;; Message Number
 0002  0000                  C1	    $M_TXT_PTR	     DW        ?			     ;;AN000;; Pointer to message text
			     C1								     ;;
 0004                        C1	$M_ID ENDS						     ;;AN000;;
			     C1	$M_RES_ADDRS STRUC					     ;;AN000;;
			     C1								     ;;
 0000  00000000              C1	    $M_EXT_ERR_ADDRS DD        0			     ;;AN000;; Allow pointers to THREE Exten
				ded error locations
 0004  00000000              C1	    $M_EXT_FILE      DD        0			     ;;AN001;;
 0008  00000000              C1	    $M_EXT_COMMAND   DD        0			     ;;AN000;;
 000C  FFFFFFFF              C1	    $M_EXT_TERM      DD        -1			     ;;AN000;;
 0010  00000000              C1	    $M_PARSE_COMMAND DD        0			     ;;AN000;;
 0014  00000000              C1	    $M_PARSE_ADDRS   DD        0			     ;;AN000;; Allow pointers to TWO Parse e
				rror locations
 0018  FFFFFFFF              C1	    $M_PARSE_TERM    DD        -1			     ;;AN000;;
 001C  00000000              C1	    $M_CRIT_ADDRS    DD        0			     ;;AN000;; Allow pointers to TWO Critica
				l error locations
 0020  00000000              C1	    $M_CRIT_COMMAND  DD        0			     ;;AN000;;
 0024  FFFFFFFF              C1	    $M_CRIT_TERM     DD        -1			     ;;AN000;;
 0028  FFFFFFFF              C1	    $M_DISK_PROC_ADDR DD       -1			     ;;AN004;; Address of READ_DISK_PROC
 002C  0001[                 C1	    $M_CLASS_ADDRS   DD        $M_NUM_CLS DUP(0)	     ;;AN000;; Allow pointers to specified c
				lasses
	   00000000          C1	
			 ]   C1	
			     C1	
 0030  FFFFFFFF              C1	    $M_CLS_TERM      DD        -1			     ;;AN000;;
 0034  00000000              C1	    $M_DBCS_VEC      DD        0			     ;;AN000;; Save DBCS vector
 0038  0000                  C1	    $M_HANDLE	     DW        ?			     ;;AN000;;
 003A  00                    C1	    $M_SIZE	     DB        0			     ;;AN000;;
 003B  0D 0A                 C1	    $M_CRLF	     DB        0DH,0AH			     ;;AN004;; CR LF message
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-8
DOS - Message Retriever - MSGSTR.INC Module                 

 003D  00                    C1	    $M_CLASS	     DB        ?			     ;;AN004;; Saved class
 003E  0000                  C1	    $M_RETURN_ADDR   DW        ?			     ;;AN000;;
 0040  0000                  C1	    $M_MSG_NUM	     DW        $M_NULL			     ;;AN000;;
 0042  000A                  C1	    $M_DIVISOR	     DW        10			     ;;AN000;; Default = 10 (must be a WORD 
				for division)
 0044  0040[                 C1	    $M_TEMP_BUF      DB        $M_TEMP_BUF_SZ DUP("$")	     ;;AN000;; Temporary buffer
	   24                C1	
			 ]   C1	
			     C1	
 0084  24                    C1	    $M_BUF_TERM      DB        "$"			     ;;AN000;;
			     C1	
 0085                        C1	$M_RES_ADDRS ENDS					     ;;AN000;;
			     C1	$M_COUNTRY_INFO STRUC					     ;;AN000;; Expected Country infomation
			     C1								     ;;
 0000  0044[                 C1	    $M_HEADER	     DB       $M_RES_ADDRS_SZ-$M_TEMP_BUF_SZ-1 DUP(?) ;;AN000;; Go past first part o
				f struc
	   ??                C1	
			 ]   C1	
			     C1	
 0044  0000                  C1	    $M_DATE_FORMAT   DW       ? 			     ;;AN000;; <------- Date Format
 0046  0005[                 C1	    $M_CURR_SEPARA   DB       5 DUP(?)			     ;;AN000;;
	   ??                C1	
			 ]   C1	
			     C1	
 004B  00 00                 C1	    $M_THOU_SEPARA   DB       ?,0			     ;;AN000;; <------- Thou Separator
 004D  00 00                 C1	    $M_DECI_SEPARA   DB       ?,0			     ;;AN000;; <------- Decimal Separator
 004F  00 00                 C1	    $M_DATE_SEPARA   DB       ?,0			     ;;AN000;; <------- Date Separator
 0051  00 00                 C1	    $M_TIME_SEPARA   DB       ?,0			     ;;AN000;; <------- Time Separator
 0053  00                    C1	    $M_CURR_FORMAT   DB       ? 			     ;;AN000;;
 0054  00                    C1	    $M_SIG_DIGS_CU   DB       ? 			     ;;AN000;;
 0055  00                    C1	    $M_TIME_FORMAT   DB       ? 			     ;;AN000;; <------- Time Format
			     C1								     ;;
 0056                        C1	$M_COUNTRY_INFO ENDS					     ;;AN000;;
				
				SUBTTL  Segments used in load order
				
				
 0000				CODE    SEGMENT
 0000				CODE    ENDS
				
 0000				CONST   SEGMENT PUBLIC BYTE
 0000				CONST   ENDS
				
				
				;-----------------------
				;---    Stack Segment
				;-----------------------
 0000				CSTACK  SEGMENT STACK
 0000  0080[			        db 128 DUP (0)          ;initial stack to be clear
	   00			
			 ]	
				
				
 0080				CSTACK  ENDS
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-9
Segments used in load order                                 

				
				
				
				;-------------------------------
				;---    Group
				;-------------------------------
				DG      GROUP   CODE,CONST,CSTACK
				
				
				;-------------------------------
				;---    Code Segment
				;-------------------------------
 0000				CODE    SEGMENT
				ASSUME  CS:DG,DS:DG,ES:NOTHING,SS:CSTACK
				
				;-------------------------------
				;---    Data Definition
				;-------------------------------
 0000  0000			COLUMN          dw      0               ;COLUMN TO USE FOR KEY + 1
 0002  00			cp_reset        db      FALSE           ;AN000;Flag indicating if Code Page was reset on target file
				
				;------------------------------------------DOS 3.30 - Russ Whitehead
 0003  00			CTRY_INFO       db      ?
 0004  0000			CTRY_TABLE_OFF  dw      ?
 0006  0000			CTRY_TABLE_SEG  dw      ?
				;------------------------------------------
				
				MSG_SERVICES <MSGDATA>                  ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-10
DOS - Message Retriever - MSGRES.TAB Module                 

 0008                        C1	      $M_RT   LABEL   BYTE				     ;;AN000;;
 0008  00000000              C1	      $M_RES_ADDRS <>					     ;;AN000;; Resident addresses
 000C  00000000              C1	
 0010  00000000              C1	
 0014  FFFFFFFF              C1	
 0018  00000000              C1	
 001C  00000000              C1	
 0020  FFFFFFFF              C1	
 0024  00000000              C1	
 0028  00000000              C1	
 002C  FFFFFFFF              C1	
 0030  FFFFFFFF              C1	
 0034  00000000              C1	
 0038  FFFFFFFF              C1	
 003C  00000000              C1	
 0040  0000                  C1	
 0042  00                    C1	
 0043  0001[                 C1	
 0045  00                    C1	
 0046  0000                  C1	
 0048  0000                  C1	
 004A  0A00                  C1	
 004C  0040[                 C1	
 008C  24                    C1	
 008D  4D 53 20 44 4F 53     C1		DB	"MS DOS Version 4.00 (C)Copyright 1988 Microsoft Corp"
 00C1  4C 69 63 65 6E 73     C1		DB	"Licensed Material - Property of Microsoft  "
				ASSUME   ds:nothing
				
				;----------------------------------------
				;- STRUCTURE TO QUERY EXTENDED ATTRIBUTES
				;----------------------------------------
				querylist      struc                    ;AN001; ;query general list
 0000  0001			qea_num        dw      1                ;AN001;
 0002  02			qea_type       db      EAISBINARY       ;AN001;
 0003  8000			qea_flags      dw      EASYSTEM         ;AN001;
 0005  00			qea_namelen    db      ?                ;AN001;
 0006  20 20 20 20 20 20	qea_name       db      "        "       ;AN001;
       20 20			
 000E				querylist      ends                     ;AN001;
				
 00EC  0100			cp_qlist       querylist <1,EAISBINARY,EASYSTEM,2,"CP">   ;AN001; ;query code page attr.
 00EE  02			
 00EF  0080			
 00F1  02			
 00F2  4350202020202020		
				
				
 00FA				cp_list        label   word             ;AN001; ;code page attr. get/set list
 00FA  0001			               dw      1                ;AN001; ; # of list entries
 00FC  02			               db      EAISBINARY       ;AN001; ; ea type
 00FD  8000			               dw      EASYSTEM         ;AN001; ; ea flags
 00FF  00			               db      ?                ;AN001; ; ea return code
 0100  02			               db      2                ;AN001; ; ea name length
 0101  0002			               dw      2                ;AN001; ; ea value length
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-11
DOS - Message Retriever - MSGRES.TAB Module                 

 0103  43 50			               db      "CP"             ;AN001; ; ea name
 0105  0000			cp             dw      ?                ;AN001; ; ea value (code page)
 = 000D				cp_len         equ     ($ - cp_list)    ;AN001;
				
				;-------Save area for Code Pages
 0107  0000			src_cp         dw      ?                ;AN000; Save area for current code page
 0109  0000			tgt_cp         dw      ?                ;AN000; Save area for current code page
 010B				endlist label  word                     ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-12
DOS - Message Retriever - MSGRES.TAB Module                 

				        PAGE   ;
				;******************************************************************************
				;*                                               PARSER DATA STRUCTURES FOLLOW
				;******************************************************************************
				
				;------------------------------
				;- STRUCTURE TO DEFINE ADDITIONAL COMMAND LINE DELIMITERS
				;------------------------------
 010B				parms   label   word                    ;AN000;
 010B  0110 R			        dw      parmsx                  ;AN000; POINTER TO PARMS STRUCTURE
 010D  01			        db      1                       ;AN000; DELIMITER LIST FOLLOWS
 010E  01			        db      1                       ;AN000; NUMBER OF ADDITIONAL DELIMITERS
 010F  3B			        db      ";"                     ;AN000; ADDITIONAL DELIMITER
				
				;------------------------------
				;- STRUCTURE TO DEFINE SORT SYNTAX REQUIREMENTS
				;------------------------------
 0110				parmsx  label   word                    ;AN000;
 0110  00 00			        db      0,0                     ;AN000; THERE ARE NO POSITIONAL PARAMETERS
 0112  02			        db      2                       ;AN000; THERE ARE 2 SWITCHES (/R AND /+n)
 0113  0119 R			        dw      sw1                     ;AN000; POINTER TO FIRST SWITCH DEFINITION AREA
 0115  0125 R			        dw      sw2                     ;AN000; POINTER TO SECOND SWITCH DEFINITION AREA
 0117  0000			        dw      0                       ;AN000; THERE ARE NO KEYWORDS IN SORT SYNTAX
				
				;------------------------------
				;- STRUCTURE TO DEFINE THE /R SWITCH
				;------------------------------
 0119				sw1     label   word                    ;AN000;
 0119  0000			        dw      0                       ;AN000; NO MATCH FLAGS
 011B  0000			        dw      0                       ;AN000; NO FUNCTION FLAGS
 011D  013D R			        dw      switchbuff              ;AN000; PLACE RESULT IN switchbufF
 011F  0131 R			        dw      novals                  ;AN000; NO VALUE LIST
 0121  01			        db      1                       ;AN000; ONLY ONE SWITCH IN FOLLOWING LIST
 0122  2F 52 00			rev_sw  db      "/R",0                  ;AN000; /R INDICATES REVERSE SORT
				
				;------------------------------
				;- STRUCTURE TO DEFINE THE /+n SWITCH
				;------------------------------
 = 8000				NUMERIC equ     08000h                  ;AN000; Control flag for numeric value
 = 0020				NO_COLON equ    0020h                   ;AN000;
				
 0125				sw2     label   word                    ;AN000;
 0125  8000			        dw      NUMERIC                 ;AN000; MATCH_FLAGS
 0127  0020			        dw      NO_COLON                ;AN000; NO FUNCTION FLAGS
 0129  013D R			        dw      switchbuff              ;AN000; PLACE RESULT IN switchbufF
 012B  0132 R			        dw      valuelist               ;AN000; NEED VALUE LIST FOR n
 012D  01			        db      1                       ;AN000; ONLY 1 SWITCH ON FOLLOWING LIST
 012E  2F 2B 00			col_sw  db      "/+",0                  ;AN000; /+n INDICATES BEGIN SORT IN COLUMN n
				
				;------------------------------
				;- VALUE LIST DEFINITION FOR NO VALUES
				;------------------------------
 0131				novals  label   word                    ;AN000;
 0131  00			        DB      0                       ;AN000;  VALUE LIST
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-13
DOS - Message Retriever - MSGRES.TAB Module                 

				
				;------------------------------
				;- VALUE LIST DEFINITION FOR /+n
				;------------------------------
 0132				valuelist       label   word            ;AN000;
 0132  01			                db      1               ;AN000; ONE VALUE ALLOWED
 0133  01			                db      1               ;AN000; ONLY ONE RANGE
 0134  01			                db      1               ;AN000; IDENTIFY THE RANGE
 0135  00000001 0000FFFF	                dd      1,65535         ;AN000; USER CAN SPECIFY /+1 THROUGH /+65535
				
				;------------------------------
				;- RETURN BUFFER FOR SWITCH INFORMATION
				;------------------------------
 013D				switchbuff      label   word            ;AN000;
 013D  00			sb_type         db      ?               ;AN000; TYPE RETURNED
 013E  00			sb_item_tag     db      ?               ;AN000; SPACE FOR ITEM TAG
 013F  0000			sb_synonym      dw      ?               ;AN000; ES:sb_synonym points to synonym
				
 0141  0000			sb_value        dw      ?               ;AN000; SPACE FOR VALUE
 0143  0000			sb_value_extra  dw      ?               ;AN000; UNUSED SPACE FOR VALUE
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-14
DOS - Message Retriever - MSGRES.TAB Module                 

				        PAGE   ;
				;**************************************************************
				;*
				;*   SUBROUTINE NAME:      main
				;*
				;*   SUBROUTINE FUNCTION:
				;*         Mainline routine, performs SYSLODMSG, calls routines to
				;*         parse command line, performs the SORT and writes the
				;*         results.
				;*
				;*   INPUT:
				;*         Command Line.
				;*
				;*         File to be sorted will be read from Standard Input
				;*         device handle 0.
				;*
				;*   OUTPUT:
				;*         Sorted data will be written to the Standard Output
				;*         device handle 1.
				;*
				;*   NORMAL EXIT:
				;*         SORT will normally exit when data was successfully read
				;*         in up to 64k or EOF, sorted, and displayed to the
				;*         standard output device.
				;*
				;*   ERROR EXIT:
				;*         If any of the following errors, SORT will display the
				;*         corresponding error message and terminate.
				;*
				;*           Insufficient disk space on target device
				;*           Incorrect DOS version
				;*           Insufficient memory to sort
				;*
				;************************************************************
				
				;-------------------------
				; Preload messages
				;-------------------------
				
				 public amis_sign
 0145  90				even
 0146				amis_sign:
 0146  65 63 6D				db "ecm"
 0149  0005[				db 5 dup (' ')
	   20			
			 ]	
				
 014E  6C 44 4F 53			db "lDOS"
 0152  0004[				db 4 dup (' ')
	   20			
			 ]	
				
 0156				amis_id:			; must be directly after amis_sign
 0156  0000				dw 0
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-15
DOS - Message Retriever - MSGRES.TAB Module                 

 0158  0000				dw 0			; sequential number
 015A  04				db amis_id_msg_end - amis_id_msg
 015B				amis_id_msg:
 015B  73 6F 72 74			db "sort"		; our id name
 015F				amis_id_msg_end:
				
 =				AMIS_SIGN_SEGMENT equ DG
				
				        MSG_SERVICES <SORT.ctl,SORT.cla,SORT.cl1,SORT.cl2>      ;AN000;
 015F                        C3	$M_CLASS_A_STRUC LABEL BYTE
 015F  FF                    C3	        $M_CLASS_ID <0FFH,EXPECTED_VERSION,Class_A_MessageCount>
 0160  0400                  C3	
 0162  04                    C3	
 0163                        C3	$M_A_00001H_STRUC LABEL BYTE
 0163  0100                  C3	        $M_ID   <00001H,$M_A_00001H_MSG-$M_A_00001H_STRUC>
 0165  1000                  C3	
 0167                        C3	$M_A_00002H_STRUC LABEL BYTE
 0167  0200                  C3	        $M_ID   <00002H,$M_A_00002H_MSG-$M_A_00002H_STRUC>
 0169  2400                  C3	
 016B                        C3	$M_A_00004H_STRUC LABEL BYTE
 016B  0400                  C3	        $M_ID   <00004H,$M_A_00004H_MSG-$M_A_00004H_STRUC>
 016D  3600                  C3	
 016F                        C3	$M_A_00005H_STRUC LABEL BYTE
 016F  0500                  C3	        $M_ID   <00005H,$M_A_00005H_MSG-$M_A_00005H_STRUC>
 0171  4C00                  C3	
 0173                        C3	$M_A_00001H_MSG LABEL BYTE
 0173  17                    C3	        DB      $M_A_00001H_END-$M_A_00001H_MSG-1
 0174  49 6E 63 6F 72 72     C3	        DB      "Incorrect DOS version",CR,LF
 018B                        C3	$M_A_00001H_END LABEL BYTE
 018B                        C3	$M_A_00002H_MSG LABEL BYTE
 018B  15                    C3	        DB      $M_A_00002H_END-$M_A_00002H_MSG-1
 018C  49 6E 73 75 66 66     C3	        DB      "Insufficient memory",CR,LF
 01A1                        C3	$M_A_00002H_END LABEL BYTE
 01A1                        C3	$M_A_00004H_MSG LABEL BYTE
 01A1  19                    C3	        DB      $M_A_00004H_END-$M_A_00004H_MSG-1
 01A2  49 6E 73 75 66 66     C3	        DB      "Insufficient disk space",CR,LF
 01BB                        C3	$M_A_00004H_END LABEL BYTE
 01BB                        C3	$M_A_00005H_MSG LABEL BYTE
 01BB  06                    C3	        DB      $M_A_00005H_END-$M_A_00005H_MSG-1
 01BC  53 4F 52 54 3A 20     C3	        DB      "SORT: "
 01C2                        C3	$M_A_00005H_END LABEL BYTE
 01C2                        C3	$M_CLS_1 PROC NEAR
 01C2  0E                    C3	        PUSH    CS
 01C3  07                    C3	        POP     ES
 01C4  8D 3E 015F R          C3	        LEA     DI,$M_CLASS_A_STRUC
 01C8  83 C1 69              C3	        ADD     CX,$-$M_CLASS_A_STRUC
 01CB  C3                    C3	        RET
 01CC                        C3	$M_CLS_1 ENDP
 01CC                        C3	$M_CLASS_1_STRUC LABEL BYTE
 01CC  01                    C3	        $M_CLASS_ID <001H,EXPECTED_VERSION,Class_1_MessageCount>
 01CD  0400                  C3	
 01CF  01                    C3	
 01D0                        C3	$M_1_FF_STRUC LABEL BYTE
 01D0  FFFF                  C3	        $M_ID <0FFFFH,$M_1_FF_MSG-$M_1_FF_STRUC>
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-16
DOS - Message Retriever - MSGRES.TAB Module                 

 01D2  0400                  C3	
 01D4                        C3	$M_1_FF_MSG LABEL BYTE
 01D4  11                    C3	        DB      $M_1_FF_END-$M_1_FF_MSG-1
 01D5  45 78 74 65 6E 64     C3	        DB      "Extended Error %1"
 01E6                        C3	$M_1_FF_END LABEL BYTE
 01E6                        C3	$M_MSGSERV_1 PROC NEAR
 01E6  0E                    C3	        PUSH    CS
 01E7  07                    C3	        POP     ES
 01E8  8D 3E 01CC R          C3	        LEA     DI,$M_CLASS_1_STRUC
 01EC  83 C1 20              C3	        ADD     CX,$-$M_CLASS_1_STRUC
 01EF  C3                    C3	        RET
 01F0                        C3	$M_MSGSERV_1 Endp
 01F0                        C3	$M_CLASS_2_STRUC LABEL BYTE
 01F0  02                    C3	        $M_CLASS_ID <002H,EXPECTED_VERSION,Class_2_MessageCount>
 01F1  0400                  C3	
 01F3  01                    C3	
 01F4                        C3	$M_2_FF_STRUC LABEL BYTE
 01F4  FFFF                  C3	        $M_ID <0FFFFH,$M_2_FF_MSG-$M_2_FF_STRUC>
 01F6  0400                  C3	
 01F8                        C3	$M_2_FF_MSG LABEL BYTE
 01F8  0E                    C3	        DB      $M_2_FF_END-$M_2_FF_MSG-1
 01F9  50 61 72 73 65 20     C3	        DB      "Parse Error %1"
 0207                        C3	$M_2_FF_END LABEL BYTE
 0207                        C3	$M_MSGSERV_2 PROC NEAR
 0207  0E                    C3	        PUSH    CS
 0208  07                    C3	        POP     ES
 0209  8D 3E 01F0 R          C3	        LEA     DI,$M_CLASS_2_STRUC
 020D  83 C1 1D              C3	        ADD     CX,$-$M_CLASS_2_STRUC
 0210  C3                    C3	        RET
 0211                        C3	$M_MSGSERV_2 Endp
				        MSG_SERVICES <DISPLAYmsg,LOADmsg,CHARmsg,NOCHECKSTDIN>          ;AN002; Make retriever servi
				ces available
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-17
DOS - Message Retriever - LOADMSG.ASM Module                

 0211                        C1		SYSLOADMSG PROC NEAR				     ;;AN000;;
 0211  50                    C1		PUSH	AX					     ;;AN000;
 0212  53                    C1		PUSH	BX					     ;;AN000;
 0213  52                    C1		PUSH	DX					     ;;AN000;
 0214  06                    C1		PUSH	ES					     ;;AN000;
 0215  57                    C1		PUSH	DI					     ;;AN000;
 0216  33 C9                 C1		XOR	CX,CX					     ;;AN000;  Reset to zero
 0218  8E C1                 C1		MOV	ES,CX					     ;;AN000;
 021A  33 FF                 C1		XOR	DI,DI					     ;;AN000;
 021C  B8 122E               C1		MOV	AX,DOS_GET_EXT_PARSE_ADD		     ;;AN000;; 2FH Interface
 021F  B2 00                 C1		MOV	DL,DOS_GET_EXTENDED			     ;;AN000;; Where are the Extended errors
				 in COMMAND.COM
 0221  CD 2F                 C1		INT	2FH					     ;;AN000;; Private interface
 0223  2E: 8C 06 0012 R      C1		MOV	WORD PTR $M_RT.$M_EXT_COMMAND+2,ES	     ;;AN000;;	Move into first avaliable ta
				ble location
 0228  2E: 89 3E 0010 R      C1		MOV	WORD PTR $M_RT.$M_EXT_COMMAND,DI	     ;;AN000;;
 022D  B8 122E               C1		MOV	AX,DOS_GET_EXT_PARSE_ADD		     ;;AN000;; 2FH Interface
 0230  B2 02                 C1		MOV	DL,DOS_GET_PARSE			     ;;AN000;; Where are the Parse errors in
				 COMMAND.COM
 0232  CD 2F                 C1		INT	2FH					     ;;AN000;; Private interface
 0234  2E: 8C 06 001A R      C1		MOV	WORD PTR $M_RT.$M_PARSE_COMMAND+2,ES	     ;;AN000;;	Move into first avaliable ta
				ble location
 0239  2E: 89 3E 0018 R      C1		MOV	WORD PTR $M_RT.$M_PARSE_COMMAND,DI	     ;;AN000;;
 023E  B8 122E               C1		MOV	AX,DOS_GET_EXT_PARSE_ADD		     ;;AN000;; 2FH Interface
 0241  B2 04                 C1		MOV	DL,DOS_GET_CRITICAL			     ;;AN000;; Where are the Critical errors
				 in COMMAND.COM
 0243  CD 2F                 C1		INT	2FH					     ;;AN000;; Private interface
 0245  2E: 8C 06 002A R      C1		MOV	WORD PTR $M_RT.$M_CRIT_COMMAND+2,ES	     ;;AN000;;	Move into first avaliable ta
				ble location
 024A  2E: 89 3E 0028 R      C1		MOV	WORD PTR $M_RT.$M_CRIT_COMMAND,DI	     ;;AN000;;
 024F  B8 122E               C1		MOV	AX,DOS_GET_EXT_PARSE_ADD		     ;;AN001;; 2FH Interface
 0252  B2 06                 C1		MOV	DL,DOS_GET_FILE 			     ;;AN001;; Where are the FILE dependant 
				in IFSFUNC.EXE
 0254  CD 2F                 C1		INT	2FH					     ;;AN001;; Private interface
 0256  2E: 8C 06 000E R      C1		MOV	WORD PTR $M_RT.$M_EXT_FILE+2,ES 	     ;;AN001;;	Move into first avaliable ta
				ble location
 025B  2E: 89 3E 000C R      C1		MOV	WORD PTR $M_RT.$M_EXT_FILE,DI		     ;;AN001;;
 0260  E8 01E6 R             C1		  CALL	  $M_MSGSERV_1				     ;;AN000;; Get addressibilty to MSGSERV 
				CLASS 1 (EXTENDED Errors)
 0263  2E: 8C 06 000A R      C1		MOV	WORD PTR $M_RT.$M_EXT_ERR_ADDRS+2,ES	     ;;AN000;; Move into first avaliable tab
				le location
 0268  2E: 89 3E 0008 R      C1		MOV	WORD PTR $M_RT.$M_EXT_ERR_ADDRS,DI	     ;;AN000;;
 026D  2E: 8C 06 0026 R      C1		MOV	WORD PTR $M_RT.$M_CRIT_ADDRS+2,ES	     ;;AN000;; Move into first avaliable tab
				le location
 0272  2E: 89 3E 0024 R      C1		MOV	WORD PTR $M_RT.$M_CRIT_ADDRS,DI 	     ;;AN000;;
 0277  E8 0207 R             C1		  CALL	  $M_MSGSERV_2				     ;;AN000;; Get addressibilty to MSGSERV 
				CLASS 2 (PARSE Errors)
 027A  2E: 8C 06 001E R      C1		MOV	WORD PTR $M_RT.$M_PARSE_ADDRS+2,ES	     ;;AN000;; Move into first avaliable tab
				le location
 027F  2E: 89 3E 001C R      C1		MOV	WORD PTR $M_RT.$M_PARSE_ADDRS,DI	     ;;AN000;;
 0284  B8 122E               C1		MOV	AX,DOS_GET_EXT_PARSE_ADD		     ;;AN001;; 2FH Interface
 0287  B2 08                 C1		MOV	DL,DOS_GET_ADDR 			     ;;AN001;; Where is the READ_DISK_PROC i
				n COMMAND.COM
 0289  CD 2F                 C1		INT	2FH					     ;;AN001;; Private interface
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-18
DOS - Message Retriever - LOADMSG.ASM Module                

 028B  2E: 8C 06 0032 R      C1		MOV	WORD PTR $M_RT.$M_DISK_PROC_ADDR+2,ES	     ;;AN001;;	Move into first avaliable ta
				ble location
 0290  2E: 89 3E 0030 R      C1		MOV	WORD PTR $M_RT.$M_DISK_PROC_ADDR,DI	     ;;AN001;;
 0295  E8 01C2 R             C4	    CALL    $M_CLS_1			 ;  Get addressibilty to class &$M_APPEND (ES:DI) 
 0298  2E: 89 3E 0034 R      C4	    MOV     WORD PTR $M_RT.$M_CLASS_ADDRS+$M_INDEX,DI ; 
 029D  E8 02B6 R             C1		CALL	$M_GET_DBCS_VEC 			     ;;AN000;; Save the DBCS vector
 02A0  E8 02D0 R             C1		CALL	$M_CHECKSTDOUT				     ;;AN000;;	 Set Disk Full CHECK
 02A3  51                    C1		PUSH	CX					     ;;AN000;;
 02A4  E8 032C R             C1		CALL	$M_VERSION_CHECK			     ;;AN000;;	 Check Version
 02A7  72 08                 C1		JC $MIF20
 02A9  59                    C1		  POP	  CX					     ;;AN000;;	Reset stack
 02AA  5F                    C1		  POP	  DI					     ;;AN000;;	Restore REGS
 02AB  07                    C1		  POP	  ES					     ;;AN000;;
 02AC  5A                    C1		  POP	  DX					     ;;AN000;;
 02AD  5B                    C1		  POP	  BX					     ;;AN000;;
 02AE  58                    C1		  POP	  AX					     ;;AN000;;
 02AF  EB 04                 C1		JMP SHORT $MEN20
 02B1                        C1	$MIF20:
 02B1  83 C4 0C              C1		  ADD	  SP,12 				     ;;AN000;;
 02B4  F9                    C1		  STC						     ;;AN000;;	Reset carry flag
 02B5                        C1	$MEN20:
 02B5  C3                    C1		RET						     ;;AN000;;
 02B6                        C1		SYSLOADMSG ENDP 				     ;;AN000;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-19
DOS - Message Retriever - $M_VERSION_CHECK Proc             

 02B6                        C1	$M_GET_DBCS_VEC PROC NEAR				     ;;AN000;;
 02B6  50                    C1		PUSH	AX					     ;;AN000;; Save character to check
 02B7  56                    C1		PUSH	SI					     ;;AN000;;
 02B8  1E                    C1		PUSH	DS					     ;;AN000;;
 02B9  B8 6300               C1		MOV	AX,DOS_GET_DBCS_INFO			     ;;AN000;; DOS function to get DBSC envi
				ronment
 02BC  CD 21                 C1		INT	21H					     ;;AN000;; Get environment pointer
 02BE  1E                    C1		PUSH	DS					     ;;AN000;; Get environment pointer
 02BF  07                    C1		POP	ES					     ;;AN000;; Get environment pointer
 02C0  1F                    C1		POP	DS					     ;;AN000;; Get environment pointer
 02C1  72 0A                 C1		JC $MIF23
 02C3  2E: 89 36 003C R      C1		  MOV	  WORD PTR $M_RT.$M_DBCS_VEC,SI 	     ;;AN000;; Save DBCS Vector
 02C8  2E: 8C 06 003E R      C1		  MOV	  WORD PTR $M_RT.$M_DBCS_VEC+2,ES	     ;;AN000;;
 02CD                        C1	$MIF23:
 02CD  5E                    C1		POP	SI					     ;;AN000;;
 02CE  58                    C1		POP	AX					     ;;AN000;; Retrieve character to check
 02CF  C3                    C1		RET						     ;;AN000;; Return
 02D0                        C1	$M_GET_DBCS_VEC ENDP					     ;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-20
DOS - Message Retriever - $M_CHECKSTDOUT Proc               

 02D0                        C1	$M_CHECKSTDOUT PROC NEAR				     ;AN001;
 02D0  B8 4400               C1		  MOV	  AX,DOS_IOCTL_GET_INFO 		     ;AN001; Get info using IOCTL
 02D3  BB 0001               C1		  MOV	  BX,STDOUT				     ;AN001;
 02D6  33 D2                 C1		  XOR	  DX,DX 				     ;AN001;
 02D8  CD 21                 C1		  INT	  21H					     ;AN001;
 02DA  80 CE 01              C1		  OR	  DH,$M_CRIT_ERR_MASK			     ;AN001; Turn on bit
 02DD  B8 4401               C1		  MOV	  AX,DOS_IOCTL_SET_INFO 		     ;AN001; Set info using IOCTL
 02E0  CD 21                 C1		  INT	  21H					     ;AN001;
 02E2  C3                    C1		  RET						     ;AN001;
 02E3                        C1	$M_CHECKSTDOUT ENDP					     ;AN001;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-21
DOS - Message Retriever - $M_VERSION_CHECK Proc             

 02E3                        C1	check_amis:
 02E3  50                    C1		push ax
 02E4  1E                    C1		push ds
 02E5  56                    C1		push si
 02E6  06                    C1		push es
 02E7  57                    C1		push di
 02E8  52                    C1		push dx
 02E9  50                    C1		push ax				; version number, last on stack
 02EA  B4 00                 C1		mov ah, 0			; multiplex number = 0
 02EC                        C1	check_amis_loop:
 02EC  B0 00                 C1		mov al, 0
 02EE  CD 2D                 C1		int 2Dh				; installation check
 02F0  3C FF                 C1		cmp al, -1			; multiplexer installed ?
 02F2  75 21                 C1		jne check_amis_next		; no -->
 02F4  0E                    C1		 push cs
 02F5  1F                    C1		 pop ds
 02F6  BE 0146 R             C1		mov si, offset AMIS_SIGN_SEGMENT:amis_sign
 02F9  8E C2                 C1		mov es, dx			; es:di -> multiplexer's sign
 02FB  B9 0008               C1		mov cx, 8			; 16 bytes
 02FE  F3/ A7                C1		repe cmpsw			; compare
 0300  75 13                 C1		jne check_amis_next		; not us -->
 0302  8C CA                 C1		mov dx, cs			; dx:si -> amis_id
 0304  B0 11                 C1		mov al, 11h
 0306  CD 2D                 C1		int 2Dh				; CHG: al, bx, cx, dx, si, di
 0308  3C 00                 C1		cmp al, 0			; id call supported ?
 030A  74 0D                 C1		je check_amis_unsup		; no, allow if alt version -->
 030C  5A                    C1		pop dx
 030D  33 D2                 C1		xor dx, dx			; 2D.MM11 supported, mark that we need it
 030F  52                    C1		push dx
 0310  3C F0                 C1		cmp al, 0F0h			; CY if below 0F0h
 0312  EB 06 90              C1		jmp check_amis_done
 0315                        C1	check_amis_next:
 0315  FE C4                 C1		inc ah				; next multiplex number
 0317  75 D3                 C1		jnz check_amis_loop		; ZR if done, NZ if more to check -->
 0319                        C1	check_amis_unsup:
 0319  F9                    C1		stc				; multiplexer not found
 031A                        C1	check_amis_done:
 031A  5B                    C1		pop bx
 031B  5A                    C1		pop dx
 031C  5F                    C1		pop di
 031D  07                    C1		pop es
 031E  5E                    C1		pop si
 031F  1F                    C1		pop ds
 0320  58                    C1		pop ax
 0321  73 1C                 C1		jnc alt_good_DOS		; id is supported -->
 0323  81 FB 1A05            C1		cmp bx, alt_expected_version	; is it fine ?
 0327  74 16                 C1		je alt_good_DOS			; yes --> (NC)
 0329  EB 17 90              C1		jmp $MIF25			; no, cancel program -->
 032C                        C1	$M_VERSION_CHECK PROC NEAR				     ;;AN000;;
 032C  B4 30                 C1		  MOV	  AH,DOS_GET_VERSION			     ;;AN000;; Check that version matches VE
				RSIONA.INC
 032E  CD 21                 C1		  INT	  21H					     ;;AN000;;
 0330  3D 2605               C1		cmp	ax,new_expected_version	; compare with DOS version
 0333  74 AE                 C1		je check_amis
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-22
DOS - Message Retriever - $M_VERSION_CHECK Proc             

 0335  3D 1A05               C1		cmp	ax,alt_expected_version	; compare with DOS version
 0338  74 A9                 C1		je check_amis
 033A  3D 0004               C1		  CMP	  AX,EXPECTED_VERSION			     ;;AN000;; IF DOS_MAJOR is correct
 033D  75 03                 C1		  JNE $MIF25
 033F                        C1	alt_good_DOS:
 033F  F8                    C1		    CLC 					     ;;AN000;;	 Clear the carry flag
 0340  EB 18                 C1		  JMP SHORT $MEN25
 0342                        C1	$MIF25:
 0342  3D 0002               C1		    CMP     AX,LOWEST_4CH_VERSION		     ;;AN000;; Does this version support AH 
				= 4CH
 0345  73 05                 C1		    JNB $MIF27
 0347  BB FFFF               C1		      MOV     BX,NO_HANDLE			     ;;AN000;;	 No handle (version doesn't 
				support)
 034A  EB 03                 C1		    JMP SHORT $MEN27
 034C                        C1	$MIF27:
 034C  BB 0002               C1		      MOV     BX,STDERR 			     ;;AN000;;	 Standard Error
 034F                        C1	$MEN27:
 034F  B8 0001               C1		    MOV     AX,1				     ;;AN000;; Set message # 1
 0352  B9 0000               C1		    MOV     CX,NO_REPLACE			     ;;AN000;; No replacable parms
 0355  B2 00                 C1		    MOV     DL,NO_INPUT 			     ;;AN000;; No input
 0357  B6 FF                 C1		    MOV     DH,UTILITY_MSG_CLASS		     ;;AN000;; Utility class message
 0359  F9                    C1		    STC 					     ;;AN000;; Set Carry Flag
 035A                        C1	$MEN25:
 035A  C3                    C1		  RET						     ;;AN000;; Return
 035B                        C1	$M_VERSION_CHECK ENDP					     ;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-23
DOS - Message Retriever - DISPMSG.ASM Module                

 035B                        C1		SYSDISPMSG PROC NEAR				     ;;AN000;;
 035B  50                    C1		PUSH	AX					     ;;AN000;; Save changed REGs
 035C  53                    C1		PUSH	BX					     ;;AN000;;
 035D  51                    C1		PUSH	CX					     ;;AN000;;
 035E  55                    C1		PUSH	BP					     ;;AN000;;
 035F  57                    C1		PUSH	DI					     ;;AN000;; Save pointer to input buffer 
				(offset)
 0360  06                    C1		PUSH	ES					     ;;AN000;; Save pointer to input buffer 
				(segment)
 0361  52                    C1		PUSH	DX					     ;;AN000;; Save Input/Class request
 0362  8B E9                 C1		MOV	BP,CX					     ;;AN000;; Use BP to hold replace count
 0364  2E: 89 1E 0040 R      C1		MOV	WORD PTR $M_RT.$M_HANDLE,BX		     ;;AN000;; Save handle
 0369  2E: 88 36 0045 R      C1		MOV	BYTE PTR $M_RT.$M_CLASS,DH		     ;;AN004;; Save class
 036E  E8 0606 R             C1		CALL	$M_GET_MSG_ADDRESS			     ;;AN000;; Scan thru classes to find mes
				sage
 0371  0B C9                 C1		OR	CX,CX					     ;;AN000;; Was message found?
 0373  74 1C                 C1		JZ $MIF93
 0375  0B ED                 C1		  OR	  BP,BP 				     ;;AN000;;	 Were replacable parameters 
				requested
 0377  75 05                 C1		  JNZ $MIF94
 0379  E8 03A2 R             C1		    CALL    $M_DISPLAY_STRING			     ;;AN000;; No, great . . . Display messa
				ge
 037C  EB 03                 C1		  JMP SHORT $MEN94
 037E                        C1	$MIF94:
 037E  E8 04F7 R             C1		    CALL    $M_DISPLAY_MESSAGE			     ;;AN000;;	 Display the message with su
				bstitutions
 0381                        C1	$MEN94:
 0381  72 08                 C1		  JC $MIF97
 0383  5A                    C1		    POP     DX					     ;;AN000;; Get Input/Class request
 0384  E8 044A R             C1		    CALL    $M_ADD_CRLF 			     ;;AN004;; Check if we need to add the C
				R LF chars.
 0387  07                    C1		    POP     ES					     ;;AN000;; Get location of input buffer 
				(if specified)
 0388  5F                    C1		    POP     DI					     ;;AN000;;
 0389  EB 04                 C1		  JMP SHORT $MEN97
 038B                        C1	$MIF97:
 038B  83 C4 06              C1		    ADD     SP,6				     ;;AN000;;
 038E  F9                    C1		    STC 					     ;;AN000;; Reset carry flag
 038F                        C1	$MEN97:
 038F  EB 04                 C1		JMP SHORT $MEN93
 0391                        C1	$MIF93:
 0391  07                    C1		  POP	  ES					     ;;AN000;;	 Get pointer to input buffer
				 (segment)
 0392  5F                    C1		  POP	  DI					     ;;AN000;;	 Get base pointer to first s
				ublist (offset)
 0393  5A                    C1		  POP	  DX					     ;;AN000;;	 Get base pointer to first s
				ublist (segment)
 0394  F9                    C1		  STC						     ;;AN000;;	 Set carry flag
 0395                        C1	$MEN93:
 0395  72 06                 C1		JC $MIF104
 0397  5D                    C1		  POP	  BP					     ;;AN000;; No,
 0398  59                    C1		  POP	  CX					     ;;AN000;;
 0399  5B                    C1		  POP	  BX					     ;;AN000;;
 039A  58                    C1		  POP	  AX					     ;;AN000;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-24
DOS - Message Retriever - DISPMSG.ASM Module                

 039B  EB 04                 C1		JMP SHORT $MEN104
 039D                        C1	$MIF104:
 039D  83 C4 08              C1		  ADD	  SP,8					     ;;AN000;;	   Eliminate from stack
 03A0  F9                    C1		  STC						     ;;AN000;;
 03A1                        C1	$MEN104:
 03A1  C3                    C1		RET						     ;;AN000;; Return
 03A2                        C1		SYSDISPMSG ENDP 				     ;;AN000;;
 03A2                        C1	$M_DISPLAY_STRING PROC NEAR				     ;;AN000;;
 03A2  50                    C1		PUSH	AX					     ;;AN000;;
 03A3  53                    C1		PUSH	BX					     ;;AN000;;
 03A4  52                    C1		PUSH	DX					     ;;AN000;;
 03A5  2E: 8B 1E 0040 R      C1		MOV	BX,$M_RT.$M_HANDLE			     ;;AN000;; Retrieve handle
 03AA  83 FB FF              C1		CMP	BX,$M_NO_HANDLE 			     ;;AN000;; Was there a handle specified?
 03AD  75 05                 C1		JNE $MIF107
 03AF  E8 03DE R             C1		  CALL	  $M_DISPLAY_$_STRING			     ;;AN000;; No, display $ terminated stri
				ng
 03B2  EB 03                 C1		JMP SHORT $MEN107
 03B4                        C1	$MIF107:
 03B4  E8 0413 R             C1		  CALL	  $M_DISPLAY_H_STRING			     ;;AN000;; Yes, display string to handle
 03B7                        C1	$MEN107:
 03B7  73 0F                 C1		JNC $MIF110
 03B9  B4 59                 C1		  MOV	  AH,DOS_GET_EXT_ERROR			     ;;AN000;;	Yes,
 03BB  BB 0000               C1		  MOV	  BX,DOS_GET_EXT_ERROR_BX		     ;;AN000;;	  Get extended error
 03BE  CD 21                 C1		  INT	  21H					     ;;AN000;;
 03C0  32 E4                 C1		  XOR	  AH,AH 				     ;;AN000;;	  Clear AH
 03C2  83 C4 06              C1		  ADD	  SP,6					     ;;AN000;;	  Clean up stack
 03C5  F9                    C1		  STC						     ;;AN000;;	  Flag that there was an err
				or
 03C6  EB 10                 C1		JMP SHORT $MEN110
 03C8                        C1	$MIF110:
 03C8  83 FB FF              C1		  CMP	  BX,$M_NO_HANDLE			     ;;AN000;; Was there a handle specified?
 03CB  74 0B                 C1		  JE $MIF112
 03CD  3B C1                 C1		    CMP     AX,CX				     ;AN001;	 Was it ALL written?
 03CF  74 07                 C1		    JE $MIF113
 03D1  E8 0441 R             C1		      CALL    $M_GET_EXT_ERR_39 		     ;AN001;	   Set Extended error
 03D4  83 C4 06              C1		      ADD     SP,6				     ;AN001;	   Clean up stack
 03D7  F9                    C1		      STC					     ;AN001;	   Flag that there was an er
				ror
 03D8                        C1	$MIF113:
 03D8                        C1	$MIF112:
 03D8                        C1	$MEN110:
 03D8  72 03                 C1		JC $MIF117
 03DA  5A                    C1		  POP	  DX					     ;;AN000;;	Restore regs
 03DB  5B                    C1		  POP	  BX					     ;;AN000;;
 03DC  58                    C1		  POP	  AX					     ;;AN000;;
 03DD                        C1	$MIF117:
 03DD  C3                    C1		RET						     ;;AN000;; Return
 03DE                        C1	$M_DISPLAY_STRING ENDP					     ;;AN000;;
 03DE                        C1	$M_DISPLAY_$_STRING PROC NEAR				     ;;AN000;;
 03DE  1E                    C1		PUSH	DS					     ;;AN000;;
 03DF  06                    C1		PUSH	ES					     ;;AN000;;
 03E0  1F                    C1		POP	DS					     ;;AN000;; Set DS to segment of message 
				text
 03E1  83 F9 01              C1		CMP	CX,$M_SINGLE_CHAR			     ;;AN000;; Is this a single character?
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-25
DOS - Message Retriever - DISPMSG.ASM Module                

 03E4  75 1B                 C1		JNE $MIF119
 03E6  B4 02                 C1		  MOV	  AH,DOS_DISP_CHAR			     ;;AN000;;	 DOS Function to display CHA
				RACTER
 03E8  26: 8A 15             C1		  MOV	  DL,BYTE PTR ES:[DI]			     ;;AN000;;	 Get the character
 03EB  CD 21                 C1		  INT	  21H					     ;;AN000;;	 Write character
 03ED  1F                    C1		  POP	  DS					     ;;AN000;; Set DS to segment of message 
				text
 03EE  8A C2                 C1		  MOV	  AL,DL 				     ;;AN000;;	 Get the character in AL
 03F0  E8 0461 R             C1		  CALL	  $M_IS_IT_DBCS 			     ;;AN000;;	 Is this the first byte of a
				 DB character
 03F3  1E                    C1		  PUSH	  DS					     ;;AN000;;
 03F4  06                    C1		  PUSH	  ES					     ;;AN000;;
 03F5  1F                    C1		  POP	  DS					     ;;AN000;; Set DS to segment of message 
				text
 03F6  73 07                 C1		  JNC $MIF120
 03F8  26: 8A 55 01          C1		    MOV     DL,BYTE PTR ES:[DI]+1		     ;;AN000;; Get the next character
 03FC  CD 21                 C1		    INT     21H 				     ;;AN000;;	 Write character
 03FE  F8                    C1		    CLC 					     ;;AN000;;	 Clear the DBCS indicator
 03FF                        C1	$MIF120:
 03FF  EB 0F                 C1		JMP SHORT $MEN119
 0401                        C1	$MIF119:
 0401  B4 02                 C1		  MOV	  AH,DOS_DISP_CHAR			     ;;AN000;;	 DOS Function to display CHA
				RACTER
 0403                        C1	$MDO123:
 0403  0B C9                 C1		    OR	    CX,CX				     ;;AN002;;	 Are there any left to displ
				ay?
 0405  74 09                 C1		  JZ $MEN123
 0407  26: 8A 15             C1		    MOV     DL,BYTE PTR ES:[DI] 		     ;;AN002;;	   Get the character
 040A  CD 21                 C1		    INT     21H 				     ;;AN002;;	   Display the character
 040C  47                    C1		    INC     DI					     ;;AN002;;	   Set pointer to next chara
				cter
 040D  49                    C1		    DEC     CX					     ;;AN002;;	   Count this character
 040E  75 F3                 C1		  JNZ $MDO123
 0410                        C1	$MEN123:
 0410                        C1	$MEN119:
 0410  F8                    C1		CLC						     ;;AN000;;	 Char functions used don't r
				eturn carry as error
 0411  1F                    C1		POP	DS					     ;;AN000;;
 0412  C3                    C1		RET						     ;;AN000;;
 0413                        C1	$M_DISPLAY_$_STRING ENDP				     ;;AN000;;
 0413                        C1	$M_DISPLAY_H_STRING PROC NEAR				     ;;AN000;;
 0413  33 C0                 C1		XOR	AX,AX					     ;;AN002;; Set number of bytes written t
				o 0
 0415  0B C9                 C1		OR	CX,CX					     ;;AN002;; For performance, don't write 
				if not necessary
 0417  74 27                 C1		JZ $MIF127
 0419  1E                    C1		  PUSH	  DS					     ;;AN000;; Yes,
 041A  06                    C1		  PUSH	  ES					     ;;AN000;;
 041B  1F                    C1		  POP	  DS					     ;;AN000;;	 Set DS to segment of messag
				e text
 041C  B4 40                 C1		  MOV	  AH,DOS_WRITE_HANDLE			     ;;AN000;;	 DOS function to write to a 
				handle
 041E  8B D7                 C1		  MOV	  DX,DI 				     ;;AN000;;	 Pointer to data to write
 0420  83 F9 01              C1		  CMP	  CX,$M_SINGLE_CHAR			     ;;AN000;;	 Is this a single character?
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-26
DOS - Message Retriever - DISPMSG.ASM Module                

 0423  75 18                 C1		  JNE $MIF128
 0425  CD 21                 C1		    INT     21H 				     ;;AN000;;	   Write character
 0427  1F                    C1		    POP     DS					     ;;AN000;;	     Set DS to segment of me
				ssage text
 0428  50                    C1		    PUSH    AX					     ;;AN000;;
 0429  26: 8A 05             C1		    MOV     AL,BYTE PTR ES:[DI] 		     ;;AN000;;	     Get the character
 042C  E8 0461 R             C1		    CALL    $M_IS_IT_DBCS			     ;;AN000;;	     Is this the first byte 
				of a DB character
 042F  58                    C1		    POP     AX					     ;;AN000;;	     Set DS to segment of me
				ssage text
 0430  1E                    C1		    PUSH    DS					     ;;AN000;;
 0431  06                    C1		    PUSH    ES					     ;;AN000;;
 0432  1F                    C1		    POP     DS					     ;;AN000;;	     Set DS to segment of me
				ssage text
 0433  73 06                 C1		    JNC $MIF129
 0435  F8                    C1		      CLC					     ;;AN000;;	      Clear the DBCS indicat
				or
 0436  B4 40                 C1		      MOV     AH,DOS_WRITE_HANDLE		     ;;AN000;;	      DOS function to write 
				to a handle
 0438  42                    C1		      INC     DX				     ;;AN000;;	      Point to next characte
				r
 0439  CD 21                 C1		      INT     21H				     ;;AN000;;	      Write character
 043B                        C1	$MIF129:
 043B  EB 02                 C1		  JMP SHORT $MEN128
 043D                        C1	$MIF128:
 043D  CD 21                 C1		    INT     21H 				     ;;AN000;;	   Write String at DS:SI to 
				handle
 043F                        C1	$MEN128:
 043F  1F                    C1		  POP	  DS					     ;;AN000;;
 0440                        C1	$MIF127:
 0440  C3                    C1		RET						     ;;AN000;;
 0441                        C1	$M_DISPLAY_H_STRING ENDP				     ;;AN000;;
 0441                        C1	$M_GET_EXT_ERR_39 PROC NEAR				     ;AN001;
 0441  B8 0027               C1		MOV	AX,EXT_ERR_39				     ;AN001; Set AX=39
 0444  BB 0004               C1		MOV	BX,(ERROR_CLASS_39 SHR 8) + ACTION_39	     ;AN001; Set BH=1 BL=4
 0447  B5 01                 C1		MOV	CH,LOCUS_39				     ;AN001; Set CH=1
 0449  C3                    C1		RET						     ;AN001;
 044A                        C1	$M_GET_EXT_ERR_39 ENDP					     ;AN001;
 044A                        C1	$M_ADD_CRLF PROC NEAR					     ;;AN004;;
 044A  80 FE FF              C1		CMP	DH,UTILITY_MSG_CLASS			     ;;AN004;; Is it a utility message?
 044D  74 11                 C1		JE $MIF134
 044F  F6 C6 80              C1		  TEST	  DH,$M_NO_CRLF_MASK			     ;;AN004;;	 Are we to supress the CR LF
				?
 0452  75 0C                 C1		  JNZ $MIF135
 0454  1E                    C1		    PUSH    DS					     ;;AN004;;
 0455  07                    C1		    POP     ES					     ;;AN004;;	  Set ES to data segment
 0456  8D 3E 0043 R          C1		    LEA     DI,$M_RT.$M_CRLF			     ;;AN004;;	  Point at CRLF message
 045A  B9 0002               C1		    MOV     CX,$M_CRLF_SIZE			     ;;AN004;;	  Set the message size
 045D  E8 03A2 R             C1		    CALL    $M_DISPLAY_STRING			     ;;AN004;;	  Display the CRLF
 0460                        C1	$MIF135:
 0460                        C1	$MIF134:
 0460  C3                    C1		RET						     ;;AN004;; Return
 0461                        C1	$M_ADD_CRLF ENDP					     ;;AN004;;
 0461                        C1	$M_IS_IT_DBCS PROC NEAR 				     ;;AN000;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-27
DOS - Message Retriever - DISPMSG.ASM Module                

 0461  06                    C1		PUSH	ES					     ;;AN000;; Save Extra segment register
 0462  57                    C1		PUSH	DI					     ;;AN000;; Save SI register
 0463  2E: C4 3E 003C R      C1		LES	DI,$M_RT.$M_DBCS_VEC			     ;;AN000;;
 0468  0B FF                 C1		OR	DI,DI					     ;;AN000;; Was the DBCS vector set?
 046A  74 17                 C1		JZ $MIF138
 046C                        C1	$MDO139:
 046C  26: 83 3D 00          C1		    CMP     WORD PTR ES:[DI],$M_DBCS_TERM	     ;;AN000;; Is this the terminating flag?
 0470  F8                    C1		    CLC 					     ;;AN000;;
 0471  74 10                 C1		  JE $MEN139
 0473  26: 3A 05             C1		    CMP     AL,BYTE PTR ES:[DI] 		     ;;AN000;;	  Does the character fall in
				 the DBCS range?
 0476  72 07                 C1		    JNAE $MIF141
 0478  26: 3A 45 01          C1		    CMP     AL,BYTE PTR ES:[DI]+1		     ;;AN000;;	  Does the character fall in
				 the DBCS range?
 047C  77 01                 C1		    JNBE $MIF141
 047E  F9                    C1		      STC					     ;;AN000;;	  Yes,
 047F                        C1	$MIF141:
 047F  47                    C1		    INC     DI					     ;;AN000;;	  No,
 0480  47                    C1		    INC     DI					     ;;AN000;;	     Go to next vector
 0481  EB E9                 C1		  JMP SHORT $MDO139
 0483                        C1	$MEN139:
 0483                        C1	$MIF138:
 0483  5F                    C1		POP	DI					     ;;AN000;;
 0484  07                    C1		POP	ES					     ;;AN000;; Restore SI register
 0485  C3                    C1		RET						     ;;AN000;; Return
 0486                        C1	$M_IS_IT_DBCS ENDP					     ;;AN000;;
 0486                        C1	$M_CONVERT2ASC PROC NEAR				     ;;AN000;;
 0486  2E: 8F 06 0046 R      C1		POP	[$M_RT.$M_RETURN_ADDR]			     ;;AN000;; Save Return Address
 048B  33 DB                 C1		XOR	BX,BX					     ;;AN000;; Use BP as a swapping register
 048D  93                    C1		XCHG	BX,AX					     ;;AN000;; Initialize - Low Word in BP
 048E  92                    C1		XCHG	AX,DX					     ;;AN000;;		  - High Word in AX
 048F                        C1	$MDO145:
 048F  2E: F7 36 004A R      C1		  DIV	  $M_RT.$M_DIVISOR			     ;;AN000;; Divide High Word by divisor
 0494  93                    C1		  XCHG	  BX,AX 				     ;;AN000;; Setup to divide Low Word usin
				g remainder
 0495  2E: F7 36 004A R      C1		  DIV	  $M_RT.$M_DIVISOR			     ;;AN000;; Divide Low Word by divisor
 049A  83 FA 09              C1		  CMP	  DX,9					     ;;AN000;;	Make a digit of the remainde
				r
 049D  76 05                 C1		  JNA $MIF146
 049F  80 C2 37              C1		    ADD     DL,55				     ;;AN000;;	   Make A to F ASCII
 04A2  EB 03                 C1		  JMP SHORT $MEN146
 04A4                        C1	$MIF146:
 04A4  80 C2 30              C1		    ADD     DL,'0'				     ;;AN000;;	   Make 0 to 9 ASCII
 04A7                        C1	$MEN146:
 04A7  52                    C1		  PUSH	  DX					     ;;AN000;; Save the digit on the stack
 04A8  41                    C1		  INC	  CX					     ;;AN000;; Count that digit
 04A9  0B C0                 C1		  OR	  AX,AX 				     ;;AN000;; Are we done?
 04AB  75 04                 C1		JNZ $MLL149
 04AD  0B DB                 C1		  OR	  BX,BX 				     ;;AN000;; AX and BX must be ZERO!!
 04AF  74 3C                 C1		JZ $MEN145
 04B1                        C1	$MLL149:
 04B1  83 F9 03              C1		  CMP	  CX,$M_FIRST_THOU			     ;;AN000;; Are we at the first thousands
				 mark
 04B4  75 0E                 C1		  JNE $MIF150
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-28
DOS - Message Retriever - DISPMSG.ASM Module                

 04B6  80 7C 0A 2C           C1		    CMP     $M_SL.$M_S_PAD,$M_COMMA		     ;;AN000;; Is the pad character a comma?
 04BA  75 06                 C1		    JNE $MIF151
 04BC  2E: FF 36 0053 R      C1		      PUSH    WORD PTR $M_RT.$M_THOU_SEPARA	     ;;AN000;; Insert a thousand separator
 04C1  41                    C1		      INC     CX				     ;;AN000;;
 04C2                        C1	$MIF151:
 04C2  EB 24                 C1		  JMP SHORT $MEN150
 04C4                        C1	$MIF150:
 04C4  83 F9 06              C1		    CMP     CX,$M_SECOND_THOU			     ;;AN000;;	 Are we at the first thousan
				ds mark
 04C7  75 0E                 C1		    JNE $MIF154
 04C9  80 7C 0A 2C           C1		      CMP     $M_SL.$M_S_PAD,$M_COMMA		     ;;AN000;; Is the pad character a comma?
 04CD  75 06                 C1		      JNE $MIF155
 04CF  2E: FF 36 0053 R      C1			PUSH	WORD PTR $M_RT.$M_THOU_SEPARA	     ;;AN000;; Insert a thousand separator
 04D4  41                    C1			INC	CX				     ;;AN000;;
 04D5                        C1	$MIF155:
 04D5  EB 11                 C1		    JMP SHORT $MEN154
 04D7                        C1	$MIF154:
 04D7  83 F9 09              C1		      CMP     CX,$M_THIRD_THOU			     ;;AN000;;	 Are we at the first thousan
				ds mark
 04DA  75 0C                 C1		      JNE $MIF158
 04DC  80 7C 0A 2C           C1			CMP	$M_SL.$M_S_PAD,$M_COMMA 	     ;;AN000;; Is the pad character a comma?
 04E0  75 06                 C1			JNE $MIF159
 04E2  2E: FF 36 0053 R      C1			  PUSH	  WORD PTR $M_RT.$M_THOU_SEPARA      ;;AN000;; Insert a thousand separator
 04E7  41                    C1			  INC	  CX				     ;;AN000;;
 04E8                        C1	$MIF159:
 04E8                        C1	$MIF158:
 04E8                        C1	$MEN154:
 04E8                        C1	$MEN150:
 04E8  93                    C1		  XCHG	  AX,BX 				     ;;AN000;;	 Setup to divide the reduced
				 High Word
 04E9  33 D2                 C1		  XOR	  DX,DX 				     ;;AN000;;	 Reset remainder
 04EB  EB A2                 C1		JMP SHORT $MDO145
 04ED                        C1	$MEN145:
 04ED  33 D2                 C1		XOR	DX,DX					     ;;AN000;;	 Reset remainder
 04EF  33 C0                 C1		XOR	AX,AX					     ;;AN000;;	 Reset remainder
 04F1  2E: FF 36 0046 R      C1		PUSH	[$M_RT.$M_RETURN_ADDR]			     ;;AN000;;	 Restore Return Address
 04F6  C3                    C1		RET						     ;;AN000;;	 Return
 04F7                        C1	$M_CONVERT2ASC ENDP					     ;;AN000;;
 04F7                        C1	$M_DISPLAY_MESSAGE PROC NEAR				     ;;AN000;;
 04F7                        C1	$MDO165:
 04F7  33 D2                 C1		  XOR	  DX,DX 				     ;;AN000;; Set size = 0
 04F9  0B C9                 C1		  OR	  CX,CX 				     ;;AN000;; Are we finished the message y
				et?
 04FB  74 21                 C1		  JZ $MIF166
 04FD  B4 25                 C1		    MOV     AH,"%"				     ;;AN000;;	 Prepare to scan for %
 04FF  B0 00                 C1		    MOV     AL,0				     ;;AN004;;
 0501                        C1	$MDO167:
 0501  26: 38 25             C1		      CMP     BYTE PTR ES:[DI],AH		     ;;AN000;;	 Is this character NOT a %
 0504  75 0A                 C1		    JNE $MLL168
 0506  26: 38 65 01          C1		      CMP     BYTE PTR ES:[DI+1],AH		     ;;AN000;;	   Is the next character als
				o a %
 050A  74 04                 C1		    JE $MLL168
 050C  3A C4                 C1		      CMP     AL,AH				     ;;AN000;;	     Was the character befor
				e a %
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-29
DOS - Message Retriever - DISPMSG.ASM Module                

 050E  75 0E                 C1		    JNE $MEN167
 0510                        C1	$MLL168:
 0510  26: 8A 05             C1		      MOV     AL,BYTE PTR ES:[DI]		     ;;AN004;;	 Yes, (to any of the above)
 0513  E8 0461 R             C1		      CALL    $M_IS_IT_DBCS			     ;;AN004;;	   Is this character the fir
				st part of a DBCS?
 0516  73 01                 C1		      JNC $MIF169
 0518  47                    C1			INC	DI				     ;;AN004;;	     Increment past second p
				art
 0519                        C1	$MIF169:
 0519  47                    C1		      INC     DI				     ;;AN000;;	     Next character in strin
				g
 051A  42                    C1		      INC     DX				     ;;AN000;;	     Size = Size + 1
 051B  49                    C1		      DEC     CX				     ;;AN000;;	     Decrement total size
 051C  75 E3                 C1		    JNZ $MDO167
 051E                        C1	$MEN167:
 051E                        C1	$MIF166:
 051E  56                    C1		  PUSH	  SI					     ;;AN000;; Save beginning of sublists
 051F  87 CA                 C1		  XCHG	  CX,DX 				     ;;AN000;; Get size of message to displa
				y (tot sz in DX)
 0521  0B ED                 C1		  OR	  BP,BP 				     ;;AN000;; Do we have any replacables to
				 do?
 0523  74 35                 C1		  JZ $MIF173
 0525  4D                    C1		    DEC     BP					     ;;AN000;;	 Decrement number of replaca
				bles
 0526  2E: 83 3E 0048 R 00   C1		    CMP     $M_RT.$M_MSG_NUM,$M_NULL		     ;;AN000;; Is this an Extended/Parse cas
				e
 052C  75 2C                 C1		    JNE $MIF174
 052E                        C1	$MDO175:
 052E  8A 44 06              C1			MOV	AL,$M_SL.$M_S_ID		     ;;AN000;;	 Get ID byte
 0531  04 30                 C1			ADD	AL,30H				     ;;AN000;;	 Convert to ASCII
 0533  26: 3A 45 01          C1			CMP	AL,BYTE PTR ES:[DI]+1		     ;;AN000;;	 Is this the right sublist?
 0537  75 02                 C1		      JNE $MIF175
 0539  EB 1F                 C1		      JMP SHORT $MSR175
 053B                        C1	$MIF175:
 053B  3C 30                 C1			CMP	AL,$M_SPECIAL_CASE		     ;;AN000;;	   Does this sublist have ID
				 = 0
 053D  75 04                 C1		      JNE $MLL178
 053F  0B D2                 C1			OR	DX,DX				     ;;AN000;;	   Are we at the end of the 
				message?
 0541  74 04                 C1		      JZ $MEN175
 0543                        C1	$MLL178:
 0543  03 34                 C1			ADD	SI,WORD PTR $M_SL.$M_S_SIZE	     ;;AN000;;	     Next SUBLIST
 0545  EB E7                 C1		      JMP SHORT $MDO175
 0547                        C1	$MEN175:
 0547  2E: 80 3E 0045 R FF   C1			CMP	$M_RT.$M_CLASS,UTILITY_MSG_CLASS     ;;AN004;;	     Is it a utility message
				?
 054D  75 08                 C1			JNE $MIF180
 054F  42                    C1			  INC	  DX				     ;;AN000;;	       Remember to display C
				R,LF
 0550  42                    C1			  INC	  DX				     ;;AN000;;		 at the end of the m
				essage
 0551  49                    C1			  DEC	  CX				     ;;AN000;;	       Adjust message length
 0552  49                    C1			  DEC	  CX				     ;;AN000;;
 0553  4F                    C1			  DEC	  DI				     ;;AN000;;	       Adjust ending address
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-30
DOS - Message Retriever - DISPMSG.ASM Module                

				 of message
 0554  4F                    C1			  DEC	  DI				     ;;AN000;;
 0555  EB 03                 C1			JMP SHORT $MEN180
 0557                        C1	$MIF180:
 0557  BA FFFF               C1			  MOV	  DX,-1 			     ;;AN004;;	       Set special case
 055A                        C1	$MEN180:
 055A                        C1	$MSR175:
 055A                        C1	$MIF174:
 055A                        C1	$MIF173:
 055A  57                    C1		  PUSH	  DI					     ;;AN000;; Save pointer to replace numbe
				r
 055B  2B F9                 C1		  SUB	  DI,CX 				     ;;AN000;; Determine beginning of string
 055D  E8 03A2 R             C1		  CALL	  $M_DISPLAY_STRING			     ;;AN000;; Display string until % (or en
				d)
 0560  5F                    C1		  POP	  DI					     ;;AN000;; Get back pointer to replace n
				umber
 0561  59                    C1		  POP	  CX					     ;;AN000;; Clean up stack in case error
 0562  73 03                 C1		JNC $MXL3
 0564  EB 67 90              C1		JMP $MEN165
 0567                        C1	$MXL3:
 0567  51                    C1		  PUSH	  CX					     ;;AN000;;
 0568  8B CA                 C1		  MOV	  CX,DX 				     ;;AN000;; Get the size of the rest of t
				he message
 056A  80 7C 06 00           C1		  CMP	  $M_SL.$M_S_ID,$M_SPECIAL_CASE-30H	     ;;AN000;; Is this the %0 case?
 056E  74 0D                 C1		  JE $MIF187
 0570  0B C9                 C1		    OR	    CX,CX				     ;;AN000;;	Are we finished the whole me
				ssage?
 0572  74 06                 C1		    JZ $MIF188
 0574  49                    C1		      DEC     CX				     ;;AN000;;	  Decrement total size (%)
 0575  49                    C1		      DEC     CX				     ;;AN000;;	  Decrement total size (#)
 0576  47                    C1		      INC     DI				     ;;AN000;;	  Go past %
 0577  47                    C1		      INC     DI				     ;;AN000;;	  Go past replace number
 0578  EB 01                 C1		    JMP SHORT $MEN188
 057A                        C1	$MIF188:
 057A  5E                    C1		      POP     SI				     ;;AN000;;	  Get back pointer to beginn
				ing of SUBLISTs
 057B                        C1	$MEN188:
 057B  EB 10                 C1		  JMP SHORT $MEN187
 057D                        C1	$MIF187:
 057D  0B C9                 C1		    OR	    CX,CX				     ;;AN000;;	Are we finished the whole me
				ssage?
 057F  75 03                 C1		    JNZ $MIF192
 0581  5E                    C1		      POP     SI				     ;;AN000;;	 Get back pointer to beginni
				ng of SUBLISTs
 0582  EB 09                 C1		    JMP SHORT $MEN192
 0584                        C1	$MIF192:
 0584  83 F9 FF              C1		      CMP     CX,-1				     ;;AN004;;	 Are we at the end of the me
				ssage?
 0587  75 02                 C1		      JNZ $MIF194
 0589  33 C9                 C1			XOR	CX,CX				     ;;AN004;;
 058B                        C1	$MIF194:
 058B  0B FF                 C1		      OR      DI,DI				     ;;AN004;;	Turn ZF off
 058D                        C1	$MEN192:
 058D                        C1	$MEN187:
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-31
DOS - Message Retriever - DISPMSG.ASM Module                

 058D  74 3E                 C1		JZ $MEN165
 058F  55                    C1		  PUSH	  BP					     ;;AN000;;	 Save the replace count
 0590  57                    C1		  PUSH	  DI					     ;;AN000;;	 Save location to complete m
				essage
 0591  06                    C1		  PUSH	  ES					     ;;AN000;;
 0592  51                    C1		  PUSH	  CX					     ;;AN000;;	 Save size of the rest of th
				e message
 0593  33 C9                 C1		  XOR	  CX,CX 				     ;;AN000;;	 Reset CX used for character
				 count
 0595  2E: 83 3E 0048 R 00   C1		  CMP	  $M_RT.$M_MSG_NUM,$M_NULL		     ;;AN000;; Is this an Extended/Parse cas
				e
 059B  75 13                 C1		  JNE $MIF199
 059D  F6 44 07 0F           C1		    TEST    BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
 05A1  75 08                 C1		    JNZ $MIF200
 05A3  C4 7C 02              C1		      LES     DI,DWORD PTR $M_SL.$M_S_VALUE	     ;;AN000;; Load pointer to replacing par
				ameter
 05A6  E8 081A R             C1		      CALL    $M_CHAR_REPLACE			     ;;AN000;;
 05A9  EB 00                 C1		    JMP SHORT $MEN200
 05AB                        C1	$MIF200:
 05AB                        C1	$MEN200:
 05AB  E8 0738 R             C1		    CALL    $M_DISPLAY_REPLACE			     ;;AN000;; Display the replace
 05AE  EB 03                 C1		  JMP SHORT $MEN199
 05B0                        C1	$MIF199:
 05B0  E8 05D5 R             C1		    CALL    $M_EXT_PAR_REPLACE			     ;;AN000;;
 05B3                        C1	$MEN199:
 05B3  72 07                 C1		  JC $MIF211
 05B5  59                    C1		    POP     CX					     ;;AN000;; Get size of the rest of the m
				essage
 05B6  07                    C1		    POP     ES					     ;;AN000;; Get address of the rest of th
				e message
 05B7  5F                    C1		    POP     DI					     ;;AN000;;
 05B8  5D                    C1		    POP     BP					     ;;AN000;; Get replacment count
 05B9  5E                    C1		    POP     SI					     ;;AN000;; ELSE get address of first sub
				list structure
 05BA  EB 04                 C1		  JMP SHORT $MEN211
 05BC                        C1	$MIF211:
 05BC  83 C4 0A              C1		    ADD     SP,10				     ;;AN000;; Clean up stack if error
 05BF  F9                    C1		    STC 					     ;;AN000;;
 05C0                        C1	$MEN211:
 05C0  2E: 83 3E 0048 R 00   C1		  CMP	  $M_RT.$M_MSG_NUM,$M_NULL		     ;;AN000;; Is this an Extended/Parse cas
				e
 05C6  75 05                 C1		JNE $MLL214
 05C8  72 03                 C1		JC $MXL4
 05CA  E9 04F7 R             C1		JMP $MDO165
 05CD                        C1	$MXL4:
 05CD                        C1	$MLL214:
 05CD                        C1	$MEN165:
 05CD  2E: C7 06 0048 R 0000 C1		MOV	$M_RT.$M_MSG_NUM,0			     ;;AN000;; Reset message number to null
 05D4  C3                    C1		RET						     ;;AN000;; Return
 05D5                        C1	$M_DISPLAY_MESSAGE ENDP 				     ;;AN000;;
 05D5                        C1	$M_EXT_PAR_REPLACE PROC NEAR				     ;;AN000;;
 05D5  33 D2                 C1		XOR	DX,DX					     ;;AN000;; Prepare for get binary value 
				(HIGH)
 05D7  2E: A1 0048 R         C1		MOV	AX,$M_RT.$M_MSG_NUM			     ;;AN000;; Prepare for get binary value 
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-32
DOS - Message Retriever - DISPMSG.ASM Module                

				(LOW)
 05DB  2E: C7 06 004A R 000A C1		MOV	$M_RT.$M_DIVISOR,$M_BASE10		     ;;AN000;; Set default divisor
 05E2  E8 0486 R             C1		CALL	$M_CONVERT2ASC				     ;;AN000;;
 05E5                        C1	$MDO215:
 05E5  58                    C1		  POP	  AX					     ;;AN000;;	 Get character in register
 05E6  2E: 88 87 004C R      C1		  MOV	  BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL	     ;;AN000;;	Move char into the buffer
 05EB  43                    C1		  INC	  BX					     ;;AN000;;	 Increase buffer count
 05EC  83 FB 40              C1		  CMP	  BX,$M_TEMP_BUF_SZ			     ;;AN000;;	 Is buffer full?
 05EF  75 03                 C1		  JNE $MIF216
 05F1  E8 07FE R             C1		    CALL    $M_FLUSH_BUF			     ;;AN000;;	   Flush the buffer
 05F4                        C1	$MIF216:
 05F4  FE C9                 C1		  DEC	  CL					     ;;AN000;;	 Have we completed replace?
 05F6  75 ED                 C1		JNZ $MDO215
 05F8  B8 0A0D               C1		MOV	AX,$M_CR_LF				     ;;AN000;;	Move char into the buffer
 05FB  2E: 89 87 004C R      C1		MOV	WORD PTR $M_RT.$M_TEMP_BUF[BX],AX	     ;;AN000;;	Move char into the buffer
 0600  43                    C1		INC	BX					     ;;AN000;;	 Increase buffer count
 0601  43                    C1		INC	BX					     ;;AN000;;	 Increase buffer count
 0602  E8 07FE R             C1		CALL	$M_FLUSH_BUF				     ;;AN000;;	   Flush the buffer
 0605  C3                    C1		RET						     ;;AN000::
 0606                        C1	$M_EXT_PAR_REPLACE ENDP 				     ;;AN000;;
 0606                        C1		  $M_GET_MSG_ADDRESS PROC NEAR			     ;;AN000;;
 0606  56                    C1		  PUSH	  SI					     ;;AN000;;
 0607  53                    C1		  PUSH	  BX					     ;;AN000;;
 0608  33 F6                 C1		  XOR	  SI,SI 				     ;;AN000;; Use SI as an index
 060A  33 C9                 C1		  XOR	  CX,CX 				     ;;AN000;; Use CX as an size
 060C                        C1	$MDO219:
 060C  80 FE FF              C1		    CMP     DH,UTILITY_MSG_CLASS		     ;;AN000;; Were utility messages request
				ed?
 060F  75 09                 C1		    JNE $MIF220
 0611  2E: 8B BC 0034 R      C1			MOV	DI,WORD PTR $M_RT.$M_CLASS_ADDRS[SI] ;;AN000;;	 Get address of class
 0616  8B DF                 C1			MOV	BX,DI				     ;;AN000;
 0618  EB 28                 C1		    JMP SHORT $MEN220
 061A                        C1	$MIF220:
 061A  F6 C6 02              C1		      TEST    DH,PARSE_ERR_CLASS		     ;;AN000;;	 Were parse errors requested
				?
 061D  74 09                 C1		      JE $MIF222
 061F  2E: C4 BC 0018 R      C1			LES	DI,DWORD PTR $M_RT.$M_PARSE_COMMAND[SI] ;;AN000;;   Get address of class
 0624  8C C3                 C1			MOV	BX,ES				     ;;AN000;
 0626  EB 1A                 C1		      JMP SHORT $MEN222
 0628                        C1	$MIF222:
 0628  3D 0013               C1			CMP	AX,$M_CRIT_LO			     ;;AN000;;	   Is this a critical error?
 062B  72 0E                 C1			JNAE $MIF224
 062D  3D 0027               C1			CMP	AX,$M_CRIT_HI			     ;;AN000;;
 0630  77 09                 C1			JNBE $MIF224
 0632  2E: C4 BC 0024 R      C1			  LES	  DI,DWORD PTR $M_RT.$M_CRIT_ADDRS[SI] ;;AN000;; Get address of class
 0637  8C C3                 C1			  MOV	  BX,ES 			     ;;AN000;
 0639  EB 07                 C1			JMP SHORT $MEN224
 063B                        C1	$MIF224:
 063B  2E: C4 BC 0008 R      C1			  LES	  DI,DWORD PTR $M_RT.$M_EXT_ERR_ADDRS[SI] ;;AN000;; Get address of class
 0640  8C C3                 C1			  MOV	  BX,ES 			     ;;AN000;
 0642                        C1	$MEN224:
 0642                        C1	$MEN222:
 0642                        C1	$MEN220:
 0642  83 FB FF              C1		    CMP     BX,$M_TERMINATING_FLAG		     ;;AN000;; Are we finished all classes?
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-33
DOS - Message Retriever - DISPMSG.ASM Module                

 0645  75 17                 C1		    JNE $MIF229
 0647  80 FE FF              C1		      CMP     DH,UTILITY_MSG_CLASS		     ;;AN000;;	  Was it a UTILITY class?
 064A  75 03                 C1		      JNE $MIF230
 064C  F9                    C1			STC					     ;;AN000;;	    Set the carry flag
 064D  EB 0D                 C1		      JMP SHORT $MEN230
 064F                        C1	$MIF230:
 064F  2E: A3 0048 R         C1			MOV	$M_RT.$M_MSG_NUM,AX		     ;;AN000;;	    Save message number
 0653  B8 FFFF               C1			MOV	AX,$M_SPECIAL_MSG_NUM		     ;;AN000;;	    Set special message numb
				er
 0656  BD 0001               C1			MOV	BP,$M_ONE_REPLACE		     ;;AN000;;	    Set one replace in messa
				ge
 0659  33 F6                 C1			XOR	SI,SI				     ;;AN000;;	    Reset the SI index to st
				art again
 065B  F8                    C1			CLC					     ;;AN000;;
 065C                        C1	$MEN230:
 065C  EB 0C                 C1		    JMP SHORT $MEN229
 065E                        C1	$MIF229:
 065E  83 FB 00              C1		      CMP     BX,$M_CLASS_NOT_EXIST		     ;;AN000;;	 Does this class exist?
 0661  74 03                 C1		      JE $MIF234
 0663  E8 06BA R             C1			CALL	$M_FIND_SPECIFIED_MSG		     ;;AN000;;	   Try to find the message
 0666                        C1	$MIF234:
 0666  83 C6 04              C1		      ADD     SI,$M_ADDR_SZ_FAR 		     ;;AN000;;	     Get next class
 0669  F8                    C1		      CLC					     ;;AN000;;
 066A                        C1	$MEN229:
 066A  72 06                 C1		  JC $MEN219
 066C  0B C9                 C1		    OR	    CX,CX				     ;;AN000;;	   Was the message found?
 066E  75 02                 C1		  JNZ $MXL5
 0670  EB 9A                 C1		  JMP $MDO219
 0672                        C1	$MXL5:
 0672                        C1	$MEN219:
 0672  9C                    C1		  PUSHF 					     ;;AN006;; Save the flag state
 0673  80 FE 01              C1		  CMP	  DH,EXT_ERR_CLASS			     ;;AN006;; Was an extended error request
				ed?
 0676  75 29                 C1		  JNE $MIF239
 0678  52                    C1		    PUSH    DX					     ;;AN006;;	Save all needed registers
 0679  55                    C1		    PUSH    BP					     ;;AN006;;
 067A  51                    C1		    PUSH    CX					     ;;AN006;;
 067B  06                    C1		    PUSH    ES					     ;;AN006;;
 067C  57                    C1		    PUSH    DI					     ;;AN006;;
 067D  50                    C1		    PUSH    AX					     ;;AN006;;
 067E  B8 0500               C1		    MOV     AX,IFSFUNC_INSTALL_CHECK		     ;;AN006;;	Check if IFSFUNC is installe
				d
 0681  CD 2F                 C1		    INT     2FH 				     ;;AN006;;
 0683  3C FF                 C1		    CMP     AL,IFSFUNC_INSTALLED		     ;;AN006;;	Is it installed?
 0685  58                    C1		    POP     AX					     ;;AN006;;	Restore msg number
 0686  75 09                 C1		    JNE $MIF240
 0688  8B D8                 C1		      MOV     BX,AX				     ;;AN006;;	  BX is the extended error n
				umber
 068A  B8 0502               C1		      MOV     AX,IFS_GET_ERR_TEXT		     ;;AN006;;	  AX is the muliplex number
 068D  CD 2F                 C1		      INT     2FH				     ;;AN006;;	  Call IFSFUNC
 068F  EB 01                 C1		    JMP SHORT $MEN240
 0691                        C1	$MIF240:
 0691  F9                    C1		      STC					     ;;AN006;;	  Carry conditon
 0692                        C1	$MEN240:
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-34
DOS - Message Retriever - DISPMSG.ASM Module                

 0692  73 05                 C1		    JNC $MIF243
 0694  5F                    C1		      POP     DI				     ;;AN006;;	No,
 0695  07                    C1		      POP     ES				     ;;AN006;;	 Restore old pointer
 0696  59                    C1		      POP     CX				     ;;AN006;;
 0697  EB 06                 C1		    JMP SHORT $MEN243
 0699                        C1	$MIF243:
 0699  83 C4 06              C1		      ADD     SP,6				     ;;AN006;;	 Throw away old pointer
 069C  E8 06AB R             C1		      CALL    $M_SET_LEN_IN_CX			     ;;AN006;;	 Get the length of the ASCII
				Z string
 069F                        C1	$MEN243:
 069F  5D                    C1		    POP     BP					     ;;AN006;;	Restore other Regs
 06A0  5A                    C1		    POP     DX					     ;;AN006;;
 06A1                        C1	$MIF239:
 06A1  EB 01                 C2		   JMP	   $+3 
 06A3                        C2	??0000   LABEL   NEAR 
 06A3  CF                    C2		   IRET 
 06A4  0E                    C2		   PUSH    CS 
 06A5  E8 06A3 R             C2		   CALL    ??0000 
 06A8  5B                    C1		  POP	  BX					     ;;AN000;;
 06A9  5E                    C1		  POP	  SI					     ;;AN000;;
 06AA  C3                    C1		  RET						     ;;AN000;; Return ES:DI pointing to the 
				message
 06AB                        C1	$M_GET_MSG_ADDRESS ENDP 				     ;;
 06AB                        C1	$M_SET_LEN_IN_CX PROC NEAR				     ;;
 06AB  57                    C1		  PUSH	  DI					     ;;AN006;; Save position
 06AC  50                    C1		  PUSH	  AX					     ;;AN006;;
 06AD  B9 FFFF               C1		  MOV	  CX,-1 				     ;;AN006;; Set CX for decrements
 06B0  32 C0                 C1		  XOR	  AL,AL 				     ;;AN006;; Prepare compare register
 06B2  F2/ AE                C1		  REPNE   SCASB 				     ;;AN006;; Scan for zero
 06B4  F7 D1                 C1		  NOT	  CX					     ;;AN006;; Change decrement into number
 06B6  49                    C1		  DEC	  CX					     ;;AN006;; Don't include the zero
 06B7  58                    C1		  POP	  AX					     ;;AN006;;
 06B8  5F                    C1		  POP	  DI					     ;;AN006;; Restore position
 06B9  C3                    C1		  RET						     ;;AN006;;
 06BA                        C1	$M_SET_LEN_IN_CX ENDP					     ;;
 06BA                        C1	$M_FIND_SPECIFIED_MSG PROC NEAR 			     ;;AN000;;
 06BA  83 FB 01              C1		  CMP	  BX,1					     ;;AN004;;	Do we have an address to CAL
				L?
 06BD  75 21                 C1		  JNE $MIF247
 06BF  2E: 83 3E 0030 R FF   C1		  CMP	  WORD PTR $M_RT.$M_DISK_PROC_ADDR,-1	     ;;AN004;;	Do we have an address to CAL
				L?
 06C5  74 19                 C1		  JE $MIF247
 06C7  3D FFFF               C1		    CMP     AX,$M_SPECIAL_MSG_NUM		     ;;AN004;; Are we displaying a default E
				xt Err?
 06CA  75 0D                 C1		    JNE $MIF248
 06CC  50                    C1		      PUSH    AX				     ;;AN004;;	 Reset the special message n
				umber
 06CD  2E: A1 0048 R         C1		      MOV     AX,$M_RT.$M_MSG_NUM		     ;;AN004;;	 Get the old message number
 06D1  2E: FF 1E 0030 R      C1		      CALL    DWORD PTR $M_RT.$M_DISK_PROC_ADDR      ;;AN004;;	 Call the READ_DISK_PROC to 
				get error text
 06D6  58                    C1		      POP     AX				     ;;AN004;;	 Reset the special message n
				umber
 06D7  EB 05                 C1		    JMP SHORT $MEN248
 06D9                        C1	$MIF248:
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-35
DOS - Message Retriever - DISPMSG.ASM Module                

 06D9  2E: FF 1E 0030 R      C1		      CALL    DWORD PTR $M_RT.$M_DISK_PROC_ADDR      ;;AN004;;	 Call the READ_DISK_PROC to 
				get error text
 06DE                        C1	$MEN248:
 06DE  EB 1A                 C1		  JMP SHORT $MEN247
 06E0                        C1	$MIF247:
 06E0  33 C9                 C1		    XOR     CX,CX				     ;;AN002;;	 CX = 0 will allow us to
 06E2  80 FE FF              C1		    CMP     DH,UTILITY_MSG_CLASS		     ;;AN001;;
 06E5  74 06                 C1		    JE $MIF252
 06E7  26: 8A 4D 03          C1		      MOV     CL,BYTE PTR ES:[DI].$M_NUM_CLS_MSG     ;;AN001;;	 Get number of messages in c
				lass
 06EB  EB 09                 C1		    JMP SHORT $MEN252
 06ED                        C1	$MIF252:
 06ED  2E: 38 35             C1		      CMP     BYTE PTR CS:[DI].$M_CLASS_ID,DH	     ;;AN002;; Check if class still exists a
				t
 06F0  75 04                 C1		      JNE $MIF254
 06F2  2E: 8A 4D 03          C1			MOV	CL,BYTE PTR CS:[DI].$M_NUM_CLS_MSG   ;;AN000;;	   Get number of messages in
				 class
 06F6                        C1	$MIF254:
 06F6                        C1	$MEN252:
 06F6  83 C7 04              C1		    ADD     DI,$M_CLASS_ID_SZ			     ;;AN000;;	   Point past the class head
				er
 06F9  F9                    C1		    STC 					     ;;AN004;;	 Flag that we haven't found 
				anything yet
 06FA                        C1	$MEN247:
 06FA  73 2D                 C1		  JNC $MIF258
 06FC  F8                    C1		    CLC 					     ;;AN004;; No, reset carry
 06FD                        C1	$MDO259:
 06FD  0B C9                 C1		      OR      CX,CX				     ;;AN000;;	  Do we have any to check?
 06FF  74 19                 C1		    JZ $MEN259
 0701  80 FE FF              C1		      CMP     DH,UTILITY_MSG_CLASS		     ;;AN001;;
 0704  74 05                 C1		      JE $MIF261
 0706  26: 3B 05             C1			CMP	AX,WORD PTR ES:[DI].$M_NUM	     ;;AN001;; Is this the message requested
				?
 0709  EB 03                 C1		      JMP SHORT $MEN261
 070B                        C1	$MIF261:
 070B  2E: 3B 05             C1			CMP	AX,WORD PTR CS:[DI].$M_NUM	     ;;AN000;; Is this the message requested
				?
 070E                        C1	$MEN261:
 070E  75 02                 C1		    JNE $MIF259
 0710  EB 09                 C1		    JMP SHORT $MSR259
 0712                        C1	$MIF259:
 0712  49                    C1		      DEC     CX				     ;;AN000;;	  No, well do we have more t
				o check?
 0713  74 05                 C1		    JZ $MEN259
 0715  83 C7 04              C1		      ADD     DI,$M_ID_SZ			     ;;AN000;;	     Yes, skip past msg head
				er
 0718  EB E3                 C1		    JMP SHORT $MDO259
 071A                        C1	$MEN259:
 071A  F9                    C1		      STC					     ;;AN000;;
 071B                        C1	$MSR259:
 071B  72 0C                 C1		    JC $MIF269
 071D  80 FE FF              C1		      CMP     DH,UTILITY_MSG_CLASS		     ;;AN001;;	 Yes, is it a utility messag
				e?
 0720  F8                    C1		      CLC					     ;;AN001;;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-36
DOS - Message Retriever - DISPMSG.ASM Module                

 0721  75 02                 C1		      JNE $MIF270
 0723  0E                    C1			PUSH	CS				     ;;AN000;;
 0724  07                    C1			POP	ES				     ;;AN000;;	 Return ES:DI pointing to th
				e message
 0725                        C1	$MIF270:
 0725  26: 03 7D 02          C1		      ADD     DI,WORD PTR ES:[DI].$M_TXT_PTR	     ;;AN000;; Prepare ES:DI pointing to the
				 message
 0729                        C1	$MIF269:
 0729                        C1	$MIF258:
 0729  72 06                 C1		  JC $MIF274
 072B  32 ED                 C1		    XOR     CH,CH				     ;;AN000;;
 072D  26: 8A 0D             C1		    MOV     CL,BYTE PTR ES:[DI] 		     ;;AN000;;	 Move size into CX
 0730  47                    C1		    INC     DI					     ;;AN000;;	 Increment past length
 0731                        C1	$MIF274:
 0731  2E: C6 06 0042 R 00   C1		  MOV	  $M_RT.$M_SIZE,$M_NULL 		     ;;AN004;; Reset variable
 0737  C3                    C1		  RET						     ;;AN000;; Return
 0738                        C1	$M_FIND_SPECIFIED_MSG ENDP				     ;;AN000;;
 0738                        C1	$M_DISPLAY_REPLACE PROC NEAR				     ;;AN000;;
 0738  33 DB                 C1		  XOR	  BX,BX 				     ;;AN000;; Use BX for buffer count
 073A  80 7C 06 00           C1		  CMP	  $M_SL.$M_S_ID,$M_SPECIAL_CASE-30H	     ;;AN000;; Is this the special case (con
				vert to ASCII)
 073E  75 13                 C1		  JNE $MIF276
 0740  2E: C7 87 004C R 2D20 C1		    MOV     WORD PTR $M_RT.$M_TEMP_BUF[BX],$M_SPACE_HYP ;;AN000;; Move in a " -"
 0747  43                    C1		    INC     BX					     ;;AN000;;	   Increment count
 0748  43                    C1		    INC     BX					     ;;AN000;;	   Increment count
 0749  2E: C6 87 004C R 20   C1		    MOV     BYTE PTR $M_RT.$M_TEMP_BUF[BX],$M_SPACE  ;;AN000;;	   Move in a " "
 074F  43                    C1		    INC     BX					     ;;AN000;;	   Increment count
 0750  E8 07FE R             C1		    CALL    $M_FLUSH_BUF			     ;;AN000;;	   Write out " - " to prepar
				e for special case
 0753                        C1	$MIF276:
 0753  5D                    C1		  POP	  BP					     ;;AN000;; Remember the return address
 0754  33 DB                 C1		  XOR	  BX,BX 				     ;;AN000;; Use BX for buffer count
 0756  33 D2                 C1		  XOR	  DX,DX 				     ;;AN000;; Use DX for count of parms tak
				en off the stack
 0758  2E: 88 0E 0042 R      C1		  MOV	  $M_RT.$M_SIZE,CL			     ;;AN000;; Save size to later clear stac
				k
 075D  8A 44 09              C1		  MOV	  AL,BYTE PTR $M_SL.$M_S_MINW		     ;;AN000;; Get the minimum width
 0760  3A C1                 C1		  CMP	  AL,CL 				     ;;AN000;; Do we need pad chars added?
 0762  76 1F                 C1		  JNA $MIF278
 0764  2A C1                 C1		    SUB     AL,CL				     ;;AN000;;	 Calculate how many pad char
				s are needed.
 0766  8A F0                 C1		    MOV     DH,AL				     ;;AN000;;	 Save the number of pad char
				acters
 0768  F6 44 07 80           C1		    TEST    BYTE PTR $M_SL.$M_S_FLAG,Right_Align     ;;AN000;;	 Was replaceable parm to be 
				right aligned?
 076C  74 15                 C1		    JZ $MIF279
 076E                        C1	$MDO280:
 076E  8A 44 0A              C1			MOV	AL,BYTE PTR $M_SL.$M_S_PAD	     ;;AN000;;
 0771  2E: 88 87 004C R      C1			MOV	BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL    ;;AN000;;	   Move in a pad char
 0776  43                    C1			INC	BX				     ;;AN000;;
 0777  83 FB 40              C1			CMP	BX,$M_TEMP_BUF_SZ		     ;;AN000;;	   Is buffer full?
 077A  75 03                 C1			JNE $MIF281
 077C  E8 07FE R             C1			  CALL	  $M_FLUSH_BUF			     ;;AN000;;	     Flush the buffer
 077F                        C1	$MIF281:
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-37
DOS - Message Retriever - DISPMSG.ASM Module                

 077F  FE CE                 C1			DEC	DH				     ;;AN000;;	   Have we filled with enoug
				h pad chars?
 0781  75 EB                 C1		      JNZ $MDO280
 0783                        C1	$MIF279:
 0783                        C1	$MIF278:
 0783  80 7C 08 00           C1		  CMP	  BYTE PTR $M_SL.$M_S_MAXW,$M_UNLIM_W	     ;;AN000;; Is maximum width unlimited?
 0787  74 0D                 C1		  JE $MIF286
 0789  38 4C 08              C1		    CMP     BYTE PTR $M_SL.$M_S_MAXW,CL 	     ;;AN000;; Will we exceed maximum width?
 078C  73 08                 C1		    JNB $MIF287
 078E  2A 4C 08              C1		      SUB     CL,BYTE PTR $M_SL.$M_S_MAXW	     ;;AN000;;	 Calculate how many extra ch
				ars
 0791  8A D1                 C1		      MOV     DL,CL				     ;;AN000;;	 Remember how many chars to 
				pop off
 0793  8A 4C 08              C1		      MOV     CL,BYTE PTR $M_SL.$M_S_MAXW	     ;;AN000;;	 Set new string length
 0796                        C1	$MIF287:
 0796                        C1	$MIF286:
 0796  0B C9                 C1		  OR	  CX,CX 				     ;;AN000;;
 0798  74 25                 C1		  JZ $MIF290
 079A                        C1	$MDO291:
 079A  F6 44 07 0F           C1		      TEST    BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
 079E  75 0C                 C1		      JNZ $MIF292
 07A0  F6 44 07 10           C1		      TEST    $M_SL.$M_S_FLAG,Char_field_ASCIIZ AND $M_SIZE_MASK ;  Is this replace a ASCIIZ
				 string?
 07A4  74 06                 C1		      JZ $MIF292
 07A6  26: 8A 05             C1			MOV	AL,BYTE PTR ES:[DI]		     ;;AN000;;	 Get first character from st
				ring
 07A9  47                    C1			INC	DI				     ;;AN000;;	 Next character in string
 07AA  EB 01                 C1		      JMP SHORT $MEN292
 07AC                        C1	$MIF292:
 07AC  58                    C1			POP	AX				     ;;AN000;;	 Get character in register
 07AD                        C1	$MEN292:
 07AD  2E: 88 87 004C R      C1		      MOV     BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL      ;;AN000;;	Move char into the buffer
 07B2  43                    C1		      INC     BX				     ;;AN000;;	 Increase buffer count
 07B3  83 FB 40              C1		      CMP     BX,$M_TEMP_BUF_SZ 		     ;;AN000;;	 Is buffer full?
 07B6  75 03                 C1		      JNE $MIF295
 07B8  E8 07FE R             C1			CALL	$M_FLUSH_BUF			     ;;AN000;;	   Flush the buffer
 07BB                        C1	$MIF295:
 07BB  FE C9                 C1		      DEC     CL				     ;;AN000;;	 Have we completed replace?
 07BD  75 DB                 C1		    JNZ $MDO291
 07BF                        C1	$MIF290:
 07BF  F6 44 07 80           C1		  TEST	  BYTE PTR $M_SL.$M_S_FLAG,Right_Align	     ;;AN000;;	 Was replaceable parm to be 
				left aligned?
 07C3  75 19                 C1		  JNZ $MIF299
 07C5  0A F6                 C1		    OR	    DH,DH				     ;;AN000;;	 Do we need pad chars added?
 07C7  74 15                 C1		    JZ $MIF300
 07C9                        C1	$MDO301:
 07C9  8A 44 0A              C1			MOV	AL,BYTE PTR $M_SL.$M_S_PAD	     ;;AN000;;
 07CC  2E: 88 87 004C R      C1			MOV	BYTE PTR $M_RT.$M_TEMP_BUF[BX],AL    ;;AN000;;	   Move in a pad char
 07D1  43                    C1			INC	BX				     ;;AN000;;
 07D2  83 FB 40              C1			CMP	BX,$M_TEMP_BUF_SZ		     ;;AN000;;	   Is buffer full?
 07D5  75 03                 C1			JNE $MIF302
 07D7  E8 07FE R             C1			  CALL	  $M_FLUSH_BUF			     ;;AN000;;	     Flush the buffer
 07DA                        C1	$MIF302:
 07DA  FE CE                 C1			DEC	DH				     ;;AN000;;	   Have we filled with enoug
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-38
DOS - Message Retriever - DISPMSG.ASM Module                

				h pad chars?
 07DC  75 EB                 C1		      JNZ $MDO301
 07DE                        C1	$MIF300:
 07DE                        C1	$MIF299:
 07DE  F6 44 07 0F           C1		  TEST	  BYTE PTR $M_SL.$M_S_FLAG,NOT Char_Type AND $M_TYPE_MASK ;;AN000;;
 07E2  75 08                 C1		  JNZ $MIF307
 07E4  F6 44 07 10           C1		  TEST	  $M_SL.$M_S_FLAG,Char_field_ASCIIZ AND $M_SIZE_MASK ;;AN000;;	Is this replace a AS
				CIIZ string?
 07E8  74 02                 C1		  JZ $MIF307
 07EA  EB 0D                 C1		  JMP SHORT $MEN307
 07EC                        C1	$MIF307:
 07EC  0A D2                 C1		    OR	    DL,DL				     ;;AN000;;
 07EE  74 09                 C1		    JE $MIF309
 07F0                        C1	$MDO310:
 07F0  2E: 8F 06 0046 R      C1			POP	[$M_RT.$M_RETURN_ADDR]		     ;;AN000;;	 Clean Up stack using spare 
				variable
 07F5  FE CA                 C1			DEC	DL				     ;;AN000;;	 Are we done?
 07F7  75 F7                 C1		      JNZ $MDO310
 07F9                        C1	$MIF309:
 07F9                        C1	$MEN307:
 07F9  E8 07FE R             C1		  CALL	  $M_FLUSH_BUF				     ;;AN000;;	     Flush the buffer for th
				e final time
 07FC  55                    C1		  PUSH	  BP					     ;;AN000;; Restore the return address
 07FD  C3                    C1		  RET						     ;;AN000;;
 07FE                        C1	$M_DISPLAY_REPLACE ENDP 				     ;;AN000;;
 07FE                        C1	$M_FLUSH_BUF PROC NEAR					     ;;AN000;;
 07FE  51                    C1		  PUSH	  CX					     ;;AN000;; Save changed regs
 07FF  06                    C1		  PUSH	  ES					     ;;AN000;;
 0800  57                    C1		  PUSH	  DI					     ;;AN000;;
 0801  1E                    C1		  PUSH	  DS					     ;;AN000;; Set ES pointing to buffer
 0802  07                    C1		  POP	  ES					     ;;AN000;;
 0803  8B CB                 C1		  MOV	  CX,BX 				     ;;AN000;; Set number of bytes to displa
				y
 0805  33 DB                 C1		  XOR	  BX,BX 				     ;;AN000;; Reset buffer counter
 0807  8D 3E 004C R          C1		  LEA	  DI,$M_RT.$M_TEMP_BUF			     ;;AN000;; Reset buffer location pointer
 080B  E8 03A2 R             C1		  CALL	  $M_DISPLAY_STRING			     ;;AN000;; Display the buffer
 080E  72 05                 C1		  JC $MIF314
 0810  5F                    C1		    POP     DI					     ;;AN000;; No, Restore changed regs
 0811  07                    C1		    POP     ES					     ;;AN000;;
 0812  59                    C1		    POP     CX					     ;;AN000;;
 0813  EB 04                 C1		  JMP SHORT $MEN314
 0815                        C1	$MIF314:
 0815  83 C4 06              C1		    ADD     SP,6				     ;;AN000;;	Fix stack
 0818  F9                    C1		    STC 					     ;;AN000;;
 0819                        C1	$MEN314:
 0819  C3                    C1		  RET						     ;;AN000;; Return
 081A                        C1	$M_FLUSH_BUF ENDP					     ;;AN000;;
 081A                        C1	$M_CHAR_REPLACE PROC NEAR				     ;;AN000;;
 081A  5D                    C1		    POP     BP					     ;;AN000;; Save return address
 081B  F6 44 07 30           C1		    TEST    $M_SL.$M_S_FLAG,NOT Char_Field_Char AND $M_SIZE_MASK ;;AN000;; Was Character spe
				cified?
 081F  75 12                 C1		    JNZ $MIF317
 0821  26: 8A 05             C1		      MOV     AL,BYTE PTR ES:[DI]		     ;;AN000;;	 Get the character
 0824  50                    C1		      PUSH    AX				     ;;AN000;;	 Put it on the stack
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-39
DOS - Message Retriever - DISPMSG.ASM Module                

 0825  41                    C1		      INC     CX				     ;;AN000;;	 Increase the count
 0826  E8 0461 R             C1		      CALL    $M_IS_IT_DBCS			     ;;AN000;;	 Is this the first byte of a
				 DB character
 0829  73 06                 C1		      JNC $MIF318
 082B  26: 8A 45 01          C1			MOV	AL,BYTE PTR ES:[DI]+1		     ;;AN000;;	   Get the next character
 082F  50                    C1			PUSH	AX				     ;;AN000;;	   Put it on the stack
 0830  F8                    C1			CLC					     ;;AN000;;	   Clear the carry
 0831                        C1	$MIF318:
 0831  EB 0D                 C1		    JMP SHORT $MEN317
 0833                        C1	$MIF317:
 0833                        C1	$MDO321:
 0833  26: 8A 05             C1			MOV	AL,BYTE PTR ES:[DI]		     ;;AN000;;	 Get the character
 0836  0A C0                 C1			OR	AL,AL				     ;;AN000;;	 Is it the NULL?
 0838  74 04                 C1		      JZ $MEN321
 083A  47                    C1			INC	DI				     ;;AN000;;	   Next character
 083B  41                    C1			INC	CX				     ;;AN000;;	   Increment the count
 083C  EB F5                 C1		      JMP SHORT $MDO321
 083E                        C1	$MEN321:
 083E  2B F9                 C1		      SUB     DI,CX				     ;;AN000;;	 Set SI at the beginning of 
				the string
 0840                        C1	$MEN317:
 0840  55                    C1		    PUSH    BP					     ;;AN000;; Restore return address
 0841  C3                    C1		    RET 					     ;;AN000;; Return
 0842                        C1	$M_CHAR_REPLACE ENDP					     ;;AN000;;
				
 0842  8C C8			        mov     ax,cs                   ;AN003; ;load ES to the right area,
 0844  8E C0			        mov     es,ax                   ;AN003;
 0846  8E D8			        mov     ds,ax                   ;AN003;
 0848				SORT:
 0848  E8 0211 R		        call    sysloadmsg              ;AN000;  Preload messages, Check DOS Version.
				                                        ;If Inc DOS Ver or error loading messages,
				                                        ;SYSLOADMSG will show msg and terminate for us
 084B  73 12			        jnc     parser                  ;AN000; If no error, parse command line
 084D  E8 035B R		        call    sysdispmsg              ;AN000; There was error.  Let SYSDISPMSG Display
 0850  83 FB FF			        cmp     bx,-1                   ;AN000; Is this DOS 1.0 or 1.1 ?
 0853  74 06			        je      OLD_ABORT               ;AN000;  Yes, terminate old way
				
 0855  B4 4C			        mov     ah,Exit                 ;AN000; No, terminate new way
 0857  B0 00			        mov     al,0                    ;AN000; Errorlevel 0 (Compatible!)
 0859  CD 21			        int     021h                    ;AN000; Bye bye!
				
 085B				OLD_ABORT:                              ;AN000; CS should point to PSP
 085B  B4 00			        mov     ah,Abort                ;AN000; Terminate program (AH=0)
 085D  CD 21			        int     021h                    ;AN000; Bye bye!
				;-----------------------------------
				;- DOS version is ok. Parse cmd line
				;-----------------------------------
 085F				PARSER:                                 ;AN000;   message and terminate
 085F  E8 0A37 R		        call    parse                   ;AN000;  Parse command line
				
				;-----------------------------------
				; set up column for proper sort offset
				;-----------------------------------
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-40
DOS - Message Retriever - DISPMSG.ASM Module                

 0862  2E: 83 06 0000 R 02	        ADD     COLUMN,2
 0868  2E: 83 3E 0000 R 02	        CMP     COLUMN,2
 086E  74 05			        JZ      GOT_COL
 0870  2E: FF 0E 0000 R		        DEC     COLUMN
				
				;------------------------------------
				; Get sorting area, no more than 64K
				;------------------------------------
 0875				GOT_COL:
 0875  BB 1000			        MOV     BX,1000H                ;64K worth of paragraphs
 0878				GET_MEM:
 0878  8B EB			        mov     bp,bx                   ;AN003; save buffer length
				        sys     ALLOC                   ;allocate them from somewhere
 087A  B4 48                 1	        MOV     AH,ALLOC 
 087C  CD 21                 1	        INT     21h 
 087E  73 06			        JNC     GOT_MEM                 ;if error, BX has amount free, try to get it
 0880  0B DB			        OR      BX,BX                   ;but, is BX = 0?
 0882  75 F4			        JNZ     GET_MEM                 ;nope, try to allocate it
 0884  EB 6A			        JMP     short SIZERR            ;AN004; ;complain
				
 0886				GOT_MEM:
				;------------------------------------RussW:--Following add in DOS 3.3 for Nat Lang Support
 0886  50			        push    ax                      ;Save AX
 0887  1E			        push    ds                      ;Save DS
 0888  06			        push    es                      ;Save ES
 0889  B0 06			        mov     al,6                    ;Function for Get collating sequence
 088B  BB FFFF			        mov     bx,-1                   ;Get active code page
 088E  BA FFFF			        mov     dx,-1                   ;Get info from active country
 0891  B9 0005			        mov     cx,5                    ;Number of bytes to be returned
 0894  0E			        push    cs                      ;Place code segment
 0895  07			        pop     es                      ;in ES
 0896  BF 0003 R		        mov     di,offset ctry_info     ;Return area for 5 byte requested information
				        sys     GetExtCntry             ;Get extended country information
 0899  B4 65                 1	        MOV     AH,GetExtCntry 
 089B  CD 21                 1	        INT     21h 
				                                        ;Ok, now copy the table in DOS to our segment
 089D  2E: C5 36 0004 R		        lds     si,dword ptr cs:ctry_table_off
 08A2  BF ---- R		        mov     di,seg dg
 08A5  8E C7			        mov     es,di
 08A7  BF 0000 E		        mov     di,offset dg:table
 08AA  8B 0C			        mov     cx,word ptr [si]
 08AC  83 C6 02			        add     si,2
 08AF  B8 0100			        mov     ax,256
 08B2  2B C1			        sub     ax,cx
 08B4  03 F8			        add     di,ax
 08B6  FC			        cld
 08B7  F3/ A4			        rep     movsb
				                                        ;Done copying, so restore regs and cont
 08B9  07			        pop     es                      ;Restore ES
 08BA  1F			        pop     ds                      ;Restore DS
 08BB  58			        pop     ax                      ;Restore AX
				;------------------------------------RussW:--End 3.3 addition
 08BC  8E D8			        MOV     DS,AX                   ;Point DS to buffer
 08BE  8E C0			        MOV     ES,AX                   ;and point ES to buffer
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-41
DOS - Message Retriever - DISPMSG.ASM Module                

 08C0  B1 04			        MOV     CL,4                    ;2^4 bytes per paragraph
 08C2  8B DD			        MOV     BX,BP                   ;AN003; restore buffer length
 08C4  D3 E3			        SHL     BX,CL                   ;Find out how many bytes we have
 08C6  8B EB			        MOV     BP,BX                   ;AN003; save buffer length in bytes
				
				;---------------------------
				; Clear out temporary record area
				;---------------------------
 08C8  B9 0080			        MOV     CX,MAXREC/2             ;Size of temporary buffer (words)
 08CB  B8 2020			        MOV     AX,'  '                 ;Character to fill with
 08CE  33 FF			        XOR     DI,DI                   ;AN004; ;Beginning of temp buffer
 08D0  F3/ AB			        REP     STOSW                   ;Blam.
				;-----------------------------------
				; Make sure source and target code pages are the same
				;-----------------------------------
 08D2  E8 0A9A R		        call    match_codepages         ;AN000;  Make sure codepages are the same
				;---------------------------
				; read in file from standard input
				;---------------------------
 08D5  BA 0102			        MOV     DX,BUFFER + 2           ;DX = place to begin reading
 08D8  8B CD			        MOV     CX,BP                   ;AN003; ;CX is the max number to read
 08DA  81 E9 0102		        SUB     CX,MAXREC + 2           ;remember offset of temp buffer
 08DE				SORTL:
 08DE  33 DB			        XOR     BX,BX                   ;Standard input
				        sys     READ                    ;Read it in
 08E0  B4 3F                 1	        MOV     AH,READ 
 08E2  CD 21                 1	        INT     21h 
 08E4  03 D0			        ADD     DX,AX                   ;Bump pointer by count read
 08E6  2B C8			        SUB     CX,AX                   ;subtract from remaining the count read
 08E8  74 06			        JZ      SIZERR                  ;if buffer is full then error
 08EA  0B C0			        OR      AX,AX                   ;no chars read -> end of file
 08EC  75 F0			        JNZ     SORTL                   ;there were chars read. go read again
 08EE  EB 08			        JMP     SHORT SIZOK             ;trim last ^Z terminated record
 08F0				SIZERR:
 08F0  B8 0002			        mov     ax,msg_NoMem            ;AN000;  not enough memory error
 08F3  B6 FF			        mov     dh,-1                   ;AN003;  class: utility error
 08F5  E8 0A88 R		        call    error_exit              ;AN000;  and write it out
				
				;---------------------------
				; Look for a ^Z. Terminate buffer at 1st ^Z.
				;---------------------------
 08F8				SIZOK:
 08F8  8B DA			        MOV     BX,DX                   ;save end pointer
 08FA  8B CA			        MOV     CX,DX                   ;get pointer to end of text
 08FC  81 E9 0102		        SUB     CX,BUFFER+2             ;dif in pointers is count
 0900  B0 1A			        MOV     AL,1AH                  ;char is ^Z
 0902  BF 0102			        MOV     DI,BUFFER+2             ;point to beginning of text
 0905  F2/ AE			        REPNZ   SCASB                   ;find one
 0907  75 01			        JNZ     NoBack                  ;nope, try to find CRLF
 0909  4B			        DEC     BX                      ;pretend that we didn't see ^Z
 090A				NoBack:
 090A  2B D9			        SUB     BX,CX                   ;sub from endpointer the number left
 090C  83 EB 02			        SUB     BX,2                    ;Hope for a CR LF at end
 090F  81 3F 0A0D		        CMP     WORD PTR [BX],0A0Dh     ;Was there one there?
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-42
DOS - Message Retriever - DISPMSG.ASM Module                

 0913  74 08			        JZ      GOTEND                  ;yep, here is the end
 0915  83 C3 02			        ADD     BX,2                    ;nope, bump back to SCASB spot
 0918  38 07			        CMP     BYTE PTR [BX],AL        ;Was there ^Z there?
 091A  74 01			        JZ      GOTEND                  ;yep, chop it
 091C  43			        INC     BX                      ;Nope, skip last char
 091D				GOTEND:
 091D  8B EB			        MOV     BP,BX                   ;BP = filesize-2(CRLF)+temp buffer+2
 091F  3E: C7 46 00 0000	        MOV     WORD PTR DS:[BP],0      ;0 at end of the file
				
				;---------------------------
				;  We now turn the entire buffer into a linked list of chains by
				;  replacing CRLFs with the length of the following line (with 2 for CRLF)
				;---------------------------
 0925  BB 0100			        MOV     BX,BUFFER               ;pointer to line head (length)
 0928  BF 0102			        MOV     DI,BUFFER+2             ;pointer to line text
 092B				REPLACE_LOOP:
 092B  B0 0D			        MOV     AL,13                   ;char to look for is CR
 092D  8B CD			        MOV     CX,BP                   ;count = end pointer
 092F  2B CF			        SUB     CX,DI                   ;chop off start point to get length
 0931  41			        INC     CX                      ;add 1???
 0932				REPLACE_SCAN:
 0932  F2/ AE			        REPNZ   SCASB                   ;look for CR
 0934  75 05			        JNZ     REPLACE_SKIP            ;count exhausted
 0936  80 3D 0A			        CMP     BYTE PTR [DI],10        ;LF there?
 0939  75 F7			        JNZ     REPLACE_SCAN            ;nope, continue scanning
 093B				REPLACE_SKIP:
 093B  8B C7			        MOV     AX,DI                   ;AX to point after CR
 093D  48			        DEC     AX                      ;AX to point to CR
				        save    <AX>                    ;save pointer
 093E  50                    2	        PUSH    AX 
 093F  2B C3			        SUB     AX,BX                   ;AX is length of line found
 0941  89 07			        MOV     [BX],AX                 ;stuff it in previous link
				        restore <BX>                    ;get pointer to next
 0943  5B                    2	        POP     BX 
 0944  47			        INC     DI                      ;skip LF???
 0945  E3 02			        JCXZ    END_REPLACE_LOOP        ;no more to scan -> go sort
 0947  EB E2			        JMP     REPLACE_LOOP            ;look for next
				
 0949				END_REPLACE_LOOP:
 0949  C7 07 0000		        MOV     WORD PTR [BX],0         ;terminate file with nul
 094D  8D 6F 02			        LEA     BP,[BX+2]               ;remember the null line at end
 0950  BF 0100			        MOV     DI,BUFFER               ;DI is start of unsorted section
				
				;---------------------------
				; begin sort. Outer loop steps over all unsorted lines
				;---------------------------
 0953				OUTER_SORT_LOOP:
 0953  8B DF			        MOV     BX,DI                   ;BX is start of unsorted section
 0955  8B F3			        MOV     SI,BX                   ;SI is scanning place link
 0957  83 3F 00			        CMP     WORD PTR [BX],0         ;are we at the end of the buffer?
 095A  75 03			        JNZ     INNER_SORT_LOOP         ;No, do inner process
 095C  E9 09FA R		        JMP     END_OUTER_SORT_LOOP     ;yes, go dump out
				
				;---------------------------
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-43
DOS - Message Retriever - DISPMSG.ASM Module                

				; BX points to best guy found so far. We scan through the sorted section
				; to find an appropriate insertion point
				;---------------------------
 095F				INNER_SORT_LOOP:
 095F  03 34			        ADD     SI,[SI]                 ;link to next fellow
 0961  8B 04			        MOV     AX,[SI]                 ;get length of comparison guy
 0963  0B C0			        OR      AX,AX                   ;test for end of buffer
 0965  74 52			        JZ      END_INNER_SORT_LOOP     ;if zero then figure out insertion
				        save    <SI,DI>                 ;save SI,DI
 0967  56                    2	        PUSH    SI 
 0968  57                    2	        PUSH    DI 
 0969  8B FB			        MOV     DI,BX                   ;DI = pointer to tester link
 096B  2E: 2B 06 0000 R		        SUB     AX,COLUMN               ;adjust length for column
 0970  77 05			        JA      AXOK                    ;more chars in tester than column?
 0972  33 F6			        XOR     SI,SI                   ;AN004; ;point SI to blank area
 0974  B8 0100			        MOV     AX,MAXREC               ;make AX be max length
 0977				AXOK:
 0977  8B 15			        MOV     DX,[DI]                 ;get length of best guy
 0979  2E: 2B 16 0000 R		        SUB     DX,COLUMN               ;adjust length for column
 097E  77 05			        JA      DXOK                    ;there are more chars after column
 0980  33 FF			        XOR     DI,DI                   ;AN004; ;point air to a space
 0982  BA 0100			        MOV     DX,MAXREC               ;really big record
 0985				DXOK:
 0985  8B C8			        MOV     CX,AX                   ;AX is shortest record
 0987  3B C2			        CMP     AX,DX                   ;perhaps DX is shorter
 0989  72 02			        JB      SMALL                   ;nope, leace CX alone
 098B  8B CA			        MOV     CX,DX                   ;DX is shorter, put length in CX
 098D				SMALL:
 098D  2E: 03 3E 0000 R		        ADD     DI,COLUMN               ;offset into record
 0992  2E: 03 36 0000 R		        ADD     SI,COLUMN               ;offset into other record
 0997  53			        push    bx
 0998  50			        push    ax
 0999  BB 0000 E		        mov     bx,offset dg:table
 099C  AC			tloop:  lodsb
 099D  2E: D7			        xlat    byte ptr cs:[bx]
 099F  8A E0			        mov     ah,al
 09A1  26: 8A 05		        mov     al,es:[di]
 09A4  47			        inc     di
 09A5  2E: D7			        xlat    byte ptr cs:[bx]
 09A7  3A E0			        cmp     ah,al
 09A9  E1 F1			        loopz   tloop
 09AB  58			        pop     ax
 09AC  5B			        pop     bx
				        restore <DI,SI>                 ;get head pointers back
 09AD  5F                    2	        POP     DI 
 09AE  5E                    2	        POP     SI 
 09AF  75 02			        JNZ     TESTED_NOT_EQUAL        ;didn't exhaust counter, conditions set
 09B1  3B C2			        CMP     AX,DX                   ;check string lengths
 09B3				TESTED_NOT_EQUAL:
				
				;---------------------------
				; NOTE! jae is patched to a jbe if file is to be sorted in reverse!
				;---------------------------
 09B3				CODE_PATCH label byte
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-44
DOS - Message Retriever - DISPMSG.ASM Module                

 09B3  73 AA			        JAE     INNER_SORT_LOOP         ;if this one wasn't better then go again
 09B5  8B DE			        MOV     BX,SI                   ;it was better, save header
 09B7  EB A6			        JMP     INNER_SORT_LOOP         ;and scan again
				
 09B9				END_INNER_SORT_LOOP:
 09B9  8B F3			        MOV     SI,BX                   ;SI is now the best person
 09BB  3B F7			        CMP     SI,DI                   ;check best for current
 09BD  74 36			        JZ      END_INSERT              ;best equals current, all done
				
				;---------------------------
				; SI points to best line found so far
				; DI points to a place to insert this line
				; DI is guaranteed to be < SI
				; make room for line at destination
				;---------------------------
 09BF  8B 14			        MOV     DX,[SI]                 ;get length of line
				        save    <SI,DI>                 ;save positions of people
 09C1  56                    2	        PUSH    SI 
 09C2  57                    2	        PUSH    DI 
 09C3  FD			        STD                             ;go right to left
 09C4  8B CD			        MOV     CX,BP                   ;get end of file pointer
 09C6  2B CF			        SUB     CX,DI                   ;get length from destination to end
 09C8  8B F5			        MOV     SI,BP                   ;start from end
 09CA  4E			        DEC     SI                      ;SI points to end of file
 09CB  8B FE			        MOV     DI,SI                   ;destination is end of file
 09CD  03 FA			        ADD     DI,DX                   ;DI points to new end of file
 09CF  F3/ A4			        REP     MOVSB                   ;blam. Move every one up
 09D1  FC			        CLD                             ;back left to right
				        restore <DI,SI>                 ;get old source and destination
 09D2  5F                    2	        POP     DI 
 09D3  5E                    2	        POP     SI 
				;---------------------------
				;  MOVE NEW LINE INTO PLACE
				;---------------------------
				        save    <DI>                    ;save destination
 09D4  57                    2	        PUSH    DI 
 09D5  03 F2			        ADD     SI,DX                   ;adjust for previous movement
				        save    <SI>                    ;save this value
 09D7  56                    2	        PUSH    SI 
 09D8  8B CA			        MOV     CX,DX                   ;get number to move
 09DA  F3/ A4			        REP     MOVSB                   ;blam. move the new line in
				        restore <SI,DI>                 ;get back destination and new source
 09DC  5E                    2	        POP     SI 
 09DD  5F                    2	        POP     DI 
				;---------------------------
				;  DELETE LINE FROM OLD PLACE
				;---------------------------
				        save    <DI>                    ;save destination
 09DE  57                    2	        PUSH    DI 
 09DF  8B CD			        MOV     CX,BP                   ;pointer to end
 09E1  03 CA			        ADD     CX,DX                   ;remember bump
 09E3  2B CE			        SUB     CX,SI                   ;get count of bytes to move
 09E5  41			        INC     CX                      ;turn it into a word
 09E6  D1 E9			        SHR     CX,1                    ;or a count of words
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-45
DOS - Message Retriever - DISPMSG.ASM Module                

 09E8  8B FE			        MOV     DI,SI                   ;new destination of move
 09EA  03 F2			        ADD     SI,DX                   ;offset of block
 09EC  F3/ A5			        REP     MOVSW                   ;blam, squeeze out the space
				        restore <DI>                    ;get back original destination
 09EE  5F                    2	        POP     DI 
 09EF  3E: C7 46 FE 0000	        MOV     WORD PTR DS:[BP-2],0    ;remake the end of file mark
				
 09F5				END_INSERT:
 09F5  03 3D			        ADD     DI,[DI]                 ;link to next guy
 09F7  E9 0953 R		        JMP     OUTER_SORT_LOOP         ;and continue
				;------------------------------
				;       PUT BACK IN THE CR-LF
				;------------------------------
 09FA				END_OUTER_SORT_LOOP:
 09FA  BF 0100			        MOV     DI,BUFFER               ;start at beginning (where else)
 09FD  8B 0D			        MOV     CX,[DI]                 ;count of butes
				
 09FF				INSERT_LOOP:
 09FF  03 F9			        ADD     DI,CX                   ;point to next length
 0A01  8B 0D			        MOV     CX,[DI]                 ;get length
 0A03  C7 05 0A0D		        MOV     WORD PTR [DI],0A0DH     ;replace length with CRLF
 0A07  23 C9			        AND     CX,CX                   ;AN004; ;check for end of file
 0A09  75 F4			        JNZ     INSERT_LOOP             ;nope, try again
				
 0A0B				WRITE_FILE:
 0A0B  BA 0102			        MOV     DX,BUFFER+2             ;get starting point
 0A0E  8B CD			        MOV     CX,BP                   ;pointer to end of buffer
 0A10  2B CA			        SUB     CX,DX                   ;dif in pointers is number of bytes
 0A12  BB 0001			        MOV     BX,1                    ;to standard output
				        sys     WRITE                   ;write 'em out
 0A15  B4 40                 1	        MOV     AH,WRITE 
 0A17  CD 21                 1	        INT     21h 
 0A19  72 04			        JC      BADWRT                  ;some bizarre error -> flag it
 0A1B  3B C1			        CMP     AX,CX                   ;did we write what was expected?
 0A1D  74 06			        JZ      WRTOK                   ;yes, say bye bye
 0A1F				BADWRT:
				
				;;;;;   mov     ax,msg_NoDisk           ;AN000; Strange write error
				;;;;;   mov     dh,-1                   ;AN003; class: extended error
				;;;;;   call    error_exit              ;AN000; Bye bye
 0A1F  B0 01			        mov     al,RETCODE_ERROR        ;AN000; return an error code (errorlevel)
				        sys     EXIT                    ;AN000;
 0A21  B4 4C                 1	        MOV     AH,EXIT 
 0A23  CD 21                 1	        INT     21h 
 0A25				WRTOK:
 0A25  B0 00			        MOV     AL,RETCODE_NOERROR      ;AN000; Errorlevel 0 (No error!)
				        sys     EXIT                    ;bye!
 0A27  B4 4C                 1	        MOV     AH,EXIT 
 0A29  CD 21                 1	        INT     21h 
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-46
DOS - Message Retriever - DISPMSG.ASM Module                

				        PAGE   ;
				;************************************************************
				;*
				;*   SUBROUTINE NAME:      display_msg
				;*
				;*   SUBROUTINE FUNCTION:
				;*         Display the requested message to the specified handle
				;*
				;*   INPUT:
				;*      1)   AX = Number of the message to be displayed.
				;*      2)   BX = Handle to be written to.
				;*
				;*   OUTPUT:
				;*      The message corresponding to the requested msg number will
				;*      be written to the requested handle. There is no substitution
				;*      text in SORT.
				;*
				;*   NORMAL EXIT:
				;*      Message will be successfully written to requested handle.
				;*
				;*   ERROR EXIT:
				;*      None.  Note that theoretically an error can be returned from
				;*      SYSDISPMSG, but there is nothing that the application can do.
				;*
				;*   INTERNAL REFERENCES:
				;*      System Display Message service routines
				;*
				;*   EXTERNAL REFERENCES:
				;*      None
				;*
				;************************************************************
				
 0A2B				display_msg     proc    near            ;AN000;
 0A2B  1E			        push    ds                      ;AN000; save DS value
 0A2C  0E			        push    cs                      ;AN000; get DS addressability
 0A2D  1F			        pop     ds                      ;AN000;
				
 0A2E  33 C9			        xor     cx,cx                   ;AN004; ;AN000;  No substitution text
				;;      mov     dh,-1                   ;AN003;  Message class
				                                        ; 1=DOS Extended error
				                                        ; 2=DOS Parse error
				                                        ; -1=Utility message
 0A30  B2 00			        mov     dl,0                    ;AN000;  DOS INT 21H function number to use for input
				                                        ; 00H=No input, 01H=Keyboard input,
				                                        ; 07H=Direct Console Input Without Echo,
				                                        ; 08H=Console Input Without Echo, 0AH=Buffered Keyboard Inpu
				t
 0A32  E8 035B R		        call    SYSDISPMSG              ;AN000;
				
 0A35  1F			        pop     ds                      ;AN000;  restore DS
 0A36  C3			        ret                             ;AN000;
 0A37				display_msg     ENDP                    ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-47
DOS - Message Retriever - DISPMSG.ASM Module                

				        PAGE   ;
				;************************************************************
				;*
				;*   SUBROUTINE NAME:      parse
				;*
				;*   SUBROUTINE FUNCTION:
				;*         Call the DOS PARSE Service Routines to process the command
				;*         line. Search for valid switches (/R and /+n) and take
				;*         appropriate action for each. Display error message and
				;*         terminate on error.
				;*
				;*   INPUT:        None
				;*
				;*   OUTPUT:       None
				;*
				;*   NORMAL EXIT:
				;*
				;*         If /R specified, then patches code to perform reverse sort
				;*         by changing JAE to a JB.
				;*
				;*         If /+n entered, COLUMN will be set to "n," otherwise COLUMN
				;*         will be set to 1.
				;*
				;*   ERROR EXIT:
				;*
				;*         If user enters any parameter or switch other than /R or /+n,
				;*         or an invalid value for "n", then this routine will display
				;*         the "Invalid Parameter" error message and terminate with
				;*         errorlevel 1.
				;*
				;*   EXTERNAL REFERENCES:
				;*         System parse service routines
				;*         INT21 - GET PSP Function Call 062h
				;*
				;************************************************************
				
 0A37				parse   proc    near                    ;AN000;
				
				        sys     GetCurrentPSP           ;AN000; Get PSP address, returned in BX
 0A37  B4 62                 1	        MOV     AH,GetCurrentPSP 
 0A39  CD 21                 1	        INT     21h 
				
 0A3B  8E DB			        mov     ds,bx                   ;AN000; Put PSP Seg in DS
 0A3D  BE 0081			        mov     si,081h                 ;AN000; Offset of command line in PSP
 0A40  80 3E 0080 00		        cmp     byte ptr ds:080h,0      ;AN000; Check length of command line
 0A45  74 40			        je      end_parse               ;AN000; If 0 len, the we are done parsing
 0A47  33 C9			        xor     cx,cx                   ;AN000; Number of parms processed so far = 0
 0A49  0E			        push    cs                      ;AN000; Put CS
 0A4A  07			        pop     es                      ;AN000;  in ES
				;---------------------------------
				;- Loop for each operand at DS:SI (Initially PSP + 081h)
				;---------------------------------
 0A4B				parse_loop:                             ;AN000;
 0A4B  BF 010B R		        mov     di,offset parms         ;AN000; Address of parse control block
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-48
DOS - Message Retriever - DISPMSG.ASM Module                

 0A4E  33 D2			        xor     dx,dx                   ;AN000; Reserved
 0A50  E8 0BB3 R		        call    sysparse                ;AN000; Parse parm at DS:SI
 0A53  3D FFFF			        cmp     ax,EOL                  ;AN000; Q: Are we at end of command line?
 0A56  74 2F			        je      end_parse               ;AN000;  YES: We are done
 0A58  23 C0			        and     ax,ax                   ;AN004; ;AN000;  NO:  Q: Any errors?
 0A5A  75 26			        jne     parse_error             ;AN000;   YES: Display msg and terminate
 0A5C  2E: 8B 1E 013F R		        mov     bx,sb_synonym           ;AN000; Get offset of switch entered
				;----------------------------------
				;- If user said /R, then patch code
				;----------------------------------
 0A61  81 FB 0122 R		        cmp     bx,offset rev_sw        ;AN000; If user specified /R
 0A65  75 08			        jne     check_column            ;AN000;
 0A67  2E: C6 06 09B3 R 72	        mov     cs:code_patch,072h      ;AN000; Sleazy patch to make reverse order sort
 0A6D  EB DC			        jmp     parse_loop              ;AN000; Look for another parm
				
				;---------------------------------------------
				;- If user said /+n, then save COLUMN index
				;---------------------------------------------
 0A6F				check_column:                           ;AN000;
 0A6F  81 FB 012E R		        cmp     bx,offset col_sw        ;AN000; Q: Did user specified /+n ?
 0A73  75 0A			        jne     switch_error            ;AC003;  No:  Unrecognized parm
 0A75  2E: A1 0141 R		        mov     ax,sb_value             ;AN000;  Yes: Get number entered by user
 0A79  2E: A3 0000 R		        mov     column,ax               ;AN000;       Set up column to begin sort
 0A7D  EB CC			        jmp     parse_loop              ;AN000;       Check for next parm
				
				;------------------------------------------------------------
				;- If any other parameter specified, display message and die
				;------------------------------------------------------------
 0A7F				switch_error:                           ;AN003;
 0A7F  B8 0003			        mov     ax,Msg_switch           ;AN003;
 0A82				parse_error:                            ;AN000;
 0A82  B6 02			        mov     dh,2                    ;AN003;  class: parse error
 0A84  E8 0A88 R		        call    error_exit              ;AN000;  Terminate utility
				
 0A87				end_parse:                              ;AN000;
 0A87  C3			        ret                             ;AN000;
 0A88				parse   endp                            ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-49
DOS - Message Retriever - DISPMSG.ASM Module                

				        PAGE   ;
				;************************************************************
				;*
				;*   SUBROUTINE NAME:   error_exit
				;*
				;*   SUBROUTINE FUNCTION:
				;*      Displays the message number in AX to the standard
				;*      error device, then terminates with errorlevel 1.
				;*
				;*   INPUT:     AX = Message number
				;*
				;*   INTERNAL REFERENCES:
				;*      display_msg
				;*
				;*   EXTERNAL REFERENCES:
				;*      INT 021h - Terminate Function 043h
				;*
				;************************************************************
 0A88				error_exit      proc    near            ;AN000;
 0A88  E8 0B04 R		        call    prt_sort                ;AN003;
 0A8B  BB 0002			        mov     bx,STDERR               ;AN000; output to standard error
 0A8E  33 C9			        xor     cx,cx                   ;AN004; ;AN003;
 0A90  E8 0A2B R		        call    display_msg             ;AN000; and write it out
 0A93  B0 01			        mov     al,RETCODE_ERROR        ;AN000; return an error code (errorlevel)
				        sys     EXIT                    ;AN000;
 0A95  B4 4C                 1	        MOV     AH,EXIT 
 0A97  CD 21                 1	        INT     21h 
 0A99  C3			        ret                             ;AN000;  Meaningless RET
 0A9A				error_exit      endp                    ;AN000;
				
				
				;************************************************************
				;*
				;*   SUBROUTINE NAME:   match_codepages
				;*
				;*   SUBROUTINE FUNCTION:
				;*      Check to see if Code Page Support is active. If so,
				;*      check code page of input and output handles. If the
				;*      source file has a code page file tag AND the target
				;*      handles code page is different, then set code  page
				;*      of the target to that of the source.
				;*
				;*   INTERNAL REFERENCES:
				;*      none
				;*
				;*   EXTERNAL REFERENCES:
				;*      INT 021h - Check CPSW
				;*      INT 021h - Get Extended Attributes by Handle
				;*      INT 021h - Set Extended Attributes by Handle
				;*
				;************************************************************
				
 0A9A				match_codepages proc    near            ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-50
DOS - Message Retriever - DISPMSG.ASM Module                

				;-----------------------------------
				; Check status of Code page support
				;-----------------------------------
 0A9A  06			        push    es                      ;AN000; Save ES register
 0A9B  1E			        push    ds                      ;AN001; Save DS register
				;
 0A9C  8C C8			        mov     ax,cs                   ;AN001; ES, DS -> CS
 0A9E  8E D8			        mov     ds,ax                   ;AN001;
 0AA0  8E C0			        mov     es,ax                   ;AN001;
				;
 0AA2  B8 3303			        mov     ax,GetCPSW              ;AN000; Get CPSW state, assume support is OFF
 0AA5  CD 21			        int     021h                    ;AN000; DL: 0=NotSupported,1=Supported
 0AA7  80 FA 01			        cmp     dl,1                    ;AN000; CPSW supported if DL=1
 0AAA  75 55			        jne     done_cpsw               ;AN000; If not supported, we're done
				;-----------------------------------
				; Get Code Pages of STDIN and STDOUT
				;-----------------------------------
 0AAC  B8 5702			        mov     ax,GetExtAttr           ;AN000; Get Extended Attributes by Handle
 0AAF  BB 0001			        mov     bx,STDOUT               ;AN000; For Standard output device
 0AB2  BF 00FA R		        mov     di,offset cp_list       ;AC001; Return buffer address
 0AB5  BE 00EC R		        mov     si,offset cp_qlist      ;AN001; Query the code page attribute
 0AB8  B9 000D			        mov     cx,cp_len               ;AN001; return buffer length
 0ABB  CD 21			        int     021h                    ;AN000;
 0ABD  72 42			        jc      done_cpsw               ;AN000; Error condition, let system handle
 0ABF  2E: A1 0105 R		        mov     ax,cp                   ;AN000; Save target code page
 0AC3  2E: A3 0109 R		        mov     tgt_cp,ax               ;AN000;  for later reference
				
 0AC7  B8 5702			        mov     ax,GetExtAttr           ;AN000; Get Extended Attributes by Handle
 0ACA  33 DB			        xor     bx,bx                   ;AN004; ;AN000; bx = STDIN (0)  For Standard input device
 0ACC  BF 00FA R		        mov     di,offset cp_list       ;AC001; Return buffer address
 0ACF  BE 00EC R		        mov     si,offset cp_qlist      ;AN001; Query the code page attribute
 0AD2  B9 000D			        mov     cx,cp_len               ;AN001; return buffer length
 0AD5  CD 21			        int     021h                    ;AN000;
 0AD7  72 28			        jc      done_cpsw               ;AN000; Error condition, let system handle
 0AD9  2E: A1 0105 R		        mov     ax,cp                   ;AN000; Save source code page
 0ADD  2E: A3 0107 R		        mov     src_cp,ax               ;AN000;  for later reference
				
 0AE1  2E: A1 0107 R		        mov     ax,src_cp               ;AN000; Get source codepage
 0AE5  23 C0			        and     ax,ax                   ;AN004; ;AN000; IF no codepage
 0AE7  74 18			        je      done_cpsw               ;AN000;   THEN no action required;
 0AE9  2E: 3B 06 0109 R		        cmp     ax,tgt_cp               ;AN000; IF src_cp = tgt_cp
 0AEE  74 11			        je      done_cpsw               ;AN000;   THEN no action required;
				;-------------------------------------
				;- Set CP of target to that of source
				;-------------------------------------
 0AF0  2E: C6 06 0002 R FF	        mov     cp_reset,TRUE           ;AN000; Set flag indicating change
 0AF6  B8 5704			        mov     ax,SetExtAttr           ;AN000; Set Extended Attributes by Handle
 0AF9  BB 0001			        mov     bx,STDOUT               ;AN000; For Standard output device
 0AFC  BF 00FA R		        mov     di,offset cp_list       ;AC001; Input buffer address
 0AFF  CD 21			        int     021h                    ;AN000;
				
 0B01				done_cpsw:                              ;AN000;
 0B01  1F			        pop     ds                      ;AN001; Restore DS register
 0B02  07			        pop     es                      ;AN000; Restore ES register
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-51
DOS - Message Retriever - DISPMSG.ASM Module                

 0B03  C3			        ret                             ;AN000;
 0B04				match_codepages endp                    ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-52
DOS - Message Retriever - DISPMSG.ASM Module                

				        PAGE   ;
				;************************************************************
				;*
				;*   SUBROUTINE NAME:   prt_sort
				;*
				;*   SUBROUTINE FUNCTION:
				;*      Preceeds all error messages with "SORT: ".
				;*
				;*   INTERNAL REFERENCES:
				;*         none
				;*   EXTERNAL REFERENCES:
				;*         none
				;************************************************************
 0B04				prt_sort proc near                      ;AN003;
 0B04  50			        push    ax                      ;AN003;
 0B05  52			        push    dx                      ;AN003;
				;
 0B06  B6 FF			        mov     dh,-1                   ;AN003;
 0B08  B8 0005			        mov     ax,Msg_sort             ;AN003;
 0B0B  33 C9			        xor     cx,cx                   ;AN004; ;AN003;
 0B0D  BB 0002			        mov     bx,STDERR               ;AN003;
 0B10  E8 0A2B R		        call    display_msg             ;AN003;
				;
 0B13  5A			        pop     dx                      ;AN003;
 0B14  58			        pop     ax                      ;AN003;
				;
 0B15  C3			        ret                             ;AN003;
 0B16				prt_sort endp                           ;AN003;
				
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Page     1-53
DOS - Message Retriever - DISPMSG.ASM Module                

				        PAGE   ;
				;--------------------
				.list
				;--------------------
				
 1294				CODE    ENDS
				
				
				
				
				
				
				
 0000				CONST   SEGMENT PUBLIC BYTE
				
				        extrn   table:byte
				
 0000				CONST   ENDS
				
				
				
				
				SUBTTL  Initialized Data
				;-------------------------------
				;---    Stack Segment
				;-------------------------------
 0080				CSTACK   SEGMENT STACK
 0080  014A[			         db      (362 - 80h) + 96 dup (0) ;(362 - 80h) == New - Old IBM
	   00			
			 ]	
				
				                                          ;interrupt reqs. == size of growth
 01CA				CSTACK   ENDS
				
				        END     SORT

Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-1


Macros:

		N a m e			Lines

$M_BUILD_PTRS  . . . . . . . . .  	  18
$M_CHECK . . . . . . . . . . . .  	  12
$M_DECLARE . . . . . . . . . . .  	  21
$M_DECLARE2  . . . . . . . . . .  	  41
$M_INC . . . . . . . . . . . . .  	   3
$M_MAKE  . . . . . . . . . . . .  	  10
$M_MAKE_COMR . . . . . . . . . .  	  21
$M_MAKE_COMT . . . . . . . . . .  	   5
$M_POPF  . . . . . . . . . . . .  	   5
BREAK  . . . . . . . . . . . . .  	   2
MSG_SERVICES . . . . . . . . . .  	  34
MSG_SERVICES2  . . . . . . . . .  	  14
MSG_UTILNAME . . . . . . . . . .  	   5
RESTORE  . . . . . . . . . . . .  	   3
SAVE . . . . . . . . . . . . . .  	   3
SYS  . . . . . . . . . . . . . .  	   2

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

$M_CLASS_ID  . . . . . . . . . .  	0004	0003
  $M_CLS_ID  . . . . . . . . . .  	0000
  $M_COMMAND_VER . . . . . . . .  	0001
  $M_NUM_CLS_MSG . . . . . . . .  	0003
$M_COUNTRY_INFO  . . . . . . . .  	0056	000A
  $M_HEADER  . . . . . . . . . .  	0000
  $M_DATE_FORMAT . . . . . . . .  	0044
  $M_CURR_SEPARA . . . . . . . .  	0046
  $M_THOU_SEPARA . . . . . . . .  	004B
  $M_DECI_SEPARA . . . . . . . .  	004D
  $M_DATE_SEPARA . . . . . . . .  	004F
  $M_TIME_SEPARA . . . . . . . .  	0051
  $M_CURR_FORMAT . . . . . . . .  	0053
  $M_SIG_DIGS_CU . . . . . . . .  	0054
  $M_TIME_FORMAT . . . . . . . .  	0055
$M_ID  . . . . . . . . . . . . .  	0004	0002
  $M_NUM . . . . . . . . . . . .  	0000
  $M_TXT_PTR . . . . . . . . . .  	0002
$M_RES_ADDRS . . . . . . . . . .  	0085	0017
  $M_EXT_ERR_ADDRS . . . . . . .  	0000
  $M_EXT_FILE  . . . . . . . . .  	0004
  $M_EXT_COMMAND . . . . . . . .  	0008
  $M_EXT_TERM  . . . . . . . . .  	000C
  $M_PARSE_COMMAND . . . . . . .  	0010
  $M_PARSE_ADDRS . . . . . . . .  	0014
  $M_PARSE_TERM  . . . . . . . .  	0018
  $M_CRIT_ADDRS  . . . . . . . .  	001C
  $M_CRIT_COMMAND  . . . . . . .  	0020
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-2


  $M_CRIT_TERM . . . . . . . . .  	0024
  $M_DISK_PROC_ADDR  . . . . . .  	0028
  $M_CLASS_ADDRS . . . . . . . .  	002C
  $M_CLS_TERM  . . . . . . . . .  	0030
  $M_DBCS_VEC  . . . . . . . . .  	0034
  $M_HANDLE  . . . . . . . . . .  	0038
  $M_SIZE  . . . . . . . . . . .  	003A
  $M_CRLF  . . . . . . . . . . .  	003B
  $M_CLASS . . . . . . . . . . .  	003D
  $M_RETURN_ADDR . . . . . . . .  	003E
  $M_MSG_NUM . . . . . . . . . .  	0040
  $M_DIVISOR . . . . . . . . . .  	0042
  $M_TEMP_BUF  . . . . . . . . .  	0044
  $M_BUF_TERM  . . . . . . . . .  	0084
$M_SUBLIST_STRUC . . . . . . . .  	000B	0008
  $M_S_SIZE  . . . . . . . . . .  	0000
  $M_S_RESV  . . . . . . . . . .  	0001
  $M_S_VALUE . . . . . . . . . .  	0002
  $M_S_ID  . . . . . . . . . . .  	0006
  $M_S_FLAG  . . . . . . . . . .  	0007
  $M_S_MAXW  . . . . . . . . . .  	0008
  $M_S_MINW  . . . . . . . . . .  	0009
  $M_S_PAD . . . . . . . . . . .  	000A
$P_CDI . . . . . . . . . . . . .  	0022	000C
  $P_CDI_DATEF . . . . . . . . .  	0000
  $P_CDI_MONEY . . . . . . . . .  	0002
  $P_CDI_1000  . . . . . . . . .  	0007
  $P_CDI_DEC . . . . . . . . . .  	0009
  $P_CDI_DATES . . . . . . . . .  	000B
  $P_CDI_TIMES . . . . . . . . .  	000D
  $P_CDI_TIMEF . . . . . . . . .  	0011
$P_CONTROL_BLK . . . . . . . . .  	000A	0006
  $P_MATCH_FLAG  . . . . . . . .  	0000
  $P_FUNCTION_FLAG . . . . . . .  	0002
  $P_RESULT_BUF  . . . . . . . .  	0004
  $P_VALUE_LIST  . . . . . . . .  	0006
  $P_NID . . . . . . . . . . . .  	0008
  $P_KEYORSW . . . . . . . . . .  	0009
$P_DOS_TBL . . . . . . . . . . .  	0005	0003
  $P_DOS_INFOID  . . . . . . . .  	0000
  $P_DOS_TBL_OFF . . . . . . . .  	0001
  $P_DOS_TBL_SEG . . . . . . . .  	0003
$P_PARMSX_BLK  . . . . . . . . .  	0004	0003
  $P_MINP  . . . . . . . . . . .  	0000
  $P_MAXP  . . . . . . . . . . .  	0001
  $P_1ST_CONTROL . . . . . . . .  	0002
$P_PARMS_BLK . . . . . . . . . .  	0004	0003
  $P_PARMSX_ADDRESS  . . . . . .  	0000
  $P_NUM_EXTRA . . . . . . . . .  	0002
  $P_LEN_EXTRA_DELIM . . . . . .  	0003
$P_RESULT_BLK  . . . . . . . . .  	0008	0004
  $P_TYPE  . . . . . . . . . . .  	0000
  $P_ITEM_TAG  . . . . . . . . .  	0001
  $P_SYNONYM_PTR . . . . . . . .  	0002
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-3


  $P_PICKED_VAL  . . . . . . . .  	0004
$P_VAL_LIST  . . . . . . . . . .  	0009	0005
  $P_NUMOFLIST . . . . . . . . .  	0000
  $P_VAL_XL  . . . . . . . . . .  	0001
  $P_VAL_XH  . . . . . . . . . .  	0003
  $P_VAL_YL  . . . . . . . . . .  	0005
  $P_VAL_YH  . . . . . . . . . .  	0007
QUERYLIST  . . . . . . . . . . .  	000E	0005
  QEA_NUM  . . . . . . . . . . .  	0000
  QEA_TYPE . . . . . . . . . . .  	0002
  QEA_FLAGS  . . . . . . . . . .  	0003
  QEA_NAMELEN  . . . . . . . . .  	0005
  QEA_NAME . . . . . . . . . . .  	0006

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

DG . . . . . . . . . . . . . . .  	GROUP
  CODE . . . . . . . . . . . . .  	1294	PARA	NONE	
  CONST  . . . . . . . . . . . .  	0000	BYTE	PUBLIC	
  CSTACK . . . . . . . . . . . .  	01CA	PARA	STACK	

Symbols:            

                N a m e         	Type	 Value	 Attr

ABORT  . . . . . . . . . . . . .  	NUMBER	0000	
ACTION_39  . . . . . . . . . . .  	NUMBER	0004	
ALLOC  . . . . . . . . . . . . .  	NUMBER	0048	
ALLOCOPER  . . . . . . . . . . .  	NUMBER	0058	
ALT_EXPECTED_VERSION . . . . . .  	NUMBER	1A05	
ALT_GOOD_DOS . . . . . . . . . .  	L NEAR	033F	CODE
ALT_MAJOR_VERSION  . . . . . . .  	NUMBER	0005	
ALT_MINOR_VERSION  . . . . . . .  	NUMBER	001A	
AMIS_ID  . . . . . . . . . . . .  	L NEAR	0156	CODE
AMIS_ID_MSG  . . . . . . . . . .  	L NEAR	015B	CODE
AMIS_ID_MSG_END  . . . . . . . .  	L NEAR	015F	CODE
amis_sign  . . . . . . . . . . .  	L NEAR	0146	CODE	Global
AMIS_SIGN_SEGMENT  . . . . . . .  	ALIAS	 DG		
ASSIGNOPER . . . . . . . . . . .  	NUMBER	005F	
AXOK . . . . . . . . . . . . . .  	L NEAR	0977	CODE

BADWRT . . . . . . . . . . . . .  	L NEAR	0A1F	CODE
BELL . . . . . . . . . . . . . .  	NUMBER	0007	
BIN_HEX_BYTE . . . . . . . . . .  	NUMBER	0013	
BIN_HEX_DWORD  . . . . . . . . .  	NUMBER	0033	
BIN_HEX_TYPE . . . . . . . . . .  	NUMBER	0003	
BIN_HEX_WORD . . . . . . . . . .  	NUMBER	0023	
BUFFER . . . . . . . . . . . . .  	ALIAS	 MAXREC		

CAPSW  . . . . . . . . . . . . .  	NUMBER	0000	
CHARMSG  . . . . . . . . . . . .  	NUMBER	FFFF	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-4


CHAR_FIELD_ASCIIZ  . . . . . . .  	NUMBER	0010	
CHAR_FIELD_CHAR  . . . . . . . .  	NUMBER	0000	
CHAR_OPER  . . . . . . . . . . .  	NUMBER	0037	
CHAR_TYPE  . . . . . . . . . . .  	NUMBER	0000	
CHDIR  . . . . . . . . . . . . .  	NUMBER	003B	
CHECK_AMIS . . . . . . . . . . .  	L NEAR	02E3	CODE
CHECK_AMIS_DONE  . . . . . . . .  	L NEAR	031A	CODE
CHECK_AMIS_LOOP  . . . . . . . .  	L NEAR	02EC	CODE
CHECK_AMIS_NEXT  . . . . . . . .  	L NEAR	0315	CODE
CHECK_AMIS_UNSUP . . . . . . . .  	L NEAR	0319	CODE
CHECK_COLUMN . . . . . . . . . .  	L NEAR	0A6F	CODE
CHMOD  . . . . . . . . . . . . .  	NUMBER	0043	
CLASS_1_MESSAGECOUNT . . . . . .  	NUMBER	0001	
CLASS_2_MESSAGECOUNT . . . . . .  	NUMBER	0001	
CLASS_A_MESSAGECOUNT . . . . . .  	NUMBER	0004	
CLOSE  . . . . . . . . . . . . .  	NUMBER	003E	
CMPXSW . . . . . . . . . . . . .  	NUMBER	0000	
CODE_PATCH . . . . . . . . . . .  	L BYTE	09B3	CODE
COLON  . . . . . . . . . . . . .  	NUMBER	003A	
COLUMN . . . . . . . . . . . . .  	L WORD	0000	CODE
COL_SW . . . . . . . . . . . . .  	L BYTE	012E	CODE
COMMIT . . . . . . . . . . . . .  	NUMBER	0068	
COMR . . . . . . . . . . . . . .  	NUMBER	0000	
COMT . . . . . . . . . . . . . .  	NUMBER	0000	
CP . . . . . . . . . . . . . . .  	L WORD	0105	CODE
CP_LEN . . . . . . . . . . . . .  	NUMBER	000D	
CP_LIST  . . . . . . . . . . . .  	L WORD	00FA	CODE
CP_QLIST . . . . . . . . . . . .  	L 	00EC	CODE
CP_RESET . . . . . . . . . . . .  	L BYTE	0002	CODE
CR . . . . . . . . . . . . . . .  	NUMBER	000D	
CREAT  . . . . . . . . . . . . .  	NUMBER	003C	
CREATENEWFILE  . . . . . . . . .  	NUMBER	005B	
CREATETEMPFILE . . . . . . . . .  	NUMBER	005A	
CREATE_PROCESS_DATA_BLOCK  . . .  	NUMBER	0026	
CTRY_INFO  . . . . . . . . . . .  	L BYTE	0003	CODE
CTRY_TABLE_OFF . . . . . . . . .  	L WORD	0004	CODE
CTRY_TABLE_SEG . . . . . . . . .  	L WORD	0006	CODE
CURRENT_DIR  . . . . . . . . . .  	NUMBER	0047	

DATEMSG  . . . . . . . . . . . .  	NUMBER	0000	
DATESW . . . . . . . . . . . . .  	NUMBER	0000	
DATE_MD  . . . . . . . . . . . .  	NUMBER	0014	
DATE_MDY_2 . . . . . . . . . . .  	NUMBER	0024	
DATE_MDY_4 . . . . . . . . . . .  	NUMBER	0034	
DATE_TYPE  . . . . . . . . . . .  	NUMBER	0004	
DEALLOC  . . . . . . . . . . . .  	NUMBER	0049	
DIR_SEARCH_FIRST . . . . . . . .  	NUMBER	0011	
DIR_SEARCH_NEXT  . . . . . . . .  	NUMBER	0012	
DISK_PROC  . . . . . . . . . . .  	NUMBER	0000	
DISK_RESET . . . . . . . . . . .  	NUMBER	000D	
DISPLAYMSG . . . . . . . . . . .  	NUMBER	0000	
DISPLAY_MSG  . . . . . . . . . .  	N PROC	0A2B	CODE	Length = 000C
DONE_CPSW  . . . . . . . . . . .  	L NEAR	0B01	CODE
DOS_BUF_KEYB_INP . . . . . . . .  	NUMBER	000A	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-5


DOS_CLOSE_FILE . . . . . . . . .  	NUMBER	003E	
DOS_CLR_KEYB_BUF . . . . . . . .  	NUMBER	000C	
DOS_CLR_KEYB_BUF_MASK  . . . . .  	NUMBER	00C0	
DOS_CON_INP  . . . . . . . . . .  	NUMBER	0008	
DOS_DIR_CON_INP  . . . . . . . .  	NUMBER	0007	
DOS_DISP_CHAR  . . . . . . . . .  	NUMBER	0002	
DOS_DISP_STRING  . . . . . . . .  	NUMBER	0009	
DOS_EXTENDED_OPEN  . . . . . . .  	NUMBER	6C00	
DOS_GET_ADDR . . . . . . . . . .  	NUMBER	0008	
DOS_GET_COUNTRY  . . . . . . . .  	NUMBER	0038	
DOS_GET_CRITICAL . . . . . . . .  	NUMBER	0004	
DOS_GET_DBCS_INFO  . . . . . . .  	NUMBER	6300	
DOS_GET_EXTENDED . . . . . . . .  	NUMBER	0000	
DOS_GET_EXT_ERROR  . . . . . . .  	NUMBER	0059	
DOS_GET_EXT_ERROR_BX . . . . . .  	NUMBER	0000	
DOS_GET_EXT_PARSE_ADD  . . . . .  	NUMBER	122E	
DOS_GET_FILE . . . . . . . . . .  	NUMBER	0006	
DOS_GET_PARSE  . . . . . . . . .  	NUMBER	0002	
DOS_GET_VERSION  . . . . . . . .  	NUMBER	0030	
DOS_IOCTL_GET_INFO . . . . . . .  	NUMBER	4400	
DOS_IOCTL_SET_INFO . . . . . . .  	NUMBER	4401	
DOS_KEYB_INP . . . . . . . . . .  	NUMBER	0001	
DOS_LSEEK_FILE . . . . . . . . .  	NUMBER	4200	
DOS_READ_BYTE  . . . . . . . . .  	NUMBER	003F	
DOS_SET_ADDR . . . . . . . . . .  	NUMBER	0009	
DOS_WRITE_HANDLE . . . . . . . .  	NUMBER	0040	
DRVSW  . . . . . . . . . . . . .  	NUMBER	0000	
DUP_PDB  . . . . . . . . . . . .  	NUMBER	0055	
DXOK . . . . . . . . . . . . . .  	L NEAR	0985	CODE

EAISBINARY . . . . . . . . . . .  	NUMBER	0002	
EASYSTEM . . . . . . . . . . . .  	NUMBER	8000	
ECS_CALL . . . . . . . . . . . .  	NUMBER	0063	
ENDLIST  . . . . . . . . . . . .  	L WORD	010B	CODE
END_INNER_SORT_LOOP  . . . . . .  	L NEAR	09B9	CODE
END_INSERT . . . . . . . . . . .  	L NEAR	09F5	CODE
END_OUTER_SORT_LOOP  . . . . . .  	L NEAR	09FA	CODE
END_PARSE  . . . . . . . . . . .  	L NEAR	0A87	CODE
END_REPLACE_LOOP . . . . . . . .  	L NEAR	0949	CODE
EOL  . . . . . . . . . . . . . .  	NUMBER	-0001	
ERROR_CLASS_39 . . . . . . . . .  	NUMBER	0001	
ERROR_EXIT . . . . . . . . . . .  	N PROC	0A88	CODE	Length = 0012
EXEC . . . . . . . . . . . . . .  	NUMBER	004B	
EXIT . . . . . . . . . . . . . .  	NUMBER	004C	
EXPECTED_VERSION . . . . . . . .  	NUMBER	0004	
EXTHANDLE  . . . . . . . . . . .  	NUMBER	0067	
EXTOPEN  . . . . . . . . . . . .  	NUMBER	006C	
EXT_ERR_39 . . . . . . . . . . .  	NUMBER	0027	
EXT_ERR_CLASS  . . . . . . . . .  	NUMBER	0001	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FARMSG . . . . . . . . . . . . .  	NUMBER	0000	
FARSW  . . . . . . . . . . . . .  	NUMBER	0000	
FCB_CLOSE  . . . . . . . . . . .  	NUMBER	0010	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-6


FCB_CREATE . . . . . . . . . . .  	NUMBER	0016	
FCB_DELETE . . . . . . . . . . .  	NUMBER	0013	
FCB_OPEN . . . . . . . . . . . .  	NUMBER	000F	
FCB_RANDOM_READ  . . . . . . . .  	NUMBER	0021	
FCB_RANDOM_READ_BLOCK  . . . . .  	NUMBER	0027	
FCB_RANDOM_WRITE . . . . . . . .  	NUMBER	0022	
FCB_RANDOM_WRITE_BLOCK . . . . .  	NUMBER	0028	
FCB_RENAME . . . . . . . . . . .  	NUMBER	0017	
FCB_SEQ_READ . . . . . . . . . .  	NUMBER	0014	
FCB_SEQ_WRITE  . . . . . . . . .  	NUMBER	0015	
FILESW . . . . . . . . . . . . .  	NUMBER	0000	
FILE_TIMES . . . . . . . . . . .  	NUMBER	0057	
FIND_FIRST . . . . . . . . . . .  	NUMBER	004E	
FIND_NEXT  . . . . . . . . . . .  	NUMBER	004F	
FORMFD . . . . . . . . . . . . .  	NUMBER	000C	

GETCPSW  . . . . . . . . . . . .  	NUMBER	3303	
GETCURRENTPSP  . . . . . . . . .  	NUMBER	0062	
GETEXTATTR . . . . . . . . . . .  	NUMBER	5702	
GETEXTCNTRY  . . . . . . . . . .  	NUMBER	0065	
GETEXTENDEDERROR . . . . . . . .  	NUMBER	0059	
GETMSG . . . . . . . . . . . . .  	NUMBER	0000	
GETSETCDPG . . . . . . . . . . .  	NUMBER	0066	
GETSETMEDIAID  . . . . . . . . .  	NUMBER	0069	
GET_CURRENT_PDB  . . . . . . . .  	NUMBER	0051	
GET_DATE . . . . . . . . . . . .  	NUMBER	002A	
GET_DEFAULT_DPB  . . . . . . . .  	NUMBER	001F	
GET_DEFAULT_DRIVE  . . . . . . .  	NUMBER	0019	
GET_DMA  . . . . . . . . . . . .  	NUMBER	002F	
GET_DPB  . . . . . . . . . . . .  	NUMBER	0032	
GET_DRIVE_FREESPACE  . . . . . .  	NUMBER	0036	
GET_FCB_FILE_LENGTH  . . . . . .  	NUMBER	0023	
GET_FCB_POSITION . . . . . . . .  	NUMBER	0024	
GET_INDOS_FLAG . . . . . . . . .  	NUMBER	0034	
GET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0035	
GET_IN_VARS  . . . . . . . . . .  	NUMBER	0052	
GET_MEM  . . . . . . . . . . . .  	L NEAR	0878	CODE
GET_TIME . . . . . . . . . . . .  	NUMBER	002C	
GET_VERIFY_ON_WRITE  . . . . . .  	NUMBER	0054	
GET_VERSION  . . . . . . . . . .  	NUMBER	0030	
GOTEND . . . . . . . . . . . . .  	L NEAR	091D	CODE
GOT_COL  . . . . . . . . . . . .  	L NEAR	0875	CODE
GOT_MEM  . . . . . . . . . . . .  	L NEAR	0886	CODE

HOME . . . . . . . . . . . . . .  	NUMBER	000B	
HONGEUL  . . . . . . . . . . . .  	NUMBER	0063	

IFSFUNC_INSTALLED  . . . . . . .  	NUMBER	00FF	
IFSFUNC_INSTALL_CHECK  . . . . .  	NUMBER	0500	
IFS_GET_ERR_TEXT . . . . . . . .  	NUMBER	0502	
IFS_IOCTL  . . . . . . . . . . .  	NUMBER	006B	
INCSW  . . . . . . . . . . . . .  	NUMBER	0001	
INNER_SORT_LOOP  . . . . . . . .  	L NEAR	095F	CODE
INPUTMSG . . . . . . . . . . . .  	NUMBER	0000	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-7


INSERT_LOOP  . . . . . . . . . .  	L NEAR	09FF	CODE
INTERNATIONAL  . . . . . . . . .  	NUMBER	0038	
IOCTL  . . . . . . . . . . . . .  	NUMBER	0044	

KEEP_PROCESS . . . . . . . . . .  	NUMBER	0031	
KEYSW  . . . . . . . . . . . . .  	NUMBER	0000	

LEFT_ALIGN . . . . . . . . . . .  	NUMBER	0000	
LF . . . . . . . . . . . . . . .  	NUMBER	000A	
LFEOLSW  . . . . . . . . . . . .  	NUMBER	0001	
LOADMSG  . . . . . . . . . . . .  	NUMBER	0000	
LOCKOPER . . . . . . . . . . . .  	NUMBER	005C	
LOCUS_39 . . . . . . . . . . . .  	NUMBER	0001	
LOWEST_4CH_VERSION . . . . . . .  	NUMBER	0002	
LOW_NIB_MASK . . . . . . . . . .  	NUMBER	000F	
LSEEK  . . . . . . . . . . . . .  	NUMBER	0042	

MAJOR_VERSION  . . . . . . . . .  	NUMBER	0004	
MATCH_CODEPAGES  . . . . . . . .  	N PROC	0A9A	CODE	Length = 006A
MAXREC . . . . . . . . . . . . .  	NUMBER	0100	
MINOR_VERSION  . . . . . . . . .  	NUMBER	0000	
MKDIR  . . . . . . . . . . . . .  	NUMBER	0039	
MSGDATA  . . . . . . . . . . . .  	NUMBER	0000	
MSG_NODISK . . . . . . . . . . .  	NUMBER	0004	
MSG_NOMEM  . . . . . . . . . . .  	NUMBER	0002	
MSG_SER_CLASS  . . . . . . . . .  	NUMBER	0000	
MSG_SORT . . . . . . . . . . . .  	NUMBER	0005	
MSG_SWITCH . . . . . . . . . . .  	NUMBER	0003	

NEARMSG  . . . . . . . . . . . .  	NUMBER	FFFF	
NEW_EXPECTED_VERSION . . . . . .  	NUMBER	2605	
NEW_MAJOR_VERSION  . . . . . . .  	NUMBER	0005	
NEW_MINOR_VERSION  . . . . . . .  	NUMBER	0026	
NOBACK . . . . . . . . . . . . .  	L NEAR	090A	CODE
NOCHECKSTDIN . . . . . . . . . .  	NUMBER	FFFF	
NOCHECKSTDOUT  . . . . . . . . .  	NUMBER	0000	
NOERROR  . . . . . . . . . . . .  	NUMBER	0000	
NOT_EX_FAIL_EX_OPEN  . . . . . .  	NUMBER	0101	
NOVALS . . . . . . . . . . . . .  	L WORD	0131	CODE
NOVERCHECKMSG  . . . . . . . . .  	NUMBER	0000	
NO_CODEPAGE  . . . . . . . . . .  	NUMBER	0000	
NO_COLON . . . . . . . . . . . .  	NUMBER	0020	
NO_CRIT_OPEN . . . . . . . . . .  	NUMBER	2000	
NO_HANDLE  . . . . . . . . . . .  	NUMBER	FFFF	
NO_INPUT . . . . . . . . . . . .  	NUMBER	0000	
NO_REPLACE . . . . . . . . . . .  	NUMBER	0000	
NULL . . . . . . . . . . . . . .  	NUMBER	0000	
NUMERIC  . . . . . . . . . . . .  	NUMBER	8000	
NUMMSG . . . . . . . . . . . . .  	NUMBER	0000	
NUMSW  . . . . . . . . . . . . .  	NUMBER	0001	

OEM_C1 . . . . . . . . . . . . .  	NUMBER	00F9	
OEM_C2 . . . . . . . . . . . . .  	NUMBER	00FA	
OEM_C3 . . . . . . . . . . . . .  	NUMBER	00FB	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-8


OEM_C4 . . . . . . . . . . . . .  	NUMBER	00FC	
OEM_C5 . . . . . . . . . . . . .  	NUMBER	00FD	
OEM_C6 . . . . . . . . . . . . .  	NUMBER	00FE	
OEM_C7 . . . . . . . . . . . . .  	NUMBER	00FF	
OLD_ABORT  . . . . . . . . . . .  	L NEAR	085B	CODE
OPEN . . . . . . . . . . . . . .  	NUMBER	003D	
OUTER_SORT_LOOP  . . . . . . . .  	L NEAR	0953	CODE

PARMS  . . . . . . . . . . . . .  	L WORD	010B	CODE
PARMSX . . . . . . . . . . . . .  	L WORD	0110	CODE
PARSE  . . . . . . . . . . . . .  	N PROC	0A37	CODE	Length = 0051
PARSER . . . . . . . . . . . . .  	L NEAR	085F	CODE
PARSE_ERROR  . . . . . . . . . .  	L NEAR	0A82	CODE
PARSE_ERR_CLASS  . . . . . . . .  	NUMBER	0002	
PARSE_FILE_DESCRIPTOR  . . . . .  	NUMBER	0029	
PARSE_LOOP . . . . . . . . . . .  	L NEAR	0A4B	CODE
PATHPARSE  . . . . . . . . . . .  	NUMBER	0061	
PRT_SORT . . . . . . . . . . . .  	N PROC	0B04	CODE	Length = 0012
PSDATA_SEG . . . . . . . . . . .  	ALIAS	 CS		

QUSSW  . . . . . . . . . . . . .  	NUMBER	0000	

RAW_CON_INPUT  . . . . . . . . .  	NUMBER	0007	
RAW_CON_IO . . . . . . . . . . .  	NUMBER	0006	
READ . . . . . . . . . . . . . .  	NUMBER	003F	
RENAME . . . . . . . . . . . . .  	NUMBER	0056	
REPLACE_LOOP . . . . . . . . . .  	L NEAR	092B	CODE
REPLACE_SCAN . . . . . . . . . .  	L NEAR	0932	CODE
REPLACE_SKIP . . . . . . . . . .  	L NEAR	093B	CODE
RESERVED . . . . . . . . . . . .  	NUMBER	0000	
RETCODE_ERROR  . . . . . . . . .  	NUMBER	0001	
RETCODE_NOERROR  . . . . . . . .  	NUMBER	0000	
REV_SW . . . . . . . . . . . . .  	L BYTE	0122	CODE
RIGHT_ALIGN  . . . . . . . . . .  	NUMBER	0080	
RMDIR  . . . . . . . . . . . . .  	NUMBER	003A	

SB_ITEM_TAG  . . . . . . . . . .  	L BYTE	013E	CODE
SB_SYNONYM . . . . . . . . . . .  	L WORD	013F	CODE
SB_TYPE  . . . . . . . . . . . .  	L BYTE	013D	CODE
SB_VALUE . . . . . . . . . . . .  	L WORD	0141	CODE
SB_VALUE_EXTRA . . . . . . . . .  	L WORD	0143	CODE
SERVERCALL . . . . . . . . . . .  	NUMBER	005D	
SETBLOCK . . . . . . . . . . . .  	NUMBER	004A	
SETDPB . . . . . . . . . . . . .  	NUMBER	0053	
SETEXTATTR . . . . . . . . . . .  	NUMBER	5704	
SETSTDIO . . . . . . . . . . . .  	NUMBER	0000	
SET_CTRL_C_TRAPPING  . . . . . .  	NUMBER	0033	
SET_CURRENT_PDB  . . . . . . . .  	NUMBER	0050	
SET_DATE . . . . . . . . . . . .  	NUMBER	002B	
SET_DEFAULT_DRIVE  . . . . . . .  	NUMBER	000E	
SET_DMA  . . . . . . . . . . . .  	NUMBER	001A	
SET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0025	
SET_OEM_HANDLER  . . . . . . . .  	NUMBER	00F8	
SET_PRINTER_FLAG . . . . . . . .  	NUMBER	0064	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-9


SET_TIME . . . . . . . . . . . .  	NUMBER	002D	
SET_VERIFY_ON_WRITE  . . . . . .  	NUMBER	002E	
SGN_BIN_BYTE . . . . . . . . . .  	NUMBER	0012	
SGN_BIN_DWORD  . . . . . . . . .  	NUMBER	0032	
SGN_BIN_TYPE . . . . . . . . . .  	NUMBER	0002	
SGN_BIN_WORD . . . . . . . . . .  	NUMBER	0022	
SIZERR . . . . . . . . . . . . .  	L NEAR	08F0	CODE
SIZOK  . . . . . . . . . . . . .  	L NEAR	08F8	CODE
SMALL  . . . . . . . . . . . . .  	L NEAR	098D	CODE
SORT . . . . . . . . . . . . . .  	L NEAR	0848	CODE
SORTL  . . . . . . . . . . . . .  	L NEAR	08DE	CODE
SPACE  . . . . . . . . . . . . .  	NUMBER	0000	
SRC_CP . . . . . . . . . . . . .  	L WORD	0107	CODE
STDAUX . . . . . . . . . . . . .  	NUMBER	0003	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDIN  . . . . . . . . . . . . .  	NUMBER	0000	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STDPRN . . . . . . . . . . . . .  	NUMBER	0004	
STD_AUX_INPUT  . . . . . . . . .  	NUMBER	0003	
STD_AUX_OUTPUT . . . . . . . . .  	NUMBER	0004	
STD_CON_INPUT  . . . . . . . . .  	NUMBER	0001	
STD_CON_INPUT_FLUSH  . . . . . .  	NUMBER	000C	
STD_CON_INPUT_NO_ECHO  . . . . .  	NUMBER	0008	
STD_CON_INPUT_STATUS . . . . . .  	NUMBER	000B	
STD_CON_OUTPUT . . . . . . . . .  	NUMBER	0002	
STD_CON_STRING_INPUT . . . . . .  	NUMBER	000A	
STD_CON_STRING_OUTPUT  . . . . .  	NUMBER	0009	
STD_PRINTER_OUTPUT . . . . . . .  	NUMBER	0005	
SUBLIST_LENGTH . . . . . . . . .  	NUMBER	000B	
SW1  . . . . . . . . . . . . . .  	L WORD	0119	CODE
SW2  . . . . . . . . . . . . . .  	L WORD	0125	CODE
SWITCHBUFF . . . . . . . . . . .  	L WORD	013D	CODE
SWITCH_ERROR . . . . . . . . . .  	L NEAR	0A7F	CODE
SWSW . . . . . . . . . . . . . .  	NUMBER	0001	
SYSDISPMSG . . . . . . . . . . .  	N PROC	035B	CODE	Length = 0047
SYSLOADMSG . . . . . . . . . . .  	N PROC	0211	CODE	Length = 00A5
SYSPARSE . . . . . . . . . . . .  	N PROC	0BB3	CODE	Length = 0159

TAB  . . . . . . . . . . . . . .  	NUMBER	0009	
table  . . . . . . . . . . . . .  	V BYTE	0000	CONST	External
TESTED_NOT_EQUAL . . . . . . . .  	L NEAR	09B3	CODE
TGT_CP . . . . . . . . . . . . .  	L WORD	0109	CODE
TIMEMSG  . . . . . . . . . . . .  	NUMBER	0000	
TIMESW . . . . . . . . . . . . .  	NUMBER	0000	
TIME_24_TYPE . . . . . . . . . .  	NUMBER	0006	
TIME_CTY_TYPE  . . . . . . . . .  	NUMBER	0005	
TIME_HHMMSSHH_24 . . . . . . . .  	NUMBER	0026	
TIME_HHMMSSHH_CTY  . . . . . . .  	NUMBER	0025	
TIME_HHMMSS_24 . . . . . . . . .  	NUMBER	0016	
TIME_HHMMSS_CTY  . . . . . . . .  	NUMBER	0015	
TIME_HHMM_24 . . . . . . . . . .  	NUMBER	0006	
TIME_HHMM_CTY  . . . . . . . . .  	NUMBER	0005	
TLOOP  . . . . . . . . . . . . .  	L NEAR	099C	CODE
TRUE . . . . . . . . . . . . . .  	NUMBER	FFFF	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-10



UNLINK . . . . . . . . . . . . .  	NUMBER	0041	
UNSGN_BIN_BYTE . . . . . . . . .  	NUMBER	0011	
UNSGN_BIN_DWORD  . . . . . . . .  	NUMBER	0031	
UNSGN_BIN_TYPE . . . . . . . . .  	NUMBER	0001	
UNSGN_BIN_WORD . . . . . . . . .  	NUMBER	0021	
USEROPER . . . . . . . . . . . .  	NUMBER	005E	
UTILITY_MSG_CLASS  . . . . . . .  	NUMBER	00FF	

VAL1SW . . . . . . . . . . . . .  	NUMBER	0001	
VAL2SW . . . . . . . . . . . . .  	NUMBER	0000	
VAL3SW . . . . . . . . . . . . .  	NUMBER	0000	
VALUELIST  . . . . . . . . . . .  	L WORD	0132	CODE

WAITPROCESS  . . . . . . . . . .  	NUMBER	004D	
WRITE  . . . . . . . . . . . . .  	NUMBER	0040	
WRITE_FILE . . . . . . . . . . .  	L NEAR	0A0B	CODE
WRTOK  . . . . . . . . . . . . .  	L NEAR	0A25	CODE

XDUP . . . . . . . . . . . . . .  	NUMBER	0045	
XDUP2  . . . . . . . . . . . . .  	NUMBER	0046	
XNAMETRANS . . . . . . . . . . .  	NUMBER	0060	

$MDO123  . . . . . . . . . . . .  	L NEAR	0403	CODE
$MDO139  . . . . . . . . . . . .  	L NEAR	046C	CODE
$MDO145  . . . . . . . . . . . .  	L NEAR	048F	CODE
$MDO165  . . . . . . . . . . . .  	L NEAR	04F7	CODE
$MDO167  . . . . . . . . . . . .  	L NEAR	0501	CODE
$MDO175  . . . . . . . . . . . .  	L NEAR	052E	CODE
$MDO215  . . . . . . . . . . . .  	L NEAR	05E5	CODE
$MDO219  . . . . . . . . . . . .  	L NEAR	060C	CODE
$MDO259  . . . . . . . . . . . .  	L NEAR	06FD	CODE
$MDO280  . . . . . . . . . . . .  	L NEAR	076E	CODE
$MDO291  . . . . . . . . . . . .  	L NEAR	079A	CODE
$MDO301  . . . . . . . . . . . .  	L NEAR	07C9	CODE
$MDO310  . . . . . . . . . . . .  	L NEAR	07F0	CODE
$MDO321  . . . . . . . . . . . .  	L NEAR	0833	CODE
$MEN104  . . . . . . . . . . . .  	L NEAR	03A1	CODE
$MEN107  . . . . . . . . . . . .  	L NEAR	03B7	CODE
$MEN110  . . . . . . . . . . . .  	L NEAR	03D8	CODE
$MEN119  . . . . . . . . . . . .  	L NEAR	0410	CODE
$MEN123  . . . . . . . . . . . .  	L NEAR	0410	CODE
$MEN128  . . . . . . . . . . . .  	L NEAR	043F	CODE
$MEN139  . . . . . . . . . . . .  	L NEAR	0483	CODE
$MEN145  . . . . . . . . . . . .  	L NEAR	04ED	CODE
$MEN146  . . . . . . . . . . . .  	L NEAR	04A7	CODE
$MEN150  . . . . . . . . . . . .  	L NEAR	04E8	CODE
$MEN154  . . . . . . . . . . . .  	L NEAR	04E8	CODE
$MEN165  . . . . . . . . . . . .  	L NEAR	05CD	CODE
$MEN167  . . . . . . . . . . . .  	L NEAR	051E	CODE
$MEN175  . . . . . . . . . . . .  	L NEAR	0547	CODE
$MEN180  . . . . . . . . . . . .  	L NEAR	055A	CODE
$MEN187  . . . . . . . . . . . .  	L NEAR	058D	CODE
$MEN188  . . . . . . . . . . . .  	L NEAR	057B	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-11


$MEN192  . . . . . . . . . . . .  	L NEAR	058D	CODE
$MEN199  . . . . . . . . . . . .  	L NEAR	05B3	CODE
$MEN20 . . . . . . . . . . . . .  	L NEAR	02B5	CODE
$MEN200  . . . . . . . . . . . .  	L NEAR	05AB	CODE
$MEN211  . . . . . . . . . . . .  	L NEAR	05C0	CODE
$MEN219  . . . . . . . . . . . .  	L NEAR	0672	CODE
$MEN220  . . . . . . . . . . . .  	L NEAR	0642	CODE
$MEN222  . . . . . . . . . . . .  	L NEAR	0642	CODE
$MEN224  . . . . . . . . . . . .  	L NEAR	0642	CODE
$MEN229  . . . . . . . . . . . .  	L NEAR	066A	CODE
$MEN230  . . . . . . . . . . . .  	L NEAR	065C	CODE
$MEN240  . . . . . . . . . . . .  	L NEAR	0692	CODE
$MEN243  . . . . . . . . . . . .  	L NEAR	069F	CODE
$MEN247  . . . . . . . . . . . .  	L NEAR	06FA	CODE
$MEN248  . . . . . . . . . . . .  	L NEAR	06DE	CODE
$MEN25 . . . . . . . . . . . . .  	L NEAR	035A	CODE
$MEN252  . . . . . . . . . . . .  	L NEAR	06F6	CODE
$MEN259  . . . . . . . . . . . .  	L NEAR	071A	CODE
$MEN261  . . . . . . . . . . . .  	L NEAR	070E	CODE
$MEN27 . . . . . . . . . . . . .  	L NEAR	034F	CODE
$MEN292  . . . . . . . . . . . .  	L NEAR	07AD	CODE
$MEN307  . . . . . . . . . . . .  	L NEAR	07F9	CODE
$MEN314  . . . . . . . . . . . .  	L NEAR	0819	CODE
$MEN317  . . . . . . . . . . . .  	L NEAR	0840	CODE
$MEN321  . . . . . . . . . . . .  	L NEAR	083E	CODE
$MEN93 . . . . . . . . . . . . .  	L NEAR	0395	CODE
$MEN94 . . . . . . . . . . . . .  	L NEAR	0381	CODE
$MEN97 . . . . . . . . . . . . .  	L NEAR	038F	CODE
$MIF104  . . . . . . . . . . . .  	L NEAR	039D	CODE
$MIF107  . . . . . . . . . . . .  	L NEAR	03B4	CODE
$MIF110  . . . . . . . . . . . .  	L NEAR	03C8	CODE
$MIF112  . . . . . . . . . . . .  	L NEAR	03D8	CODE
$MIF113  . . . . . . . . . . . .  	L NEAR	03D8	CODE
$MIF117  . . . . . . . . . . . .  	L NEAR	03DD	CODE
$MIF119  . . . . . . . . . . . .  	L NEAR	0401	CODE
$MIF120  . . . . . . . . . . . .  	L NEAR	03FF	CODE
$MIF127  . . . . . . . . . . . .  	L NEAR	0440	CODE
$MIF128  . . . . . . . . . . . .  	L NEAR	043D	CODE
$MIF129  . . . . . . . . . . . .  	L NEAR	043B	CODE
$MIF134  . . . . . . . . . . . .  	L NEAR	0460	CODE
$MIF135  . . . . . . . . . . . .  	L NEAR	0460	CODE
$MIF138  . . . . . . . . . . . .  	L NEAR	0483	CODE
$MIF141  . . . . . . . . . . . .  	L NEAR	047F	CODE
$MIF146  . . . . . . . . . . . .  	L NEAR	04A4	CODE
$MIF150  . . . . . . . . . . . .  	L NEAR	04C4	CODE
$MIF151  . . . . . . . . . . . .  	L NEAR	04C2	CODE
$MIF154  . . . . . . . . . . . .  	L NEAR	04D7	CODE
$MIF155  . . . . . . . . . . . .  	L NEAR	04D5	CODE
$MIF158  . . . . . . . . . . . .  	L NEAR	04E8	CODE
$MIF159  . . . . . . . . . . . .  	L NEAR	04E8	CODE
$MIF166  . . . . . . . . . . . .  	L NEAR	051E	CODE
$MIF169  . . . . . . . . . . . .  	L NEAR	0519	CODE
$MIF173  . . . . . . . . . . . .  	L NEAR	055A	CODE
$MIF174  . . . . . . . . . . . .  	L NEAR	055A	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-12


$MIF175  . . . . . . . . . . . .  	L NEAR	053B	CODE
$MIF180  . . . . . . . . . . . .  	L NEAR	0557	CODE
$MIF187  . . . . . . . . . . . .  	L NEAR	057D	CODE
$MIF188  . . . . . . . . . . . .  	L NEAR	057A	CODE
$MIF192  . . . . . . . . . . . .  	L NEAR	0584	CODE
$MIF194  . . . . . . . . . . . .  	L NEAR	058B	CODE
$MIF199  . . . . . . . . . . . .  	L NEAR	05B0	CODE
$MIF20 . . . . . . . . . . . . .  	L NEAR	02B1	CODE
$MIF200  . . . . . . . . . . . .  	L NEAR	05AB	CODE
$MIF211  . . . . . . . . . . . .  	L NEAR	05BC	CODE
$MIF216  . . . . . . . . . . . .  	L NEAR	05F4	CODE
$MIF220  . . . . . . . . . . . .  	L NEAR	061A	CODE
$MIF222  . . . . . . . . . . . .  	L NEAR	0628	CODE
$MIF224  . . . . . . . . . . . .  	L NEAR	063B	CODE
$MIF229  . . . . . . . . . . . .  	L NEAR	065E	CODE
$MIF23 . . . . . . . . . . . . .  	L NEAR	02CD	CODE
$MIF230  . . . . . . . . . . . .  	L NEAR	064F	CODE
$MIF234  . . . . . . . . . . . .  	L NEAR	0666	CODE
$MIF239  . . . . . . . . . . . .  	L NEAR	06A1	CODE
$MIF240  . . . . . . . . . . . .  	L NEAR	0691	CODE
$MIF243  . . . . . . . . . . . .  	L NEAR	0699	CODE
$MIF247  . . . . . . . . . . . .  	L NEAR	06E0	CODE
$MIF248  . . . . . . . . . . . .  	L NEAR	06D9	CODE
$MIF25 . . . . . . . . . . . . .  	L NEAR	0342	CODE
$MIF252  . . . . . . . . . . . .  	L NEAR	06ED	CODE
$MIF254  . . . . . . . . . . . .  	L NEAR	06F6	CODE
$MIF258  . . . . . . . . . . . .  	L NEAR	0729	CODE
$MIF259  . . . . . . . . . . . .  	L NEAR	0712	CODE
$MIF261  . . . . . . . . . . . .  	L NEAR	070B	CODE
$MIF269  . . . . . . . . . . . .  	L NEAR	0729	CODE
$MIF27 . . . . . . . . . . . . .  	L NEAR	034C	CODE
$MIF270  . . . . . . . . . . . .  	L NEAR	0725	CODE
$MIF274  . . . . . . . . . . . .  	L NEAR	0731	CODE
$MIF276  . . . . . . . . . . . .  	L NEAR	0753	CODE
$MIF278  . . . . . . . . . . . .  	L NEAR	0783	CODE
$MIF279  . . . . . . . . . . . .  	L NEAR	0783	CODE
$MIF281  . . . . . . . . . . . .  	L NEAR	077F	CODE
$MIF286  . . . . . . . . . . . .  	L NEAR	0796	CODE
$MIF287  . . . . . . . . . . . .  	L NEAR	0796	CODE
$MIF290  . . . . . . . . . . . .  	L NEAR	07BF	CODE
$MIF292  . . . . . . . . . . . .  	L NEAR	07AC	CODE
$MIF295  . . . . . . . . . . . .  	L NEAR	07BB	CODE
$MIF299  . . . . . . . . . . . .  	L NEAR	07DE	CODE
$MIF300  . . . . . . . . . . . .  	L NEAR	07DE	CODE
$MIF302  . . . . . . . . . . . .  	L NEAR	07DA	CODE
$MIF307  . . . . . . . . . . . .  	L NEAR	07EC	CODE
$MIF309  . . . . . . . . . . . .  	L NEAR	07F9	CODE
$MIF314  . . . . . . . . . . . .  	L NEAR	0815	CODE
$MIF317  . . . . . . . . . . . .  	L NEAR	0833	CODE
$MIF318  . . . . . . . . . . . .  	L NEAR	0831	CODE
$MIF93 . . . . . . . . . . . . .  	L NEAR	0391	CODE
$MIF94 . . . . . . . . . . . . .  	L NEAR	037E	CODE
$MIF97 . . . . . . . . . . . . .  	L NEAR	038B	CODE
$MLL149  . . . . . . . . . . . .  	L NEAR	04B1	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-13


$MLL168  . . . . . . . . . . . .  	L NEAR	0510	CODE
$MLL178  . . . . . . . . . . . .  	L NEAR	0543	CODE
$MLL214  . . . . . . . . . . . .  	L NEAR	05CD	CODE
$MSR175  . . . . . . . . . . . .  	L NEAR	055A	CODE
$MSR259  . . . . . . . . . . . .  	L NEAR	071B	CODE
$MXL3  . . . . . . . . . . . . .  	L NEAR	0567	CODE
$MXL4  . . . . . . . . . . . . .  	L NEAR	05CD	CODE
$MXL5  . . . . . . . . . . . . .  	L NEAR	0672	CODE
$M_1_FF_END  . . . . . . . . . .  	L BYTE	01E6	CODE
$M_1_FF_MSG  . . . . . . . . . .  	L BYTE	01D4	CODE
$M_1_FF_STRUC  . . . . . . . . .  	L BYTE	01D0	CODE
$M_2_FF_END  . . . . . . . . . .  	L BYTE	0207	CODE
$M_2_FF_MSG  . . . . . . . . . .  	L BYTE	01F8	CODE
$M_2_FF_STRUC  . . . . . . . . .  	L BYTE	01F4	CODE
$M_ADDR_SZ_FAR . . . . . . . . .  	NUMBER	0004	
$M_ADDR_SZ_NEAR  . . . . . . . .  	NUMBER	0002	
$M_ADD_CRLF  . . . . . . . . . .  	N PROC	044A	CODE	Length = 0017
$M_ALIGN_MASK  . . . . . . . . .  	NUMBER	0080	
$M_AM  . . . . . . . . . . . . .  	NUMBER	0061	
$M_A_00001H_END  . . . . . . . .  	L BYTE	018B	CODE
$M_A_00001H_MSG  . . . . . . . .  	L BYTE	0173	CODE
$M_A_00001H_STRUC  . . . . . . .  	L BYTE	0163	CODE
$M_A_00002H_END  . . . . . . . .  	L BYTE	01A1	CODE
$M_A_00002H_MSG  . . . . . . . .  	L BYTE	018B	CODE
$M_A_00002H_STRUC  . . . . . . .  	L BYTE	0167	CODE
$M_A_00004H_END  . . . . . . . .  	L BYTE	01BB	CODE
$M_A_00004H_MSG  . . . . . . . .  	L BYTE	01A1	CODE
$M_A_00004H_STRUC  . . . . . . .  	L BYTE	016B	CODE
$M_A_00005H_END  . . . . . . . .  	L BYTE	01C2	CODE
$M_A_00005H_MSG  . . . . . . . .  	L BYTE	01BB	CODE
$M_A_00005H_STRUC  . . . . . . .  	L BYTE	016F	CODE
$M_BASE10  . . . . . . . . . . .  	NUMBER	000A	
$M_BASE16  . . . . . . . . . . .  	NUMBER	0010	
$M_BYTE  . . . . . . . . . . . .  	NUMBER	0010	
$M_CHAR_ONLY . . . . . . . . . .  	NUMBER	FFFF	
$M_CHAR_REPLACE  . . . . . . . .  	N PROC	081A	CODE	Length = 0028
$M_CHECKSTDOUT . . . . . . . . .  	N PROC	02D0	CODE	Length = 0013
$M_CLASS_1_STRUC . . . . . . . .  	L BYTE	01CC	CODE
$M_CLASS_2_STRUC . . . . . . . .  	L BYTE	01F0	CODE
$M_CLASS_A_STRUC . . . . . . . .  	L BYTE	015F	CODE
$M_CLASS_ID_SZ . . . . . . . . .  	NUMBER	0004	
$M_CLASS_NOT_EXIST . . . . . . .  	NUMBER	0000	
$M_CLS_1 . . . . . . . . . . . .  	N PROC	01C2	CODE	Global	Length = 000A
$M_COMMA . . . . . . . . . . . .  	NUMBER	002C	
$M_CONVERT2ASC . . . . . . . . .  	N PROC	0486	CODE	Length = 0071
$M_CON_INP . . . . . . . . . . .  	NUMBER	-0001	
$M_COUNT . . . . . . . . . . . .  	NUMBER	0001	
$M_CRIT_ERR_MASK . . . . . . . .  	NUMBER	0001	
$M_CRIT_HI . . . . . . . . . . .  	NUMBER	0027	
$M_CRIT_LO . . . . . . . . . . .  	NUMBER	0013	
$M_CRLF_SIZE . . . . . . . . . .  	NUMBER	0002	
$M_CR_LF . . . . . . . . . . . .  	NUMBER	0A0D	
$M_DATE_MASK . . . . . . . . . .  	NUMBER	0010	
$M_DBCS_TERM . . . . . . . . . .  	NUMBER	0000	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-14


$M_DCOUNT  . . . . . . . . . . .  	NUMBER	0001	
$M_DEF_DATE_FORM . . . . . . . .  	NUMBER	0000	
$M_DEF_DATE_SEP  . . . . . . . .  	NUMBER	002D	
$M_DEF_DECI_SEP  . . . . . . . .  	NUMBER	002E	
$M_DEF_TIME_FORM . . . . . . . .  	NUMBER	0001	
$M_DEF_TIME_SEP  . . . . . . . .  	NUMBER	003A	
$M_DISPLAY_$_STRING  . . . . . .  	N PROC	03DE	CODE	Length = 0035
$M_DISPLAY_H_STRING  . . . . . .  	N PROC	0413	CODE	Length = 002E
$M_DISPLAY_MESSAGE . . . . . . .  	N PROC	04F7	CODE	Length = 00DE
$M_DISPLAY_REPLACE . . . . . . .  	N PROC	0738	CODE	Length = 00C6
$M_DISPLAY_STRING  . . . . . . .  	N PROC	03A2	CODE	Length = 003C
$M_DWORD . . . . . . . . . . . .  	NUMBER	0030	
$M_END . . . . . . . . . . . . .  	NUMBER	0000	
$M_EXTPAR_TYPE . . . . . . . . .  	NUMBER	0008	
$M_EXT_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_EXT_ERR_FLAG  . . . . . . . .  	NUMBER	FFFF	
$M_EXT_PAR_REPLACE . . . . . . .  	N PROC	05D5	CODE	Length = 0031
$M_FIND_SPECIFIED_MSG  . . . . .  	N PROC	06BA	CODE	Length = 007E
$M_FIRST_THOU  . . . . . . . . .  	NUMBER	0003	
$M_FLUSH_BUF . . . . . . . . . .  	N PROC	07FE	CODE	Length = 001C
$M_GET_DBCS_VEC  . . . . . . . .  	N PROC	02B6	CODE	Length = 001A
$M_GET_EXT_ERR_39  . . . . . . .  	N PROC	0441	CODE	Length = 0009
$M_GET_MSG_ADDRESS . . . . . . .  	N PROC	0606	CODE	Global	Length = 00A5
$M_ID_SZ . . . . . . . . . . . .  	NUMBER	0004	
$M_INCLUDE . . . . . . . . . . .  	NUMBER	0000	
$M_INDEX . . . . . . . . . . . .  	NUMBER	0004	
$M_IS_IT_DBCS  . . . . . . . . .  	N PROC	0461	CODE	Length = 0025
$M_LOAD  . . . . . . . . . . . .  	NUMBER	FFFF	
$M_MAX_2_YEAR  . . . . . . . . .  	NUMBER	0063	
$M_MSGDATA_ONLY  . . . . . . . .  	NUMBER	0000	
$M_MSGSERV_1 . . . . . . . . . .  	N PROC	01E6	CODE	Global	Length = 000A
$M_MSGSERV_2 . . . . . . . . . .  	N PROC	0207	CODE	Global	Length = 000A
$M_NEG_SIGN  . . . . . . . . . .  	NUMBER	002D	
$M_NEXT_DBCS_VECTOR  . . . . . .  	NUMBER	0002	
$M_NO_CRLF_MASK  . . . . . . . .  	NUMBER	0080	
$M_NO_HANDLE . . . . . . . . . .  	NUMBER	-0001	
$M_NULL  . . . . . . . . . . . .  	NUMBER	0000	
$M_NUM_CLS . . . . . . . . . . .  	NUMBER	0001	
$M_ONE_REPLACE . . . . . . . . .  	NUMBER	0001	
$M_PARSE_FLAG  . . . . . . . . .  	NUMBER	FFFF	
$M_PAR_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_PM  . . . . . . . . . . . . .  	NUMBER	0070	
$M_REPLACE . . . . . . . . . . .  	NUMBER	FFFF	
$M_REPL_DONE . . . . . . . . . .  	NUMBER	0000	
$M_RES_ADDRS_SZ  . . . . . . . .  	NUMBER	0085	
$M_RT  . . . . . . . . . . . . .  	L BYTE	0008	CODE	Global
$M_SECOND_THOU . . . . . . . . .  	NUMBER	0006	
$M_SERVICE . . . . . . . . . . .  	NUMBER	FFFF	
$M_SET_LEN_IN_CX . . . . . . . .  	N PROC	06AB	CODE	Length = 000F
$M_SINGLE_CHAR . . . . . . . . .  	NUMBER	0001	
$M_SIZE_MASK . . . . . . . . . .  	NUMBER	0030	
$M_SL  . . . . . . . . . . . . .  	TEXT  DS:[SI]		
$M_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$M_SPACE_HYP . . . . . . . . . .  	NUMBER	2D20	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-15


$M_SPECIAL_CASE  . . . . . . . .  	NUMBER	0030	
$M_SPECIAL_MSG_NUM . . . . . . .  	NUMBER	FFFF	
$M_STRUC . . . . . . . . . . . .  	NUMBER	0000	
$M_SUBS  . . . . . . . . . . . .  	NUMBER	0000	
$M_TEMP_BUF_SZ . . . . . . . . .  	NUMBER	0040	
$M_TERMINATING_FLAG  . . . . . .  	NUMBER	-0001	
$M_THIRD_THOU  . . . . . . . . .  	NUMBER	0009	
$M_TIMEDATE_PAD  . . . . . . . .  	NUMBER	0030	
$M_TIME_MASK . . . . . . . . . .  	NUMBER	0001	
$M_TYPE_MASK . . . . . . . . . .  	NUMBER	000F	
$M_UNLIM_W . . . . . . . . . . .  	NUMBER	0000	
$M_VERSION_CHECK . . . . . . . .  	N PROC	032C	CODE	Length = 002F
$M_WORD  . . . . . . . . . . . .  	NUMBER	0020	
$P_0099  . . . . . . . . . . . .  	N PROC	108C	CODE	Length = 000E
$P_0099ERR . . . . . . . . . . .  	L NEAR	1098	CODE
$P_ASCII80 . . . . . . . . . . .  	NUMBER	0080	
$P_BRIDGE  . . . . . . . . . . .  	L NEAR	0E81	CODE
$P_CAPS_RET  . . . . . . . . . .  	L NEAR	0F63	CODE
$P_CAP_CHAR  . . . . . . . . . .  	NUMBER	0002	
$P_CAP_FILE  . . . . . . . . . .  	NUMBER	0001	
$P_CHAR_CAP_PTR  . . . . . . . .  	L BYTE	0BAD	CODE
$P_CHECK_MATCH_FLAGS . . . . . .  	N PROC	0E59	CODE	Length = 0081
$P_CHECK_OVF . . . . . . . . . .  	N PROC	107A	CODE	Length = 0012
$P_CHKDFIN . . . . . . . . . . .  	L NEAR	1207	CODE
$P_CHK_DBCS  . . . . . . . . . .  	N PROC	123E	CODE	Length = 0056
$P_CHK_DELIM . . . . . . . . . .  	N PROC	11BF	CODE	Length = 0061
$P_CHK_DELIM00 . . . . . . . . .  	L NEAR	11D9	CODE
$P_CHK_DELIM01 . . . . . . . . .  	L NEAR	11E9	CODE
$P_CHK_DELIM_EXIT  . . . . . . .  	L NEAR	1207	CODE
$P_CHK_DELIM_EXIT0 . . . . . . .  	L NEAR	120A	CODE
$P_CHK_DELIM_LOOP  . . . . . . .  	L NEAR	11FD	CODE
$P_CHK_DELIM_NZ  . . . . . . . .  	L NEAR	1205	CODE
$P_CHK_EOL . . . . . . . . . . .  	N PROC	1189	CODE	Length = 0036
$P_CHK_EOL_EXIT  . . . . . . . .  	L NEAR	11BC	CODE
$P_CHK_EOL_LOOP  . . . . . . . .  	L NEAR	11B2	CODE
$P_CHK_EOL_NZ  . . . . . . . . .  	L NEAR	11BA	CODE
$P_CHK_IF_DATA_REQUIRED  . . . .  	L NEAR	0DAA	CODE
$P_CHK_KEY_CONTROL . . . . . . .  	N PROC	0D3E	CODE	Length = 0002
$P_CHK_POS_CONTROL . . . . . . .  	N PROC	0D0C	CODE	Length = 0032
$P_CHK_SWITCH  . . . . . . . . .  	N PROC	1220	CODE	Length = 001E
$P_CHK_SW_CONTROL  . . . . . . .  	N PROC	0D71	CODE	Length = 0063
$P_CHK_SW_ERR0 . . . . . . . . .  	L NEAR	0DC6	CODE
$P_CHK_SW_EXIT . . . . . . . . .  	L NEAR	0DC9	CODE
$P_CHK_SW_SINGLE_EXIT  . . . . .  	L NEAR	0DD3	CODE
$P_CMPX_S  . . . . . . . . . . .  	NUMBER	0400	
$P_COLON . . . . . . . . . . . .  	NUMBER	003A	
$P_COLON_IS_NOT_NECESSARY  . . .  	NUMBER	0020	
$P_COLON_PERIOD  . . . . . . . .  	NUMBER	0001	
$P_COMMA . . . . . . . . . . . .  	NUMBER	002C	
$P_COMPLEX . . . . . . . . . . .  	NUMBER	0004	
$P_COVF  . . . . . . . . . . . .  	L NEAR	1085	CODE
$P_COVF00  . . . . . . . . . . .  	L NEAR	108A	CODE
$P_CPC00 . . . . . . . . . . . .  	L NEAR	0D1A	CODE
$P_CPC01 . . . . . . . . . . . .  	L NEAR	0D39	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-16


$P_CPC02 . . . . . . . . . . . .  	L NEAR	0D2E	CODE
$P_CPC_EXIT  . . . . . . . . . .  	L NEAR	0D3C	CODE
$P_CR  . . . . . . . . . . . . .  	NUMBER	000D	
$P_CSW00 . . . . . . . . . . . .  	L NEAR	0DC0	CODE
$P_DATE_DMY  . . . . . . . . . .  	NUMBER	0001	
$P_DATE_F  . . . . . . . . . . .  	NUMBER	0007	
$P_DATE_MDY  . . . . . . . . . .  	NUMBER	0000	
$P_DATE_S  . . . . . . . . . . .  	NUMBER	1000	
$P_DATE_YMD  . . . . . . . . . .  	NUMBER	0002	
$P_DBCS00  . . . . . . . . . . .  	L NEAR	1270	CODE
$P_DBCS01  . . . . . . . . . . .  	L NEAR	128B	CODE
$P_DBCS02  . . . . . . . . . . .  	L NEAR	1266	CODE
$P_DBCSEV_OFF  . . . . . . . . .  	L WORD	0B1F	CODE
$P_DBCSEV_SEG  . . . . . . . . .  	L WORD	0B21	CODE
$P_DBCS_EXIT . . . . . . . . . .  	L NEAR	1290	CODE
$P_DBCS_LOOP . . . . . . . . . .  	L NEAR	127A	CODE
$P_DBSP1 . . . . . . . . . . . .  	NUMBER	0081	
$P_DBSP2 . . . . . . . . . . . .  	NUMBER	0040	
$P_DCC00 . . . . . . . . . . . .  	L NEAR	0F36	CODE
$P_DCC01 . . . . . . . . . . . .  	L NEAR	0F52	CODE
$P_DCC_GO  . . . . . . . . . . .  	L NEAR	0F2F	CODE
$P_DCS00 . . . . . . . . . . . .  	L NEAR	0F18	CODE
$P_DCS01 . . . . . . . . . . . .  	L NEAR	0F19	CODE
$P_DCS_EXIT  . . . . . . . . . .  	L NEAR	0F1C	CODE
$P_DCS_LOOP  . . . . . . . . . .  	L NEAR	0F04	CODE
$P_DOSTBL_BL . . . . . . . . . .  	NUMBER	0005	
$P_DOSTBL_CHAR . . . . . . . . .  	NUMBER	0002	
$P_DOSTBL_DEF  . . . . . . . . .  	NUMBER	-0001	
$P_DOSTBL_FILE . . . . . . . . .  	NUMBER	0004	
$P_DOS_GETEV . . . . . . . . . .  	NUMBER	6300	
$P_DOS_GET_CDI . . . . . . . . .  	NUMBER	3800	
$P_DOS_GET_TBL . . . . . . . . .  	NUMBER	0065	
$P_DO_CAPS_CHAR  . . . . . . . .  	N PROC	0F1F	CODE	Length = 0045
$P_DO_CAPS_STRING  . . . . . . .  	N PROC	0F00	CODE	Length = 001F
$P_DQUOTE  . . . . . . . . . . .  	NUMBER	0022	
$P_DRIVE . . . . . . . . . . . .  	NUMBER	0006	
$P_DRV_ONLY  . . . . . . . . . .  	NUMBER	0100	
$P_DX  . . . . . . . . . . . . .  	L WORD	0B1C	CODE
$P_EOL . . . . . . . . . . . . .  	NUMBER	0000	
$P_EQU . . . . . . . . . . . . .  	NUMBER	0001	
$P_ERROR_FILESPEC  . . . . . . .  	NUMBER	0001	
$P_ERR_FLAG  . . . . . . . . . .  	L BYTE	0BB2	CODE
$P_EXIT_AT_EXTRA . . . . . . . .  	L NEAR	1187	CODE
$P_EXTRA . . . . . . . . . . . .  	NUMBER	0020	
$P_FILE_SPC  . . . . . . . . . .  	NUMBER	0200	
$P_FILE_SPEC . . . . . . . . . .  	NUMBER	0005	
$P_FILL_RESULT . . . . . . . . .  	N PROC	0DD4	CODE	Length = 0085
$P_FIN . . . . . . . . . . . . .  	L NEAR	0BE9	CODE
$P_FLAGS . . . . . . . . . . . .  	L WORD	0B23	CODE
$P_FLAGS1  . . . . . . . . . . .  	BYTE	0B23	CODE
$P_FLAGS2  . . . . . . . . . . .  	BYTE	0B24	CODE
$P_FOUND_SYNONYM . . . . . . . .  	L WORD	0B2B	CODE
$P_IG_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_I_HAVE_DELIM  . . . . . . . .  	NUMBER	0001	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-17


$P_I_HAVE_EOL  . . . . . . . . .  	NUMBER	0002	
$P_I_USE_DEFAULT . . . . . . . .  	NUMBER	0000	
$P_KEYORSW_EXIT  . . . . . . . .  	L NEAR	0D62	CODE
$P_KEYORSW_FOUND . . . . . . . .  	L NEAR	0D5C	CODE
$P_KEYORSW_LOOP  . . . . . . . .  	L NEAR	0D4F	CODE
$P_KEYORSW_NOT_FOUND . . . . . .  	L NEAR	0D59	CODE
$P_KEYORSW_PTR . . . . . . . . .  	L WORD	0B27	CODE
$P_KEYWORD . . . . . . . . . . .  	NUMBER	003D	
$P_KEY_CMP . . . . . . . . . . .  	NUMBER	0008	
$P_KEY_MANAGER . . . . . . . . .  	L NEAR	0CBB	CODE
$P_KEY_MGR_LOOP  . . . . . . . .  	L NEAR	0CDA	CODE
$P_KEY_NOT_FOUND . . . . . . . .  	L NEAR	0CE8	CODE
$P_LEN_PARMS . . . . . . . . . .  	NUMBER	0004	
$P_LEN_RANGE . . . . . . . . . .  	NUMBER	0009	
$P_LEN_STRING  . . . . . . . . .  	NUMBER	0003	
$P_LEN_VALUE . . . . . . . . . .  	NUMBER	0005	
$P_LF  . . . . . . . . . . . . .  	NUMBER	000A	
$P_LIST_IDX  . . . . . . . . . .  	NUMBER	0002	
$P_LPAREN  . . . . . . . . . . .  	NUMBER	0028	
$P_MAKE_LOWER  . . . . . . . . .  	NUMBER	0020	
$P_MAKE_UPPER  . . . . . . . . .  	NUMBER	00DF	
$P_MAT . . . . . . . . . . . . .  	L NEAR	0E7F	CODE
$P_MATCH03 . . . . . . . . . . .  	L NEAR	0E84	CODE
$P_MATCH04 . . . . . . . . . . .  	L NEAR	0E9B	CODE
$P_MATCH05 . . . . . . . . . . .  	L NEAR	0EB2	CODE
$P_MATCH09 . . . . . . . . . . .  	L NEAR	0EC1	CODE
$P_MATCH2_EXIT . . . . . . . . .  	L NEAR	0ED8	CODE
$P_MATCH_EXIT  . . . . . . . . .  	L NEAR	0EC1	CODE
$P_MBP_EXIT  . . . . . . . . . .  	L NEAR	0D6F	CODE
$P_MBP_LOOP  . . . . . . . . . .  	L NEAR	0D65	CODE
$P_MINUS . . . . . . . . . . . .  	NUMBER	002D	
$P_MOVEBP_NUL  . . . . . . . . .  	N PROC	0D65	CODE	Length = 000C
$P_NEG . . . . . . . . . . . . .  	NUMBER	0002	
$P_NON_DBCS  . . . . . . . . . .  	L NEAR	128F	CODE
$P_NOT_APPLICABLE  . . . . . . .  	L NEAR	1136	CODE
$P_NOT_IN_KEY  . . . . . . . . .  	NUMBER	0004	
$P_NOT_IN_STR  . . . . . . . . .  	NUMBER	0008	
$P_NOT_IN_SW . . . . . . . . . .  	NUMBER	0003	
$P_NOT_IN_VAL  . . . . . . . . .  	NUMBER	0007	
$P_NO_ERROR  . . . . . . . . . .  	NUMBER	0000	
$P_NO_NRNG . . . . . . . . . . .  	NUMBER	0000	
$P_NO_SET_EXTRA  . . . . . . . .  	L NEAR	121C	CODE
$P_NO_TAG  . . . . . . . . . . .  	NUMBER	00FF	
$P_NULL  . . . . . . . . . . . .  	NUMBER	0000	
$P_NUMBER  . . . . . . . . . . .  	NUMBER	0001	
$P_NUM_VAL . . . . . . . . . . .  	NUMBER	8000	
$P_NVAL_NONE . . . . . . . . . .  	NUMBER	0000	
$P_NVAL_RANGE  . . . . . . . . .  	NUMBER	0001	
$P_NVAL_STRING . . . . . . . . .  	NUMBER	0003	
$P_NVAL_VALUE  . . . . . . . . .  	NUMBER	0002	
$P_OPTIONAL  . . . . . . . . . .  	NUMBER	0001	
$P_OP_MISSING  . . . . . . . . .  	NUMBER	0002	
$P_ORDINAL . . . . . . . . . . .  	L WORD	0B16	CODE
$P_OUT_OF_RANGE  . . . . . . . .  	NUMBER	0006	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-18


$P_PACK_END  . . . . . . . . . .  	L NEAR	0C44	CODE
$P_PACK_END_BACKUP_SI  . . . . .  	L NEAR	0C1E	CODE
$P_PACK_END_BY_EOL . . . . . . .  	L NEAR	0C43	CODE
$P_PACK_LOOP . . . . . . . . . .  	L NEAR	0C01	CODE
$P_PERIOD  . . . . . . . . . . .  	NUMBER	002E	
$P_PERIOD_ONLY . . . . . . . . .  	NUMBER	0002	
$P_PL00  . . . . . . . . . . . .  	L NEAR	0C36	CODE
$P_PL01  . . . . . . . . . . . .  	L NEAR	0C29	CODE
$P_PLUS  . . . . . . . . . . . .  	NUMBER	002B	
$P_POSITIONAL_MANAGER  . . . . .  	L NEAR	0C67	CODE
$P_QUOTED_STRING . . . . . . . .  	NUMBER	0009	
$P_QU_STRING . . . . . . . . . .  	NUMBER	0080	
$P_RC  . . . . . . . . . . . . .  	L WORD	0B18	CODE
$P_RCOL00  . . . . . . . . . . .  	L NEAR	0EF4	CODE
$P_RCOL01  . . . . . . . . . . .  	L NEAR	0EFA	CODE
$P_RCOL_EXIT . . . . . . . . . .  	L NEAR	0EFD	CODE
$P_RCOL_LOOP . . . . . . . . . .  	L NEAR	0EDC	CODE
$P_RC_EOL  . . . . . . . . . . .  	NUMBER	-0001	
$P_REMOVE_COLON  . . . . . . . .  	N PROC	0EDA	CODE	Length = 0026
$P_REPEAT  . . . . . . . . . . .  	NUMBER	0002	
$P_RETURN_TO_CALLER  . . . . . .  	L NEAR	0CEF	CODE
$P_RETURN_TO_CALLER0 . . . . . .  	L NEAR	0CEF	CODE
$P_RLT00 . . . . . . . . . . . .  	L NEAR	0DFD	CODE
$P_RLT01 . . . . . . . . . . . .  	L NEAR	0E07	CODE
$P_RLT02 . . . . . . . . . . . .  	L NEAR	0DF3	CODE
$P_RLT03 . . . . . . . . . . . .  	L NEAR	0E19	CODE
$P_RLT04 . . . . . . . . . . . .  	L NEAR	0DEF	CODE
$P_RLT05 . . . . . . . . . . . .  	L NEAR	0E2C	CODE
$P_RLT_CAP00 . . . . . . . . . .  	L NEAR	0E40	CODE
$P_RLT_CAP01 . . . . . . . . . .  	L NEAR	0E4C	CODE
$P_RLT_CAP02 . . . . . . . . . .  	L NEAR	0E49	CODE
$P_RLT_EXIT  . . . . . . . . . .  	L NEAR	0E57	CODE
$P_RM_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_RPAREN  . . . . . . . . . . .  	NUMBER	0029	
$P_SAVESI_CMPX . . . . . . . . .  	L WORD	0B25	CODE
$P_SAVE_EOB  . . . . . . . . . .  	L WORD	0B29	CODE
$P_SCOM00  . . . . . . . . . . .  	L NEAR	110A	CODE
$P_SCOM01  . . . . . . . . . . .  	L NEAR	111D	CODE
$P_SCOM02  . . . . . . . . . . .  	L NEAR	114A	CODE
$P_SCOM03  . . . . . . . . . . .  	L NEAR	10FC	CODE
$P_SCOM04  . . . . . . . . . . .  	L NEAR	10E6	CODE
$P_SCOM05  . . . . . . . . . . .  	L NEAR	10F9	CODE
$P_SCOM_DIFFER . . . . . . . . .  	L NEAR	1155	CODE
$P_SCOM_DIFFER0  . . . . . . . .  	L NEAR	111F	CODE
$P_SCOM_EXIT . . . . . . . . . .  	L NEAR	115E	CODE
$P_SCOM_LOOP . . . . . . . . . .  	L NEAR	10C6	CODE
$P_SCOM_SAME . . . . . . . . . .  	L NEAR	1158	CODE
$P_SEARCH_KEYORSW  . . . . . . .  	N PROC	0D40	CODE	Length = 0025
$P_SIGNED  . . . . . . . . . . .  	NUMBER	0080	
$P_SIM00 . . . . . . . . . . . .  	L NEAR	10AD	CODE
$P_SIM01 . . . . . . . . . . . .  	L NEAR	10AD	CODE
$P_SIMPLE_S  . . . . . . . . . .  	NUMBER	2000	
$P_SIMPLE_STRING . . . . . . . .  	N PROC	109A	CODE	Length = 0026
$P_SIM_EXIT  . . . . . . . . . .  	L NEAR	10B6	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-19


$P_SIM_EXIT0 . . . . . . . . . .  	L NEAR	10B8	CODE
$P_SINGLE_EXIT . . . . . . . . .  	L NEAR	0D0A	CODE
$P_SI_SAVE . . . . . . . . . . .  	L WORD	0B1A	CODE
$P_SKIP_DELIM  . . . . . . . . .  	N PROC	1163	CODE	Length = 0026
$P_SKIP_DELIM_CY . . . . . . . .  	L NEAR	1181	CODE
$P_SKIP_DELIM_EXIT . . . . . . .  	L NEAR	1185	CODE
$P_SKIP_DELIM_LOOP . . . . . . .  	L NEAR	1163	CODE
$P_SKIP_DELIM_NCY  . . . . . . .  	L NEAR	1184	CODE
$P_SLASH . . . . . . . . . . . .  	NUMBER	002F	
$P_SNUM_VAL  . . . . . . . . . .  	NUMBER	4000	
$P_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$P_START . . . . . . . . . . . .  	L NEAR	0BED	CODE
$P_STRING  . . . . . . . . . . .  	NUMBER	0003	
$P_STRING_BUF  . . . . . . . . .  	L BYTE	0B2D	CODE	Length = 0080
$P_STRING_BUF_END  . . . . . . .  	NEAR	0BAD	CODE
$P_STRING_COMP . . . . . . . . .  	N PROC	10C0	CODE	Length = 00A3
$P_STRUC_L1  . . . . . . . . . .  	L NEAR	123D	CODE
$P_STRUC_L12 . . . . . . . . . .  	L NEAR	123C	CODE
$P_STRUC_L2  . . . . . . . . . .  	L NEAR	1232	CODE
$P_STRUC_L5  . . . . . . . . . .  	L NEAR	122F	CODE
$P_SVAL00  . . . . . . . . . . .  	L NEAR	0F82	CODE
$P_SVAL01  . . . . . . . . . . .  	L NEAR	0F83	CODE
$P_SVALUE  . . . . . . . . . . .  	N PROC	0F64	CODE	Length = 0024
$P_SVAL_IN . . . . . . . . . . .  	L NEAR	103C	CODE
$P_SW  . . . . . . . . . . . . .  	NUMBER	0040	
$P_SWITCH  . . . . . . . . . . .  	NUMBER	002F	
$P_SW_CMP  . . . . . . . . . . .  	NUMBER	0010	
$P_SW_MANAGER  . . . . . . . . .  	L NEAR	0C8F	CODE
$P_SW_MGR_LOOP . . . . . . . . .  	L NEAR	0CA4	CODE
$P_SW_NOT_FOUND  . . . . . . . .  	L NEAR	0CB2	CODE
$P_SYNTAX  . . . . . . . . . . .  	NUMBER	0009	
$P_TAB . . . . . . . . . . . . .  	NUMBER	0009	
$P_TERMINATOR  . . . . . . . . .  	L BYTE	0B1E	CODE
$P_TIME12  . . . . . . . . . . .  	NUMBER	0004	
$P_TIME12AM  . . . . . . . . . .  	NUMBER	0001	
$P_TIME_AGAIN  . . . . . . . . .  	NUMBER	0002	
$P_TIME_F  . . . . . . . . . . .  	NUMBER	0008	
$P_TIME_S  . . . . . . . . . . .  	NUMBER	0800	
$P_TOO_MANY  . . . . . . . . . .  	NUMBER	0001	
$P_TOO_MANY_ERROR  . . . . . . .  	L NEAR	0C86	CODE
$P_VAL02_LOOP  . . . . . . . . .  	L NEAR	1008	CODE
$P_VAL02_NEXT  . . . . . . . . .  	L NEAR	104C	CODE
$P_VAL02_SIGN  . . . . . . . . .  	L NEAR	102E	CODE
$P_VALUE . . . . . . . . . . . .  	N PROC	0F88	CODE	Length = 00F2
$P_VALUE00 . . . . . . . . . . .  	L NEAR	0FDA	CODE
$P_VALUE01 . . . . . . . . . . .  	L NEAR	0FED	CODE
$P_VALUE02 . . . . . . . . . . .  	L NEAR	0FFF	CODE
$P_VALUE03 . . . . . . . . . . .  	L NEAR	1067	CODE
$P_VALUE04 . . . . . . . . . . .  	L NEAR	1067	CODE
$P_VALUE_ERR . . . . . . . . . .  	L NEAR	1067	CODE
$P_VALUE_ERR0  . . . . . . . . .  	L NEAR	0FD6	CODE
$P_VALUE_EXIT  . . . . . . . . .  	L NEAR	1072	CODE
$P_VALUE_LOOP  . . . . . . . . .  	L NEAR	0F91	CODE
$P_VAL_FOUND . . . . . . . . . .  	L NEAR	1060	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:09
SORT FILTER FOR DOS                                         Symbols-20


$P_VAL_IN  . . . . . . . . . . .  	L NEAR	101E	CODE
??0000 . . . . . . . . . . . . .  	L NEAR	06A3	CODE
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  sort		
@VERSION . . . . . . . . . . . .  	TEXT  510		


  15020 Source  Lines
  18665 Total   Lines
    989 Symbols

  44266 + 170744 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
