Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-1


				PAGE 55,132				;AN000;
				NAME	SELCHILD			;AN000;
				TITLE	SELCHILD - CHILD processing for SELECT.EXE;AN000;
				SUBTTL	selchild.asm			;AN000;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				;
				;	HANDLE_CHILDREN
				;
				; Entry:
				;
				;
				;
				; Exit:
				;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
					EXTRN	QM_ID:WORD		;AN000;
					EXTRN	QM_OPT1:WORD		;AN000;
					EXTRN	QM_ACTIVEPAN:WORD	;AN000;
									;
 0000				SELECT	SEGMENT PARA PUBLIC 'SELECT'    ;AN000;segment for far routine
					ASSUME	CS:SELECT		;AN000;
									;
					EXTRN	GET_PCB:NEAR		;AN000;
					EXTRN	PCDISPQ_CALL:NEAR	;AN000;
									;
					INCLUDE PCEQUATE.INC		;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSCRRD option bit equates (SRD_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SRD_INITIAL    EQU  0000000000000001B	     ;AN000;initialize SCB and filespec buff
 = 0002                      C	SRD_READONE    EQU  0000000000000010B	     ;AN000;read field specified by SRD_ID
 = 0004                      C	SRD_APPEND     EQU  0000000000000100B	     ;AN000;match field ID are issued new ID
 = 0008                      C	SRD_READALL    EQU  0000000000001000B	     ;AN000;read all FLDS in specified file
 = 0010                      C	SRD_ALLOCRES   EQU  0000000000010000B	     ;AN000;allocate reserved PCSLCTP space
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSCRRD error bit equates (SRD_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SRD_BUFSIZE    EQU  0000000000000001B	     ;AN000;buffer size is too small
 = 0002                      C	SRD_NOFIELDS   EQU  0000000000000010B	     ;AN000;file does not contain fields
 = 0004                      C	SRD_NOTCASFILE EQU  0000000000000100B	     ;AN000;file object list does not exist
 = 0008                      C	SRD_FIELDSFULL EQU  0000000000001000B	     ;AN000;max num FLDS read into SCB vect
 = 0010                      C	SRD_NOINITIAL  EQU  0000000000010000B	     ;AN000;make initialize call first
 = 0020                      C	SRD_NOFIELDID  EQU  0000000000100000B	     ;AN000;specified field ID not found
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCHLPRD option bit equates (HRD_OPT1)
			     C	;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-2
selchild.asm			;AN000;                                      

			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	HRD_TOPIC      EQU  0000000000000001B	      ;AN000;process help TOPIC(S) index
 = 0002                      C	HRD_TEXT       EQU  0000000000000010B	      ;AN000;process HELP or ERROR text
 = 0004                      C	HRD_DISPID     EQU  0000000000000100B	      ;AN000;display unique id on topic list
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCHLPRD error bit equates (HRD_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	HRD_BUFSIZE    EQU  0000000000000001B	      ;AN000;buffer size is too small
 = 0002                      C	HRD_NOHLPOBJ   EQU  0000000000000010B	      ;AN000;file does not contain helps
 = 0004                      C	HRD_NOOBJLST   EQU  0000000000000100B	      ;AN000;file object list does not exist
 = 0008                      C	HRD_NOHELPID   EQU  0000000000001000B	      ;AN000;requested id was not found
 = 0010                      C	HRD_NOTCASFILE EQU  0000000000010000B	      ;AN000;not a valid cas file
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSTRST equates
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SSC_TBSL       EQU  0000000000000001B	     ;AN000;use two byte string length
 = 0002                      C	SSC_PTSB       EQU  0000000000000010B	     ;AN000;pointer points to string buffer
 = 0004                      C	SSC_VTSAO      EQU  0000000000000100B	     ;AN000;vector table is string addr only
 = 0008                      C	SSC_VTASO      EQU  0000000000001000B	     ;AN000;vector table addr is seg:offset
 = 0010                      C	SSC_SLSB       EQU  0000000000010000B	     ;AN000;string length is in string buffer
 = 0020                      C	SSC_SBTC       EQU  0000000000100000B	     ;AN000;string buffer has term. character
 = 0001                      C	SSC_VTE        EQU  1			     ;AN000;error in vector table
 = 0002                      C	SSC_SBE        EQU  2			     ;AN000;error in string buffer
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSLCTP Option word one (SCB_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SCB_UC	       EQU  0000000000000001B	     ;AN000;upper case option
 = 0002                      C	SCB_WRAP       EQU  0000000000000010B	     ;AN000;wrap option
 = 0004                      C	SCB_FRBF       EQU  0000000000000100B	     ;AN000;force return before first option
 = 0008                      C	SCB_FRAL       EQU  0000000000001000B	     ;AN000;force return after last option
 = 0010                      C	SCB_LL	       EQU  0000000000010000B	     ;AN000;lock line
 = 0020                      C	SCB_UKS        EQU  0000000000100000B	     ;AN000;use keystroke
 = 0040                      C	SCB_RD	       EQU  0000000001000000B	     ;AN000;return after display option
 = 0080                      C	SCB_RUK        EQU  0000000010000000B	     ;AN000;return unused keys option
 = 0100                      C	SCB_UI	       EQU  0000000100000000B	     ;AN000;use index option
 = 0200                      C	SCB_TRN        EQU  0000001000000000B	     ;AN000;translate character
 = 0400                      C	SCB_MON        EQU  0000010000000000B	     ;AN000;convert to upper case monocasing
 = 0800                      C	SCB_DBCS       EQU  0000100000000000B	     ;AN000;check for double byte chars
 = 1000                      C	SCB_TBL        EQU  0001000000000000B	     ;AN000;use given DBCS range table
 = 2000                      C	SCB_DCHECK     EQU  0010000000000000B	     ;AN000;display check mark characters
 = 4000                      C	SCB_DACTIVE    EQU  0100000000000000B	     ;AN000;display active string indicators
 = 8000                      C	SCB_DPOINT     EQU  1000000000000000B	     ;AN000;display selection pointer string
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSLCTP Option word two (SCB_OPT2)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-3
selchild.asm			;AN000;                                      

			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SCB_CS	       EQU  0000000000000001B	     ;AN000;clear screen on entry option
 = 0002                      C	SCB_ROTN       EQU  0000000000000010B	     ;AN000;reset option to normal on return
 = 0004                      C	SCB_UET        EQU  0000000000000100B	     ;AN000;use existing text option
 = 0008                      C	SCB_CFO        EQU  0000000000001000B	     ;AN000;cursor follows option
 = 0010                      C	SCB_LCOX       EQU  0000000000010000B	     ;AN000;leave cursor on exit
 = 0020                      C	SCB_IPAGE      EQU  0000000000100000B	     ;AN000;instant paging
 = 0040                      C	SCB_PM1        EQU  0000000001000000B	     ;AN000;paging is minus one line
 = 0080                      C	SCB_UIND       EQU  0000000010000000B	     ;AN000;display up, dn, lf, rg indicators
 = 0100                      C	SCB_UNCA       EQU  0000000100000000B	     ;AN000;use normal color array
 = 0200                      C	SCB_DYN        EQU  0000001000000000B	     ;AN000;option array is dynamicly created
 = 0400                      C	SCB_LANDR      EQU  0000010000000000B	     ;AN000;left and right scrolling active
 = 0800                      C	SCB_CPHY       EQU  0000100000000000B	     ;AN000;color array is physical attributs
 = 1000                      C	SCB_NUML       EQU  0001000000000000B	     ;AN000;generate num list in opt strings
 = 2000                      C	SCB_SKIP       EQU  0010000000000000B	     ;AN000;skip inactive option strings
 = 4000                      C	SCB_SHIGH      EQU  0100000000000000B	     ;AN000;highlight the selected opt strgs
 = 8000                      C	SCB_AHIGH      EQU  1000000000000000B	     ;AN000;highlight the active option strgs
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSLCTP Option word three (SCB_OPT3)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SCB_SELACT     EQU  0000000000000001B	     ;AN000;allow selection of inactive elem
 = 0002                      C	SCB_SELEXC     EQU  0000000000000010B	     ;AN000;exclusive selection of one elemet
 = 0004                      C	SCB_EXCSING    EQU  0000000000000100B	     ;AN000;one element is always selected
 = 0008                      C	SCB_NUMUIND    EQU  0000000000001000B	     ;AN000;display line number count
 = 0010                      C	SCB_CHIGH      EQU  0000000000010000B	     ;AN000;hilight cursored and selected stg
 = 0020                      C	SCB_NUMS       EQU  0000000000100000B	     ;AN000;auto 0-9 number selection
 = 0040                      C	SCB_FINDE      EQU  0000000001000000B	     ;AN000;auto character search
 = 0080                      C	SCB_RELUIND    EQU  0000000010000000B	     ;AN000;rel row/col used w/dirct indicato
 = 0100                      C	SCB_RELSCR     EQU  0000000100000000B	     ;AN000;rel row/col used w/scroll field
 = 0200                      C	SCB_LVBOVR     EQU  0000001000000000B	     ;AN000;use video buffer seg:off override
 = 0400                      C	SCB_FM	       EQU  0000010000000000B	     ;AN000;make call to dynamic format rout
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSLCTP Select Array Option (SCB_SELSEG:SCB_SELOFF)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	SCB_SELECTON   EQU  0000000000000001B	     ;AN000;element selected
 = 0002                      C	SCB_ACTIVEON   EQU  0000000000000010B	     ;AN000;element active
 = 0004                      C	SCB_SKIPON     EQU  0000000000000100B	     ;AN000;element should be skipped
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCINCHA option equates (INC_OPT)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	INC_KWAIT      EQU  0000000000000001B	     ;keystroke
 = 0002                      C	INC_UTRAN      EQU  0000000000000010B	     ;translate keys using user table
 = 0004                      C	INC_UDBCS      EQU  0000000000000100B	     ;DBCS processed using user table
 = 0008                      C	INC_DDBCS      EQU  0000000000001000B	     ;DBCS processed using DOS table
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-4
selchild.asm			;AN000;                                      

 = 0010                      C	INC_UMONO      EQU  0000000000010000B	     ;monocase keys using user table
 = 0020                      C	INC_AMONO      EQU  0000000000100000B	     ;monocase keys using USA algorithm
 = 0040                      C	INC_RSCAN      EQU  0000000001000000B	     ;return scan codes for norm chars
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCINCHA option equates (INC_STAT)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	INC_KFND       EQU  0000000000000001B	     ;AN000;character found in buffer
 = 0002                      C	INC_DBCS       EQU  0000000000000010B	     ;AN000;character found is double byte
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCCLRRD error bit equates (CRD_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	CRD_BUFSIZE	EQU  0000000000000001B	     ;AN000;buffer size is too small
 = 0002                      C	CRD_NOCOLORS	EQU  0000000000000010B	     ;AN000;file does not contain colors
 = 0004                      C	CRD_NOTCASFILE	EQU  0000000000000100B	     ;AN000;file object list does not exist
 = 0008                      C	CRD_IDNOTFOUND	EQU  0000000000001000B	     ;AN000;color index ID not found
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANRD option bit equates (PRD_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PRD_INITIAL    EQU  0000000000000001B	     ;AN000;initialize PCB and filespec buff
 = 0002                      C	PRD_READONE    EQU  0000000000000010B	     ;AN000;read pan specified by PRD_ID
 = 0004                      C	PRD_APPEND     EQU  0000000000000100B	     ;AN000;match pans ID are issued new ID
 = 0008                      C	PRD_READALL    EQU  0000000000001000B	     ;AN000;read all pans in specified file
 = 0010                      C	PRD_SIZEMALL   EQU  0000000000010000B	     ;AN000;reserve space for panel sizing
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANRD error bit equates (PRD_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PRD_BUFSIZE    EQU  0000000000000001B	     ;AN000;buffer size is too small
 = 0002                      C	PRD_NOPANELS   EQU  0000000000000010B	     ;AN000;file does not contain panels
 = 0004                      C	PRD_NOTCASFILE EQU  0000000000000100B	     ;AN000;file object list does not exist
 = 0008                      C	PRD_PANELSFULL EQU  0000000000001000B	     ;AN000;max num pans read into PCB vect
 = 0010                      C	PRD_NOINITIAL  EQU  0000000000010000B	     ;AN000;make initialize call first
 = 0020                      C	PRD_NOPANELID  EQU  0000000000100000B	     ;AN000;specified panel ID not found
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCDISPQ option equates (QM_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	QM_INIT        EQU  0000000000000001B	     ;AN000;Initialize working buffer
 = 0002                      C	QM_PUSHCHD     EQU  0000000000000010B	     ;AN000;Add child number
 = 0004                      C	QM_RVMCHD      EQU  0000000000000100B	     ;AN000;Remove specific child number
 = 0008                      C	QM_POPCHD      EQU  0000000000001000B	     ;AN000;Pop (n) number of child cur queue
 = 0010                      C	QM_PUSHPAN     EQU  0000000000010000B	     ;AN000;Add panel number
 = 0020                      C	QM_RVMPAN      EQU  0000000000100000B	     ;AN000;Remove specific panel number
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-5
selchild.asm			;AN000;                                      

 = 0040                      C	QM_POPPAN      EQU  0000000001000000B	     ;AN000;Pop (n) number of panls cur queue
 = 0080                      C	QM_PUSHCQU     EQU  0000000010000000B	     ;AN000;Push current child queue
 = 0100                      C	QM_POPCQU      EQU  0000000100000000B	     ;AN000;Pop last child queue
 = 0200                      C	QM_PUSHPQU     EQU  0000001000000000B	     ;AN000;Push current panel queue
 = 0400                      C	QM_POPPQU      EQU  0000010000000000B	     ;AN000;Pop last panel queue pushed
 = 0800                      C	QM_CLSCHD      EQU  0000100000000000B	     ;AN000;Clear current child queue.
 = 1000                      C	QM_CLSPAN      EQU  0001000000000000B	     ;AN000;Clear current panel queue.
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	; PCDISPQ option equates (QM_OPT2)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	QM_BREAKON     EQU  0000000000000001B	     ;AN000;break option is on
 = 0002                      C	QM_BREAKOFF    EQU  0000000000000010B	     ;AN000;break option is off
 = 0004                      C	QM_SRFON       EQU  0000000000000100B	     ;AN000;selected refresh option is on
 = 0008                      C	QM_SRFOFF      EQU  0000000000001000B	     ;AN000;selected refresh option is off
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCDISPQ error equates (QM_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	QM_ERRMP       EQU  0000000000000001B	     ;AN000;max number of panels added
 = 0002                      C	QM_ERRMC       EQU  0000000000000010B	     ;AN000;max number of childs added
 = 0004                      C	QM_ERRMPQ      EQU  0000000000000100B	     ;AN000;max number of panel queues pushed
 = 0008                      C	QM_ERRMCQ      EQU  0000000000001000B	     ;AN000;max number of child queues pushed
 = 0010                      C	QM_ERROP       EQU  0000000000010000B	     ;AN000;max number of panel queues popped
 = 0020                      C	QM_ERROC       EQU  0000000000100000B	     ;AN000;max number of child queues popped
 = 0040                      C	QM_ERRBU       EQU  0000000001000000B	     ;AN000;inadequate buffer size avail
 = 0080                      C	QM_ERRPN       EQU  0000000010000000B	     ;AN000;specified panel not found
 = 0100                      C	QM_ERRCN       EQU  0000000100000000B	     ;AN000;specified child not found
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANEL option bit equates (PM_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PM_RF	       EQU  0000000000000001B	     ;AN000;do not refresh display
 = 0002                      C	PM_SRF	       EQU  0000000000000010B	     ;AN000;selective PVB refresh from LVB
 = 0004                      C	PM_BK	       EQU  0000000000000100B	     ;AN000;panel break function active
 = 0008                      C	PM_CL	       EQU  0000000000001000B	     ;AN000;initialize LVB to base char/attr
 = 0010                      C	PM_DOA	       EQU  0000000000010000B	     ;AN000;display childs in active parent
 = 0020                      C	PM_DOV	       EQU  0000000000100000B	     ;AN000;use child row, col, color overrid
 = 0040                      C	PM_DOQ	       EQU  0000000001000000B	     ;AN000;disp all child in parent chd tabl
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANEL error equates for (PM_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PM_PANPDQ      EQU  0000000000000001B	     ;AN000;invalid parent PDQ or start num
 = 0002                      C	PM_PCBVEC      EQU  0000000000000010B	     ;AN000;invalid PCB vector entry found
 = 0004                      C	PM_UNKNPANS    EQU  0000000000000100B	     ;AN000;unknown panel source found
 = 0008                      C	PM_CHDTAB      EQU  0000000000001000B	     ;AN000;set error with child table
 = 0010                      C	PM_COLORX      EQU  0000000000010000B	     ;AN000;panel's color index out of range
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-6
selchild.asm			;AN000;                                      

			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANEL Parent and Child Display Queue option bit equates (PT_OPT)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PT_BK	       EQU  0000000000000001B	     ;AN000;panel break on
 = 0002                      C	PT_SRF	       EQU  0000000000000010B	     ;AN000;selective refresh of panel to PVB
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCPANEL Panel Control Block option equates for individual panels (PCB_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PCB_CRE        EQU  0000000000000001B	     ;AN000;Create panel from scratch
 = 0002                      C	PCB_CMP        EQU  0000000000000010B	     ;AN000;Use compress text form in memory
 = 0004                      C	PCB_EXP        EQU  0000000000000100B	     ;AN000;Use expanded text form in memory
 = 0008                      C	PCB_MXP        EQU  0000000000001000B	     ;AN000;Use mixed text/attr form in memoy
 = 0010                      C	PCB_LB	       EQU  0000000000010000B	     ;AN000;Use logical border
 = 0020                      C	PCB_ASZ        EQU  0000000000100000B	     ;AN000;Allow sizing of panel
 = 0040                      C	PCB_ASC        EQU  0000000001000000B	     ;AN000;Allow scrolling of panel
 = 0080                      C	PCB_LAB        EQU  0000000010000000B	     ;AN000;Use the defined panel label
 = 0100                      C	PCB_DTB        EQU  0000000100000000B	     ;AN000;Draw top border (graphics only)
 = 0200                      C	PCB_DBB        EQU  0000001000000000B	     ;AN000;Draw bottom border (graphic only)
 = 0400                      C	PCB_DLB        EQU  0000010000000000B	     ;AN000;Draw left border (graphics only)
 = 0800                      C	PCB_DRB        EQU  0000100000000000B	     ;AN000;Draw right border (graphics only)
 = 1000                      C	PCB_DSHADOW    EQU  0001000000000000B	     ;AN000;Draw shadow (graphics only)
 = 2000                      C	PCB_PELCOORD   EQU  0010000000000000B	     ;AN000;row/col in pel coordinates (grap)
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCINSTR option bit equates (INS_OPT)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	INS_FKS        EQU  0000000000000001B	     ;AN000;find keystroke
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCGVIDO Status equates (GV_STAT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	GV_TV	       EQU  0000000000000001B	     ;AN000;TopView is present
 = 0002                      C	GV_CGA	       EQU  0000000000000010B	     ;AN000;CGA is present
 = 0004                      C	GV_EGA	       EQU  0000000000000100B	     ;AN000;EGA is present
 = 0008                      C	GV_PGA	       EQU  0000000000001000B	     ;AN000;PGA is present
 = 0010                      C	GV_MGA	       EQU  0000000000010000B	     ;AN000;MGA is present
 = 0020                      C	GV_EGAA        EQU  0000000000100000B	     ;AN000;EGA is active card
 = 0040                      C	GV_CGAA        EQU  0000000001000000B	     ;AN000;CGA is active card
 = 0080                      C	GV_EGACM       EQU  0000000010000000B	     ;AN000;EGA is set to monochrome
 = 0100                      C	GV_PGAEM       EQU  0000000100000000B	     ;AN000;PGA is in color emulation mode
 = 0200                      C	GV_HS	       EQU  0000001000000000B	     ;AN000;display requires sync check 1=Y
 = 0400                      C	GV_64K	       EQU  0000010000000000B	     ;AN000; 64K memory on EGA card
 = 0800                      C	GV_128K        EQU  0000100000000000B	     ;AN000;128K memory on EGA card
 = 1000                      C	GV_192K        EQU  0001000000000000B	     ;AN000;192K memory on EGA card
 = 2000                      C	GV_256K        EQU  0010000000000000B	     ;AN000;256K memory on EGA card
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-7
selchild.asm			;AN000;                                      

 = 4000                      C	GV_UM	       EQU  0100000000000000B	     ;AN000;error unknown moniter or config
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCGVIDO Status equates (GV_STAT2)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	GV_TVW	       EQU  0000000000000001B	     ;AN000;App is 'well behaved' under TV
 = 0002                      C	GV_P5140       EQU  0000000000000010B	     ;AN000;P12 with LCD
 = 0004                      C	GV_P5153       EQU  0000000000000100B	     ;AN000;P12 with color
 = 0008                      C	GV_P5151       EQU  0000000000001000B	     ;AN000;P12 with monochrome
 = 0010                      C	GV_COLOR       EQU  0000000000010000B	     ;AN000;color mode
 = 0020                      C	GV_TEXTGRAPH   EQU  0000000000100000B	     ;AN000;graphics mode
 = 0040                      C	GV_MONOP       EQU  0000000001000000B	     ;AN000;monochrome adapter is primary
 = 0080                      C	GV_CGAP        EQU  0000000010000000B	     ;AN000;CGA adapter is primary card
 = 0100                      C	GV_EGAP        EQU  0000000100000000B	     ;AN000;EGA adapter is primary card
 = 0200                      C	GV_TURBOP      EQU  0000001000000000B	     ;AN000;Turbo graphics adapter is primary
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCINPUT option equates.
			     C	;
			     C	;
			     C	; PCINPUT Option equates (IN_OPT)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	IN_UTRAN       EQU  0000000000000001B	     ;AN000;translate keys using user table
 = 0002                      C	IN_ADBCS       EQU  0000000000000010B	     ;AN000;DBCS option active
 = 0004                      C	IN_UDBCS       EQU  0000000000000100B	     ;AN000;DBCS processed using user table
 = 0008                      C	IN_DDBCS       EQU  0000000000001000B	     ;AN000;DBCS processed using DOS table
 = 0010                      C	IN_UMONO       EQU  0000000000010000B	     ;AN000;monocase keys using user table
 = 0020                      C	IN_AMONO       EQU  0000000000100000B	     ;AN000;monocase keys using USA algorithm
 = 0040                      C	IN_LICBX       EQU  0000000001000000B	     ;AN000;load ICB off:seg and exit
 = 0080                      C	IN_LVBOV       EQU  0000000010000000B	     ;AN000;use video buffer seg:off override
			     C						     ;
 = 0001                      C	IN_RANG        EQU  0000000000000001B	     ;AN000;ICB ID out of vector range
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; Input Field Control Block Equates
			     C	;
			     C	; ICB_OPT1  Option word one equates
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	ICB_ECL 	EQU  0000000000000001B	      ;AN000;set specified color on entry
 = 0002                      C	ICB_XCL 	EQU  0000000000000010B	      ;AN000;set specified color on exit
 = 0004                      C	ICB_USC 	EQU  0000000000000100B	      ;AN000;use color attribute string
 = 0008                      C	ICB_BEN 	EQU  0000000000001000B	      ;AN000;display entry delimiters
 = 0010                      C	ICB_BEX 	EQU  0000000000010000B	      ;AN000;display exit delimiters
 = 0020                      C	ICB_BOX 	EQU  0000000000100000B	      ;AN000;display border delimiters
 = 0040                      C	ICB_MUS 	EQU  0000000001000000B	      ;AN000;plus and minus display active
 = 0080                      C	ICB_SMU 	EQU  0000000010000000B	      ;AN000;starting default is negative
 = 0100                      C	ICB_OUT 	EQU  0000000100000000B	      ;AN000;display default and accept input
 = 0200                      C	ICB_CLR 	EQU  0000001000000000B	      ;AN000;clear default on first entry
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-8
selchild.asm			;AN000;                                      

 = 0400                      C	ICB_PSW 	EQU  0000010000000000B	      ;AN000;password
 = 0800                      C	ICB_RJU 	EQU  0000100000000000B	      ;AN000;right justification is activated
 = 1000                      C	ICB_SWK 	EQU  0001000000000000B	      ;AN000;switch entry dir key active
 = 2000                      C	ICB_RTA 	EQU  0010000000000000B	      ;AN000;right arrow editing
 = 4000                      C	ICB_LFA 	EQU  0100000000000000B	      ;AN000;left arrow editing
 = 8000                      C	ICB_BKS 	EQU  1000000000000000B	      ;AN000;backspace editing
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; ICB_OPT2  Option word two equates
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	ICB_INS 	EQU  0000000000000001B	      ;AN000;insert key editing
 = 0002                      C	ICB_DEL 	EQU  0000000000000010B	      ;AN000;delete key editing
 = 0004                      C	ICB_HOM 	EQU  0000000000000100B	      ;AN000;home key editing
 = 0008                      C	ICB_CTE 	EQU  0000000000001000B	      ;AN000;control + end key editing
 = 0010                      C	ICB_END 	EQU  0000000000010000B	      ;AN000;end key editing
 = 0020                      C	ICB_AXC 	EQU  0000000000100000B	      ;AN000;auto enter on cursor
 = 0040                      C	ICB_AXD 	EQU  0000000001000000B	      ;AN000;auto enter on data
 = 0080                      C	ICB_CSW 	EQU  0000000010000000B	      ;AN000;wrap the cursor end to end
 = 0100                      C	ICB_UPC 	EQU  0000000100000000B	      ;AN000;lower case to upper conversion
 = 0200                      C	ICB_UFK 	EQU  0000001000000000B	      ;AN000;use supplied keystroke as 1 key
 = 0400                      C	ICB_UDO 	EQU  0000010000000000B	      ;AN000;undo key replaces default
 = 0800                      C	ICB_TSD 	EQU  0000100000000000B	      ;AN000;thousands separators during inpu
 = 1000                      C	ICB_TSA 	EQU  0001000000000000B	      ;AN000;thousands separators after entry
 = 2000                      C	ICB_TSR 	EQU  0010000000000000B	      ;AN000;return thousand separators
 = 4000                      C	ICB_PAD 	EQU  0100000000000000B	      ;AN000;pad zeros to precision
 = 8000                      C	ICB_WRP 	EQU  1000000000000000B	      ;AN000;word wrap in windowed field
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; ICB_OPT3  Option word three equates
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	ICB_WIN        EQU  0000000000000001B	     ;AN000;windowing wrap of field
 = 0002                      C	ICB_WAE        EQU  0000000000000010B	     ;AN000;up and down arrow editing
 = 0004                      C	ICB_TBX        EQU  0000000000000100B	     ;AN000;exit if arrows reach top/bottom
 = 0008                      C	ICB_HOR        EQU  0000000000001000B	     ;AN000;horizontial windowing
 = 0010                      C	ICB_WHM        EQU  0000000000010000B	     ;AN000;full window Home key
 = 0020                      C	ICB_WEN        EQU  0000000000100000B	     ;AN000;full window End key
 = 0040                      C	ICB_WCE        EQU  0000000001000000B	     ;AN000;full window Ctrl-End key
 = 0080                      C	ICB_WDL        EQU  0000000010000000B	     ;AN000;full window Delete key
 = 0100                      C	ICB_WAR        EQU  0000000100000000B	     ;AN000;full window arrow keys
 = 0200                      C	ICB_WBS        EQU  0000001000000000B	     ;AN000;full window backspace key
 = 0400                      C	ICB_FGS        EQU  0000010000000000B	     ;AN000;use the ICB_STATUS status values
 = 0800                      C	ICB_SCR        EQU  0000100000000000B	     ;AN000;display of scroll flag active
 = 1000                      C	ICB_NUM        EQU  0001000000000000B	     ;AN000;display of numlock flag active
 = 2000                      C	ICB_CAP        EQU  0010000000000000B	     ;AN000;display of caps flag active
 = 4000                      C	ICB_FIN        EQU  0100000000000000B	     ;AN000;display of insert flag active
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; ICB_STATUS status word equates
			     C	;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-9
selchild.asm			;AN000;                                      

			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	ICB_SDEF       EQU  0000000000000001B	     ;AN000;default value changed
 = 0002                      C	ICB_SMUS       EQU  0000000000000010B	     ;AN000;minus sign active
 = 0004                      C	ICB_SPUS       EQU  0000000000000100B	     ;AN000;plus sign active
 = 0008                      C	ICB_STRU       EQU  0000000000001000B	     ;AN000;default value was truncated
 = 0010                      C	ICB_SSCR       EQU  0000000000010000B	     ;AN000;scroll lock flag on at exit/entry
 = 0020                      C	ICB_SNUM       EQU  0000000000100000B	     ;AN000;num lock flag on at exit/entry
 = 0040                      C	ICB_SCAP       EQU  0000000001000000B	     ;AN000;caps lock flag on at exit/entry
 = 0080                      C	ICB_SINS       EQU  0000000010000000B	     ;AN000;insert flag on at exit/entry
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCWWRAP option bit equates (WWP_OPT1)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	WWP_LEFTJUST   EQU  0000000000000001B	     ;AN000;process with left straight edge
 = 0002                      C	WWP_RIGHTJUST  EQU  0000000000000010B	     ;AN000;process with right straight edge
 = 0004                      C	WWP_LEFTNRIGHT EQU  0000000000000100B	     ;AN000;process with left and right edge
 = 0008                      C	WWP_HYPHEN     EQU  0000000000001000B	     ;AN000;hyphenate word(s)
 = 0010                      C	WWP_DESTBUFFER EQU  0000000000010000B	     ;AN000;Use specified destination buffer
 = 0020                      C	WWP_SRCBUFFER  EQU  0000000000100000B	     ;AN000;Use the same buf as the text
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCWWRAP error bit equates (WWP_ERROR)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	WWP_BUFSIZE    EQU  0000000000000001B	     ;AN000;buffer size is too small
 = 0002                      C	WWP_DUPSYMBOL  EQU  0000000000000010B	     ;AN000;WWP_HYSMBOL and WWP_SRCHYSMB
			     C						     ; are set to same character
 = 0004                      C	WWP_LONGWORD   EQU  0000000000000100B	     ;AN000;word is longer than WWP_WIDTH
 = 0008                      C	WWP_NOBUFFER   EQU  0000000000001000B	     ;AN000;no address to src or dest buf
 = 0010                      C	WWP_NOJUSTOPT  EQU  0000000000010000B	     ;AN000;no justification option was set
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; Help options (WR_HLPOPT, WR_HLPPAN, WR_HLPDIS)
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	HLP_CONT       EQU  0000000000000001B	     ;AN000;contextual help
 = 0002                      C	HLP_KEYS       EQU  0000000000000010B	     ;AN000;keys help
 = 0004                      C	HLP_HELP       EQU  0000000000000100B	     ;AN000;help-on-help
 = 0008                      C	HLP_INDX       EQU  0000000000001000B	     ;AN000;help index
 = 0010                      C	HLP_OVER       EQU  0000000000010000B	     ;AN000;help row and column overrides
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; Internal equates
			     C	;
			     C	;
			     C	; Internal keystroke equates
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 4800                      C	UPARROW        EQU  72*256		     ;AN000;up arrow
 = 5000                      C	DNARROW        EQU  80*256		     ;AN000;down arrow
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-10
selchild.asm			;AN000;                                      

 = 4B00                      C	LFARROW        EQU  75*256		     ;AN000;left arrow
 = 4D00                      C	RTARROW        EQU  77*256		     ;AN000;right arrow
 = 0049                      C	PGUP	       EQU  73			     ;AN000;
 = 0051                      C	PGDN	       EQU  81			     ;AN000;
 = 001B                      C	ESCAPE	       EQU  27			     ;AN000;
 = 000D                      C	ENTER	       EQU  13			     ;AN000;
 = 0020                      C	SPACE	       EQU  32			     ;AN000;
 = 0009                      C	TAB	       EQU   9			     ;AN000;
 = 003B                      C	F1	       EQU  59			     ;AN000;
 = 003C                      C	F2	       EQU  60			     ;AN000;
 = 003D                      C	F3	       EQU  61			     ;AN000;
 = 003E                      C	F4	       EQU  62			     ;AN000;
 = 003F                      C	F5	       EQU  63			     ;AN000;
 = 0040                      C	F6	       EQU  64			     ;AN000;
 = 0041                      C	F7	       EQU  65			     ;AN000;
 = 0042                      C	F8	       EQU  66			     ;AN000;
 = 0043                      C	F9	       EQU  67			     ;AN000;
 = 0044                      C	F10	       EQU  68			     ;AN000;
					INCLUDE CASTRUC.INC		;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	;	CASTRUC.INC
			     C	;
			     C	;
			     C	;
			     C	;
			     C	;
			     C	; PCPANEL PCB Structure
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	PCB_PB	       STRUC			     ;AN000;
 0000  0000                  C	PCB_OPT1       DW   0			     ;AN000;option word
 0002  00                    C	PCB_OPT2       DB   0			     ;AN000;option 2 added
 0003  00                    C	PCB_OPT3       DB   0			     ;AN000;option 3 added
 0004  00                    C	PCB_OPT4       DB   0			     ;AN000;option 4 added
 0005  0000                  C	PCB_UROW       DW   0			     ;AN000;row location of panel
 0007  0000                  C	PCB_UCOL       DW   0			     ;AN000;column location of panel
 0009  0000                  C	PCB_WIDTH      DW   0			     ;AN000;text char width of panel
 000B  0000                  C	PCB_MAXSIZE    DW   0			     ;AN000;Max poss panel sizing in text
 000D  0000                  C	PCB_CCBID      DW   0			     ;AN000;Index number of log color
 000F  0008[                 C	PCB_BORDER     DB   8  DUP(0)		     ;AN000;8 log border characters
	   00                C	
			 ]   C	
			     C	
 0017  0000                  C	PCB_COMPLEN    DW   0			     ;AN000;Length compress panel in mem
 0019  0000                  C	PCB_COMPOFF    DW   0			     ;AN000;Off addr compressed panel
 001B  0000                  C	PCB_COMPSEG    DW   0			     ;AN000;Seg addr compressed panel
 001D  0000                  C	PCB_EXPANDLEN  DW   0			     ;AN000;Length expanded panel in mem
 001F  0000                  C	PCB_EXPANDOFF  DW   0			     ;AN000;Off addr of expanded panel in
 0021  0000                  C	PCB_EXPANDSEG  DW   0			     ;AN000;Seg addr of expanded panel in
 0023  0000                  C	PCB_MIXEDLEN   DW   0			     ;AN000;Len of the mixed panel in mem
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-11
selchild.asm			;AN000;                                      

 0025  0000                  C	PCB_MIXEDOFF   DW   0			     ;AN000;Off addr of mixed panel in mem
 0027  0000                  C	PCB_MIXEDSEG   DW   0			     ;AN000;Seg addr of mixed panel in mem
 0029  0000                  C	PCB_LABELLEN   DW   0			     ;AN000;Len of the panel label
 002B  0000                  C	PCB_LABELOFF   DW   0			     ;AN000;Off addr of the panel label
 002D  0000                  C	PCB_LABELSEG   DW   0			     ;AN000;Seg addr of the panel label
 002F  0000                  C	PCB_LABELROW   DW   0			     ;AN000;Beg row of title relative to pan
 0031  0000                  C	PCB_LABELCOL   DW   0			     ;AN000;Beg col of title relative to pan
 0033  0000                  C	PCB_FPANLEN    DW   0			     ;AN000;Len of the panel stored in file
 0035  0000                  C	PCB_FNAMEOFF   DW   0			     ;AN000;Off address of full filespec
 0037  0000                  C	PCB_FNAMESEG   DW   0			     ;AN000;Seg address of full filespec
 0039  0000                  C	PCB_FTEXTLOCL  DW   0			     ;AN000;Lower off word of the beg off
 003B  0000                  C	PCB_FTEXTLOCH  DW   0			     ;AN000;High off word of the beg off
 003D  0000                  C	PCB_LROW       DW   0			     ;AN000;lower right corner (graphs only)
 003F  0000                  C	PCB_LCOL       DW   0			     ;AN000;lower left corner (graphs only)
 0041  00                    C	PCB_VERTSHADE  DB   0			     ;AN000;vertical shadow mask (grap only)
 0042  00                    C	PCB_HORZSHADE  DB   0			     ;AN000;horizontal shadow mask (graphs)
 0043  0000                  C	PCB_GFILLOFF   DW   0			     ;AN000;offset of wind char fill bit map
 0045  0000                  C	PCB_GFILLSEG   DW   0			     ;AN000;segmnt of wind char fill bit map
 0047  0000                  C	PCB_SCRSV1OFF  DW   0			     ;AN000;off scr buffer save 10H, 12H
 0049  0000                  C	PCB_SCRSV2OFF  DW   0			     ;AN000;off scr buffer save 11H
 004B  0000                  C	PCB_SCRSAVSEG  DW   0			     ;AN000;segment of screen buffer save
 004D  0000                  C	PCB_RESERVED   DW   0			     ;AN000;reserved
 004F  0000                  C	PCB_CHILDNUM   DW   0			     ;AN000;Number of child panel entries
 0051  0000                  C	PCB_CHILDOFF   DW   0			     ;AN000;Off address of child panel table
 0053  0000                  C	PCB_CHILDSEG   DW   0			     ;AN000;Seg address of child panel table
 0055                        C	PCB_PB	       ENDS			     ;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PCSLCTP Structure
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	SCB_PB	       STRUC			     ;AN000;
 0000  0000                  C	SCB_OPT1       DW   0			     ;AN000;option word one
 0002  0000                  C	SCB_OPT2       DW   0			     ;AN000;option word two
 0004  0000                  C	SCB_OPT3       DW   0			     ;AN000;option word three
 0006  0000                  C	SCB_OPT4       DW   0			     ;AN068;SEH option word four
 0008  0000                  C	SCB_FREQ       DW   0			     ;AN000;error beep frequency
 000A  0000                  C	SCB_ROW        DW   0			     ;AN000;upper left row
 000C  0000                  C	SCB_COL        DW   0			     ;AN000;upper left column
 000E  0000                  C	SCB_RELROW     DW   0			     ;AN000;relative upper left row
 0010  0000                  C	SCB_RELCOL     DW   0			     ;AN000;relative upper left column
 0012  0000                  C	SCB_WIDTH      DW   0			     ;AN000;line width
 0014  0000                  C	SCB_NUMLINE    DW   0			     ;AN000;number of lines
 0016  0000                  C	SCB_TOPELE     DW   0			     ;AN000;number of element on top
 0018  0000                  C	SCB_NUMELE     DW   0			     ;AN000;number of elements
 001A  0000                  C	SCB_CURELE     DW   0			     ;AN000;current element
 001C  0000                  C	SCB_NUMCOL     DW   0			     ;AN000;maximun number of cols to scroll
 001E  0000                  C	SCB_CURCOL     DW   0			     ;AN000;display offset into opt strings
 0020  0000                  C	SCB_NLISTCOL   DW   0			     ;AN000;num list txt col offset in strg
 0022  00                    C	SCB_NLISTSEP   DB   0			     ;AN000;numbered list separator
 0023  0000                  C	SCB_SKLEN      DW   0			     ;AN000;select keystroke string length
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-12
selchild.asm			;AN000;                                      

 0025  0000                  C	SCB_SKOFF      DW   0			     ;AN000;select keystroke string offset
 0027  0000                  C	SCB_SKSEG      DW   0			     ;AN000;select keystroke string segment
 0029  0000                  C	SCB_RLLEN      DW   0			     ;AN000;return/leave string length
 002B  0000                  C	SCB_RLOFF      DW   0			     ;AN000;return/leave string offset
 002D  0000                  C	SCB_RLSEG      DW   0			     ;AN000;return/leave string segment
 002F  0000                  C	SCB_RELEN      DW   0			     ;AN000;return/erase string length
 0031  0000                  C	SCB_REOFF      DW   0			     ;AN000;return/erase string offset
 0033  0000                  C	SCB_RESEG      DW   0			     ;AN000;return/erase string segment
 0035  0000                  C	SCB_UALEN      DW   0			     ;AN000;up arrow string length
 0037  0000                  C	SCB_UAOFF      DW   0			     ;AN000;up arrow string offset
 0039  0000                  C	SCB_UASEG      DW   0			     ;AN000;up arrow string segment
 003B  0000                  C	SCB_DALEN      DW   0			     ;AN000;down arrow string length
 003D  0000                  C	SCB_DAOFF      DW   0			     ;AN000;down arrow string offset
 003F  0000                  C	SCB_DASEG      DW   0			     ;AN000;down arrow string segment
 0041  0000                  C	SCB_LALEN      DW   0			     ;AN000;left arrow string length
 0043  0000                  C	SCB_LAOFF      DW   0			     ;AN000;left arrow string offset
 0045  0000                  C	SCB_LASEG      DW   0			     ;AN000;left arrow string segment
 0047  0000                  C	SCB_RALEN      DW   0			     ;AN000;right arrow string length
 0049  0000                  C	SCB_RAOFF      DW   0			     ;AN000;right arrow string offset
 004B  0000                  C	SCB_RASEG      DW   0			     ;AN000;right arrow string segment
 004D  0000                  C	SCB_PULEN      DW   0			     ;AN000;page-up string length
 004F  0000                  C	SCB_PUOFF      DW   0			     ;AN000;page-up string offset
 0051  0000                  C	SCB_PUSEG      DW   0			     ;AN000;page-up string segment
 0053  0000                  C	SCB_PDLEN      DW   0			     ;AN000;page-down string length
 0055  0000                  C	SCB_PDOFF      DW   0			     ;AN000;page-down string offset
 0057  0000                  C	SCB_PDSEG      DW   0			     ;AN000;page-down string segment
 0059  0000                  C	SCB_PILEN      DW   0			     ;AN000;pointer indicator strg length
 005B  0000                  C	SCB_PIOFF      DW   0			     ;AN000;pointer indicator string offset
 005D  0000                  C	SCB_PISEG      DW   0			     ;AN000;pointer indicator string segment
 005F  0000                  C	SCB_PICOL      DW   0			     ;AN000;pointer ind txt col off into stg
 0061  0000                  C	SCB_AILEN      DW   0			     ;AN000;active indicator strg length
 0063  0000                  C	SCB_AIOFF      DW   0			     ;AN000;active indicator string offset
 0065  0000                  C	SCB_AISEG      DW   0			     ;AN000;active indicator string segment
 0067  0000                  C	SCB_AICOL      DW   0			     ;AN000;active ind txt col off into stg
 0069  0000                  C	SCB_CILEN      DW   0			     ;AN000;check mark text string length
 006B  0000                  C	SCB_CIOFF      DW   0			     ;AN000;check mark text string offset
 006D  0000                  C	SCB_CISEG      DW   0			     ;AN000;check mark text string segment
 006F  0000                  C	SCB_CICOL      DW   0			     ;AN000;check mark offset into opt strg
 0071  0000                  C	SCB_UILEN      DW   0			     ;AN000;up indicator string length
 0073  0000                  C	SCB_UIOFF      DW   0			     ;AN000;up indicator string offset
 0075  0000                  C	SCB_UISEG      DW   0			     ;AN000;up indicator string segment
 0077  0000                  C	SCB_UIROW      DW   0			     ;AN000;up indicator row location
 0079  0000                  C	SCB_UICOL      DW   0			     ;AN000;up indicator column location
 007B  0000                  C	SCB_DILEN      DW   0			     ;AN000;down indicator string length
 007D  0000                  C	SCB_DIOFF      DW   0			     ;AN000;down indicator string offset
 007F  0000                  C	SCB_DISEG      DW   0			     ;AN000;down indicator string segment
 0081  0000                  C	SCB_DIROW      DW   0			     ;AN000;down indicator row location
 0083  0000                  C	SCB_DICOL      DW   0			     ;AN000;down indicator column locaiton
 0085  0000                  C	SCB_LILEN      DW   0			     ;AN000;left indicator string length
 0087  0000                  C	SCB_LIOFF      DW   0			     ;AN000;left indicator string offset
 0089  0000                  C	SCB_LISEG      DW   0			     ;AN000;left indicator string segment
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-13
selchild.asm			;AN000;                                      

 008B  0000                  C	SCB_LIROW      DW   0			     ;AN000;left indicator row location
 008D  0000                  C	SCB_LICOL      DW   0			     ;AN000;left indicator column location
 008F  0000                  C	SCB_RILEN      DW   0			     ;AN000;right indicator string length
 0091  0000                  C	SCB_RIOFF      DW   0			     ;AN000;right indicator string offset
 0093  0000                  C	SCB_RISEG      DW   0			     ;AN000;right indicator string segment
 0095  0000                  C	SCB_RIROW      DW   0			     ;AN000;right indicator row location
 0097  0000                  C	SCB_RICOL      DW   0			     ;AN000;right indicator column locaiton
 0099  0000                  C	SCB_NCRAYOFF   DW   0			     ;AN000;normal color array offset
 009B  0000                  C	SCB_NCRAYSEG   DW   0			     ;AN000;normal color array segment
 009D  0000                  C	SCB_CCBID      DW   0			     ;AN000;logical color index number
 009F  0000                  C	SCB_CCBVECNUM  DW   0			     ;AN000;number color index table entries
 00A1  0000                  C	SCB_CCBVECOFF  DW   0			     ;AN000;offset addr of color index table
 00A3  0000                  C	SCB_CCBVECSEG  DW   0			     ;AN000;segment addr of color index tabl
 00A5  0000                  C	SCB_INDEXOFF   DW   0			     ;AN000;index array offset
 00A7  0000                  C	SCB_INDEXSEG   DW   0			     ;AN000;index array segment
 00A9  0000                  C	SCB_SELOFF     DW   0			     ;AN000;element selection array offset
 00AB  0000                  C	SCB_SELSEG     DW   0			     ;AN000;element selection array segment
 00AD  0000                  C	SCB_OAOPT      DW   0			     ;AN000;option array option word
 00AF  0000                  C	SCB_OAPOFF     DW   0			     ;AN000;option array pointer offset
 00B1  0000                  C	SCB_OAPSEG     DW   0			     ;AN000;option array pointer segment
 00B3  0000                  C	SCB_OASLEN     DW   0			     ;AN000;option array string length
 00B5  0000                  C	SCB_OASSEG     DW   0			     ;AN000;option array string segment
 00B7  00                    C	SCB_OASTERMC   DB   0			     ;AN000;option array string term char
 00B8  0000                  C	SCB_KS	       DW   0			     ;AN000;keystroke
 00BA  0000                  C	SCB_LVBOFF     DW   0			     ;AN000;log vid buf offset override
 00BC  0000                  C	SCB_LVBSEG     DW   0			     ;AN000;log vid buf segment override
 00BE  0000                  C	SCB_FMOPT1     DW   0			     ;AN000;general purpose format hook opt
 00C0  0000                  C	SCB_FMOPT2     DW   0			     ;AN000;general purpose format hook opt
 00C2  0000                  C	SCB_TRANLEN    DW   0			     ;AN000;length of translation table
 00C4  0000                  C	SCB_TRANOFF    DW   0			     ;AN000;offset of translation table
 00C6  0000                  C	SCB_TRANSEG    DW   0			     ;AN000;segment of translation table
 00C8  0000                  C	SCB_MONOOFF    DW   0			     ;AN000;monocasing table offset
 00CA  0000                  C	SCB_MONOSEG    DW   0			     ;AN000;monocasing table segment
 00CC  0000                  C	SCB_DBCSLEN    DW   0			     ;AN000;dbcs table length
 00CE  0000                  C	SCB_DBCSOFF    DW   0			     ;AN000;dbcs table offset
 00D0  0000                  C	SCB_DBCSSEG    DW   0			     ;AN000;dbcs table segment
 00D2  0000                  C	SCB_FONTOFF    DW   0			     ;AN068;SEH offset of font descriptor block
 00D4  0000                  C	SCB_FONTSEG    DW   0			     ;AN068;SEH segment of font descriptor block
 00D6                        C	SCB_PB	       ENDS			     ;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	CHD_PB	STRUC				     ;AN000;
 0000  0000                  C	CHD_PCB DW	0			     ;AN000;child PCB element number
 0002  0000                  C	CHD_ROW DW	0			     ;AN000;row override
 0004  0000                  C	CHD_COL DW	0			     ;AN000;column override
 0006  0000                  C	CHD_INX DW	0			     ;AN000;color index pointer override
 0008  0000                  C		DW	0			     ;AN000;function key attribute
 000A  00 00                 C		DB	0,0			     ;AN000;keystroke associated with child
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-14
selchild.asm			;AN000;                                      

 000C  0000                  C		DW	0			     ;AN000;option word
 000E                        C	CHD_PB	ENDS				     ;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; Input Field Control Block (ICB) Structure
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	ICB_PB	       STRUC			     ;AN000;begin input field control block
 0000  0000                  C	ICB_OPT1       DW   0			     ;AN000;option word one
 0002  0000                  C	ICB_OPT2       DW   0			     ;AN000;option word two
 0004  0000                  C	ICB_OPT3       DW   0			     ;AN000;option word three
 0006  0000                  C	ICB_OPT4       DW   0			     ;AN000;option word four
 0008  0000                  C	ICB_ROW        DW   0			     ;AN000;upper left corner field row
 000A  0000                  C	ICB_COL        DW   0			     ;AN000;upper left corner field column
 000C  0000                  C	ICB_WIDTH      DW   0			     ;AN000;number of chars before wrapping
 000E  0000                  C	ICB_CCBID      DW   0			     ;AN000;color index number assigned
 0010  0000                  C	ICB_STATUS     DW   0			     ;AN000;default change/minus status
 0012  0000                  C	ICB_CURCHAR    DW   0			     ;AN000;cursor character pos in field
 0014  0000                  C	ICB_HRSTART    DW   0			     ;AN000;NEW ADD...Hor scroll support
 0016  0000                  C	ICB_SOUND      DW   0			     ;AN000;frequency of error beep
 0018  0000                  C	ICB_KEYRET     DW   0			     ;AN000;ASCII code of the key returned
 001A  0000                  C	ICB_ENDBYTE    DW   0			     ;AN000;length of data entered into fld
 001C  0000                  C	ICB_FIELDLEN   DW   0			     ;AN000;length of input field
 001E  0000                  C	ICB_FIELDOFF   DW   0			     ;AN000;offset of input field
 0020  0000                  C	ICB_FIELDSEG   DW   0			     ;AN000;segment of input field
 0022  0000                  C	ICB_ATTROFF    DW   0			     ;AN000;offset of color attribute buffer
 0024  0000                  C	ICB_ATTRSEG    DW   0			     ;AN000;segment of color attr buffer
 0026  0000                  C	ICB_DEFLEN     DW   0			     ;AN000;length of field's default value
 0028  0000                  C	ICB_DEFOFF     DW   0			     ;AN000;offset field's default value
 002A  0000                  C	ICB_DEFSEG     DW   0			     ;AN000;segment field's default value
 002C  0000                  C	ICB_RETLEN     DW   0			     ;AN000;length of return string
 002E  0000                  C	ICB_RETOFF     DW   0			     ;AN000;offset of return string
 0030  0000                  C	ICB_RETSEG     DW   0			     ;AN000;segment of return string
 0032  0000                  C	ICB_ALLLEN     DW   0			     ;AN000;length of allow chars
 0034  0000                  C	ICB_ALLOFF     DW   0			     ;AN000;offset of allow chars
 0036  0000                  C	ICB_ALLSEG     DW   0			     ;AN000;segment of allow chars
 0038  0000                  C	ICB_SKIPLEN    DW   0			     ;AN000;length of skip chars
 003A  0000                  C	ICB_SKIPOFF    DW   0			     ;AN000;offset of skip chars
 003C  0000                  C	ICB_SKIPSEG    DW   0			     ;AN000;segment of skip chars
 003E  0000                  C	ICB_ALL1LEN    DW   0			     ;AN000;length of allow once chars
 0040  0000                  C	ICB_ALL1OFF    DW   0			     ;AN000;offset of allow once chars
 0042  0000                  C	ICB_ALL1SEG    DW   0			     ;AN000;segment of allow once chars
 0044  0000                  C	ICB_DECPOS     DW   0			     ;AN000;precision of decimal point
 0046  0000                  C	ICB_RANUML1    DW   0			     ;AN000;low numeric range (low intrgr)
 0048  0000                  C	ICB_RANUMH1    DW   0			     ;AN000;low numeric range (high intrgr)
 004A  0000                  C	ICB_RANUML2    DW   0			     ;AN000;high numeric range (low intrgr)
 004C  0000                  C	ICB_RANUMH2    DW   0			     ;AN000;high numeric range (high intrgr)
 004E  0000                  C	ICB_MANDPROW   DW   0			     ;AN000;beginning row of minus and plus
 0050  0000                  C	ICB_MANDPCOL   DW   0			     ;AN000;beginning col of minus & plus
 0052  0000                  C	ICB_MINUSLEN   DW   0			     ;AN000;length of minus sign string
 0054  0000                  C	ICB_MINUSOFF   DW   0			     ;AN000;offset of minus sign string
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-15
selchild.asm			;AN000;                                      

 0056  0000                  C	ICB_MINUSSEG   DW   0			     ;AN000;segment of minus sign string
 0058  0000                  C	ICB_PLUSLEN    DW   0			     ;AN000;length of plus sign string
 005A  0000                  C	ICB_PLUSOFF    DW   0			     ;AN000;offset of plus sign string
 005C  0000                  C	ICB_PLUSSEG    DW   0			     ;AN000;segment of plus sign string
 005E                        C	ICB_PB	       ENDS			     ;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
					INCLUDE MACROS.INC		;AN000;
			     C	;;****************************************************************************
			     C	;;     Assembler MACROS for use with SELECT.
			     C	;;     File: MACROS.INC
			     C	;;     Latest Change Date: July 28, 1987
			     C	;;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.
			     C	;;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing
			     C	;;	 parameters.  The string is defined below.
			     C	;;		   DW  count
			     C	;;		   DB  "string_variable",?
			     C	;;
			     C	;;	 COUNT is the length of the string and is a word.
			     C	;;	 It is necessary to follow the string with at least one byte for the
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.
			     C	;;
			     C	;;****************************************************************************
			     C	;;****************************************************************************
			     C	;;  Macro Change History.
			     C	;;
			     C	;;  June 18, 1987 - Split MACROS.INC into 5 smaller files.  They are:
			     C	;;			     MACROS.INC
			     C	;;			     MACROS2.INC
			     C	;;			     MACROS3.INC
			     C	;;			     MACROS4.INC
			     C	;;			     MACROS5.INC
			     C	;;		   At the end of the files, there is an INCLUDE statement
			     C	;;		   to include the next file.  Therefore, the modules which
			     C	;;		   use these macros do not have to add more include statements.
			     C	;;		   The only one that must have an INCLUDE statement is
			     C	;;		   MACROS.INC.
			     C	;;
			     C	;;		  - Removed the PUSHH and POPP macros from the other macro
			     C	;;		   definitions.
			     C	;;
			     C	;;  June 22, 1987 - Added the SCAN_PARAMETERS macro.
			     C	;;
			     C	;;  June 24, 1987 - Added the PREPARE_FILE, WRITE_LINE and SAVE_FILE macros.
			     C	;;		  - Revised the SCAN_PARAMETERS macro to read two of the
			     C	;;		    parameters from a file instead of the command line.
			     C	;;
			     C	;;  June 26, 1987 - Changed the EXEC_PROGRAM macros to perform a call to
			     C	;;		    EXEC_PROGRAM_ROUTINE which performs the same tasks are the
			     C	;;		    previously defined macro.  EXEC_PROGRAM_ROUTINE was added
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-16
selchild.asm			;AN000;                                      

			     C	;;		    to ROUTINES.INC.
			     C	;;
			     C	;;  June 29, 1987 - Changed the GET_COUNTRY_INDEX to a subroutine call to
			     C	;;		    GET_CNTY_INDEX_ROUTINE.  The routine has been changed
			     C	;;		    to get the new information from the structure, NUM_DESIGNATES,
			     C	;;		    CPSW_STAT, and RESERVED_1.
			     C	;;		   - Changed GET_COUNTRY_DEFAULTS, GET_KEYBOARD_INDEX and
			     C	;;		     GET_KEYBOARD macros to perform subroutines calls.
			     C	;;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-17
selchild.asm			;AN000;                                      

			     C	PAGE					;AN000;
			     C	INCLUDE  MAC_EQU.INC			;AN000;
			     C	INCLUDE VERSIONA.INC				;AN047;SEH check DOS version in VERSIONA.INC instead
				 of in MAC_EQU.INC
			     C	
 = 0004                      C	major_version	    equ     4	    ;Major DOS version
 = 0000                      C	minor_version	    equ     00	    ;Minor DOS Version
			     C	
 = 0004                      C	expected_version    equ     (MINOR_VERSION SHL 8)+MAJOR_VERSION
			     C	
			     C	
			     C	       ;******************************
			     C	       ;Each assembler program should:
			     C	       ;  mov ah,030h			;DOS Get Version function
			     C	       ;  int 021h			;Version ret. in AX,minor version first
			     C	       ;  cmp ax,expected_version	;ALL utilities should check for an
			     C	       ;  jne error_handler		; EXACT version match.
			     C	       ;******************************
			     C	
			     C	
 = 0001                      C	TRUE			=	  1		;AN000;
 = 0000                      C	FALSE			=	  0		;AN000;
			     C	
			     C	; Equates from PRN_DEF.ASM
			     C	
 = 0001                      C	ERR_NOT_ENOUGH_MEM	EQU	  1		;AN000; There was not enough memory to build the nam
				es table
 = 0002                      C	ERR_OPENING_FILE	EQU	  2		;AN000; Error opening a file
 = 0003                      C	ERR_READING_FILE	EQU	  3		;AN000; Error reading from a file
 = 0004                      C	ERR_FINDING_VALUE	EQU	  4		;AN000; Error finding the number of prn defs at the 
				beginning of the file
 = 0005                      C	ERR_LINE_TOO_LONG	EQU	  5		;AN000; There was a line too long for the buffer
 = 0006                      C	ERR_FINDING_NAME	EQU	  6		;AN000; There was an error locating a printer name a
				fter a P or S
 = 0007                      C	ERR_ACCESSING_FILE	EQU	  7		;AN000; There was an error updating the file pointer
 = 0008                      C	ERR_TOO_MANY_DEFS	EQU	  8		;AN000; There are too many defintion in the file
 = 0009                      C	ERR_NUMBER_MATCH	EQU	  9		;AN000; The number of actual definition do not match
				 the number expected
 = 000A                      C	ERR_ALLOCATING_MEM	EQU	  10		;AN000; There was an error allocating memory
 = 000B                      C	ERR_CDP_CPP		EQU	  11		;AN000; A prn defn had either a CDP or CPP but not b
				oth
 = 000C                      C	ERR_PRN_DEFN		EQU	  12		;AN000; There was an error in a printer definition
			     C	
			     C	; Equates from MACROS.INC			;
			     C	; Equates from MACROS2.INC			;
			     C	;MAJOR_DOS_VER		 EQU	   4		;AC047;SEH check now done in VERSIONA.INC ;AC045;SEH
			     C	;MINOR_DOS_VER		 EQU	   00		;AC047;SEH ;AC045;SEH version update to DOS 4.00
			     C							;
			     C	; Equates from MACROS3.INC			;
 = 0002                      C	PRESENT_WITH_PART	EQU	  2		;AN000;
 = 0001                      C	PRESENT_WITHOUT_PART	EQU	  1		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-18
selchild.asm			;AN000;                                      

 = 0000                      C	NOT_PRESENT		EQU	  0		;AN000;
 = 0000                      C	NO_EDOS_SPACE		EQU	  0		;AN000;
 = 0001                      C	FREE_EDOS_SPACE 	EQU	  1		;AN000;
 = 0002                      C	NO_EDOS_BUT_SPACE	EQU	  2		;AN000;
			     C							;
 = 0001                      C	M_DOS_EXISTS		EQU	  1H		;AN000;
 = 0002                      C	M_EDOS_EXISTS		EQU	  2H		;AN000;
 = 0004                      C	M_LOGICAL_EXISTS	EQU	  4H		;AN000;
 = 0008                      C	M_EDOS_SPACE		EQU	  8H		;AN000;
 = 0010                      C	M_FREE_SPACE		EQU	 10H		;AN000;
 = 0003                      C	M_DOS_EDOS_PART 	EQU	  3H		;AN000;
			     C							;
 = 0001                      C	DISKETTES_EXIST 	EQU	  1		;AN000;
 = 0002                      C	MAX_NUM_DISKETTE	EQU	  2		;AN000;
			     C							;
 = 0001                      C	TABLE_ONE		EQU	  1		;AN000;
 = 0002                      C	TABLE_TWO		EQU	  2		;AN000;
			     C							;
 = 0000                      C	DATA_VALID		EQU	  0		;AN000;
 = 0001                      C	DATA_INVALID		EQU	  1		;AN000;
			     C							;
 = 0000                      C	USE_DEFAULT		EQU	  0		;AN000;
 = 0001                      C	DO_NOT_USE_DEFAULT	EQU	  1		;AN000;
			     C							;
 = 0003                      C	DEF_DEST_A		EQU	  3		;AN111;JW
 = 0002                      C	DEF_DEST_B		EQU	  2		;AN000;
 = 0001                      C	DEF_DEST_C		EQU	  1		;AN000;
			     C							;
 = 0050                      C	E_1440_TRACKS		EQU	  80		;AN000;
 = 0012                      C	E_1440_SECTORS		EQU	  18		;AN000;
			     C							;
			     C	; Equates from MACROS4.INC			;
			     C	; Equates from MACROS5.INC			;
 = 0001                      C	B_DRIVE 		EQU	  1		;AN000;
 = 0002                      C	C_DRIVE 		EQU	  2		;AN000;
 = 0003                      C	A_DRIVE 		EQU	  3		;AN111;JW
 = 0003                      C	LEN_ALT_KYBD_ID 	EQU	  3		;AN000;
			     C	; Equates from MACROS6.INC			;
			     C							;
			     C							;
			     C	; Equates from ROUTINES.ASM			;
 = 0001                      C	STDOUT			EQU	  1		;AN000;
 = 0002                      C	STDERR			EQU	  2		;AN000;
 = 0001                      C	EXEC_DIR		EQU	  1		;AN000;
 = 0000                      C	EXEC_NO_DIR		EQU	  0		;AN000;
			     C							;
			     C	; Equates from SELECT.SKL			;
 = 0001                      C	MSG_INV_DOS		    EQU       1 	;AN000;
 = 0004                      C	MSG_INV_BOOT_MEDIA	    EQU       4 	;AN000;
 = 0005                      C	MSG_INV_DISK_MEDIA	    EQU       5 	;AN000;
 = 0006                      C	MSG_INV_PARMS		    EQU       6 	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-19
selchild.asm			;AN000;                                      

 = 0007                      C	MSG_INV_INSTALL 	    EQU       7 	;AN000;
 = 0008                      C	MSG_LOADING		    EQU       8 	;AN000;
 = 0009                      C	MSG_RELOADING		    EQU       9 	;AN000;
			     C							;
			     C	; Equates for SEL_FLG (DB) in PRN_DEF.ASM
			     C	; SEL_FLG   DB	0
 = 0080                      C	INSTALLRW		EQU	  80H		;AN000;The INSTALL diskette is read/write
			     C	
			     C	;;****************************************************************************
			     C	;;
			     C	;;   PUSHH:	pushes the listed registers on the stack
			     C	;;
			     C	;;   SYNTAX:   PUSHH <register list>
			     C	;;
			     C	;;   INPUT:    register list = AX, BX, CX, DX, SI, DI, BP, SS, SP, CS, DS, ES
			     C	;;
			     C	;;   OUTPUT:   none
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   PUSHH  ALLOWS THE PROGRAMER TO SPECIFY A LIST OF REGISTER TO
			     C	;;   BE PUSHED ON A SINGLE LINE.
			     C	;;
			     C	;;****************************************************************************
			     C	PUSHH	MACRO	REG_LIST		;;AN000;
			     C		IRP	REG,<REG_LIST>		;;AN000;
			     C		PUSH	REG			;;AN000; save registers
			     C		ENDM				;;AN000;
			     C			ENDM			;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   POPP:     pops the listed registers on the stack
			     C	;;
			     C	;;   SYNTAX:   POPP <register list>
			     C	;;
			     C	;;   INPUT:    register list = AX, BX, CX, DX, SI, DI, BP, SS, SP, CS, DS, ES
			     C	;;
			     C	;;   OUTPUT:   none
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   POPP ALLOWS THE PROGRAMER TO SPECIFY A LIST OF REGISTER TO
			     C	;;   BE POPPED ON A SINGLE LINE.
			     C	;;
			     C	;;****************************************************************************
			     C	POPP	MACRO	REG_LIST		;;AN000;
			     C		IRP	REG,<REG_LIST>		;;AN000;
			     C		POP	REG			;;AN000; return registers to initial state
			     C		ENDM				;;AN000;
			     C			ENDM			;;AN000;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-20
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   DOSCALL:  DOS interrupt 21 function call
			     C	;;
			     C	;;   SYNTAX:   DOSCALL
			     C	;;
			     C	;;   INPUT:    none
			     C	;;
			     C	;;   OUTPUT:   none
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   DOSCALL INVOKES THE DOS INTERRUPT 21 FUNCTION CALL.
			     C	;;   THE AH REGISTER MUST ALREADY BE LOADED WITH THE
			     C	;;   REQUIRED VALUE.
			     C	;;
			     C	;;****************************************************************************
			     C	DOSCALL MACRO				;;AN000;
			     C		INT	21H			;;AN000; call to DOS
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   INIT_VAR: Load a variable with an immediate value.
			     C	;;
			     C	;;   SYNTAX:  INIT_VAR	variable, expression
			     C	;;
			     C	;;   INPUT:   variable = Address of a variable.
			     C	;;	      expression = The immediate value to load into the variable.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION:    The memory variable identified by var is assigned the
			     C	;;	 immediate value specified in immed.
			     C	;;
			     C	;;****************************************************************************
			     C	INIT_VAR   MACRO  VARIABLE,EXPRESSION		;;AN000;
			     C		MOV	VARIABLE,EXPRESSION		;;AN000; move expression into variable
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   COPY_WORD: Copy a word variable to another word variable.
			     C	;;
			     C	;;   SYNTAX:  COPY_WORD  var_dest, var_src
			     C	;;
			     C	;;   INPUT:   var_dest - The destination word variable.
			     C	;;	      var_src - The source word variable.
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The contents of var_src remain intact.
			     C	;;		 The contents of AX is destroyed.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-21
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;************************************************************************
			     C	COPY_WORD  MACRO  VAR_DEST, VAR_SRC		;;AN000;
			     C		MOV	AX, VAR_SRC			;;AN000;
			     C		MOV	VAR_DEST,AX			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   COPY_BYTE: Copy a byte variable to another byte variable.
			     C	;;
			     C	;;   SYNTAX:  COPY_WORD  var_dest, var_src
			     C	;;
			     C	;;   INPUT:   var_dest - The destination byte variable.
			     C	;;	      var_src - The source byte variable.
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The contents of var_src remain intact.
			     C	;;		 The contents of AL is destroyed.
			     C	;;
			     C	;;************************************************************************
			     C	COPY_BYTE  MACRO  VAR_DEST, VAR_SRC		;;AN000;
			     C		MOV	AL, VAR_SRC			;;AN000;
			     C		MOV	VAR_DEST,AL			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   COMP_WORDS:  Compare two 16 bit memory variable.
			     C	;;
			     C	;;   SYNTAX:  COMP_WORDS  var_dest, var_src
			     C	;;
			     C	;;   INPUT:   var_dest - The destination memory variable (16 bits)
			     C	;;	      var_src - The source memory variable	 (16 bits)
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The two 16 bit memory variables are compared and the status
			     C	;;	 flags are updated.  Refer to the ASSEMBLER reference for more details.
			     C	;;
			     C	;;************************************************************************
			     C	COMP_WORDS	MACRO	VAR_DEST, VAR_SRC	;;AN000;
			     C							;
			     C		MOV	AX, VAR_DEST			;;AN000;
			     C		CMP	AX, VAR_SRC			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   COMP_BYTES:  Compare two 8 bit memory variables.
			     C	;;
			     C	;;   SYNTAX:  COMP_BYTES  var_dest, var_src
			     C	;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-22
selchild.asm			;AN000;                                      

			     C	;;   INPUT:   var_dest - The destination memory variable ( 8 bits)
			     C	;;	      var_src - The source memory variable	 ( 8 bits)
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The two 8 bit memory variables are compared and the status
			     C	;;	 flags are updated.  Refer to the ASSEMBLER reference for more details.
			     C	;;
			     C	;;************************************************************************
			     C	COMP_BYTES	MACRO	VAR_DEST, VAR_SRC	;;AN000;
			     C							;
			     C		MOV	AL, VAR_DEST			;;AN000;
			     C		CMP	AL, VAR_SRC			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   INC_VAR:  Increment the specified memory variable by 1.
			     C	;;
			     C	;;   SYNTAX:  INC_VAR  var_dest
			     C	;;
			     C	;;   INPUT:   var_dest - The destination memory variable.
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The memory variable is incremented by one.
			     C	;;
			     C	;;************************************************************************
			     C	INC_VAR 	MACRO	VAR_DEST		;;AN000;
			     C		INC	VAR_DEST			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   DEC_VAR:  Decrement the specified memory variable by 1.
			     C	;;
			     C	;;   SYNTAX:  DEC_VAR  var_dest
			     C	;;
			     C	;;   INPUT:   var_dest - The destination memory variable.
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:  The memory variable is decremented by one.
			     C	;;
			     C	;;************************************************************************
			     C	DEC_VAR 	MACRO	VAR_DEST		;;AN000;
			     C		DEC	VAR_DEST			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   INIT:    initializes the DS to the beginning of the data
			     C	;;
			     C	;;   SYNTAX:  INIT
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-23
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   INPUT:   none
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THE MACRO SIMPLY SETS UP THE DATA SEGMENT.
			     C	;;
			     C	;;****************************************************************************
			     C	INIT	MACRO				;;AN000;
			     C		PUSH	DS			;;AN000;
			     C		XOR	AX,AX			;;AN000; make AX = 0
			     C		PUSH	AX			;;AN000;
			     C		MOV	AX,DATA 		;;AN000;
			     C		MOV	DS,AX			;;AN000; initialize DS reg to beginning of data
			     C		ENDM				;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   MERGE_STRING: merges 2 string blocks together to form a third one
			     C	;;
			     C	;;   SYNTAX:  MERGE_STRING  name_dest, immed_max, name_src1, name_src2
			     C	;;
			     C	;;   INPUT:   name_dest - Destination string variable (ASCII-N format)
			     C	;;	      immed_max - Maximum length of destination string
			     C	;;	      name_src1 - Source string variable 1 (ASCII-N format)
			     C	;;	      name_src2 - Source string variable 2 (ASCII-N format)
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION:
			     C	;;	 The string pointed to by name_scr1 is copied to the destination string
			     C	;;	 first followed by the string pointed to by name_scr2.	If the
			     C	;;	 destination string is not long enough to hold the new string, then
			     C	;;	 the strings are copied until all the space is used up.
			     C	;;	 It is assumed that the input strings and the output string
			     C	;;	 are in the current data segment.
			     C	;;
			     C	;;
			     C	;;**************************************************************************************
			     C	MERGE_STRING   MACRO   NAME_DEST, IMMED_MAX, NAME_SRC1, NAME_SRC2 ;;AN000;
			     C	
			     C		LEA	DI, NAME_DEST				;;AN000;
			     C		LEA	SI, NAME_SRC1				;;AN000;
			     C		MOV	AX, IMMED_MAX				;;AN000;
			     C		CALL	COPY_ROUTINE				;;AN000;
			     C		MOV	CX, IMMED_MAX				;;AN000;
			     C		LEA	DI, NAME_DEST				;;AN000;
			     C		LEA	SI, NAME_SRC2				;;AN000;
			     C		CALL	APPEND_STRING_ROUTINE			;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-24
selchild.asm			;AN000;                                      

			     C		ENDM						;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   APPEND_STRING:  Appends an ASCII-N string to the specified string.
			     C	;;
			     C	;;   SYNTAX:  APPEND_STRING  name_dest, immed_max, name_src
			     C	;;
			     C	;;   INPUT:   name_dest - Destination string variable (ASCII-N format)
			     C	;;	      immed_max - Maximum length of destination string
			     C	;;	      name_src	- Source string variable   (ASCII-N format)
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION:
			     C	;;	 The ASCII-N string text defined in name_scr is appended to the
			     C	;;	 end of name_dest.
			     C	;;
			     C	;;**************************************************************************************
			     C	APPEND_STRING	MACRO	NAME_DEST, IMMED_MAX, NAME_SRC	;;AN000;
			     C		MOV	CX, IMMED_MAX				;;AN000;
			     C		LEA	DI, NAME_DEST				;;AN000;
			     C		LEA	SI, NAME_SRC				;;AN000;
			     C		CALL	APPEND_STRING_ROUTINE			;;AN000;
			     C		ENDM						;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   COPY_STRING: Copy ASCII-N string text.
			     C	;;
			     C	;;   SYNTAX:  MOVE_STRING  name_dest, immed_max, name_src
			     C	;;
			     C	;;   INPUT:
			     C	;;	 name_dest - The destination string variable.
			     C	;;	 immed_max - The maximum length of destination string.
			     C	;;	 name_src - source string veriable (ASCII-N format)
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION: ASCII-N string text defined in name_src is copied to name_dest.
			     C	;;	 The number of characters copied to name_dest will not exceed immed_max.
			     C	;;
			     C	;;**************************************************************************
			     C	COPY_STRING MACRO  NAME_DEST, IMMED_MAX, NAME_SRC	;;AN000;
			     C								;
			     C		LEA	DI, NAME_DEST				;;AN000;
			     C		LEA	SI, NAME_SRC				;;AN000;
			     C		MOV	AX, IMMED_MAX				;;AN000;
			     C		CALL	COPY_ROUTINE				;;AN000;
			     C		ENDM						;;AN000;
			     C	;;**************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-25
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   PUSH_HEADING: Push screen label address to the SELECT stack
			     C	;;
			     C	;;   SYNTAX:  PUSH_HEADING  immed_lab
			     C	;;
			     C	;;   INPUT:
			     C	;;	 immed_lab - screen label
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION: The screen label address is pushed onto the SELECT stack
			     C	;;	 provided the numher of entries on the stack will not exceed the
			     C	;;	 maximum.  Error will NOT be generated if the function was not
			     C	;;	 successful.
			     C	;;
			     C	;;****************************************************************************
			     C	PUSH_HEADING	MACRO	IMMED_LAB			;;AN000;
			     C		MOV	AX, OFFSET IMMED_LAB			;;AN000;
			     C		CALL	PUSH_ROUTINE				;;AN000;
			     C		ENDM						;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   POP_HEADING: Pop screen label address from the SELECT stack and jump
			     C	;;		  to the label address.
			     C	;;
			     C	;;   SYNTAX:  POP_HEADING
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION: The screen label address from the SELECT stack is poped
			     C	;;	 if the number of entries on the stack is not zero.  If the number
			     C	;;	 of entries is zero, the EXIT_DOS screen label address will be used.
			     C	;;	 A jump to the screen label address is also performed.
			     C	;;
			     C	;;****************************************************************************
			     C	POP_HEADING	MACRO					;;AN000;
			     C		CALL	POP_ROUTINE				;;AN000;
			     C		JMP	SI					;;AN000;
			     C		ENDM						;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   DIR: get current directory
			     C	;;
			     C	;;   SYNTAX:  DIR  dir_buffer
			     C	;;
			     C	;;   INPUT:   dir_buffer = POINTER TO A  64-BYTE USER MEMORY AREA
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-26
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = N/A, successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   DIR PLACES THE FULL PATH NAME OF THE CURRENT DIRECTORY FOR THE
			     C	;;   SPECIFIED DRIVE IN THE BUFFER.
			     C	;;   THE RETURNING STRING IS AN ASCIIZ STRING AND IT DOES NOT
			     C	;;   HAVE THE DRIVE LETTER OR A BACKSLASH.
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;****************************************************************************
			     C	DIR   MACRO   DIR_BUFFER			;;AN000;
			     C	    CALL HOOK_INT_24				;;AN000;
			     C		MOV	SI,OFFSET DIR_BUFFER		;;AN000; pointer to 64 byte user area
			     C		MOV	DL,0				;;AN000; give directory of the default drive
			     C		MOV	AH,47H				;;AN000; get current directory
			     C		DOSCALL 				;;AN000;
			     C	    CALL RESTORE_INT_24 			;;AN000;
			     C	      ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   MAKE_DIR: Make a Directory
			     C	;;
			     C	;;   SYNTAX:   MAKE_DIR directory
			     C	;;
			     C	;;   INPUT:    directory = An ASCII-N STRING GIVING THE REQUIRED
			     C	;;			   PATH
			     C	;;   OUTPUT:	CY = 0, AX = undefined,  call was successful
			     C	;;		CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THE DIRECTORY IS MADE USING THE DOS INT 21H (AH=39H) CALL.
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;
			     C	;;****************************************************************************
			     C	MAKE_DIR MACRO	dir_len 		;;AN000;
			     C	    CALL HOOK_INT_24			;;AN000;
			     C	
			     C		MOV	DI,OFFSET dir_len	;;AN000;
			     C		CALL	POS_ZERO		;;AN000; position the '0' at the end of the path
			     C		MOV	DX,OFFSET dir_len[2]	;;AN000; advance pointer to beginning of path
			     C		MOV	AH,39H			;;AN000; make directory interrupt
			     C		DOSCALL 			;;AN000; call to DOS interrupt 21
			     C		CALL  RESTORE_INT_24		;;AN000;
			     C		ENDM				;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-27
selchild.asm			;AN000;                                      

			     C	;;**************************************************************************
			     C	;;
			     C	;;   MAKE_DIR_PATHS: Create the specified directory including all the specified
			     C	;;		 sub-directories if they do not exist.
			     C	;;
			     C	;;   SYNTAX:  MAKE_DIR_PATHS  name_dir
			     C	;;
			     C	;;   INPUT:
			     C	;;	 name_dir - Directory pathname in ASCII-N string format.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0 Success
			     C	;;	 CY = 1 Error - AX will contain an error code.
			     C	;;
			     C	;;   OPERATION: The directory pathname is created.
			     C	;;	 If the drive letter and colon are not followed by a '\', then the
			     C	;;	 macro will start creating the directories from the default directory.
			     C	;;	 If they are followed by a '\', then the macro will start at the root.
			     C	;;
			     C	;;
			     C	;;****************************************************************************
			     C	MAKE_DIR_PATHS	MACRO	NAME_DIR	;;AN000;
			     C	
			     C		MOV	BX, OFFSET NAME_DIR	;;AN000; Address of the ASCII-N string
			     C		CALL	MAKE_DIR_PATHS_ROUTINE	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   REMOVE_DIR: Remove Directory
			     C	;;
			     C	;;   SYNTAX:   REMOVE_DIR directory
			     C	;;
			     C	;;   INPUT:    directory = An ASCII-N STRING giving the REQUIRED PATH
			     C	;;
			     C	;;   OUTPUT:   CY = 0, AX = undefined,	successful
			     C	;;	       CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THE DIRECTORY IS REMOVED USING THE DOS INT 21H (AH=3AH) CALL.
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;   It is assumed that the string is located in the data segment
			     C	;;
			     C	;;****************************************************************************
			     C	REMOVE_DIR   MACRO   dir_len		;;AN000;
			     C	
			     C	    CALL HOOK_INT_24			;;AN000;
			     C		MOV	DI,OFFSET dir_len	;;AN000;
			     C		CALL	POS_ZERO		;;AN000; position the '0' at the end of the path
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-28
selchild.asm			;AN000;                                      

			     C		MOV	DX,OFFSET dir_len[2]	;;AN000; advance pointer to beginning of path
			     C		MOV	AH,3AH			;;AN000; remove the specified directory
			     C		DOSCALL 			;;AN000; call to DOS interrupt 21
			     C		CALL  RESTORE_INT_24		;;AN000;
			     C		ENDM				;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   CHANGE_DIR: Change the current directory to the specified directory.
			     C	;;
			     C	;;   SYNTAX:  CHANGE_DIR  name_dir
			     C	;;
			     C	;;   INPUT:
			     C	;;	 name_dir - directory pathname in ASCII-N string format.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0 Success
			     C	;;	 CY = 1 Error  AX will contain an error code
			     C	;;
			     C	;;   OPERATION: The directory pathname identified by the ASCII-N string
			     C	;;	 becomes the default directory.
			     C	;;
			     C	;;****************************************************************************
			     C	CHANGE_DIR	MACRO	NAME_DIR	;;AN000;
			     C	
			     C	    CALL HOOK_INT_24			;;AN000;
			     C		MOV	DI,OFFSET NAME_DIR	;;AN000; Get the offset of the string
			     C		CALL	POS_ZERO		;;AN000; Make into an ASCII-Z string
			     C		MOV	DX,OFFSET NAME_DIR+2	;;AN000; Get the start of the string
			     C		MOV	AH,3BH			;;AN000; DOS function call number
			     C		DOSCALL 			;;AN000;
			     C	    CALL RESTORE_INT_24 		;;AN000;
			     C		ENDM				;;AN000;
			     C	INCLUDE  MACROS2.INC			;;AN000;
			     C	;;****************************************************************************
			     C	;;     Assembler MACROS for use with SELECT.
			     C	;;     File: MACROS2.INC
			     C	;;     Latest Change Date: August 04, 1987
			     C	;;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.
			     C	;;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing
			     C	;;	 parameters.  The string is defined below.
			     C	;;		   DW  count
			     C	;;		   DB  "string_variable",?
			     C	;;
			     C	;;	 COUNT is the length of the string and is a word.
			     C	;;	 It is necessary to follow the string with at least one byte for the
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.
			     C	;;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-29
selchild.asm			;AN000;                                      

			     C	page					;AN000;
			     C	;;************************************************************************
			     C	;;
			     C	;;   CLOSE_FILE: Close File
			     C	;;
			     C	;;   SYNTAX:  CLOSE_FILE  handle
			     C	;;
			     C	;;   INPUT:   handle = The handle of the file to close.
			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = undefined,  successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THIS MACROS CLOSES THE FILE WITH THE GIVEN FILE HANDLE.
			     C	;;   IT MAKES USE OF INT 21 (AH=3EH).
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;**************************************************************************
			     C	CLOSE_FILE   MACRO   HANDLE			 ;;AN000;
			     C							 ;;
			     C	    MOV  BX, HANDLE				 ;;AN000;
			     C	    CALL FAR PTR CLOSE_FILE_ROUTINE		 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************
			     C	;;
			     C	;;   CREATE_FILE: Create new File
			     C	;;
			     C	;;   SYNTAX:  CREATE_FILE  name_file, immed_attr, var_handle
			     C	;;
			     C	;;   INPUT:   name_file - filename in ASCII-N string format.
			     C	;;	      immed_attr - file attribute
			     C	;;
			     C	;;   OUTPUT:  CY = 0 Success: var_handle contain the file handle
			     C	;;	      CY = 1 Error: AX contains as error code
			     C	;;
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   CREATE_FILE CREATES A FILE WITH THE GIVEN NAME USING INT 21H (AH=5BH)
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;**************************************************************************
			     C	CREATE_FILE  MACRO   NAME_FILE, IMMED_ATTR, VAR_HANDLE ;;AN000;
			     C	    LEA  DI, NAME_FILE				;;AN000;
			     C	    MOV  CX, IMMED_ATTR 			;;AN000;
			     C	    CALL CREATE_FILE_ROUTINE			;;AN000;
			     C	    MOV  VAR_HANDLE, AX 			;;AN000;
			     C	    ENDM					;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-30
selchild.asm			;AN000;                                      

			     C	;;****************************************************************************
			     C	;;
			     C	;;   ERASE_FILE: Erase File
			     C	;;
			     C	;;   SYNTAX:  ERASE_FILE  filename
			     C	;;
			     C	;;   INPUT:   filename = POINTER TO ASCII-N STRING - FILE NAME
			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = undefined,  successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   ERASE_FILE ERASES THE FILE USING INT 21H (AH=41H).
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;****************************************************************************
			     C	ERASE_FILE   MACRO   FILE_NAME			;;AN000;
			     C	
			     C	    LEA  DI, FILE_NAME				;;AN000;
			     C	    CALL ERASE_FILE_ROUTINE			;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   CHMOD_FILE: Change file attributes to read/write
			     C	;;
			     C	;;   SYNTAX:  CHMOD_FILE  filename
			     C	;;
			     C	;;   INPUT:   filename = POINTER TO ASCII-N STRING - FILE NAME
			     C	;;
			     C	;;   OUTPUT:  None.
			     C	;;
			     C	;;   OPERATION:
			     C	;;	The CHMOD dos call is executed (43H) to change the file's attributes
			     C	;;	to read/write.
			     C	;;
			     C	;;****************************************************************************
			     C	CHMOD_FILE   MACRO   FILE_NAME			;;AN000;
			     C	
			     C	    LEA  DI, FILE_NAME				;;AN000;
			     C	    CALL CHMOD_FILE_ROUTINE			;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;************************************************************************
			     C	;;   FIND_FILE: Find File
			     C	;;
			     C	;;   SYNTAX:  FIND_FILE   name, attribute
			     C	;;
			     C	;;   INPUT:   name = POINTER TO ASCII-N STRING - FILE NAME
			     C	;;	      attribute - the file attribute used in the search
			     C	;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-31
selchild.asm			;AN000;                                      

			     C	;;   OUTPUT:  CY = 0, AX = undefined,  successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   FINDFILE FINDS THE FIRST FILENAME SPECIFIED USING INT 21 (AH=4EH).
			     C	;;   AND LOADS INFORMATION INTO THE CURRENT DTA.
			     C	;;   NOTE : THE DEFAULT DTA IS AT 80H IN THE PSP.
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;************************************************************************
			     C	FIND_FILE  MACRO   LOC_FILE,ATTRIBUTE		 ;;AN000;
			     C							 ;;
			     C	    LEA  DI, LOC_FILE				 ;;AN000;
			     C	    MOV  CX, ATTRIBUTE				 ;;AN000;
			     C	    CALL FIND_FILE_ROUTINE			 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************
			     C	;;   FIND_NEXT: Find the next match in the directory.
			     C	;;
			     C	;;   SYNTAX:  FIND_NEXT
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = undefined,  successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION: This macro must be called after FIND_FIRST.  It searched
			     C	;;	 the same directory as the FIND_FIRST command for the next match.
			     C	;;	 If none is found then the carry flag is set.
			     C	;;	 This macro uses the data in the DTA for the directory seach so
			     C	;;	 it is important not to change the address of the current DTA.
			     C	;;
			     C	;;
			     C	;;************************************************************************
			     C	FIND_NEXT  MACRO   LOC_FILE,ATTRIBUTE		;;AN000;
			     C		CALL  HOOK_INT_24			;;AN000;
			     C		MOV	INT_24_ERROR, FALSE		;;AN000; Zero the number of critical errors
			     C		MOV	AH,4FH				;;AN000;
			     C		DOSCALL 				;;AN000;
			     C		CALL  RESTORE_INT_24			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   OPEN_FILE - Open File
			     C	;;
			     C	;;   SYNTAX:  OPEN_FILE  file_name, mode, handle
			     C	;;
			     C	;;   INPUT:   file_name = POINTER TO ASCII-N STRING - FILE NAME
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-32
selchild.asm			;AN000;                                      

			     C	;;	      mode =  0,1,2 (read,write,read/write)
			     C	;;	      handle = POINTER TO A LOCATION TO STORE FILE HANDLE
			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = FILE HANDLE, successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THIS MACRO OPENS A FILE FOR READ/WRITE OPERATIONS.
			     C	;;   IT MAKES USE OF INT 21 (AH=3DH).
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;**************************************************************************
			     C	OPEN_FILE   MACRO   FILE_NAME,MODE,HANDLE	;;AN000;
			     C	
			     C	    LEA  DI, FILE_NAME				;;AN000;
			     C	    MOV  AL, MODE				;;AN000;
			     C	    CALL OPEN_FILE_ROUTINE			;;AN000;
			     C	    MOV  HANDLE, AX				;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   RENAME_FILE - Rename File
			     C	;;
			     C	;;   SYNTAX:  RENAME_FILE  old_name, new_name
			     C	;;
			     C	;;   INPUT:   old_name = POINTER TO ASCII-N STRING -OLD FILE NAME
			     C	;;	      new_name = POINTER TO ASCII-N STRING -NEW FILE NAME
			     C	;;
			     C	;;   OUTPUT:  CY = 0, AX = undefined,  successful
			     C	;;	      CY = 1, AX = error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THIS MACRO RENAMES A FILE GIVEN 2 NAMES.
			     C	;;   IT MAKES USE OF INT 21 (AH=56H).
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;**************************************************************************
			     C	RENAME_FILE  MACRO   OLD_NAME,NEW_NAME		 ;;AN000;
			     C							 ;;
			     C	    LEA  SI, OLD_NAME				 ;;AN000;
			     C	    LEA  DI, NEW_NAME				 ;;AN000;
			     C	    CALL RENAME_FILE_ROUTINE			 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   READ_FILE: Transfer the specified number of bytes from a file into a
			     C	;;	 buffer location.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-33
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   SYNTAX:  READ_FILE  var_handle, buffer, immed_char, var_char
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_handle - The handle of the file to read.
			     C	;;	 buffer - The address of where to store the data
			     C	;;	 immed_char - The number of characters to read
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0, Read success.	var_char - number of bytes read
			     C	;;	 CY = 1, Read error. AX contains the error code.
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THIS MACRO READS TO AN ALREADY OPENED FILE.
			     C	;;   IT MAKES USE OF INT 21 (AH=3FH).
			     C	;;   AX WILL RETURN THE NUMBER BYTES ACTUALLY WRITTEN.
			     C	;;
			     C	;;************************************************************************
			     C	READ_FILE    MACRO   VAR_HANDLE,BUFFER,IMMED_CHAR, VAR_CHAR ;;AN000;
			     C	
			     C	    MOV  BX,VAR_HANDLE				 ;;AN000;
			     C	    MOV  DX,OFFSET BUFFER			 ;;AN000;
			     C	    MOV  CX,IMMED_CHAR				 ;;AN000;
			     C	    CALL READ_FILE_ROUTINE			 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   WRITE_FILE: Transfer the specified number of bytes from a buffer into a
			     C	;;	 specified file.
			     C	;;
			     C	;;   SYNTAX:  WRITE_FILE  var_handle, buffer, immed_char, var_char
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_handle - The handle of the file to write to.
			     C	;;	 buffer - The address of where the data is stored.
			     C	;;	 immed_char - The number of characters to write.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0, Write success.  var_char - number of bytes written.
			     C	;;	 CY = 1, Write error. AX contains the error code.
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   THIS MACRO WRITES TO AN ALREADY OPENED FILE.
			     C	;;   IT MAKES USE OF INT 21 (AH=3DH).
			     C	;;   AX WILL RETURN THE NUMBER BYTES ACTUALLY WRITTEN.
			     C	;;
			     C	;;************************************************************************
			     C	WRITE_FILE   MACRO   VAR_HANDLE, BUFFER, IMMED_CHAR, VAR_CHAR ;;AN000;
			     C							 ;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-34
selchild.asm			;AN000;                                      

			     C	    MOV  BX,VAR_HANDLE				 ;;AN000;
			     C	    MOV  DX,OFFSET BUFFER			 ;;AN000;
			     C	    MOV  CX,IMMED_CHAR				 ;;AN000;
			     C	    CALL WRITE_FILE_ROUTINE			 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   PREPARE_FILE:  Prepare a file and a buffer for the construction of that
			     C	;;	 file line by line.
			     C	;;
			     C	;;   SYNTAX:  PREPARE_FILE  filename
			     C	;;
			     C	;;   INPUT:
			     C	;;	 filename  =  The name of the file to create. (ASCII-N format)
			     C	;;
			     C	;;   OUTPUT:  CY = 0: No error was encountered.
			     C	;;	      CY = 1: There was an error encountered.
			     C	;;
			     C	;;   OPERATION:  A attempt is made to create the file.	If it fails because
			     C	;;	 the file already exists, then the file is opened for writing.
			     C	;;	 The user will then write to the file be calling WRITE_LINE macro.  The
			     C	;;	 data will be temperarily stored in a buffer to limit the actual number
			     C	;;	 of writes to the file.
			     C	;;
			     C	;;**************************************************************************
			     C	PREPARE_FILE  MACRO	FILENAME		 ;;AN000;
			     C	
			     C	    MOV  BX, OFFSET FILENAME			 ;;AN000; Pass the address of the filename string
			     C	    CALL PREPARE_FILE_ROUTINE			 ;;AN000; Call a routine to do that actual work
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   WRITE_LINE:  Write a line to the file being constructed.
			     C	;;
			     C	;;   SYNTAX:  WRITE_LINE  line
			     C	;;
			     C	;;   INPUT:
			     C	;;	 line  =  The line to write to the file. (ASCII-N format)
			     C	;;
			     C	;;   OUTPUT:  CY = 0: No error was encountered.
			     C	;;	      CY = 1: An error was encountered.
			     C	;;
			     C	;;   OPERATION:  The line that is passed, has a CR and a LF appended to the
			     C	;;	 end of the line.  The data is then stored in a buffer.  When the
			     C	;;	 buffer is full, the data is written to the disk.
			     C	;;
			     C	;;**************************************************************************
			     C	WRITE_LINE    MACRO	LINE			 ;;AN000;
			     C	
			     C	    MOV  BX, OFFSET LINE			 ;;AN000; Pass the address of the line to write
			     C	    CALL WRITE_LINE_ROUTINE			 ;;AN000; Call a routine to do the actual work
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-35
selchild.asm			;AN000;                                      

			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   SAVE_FILE:  Empty the data in the buffer being used to create the file
			     C	;;	      and then close the file.
			     C	;;
			     C	;;   SYNTAX:  SAVE_FILE  file_name, error_code
			     C	;;
			     C	;;   INPUT:
			     C	;;	 file_name = The name of the file being built.	If there has been
			     C	;;		an error encountered, then the file will be erased.
			     C	;;
			     C	;;   OUTPUT:  CY = 0: No error was encountered.
			     C	;;	      CY = 1: An error was encountered.
			     C	;;		      ERROR_CODE will contain the code of the error which
			     C	;;				 occured.
			     C	;;
			     C	;;   OPERATION:  The routine will check to see if there is any data left in
			     C	;;	 the buffer.  If there is, the data is written to the file being
			     C	;;	 created.  The file is then closed.  If errors were encountered at
			     C	;;	 anytime during the create process, then the carry flag will be set
			     C	;;	 and the error code will be returned in ERROR_CODE.
			     C	;;
			     C	;;**************************************************************************
			     C	SAVE_FILE     MACRO	FILE_NAME, ERROR_CODE	 ;;AN000;
			     C	
			     C	    MOV  BX, OFFSET FILE_NAME			 ;;AN000; Get the address of the file name string
			     C	    CALL SAVE_FILE_ROUTINE			 ;;AN000; Call a subroutine to do the actual work
			     C	    MOV  ERROR_CODE, AX 			 ;;AN000; Store the returned error code
			     C	    ENDM					 ;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   CHECK_DOS_VERSION: Check DOS Version level is 4.00
			     C	;;
			     C	;;   SYNTAX:  CHECK_DOS_VERSION
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:  CY = 0: Current DOS Version is 4.00
			     C	;;	      CY = 1: Current DOS Version is other than level 4.00
			     C	;;
			     C	;;   OPERATION:  DOS function call 30h is performed to get the current DOS
			     C	;;	 version number.  If the DOS version is not 4.00, the carry flag is set.
			     C	;;
			     C	;;**************************************************************************
			     C	CHECK_DOS_VERSION   MACRO		;;AN000;
			     C		MOV	AH, 30H 		;;AN000; DOS function number to perform
			     C		DOSCALL 			;;AN000;
			     C		.IF < AL EQ MAJOR_VERSION > AND ;;AC047;SEH check is now made in VERSIONA.INC
			     C		.IF < AH EQ MINOR_VERSION >	;;AC047;SEH Check the DOS minor version
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-36
selchild.asm			;AN000;                                      

			     C		CLC				;;AN000; This is the correct version
			     C		.ELSE				;;AN000;
			     C		STC				;;AN000; This is the incorrect version
			     C		.ENDIF				;;AN000;
			     C		ENDM				;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   SET_DISPLAY_MODE:	Set the display mode to 80 column.
			     C	;;
			     C	;;   SYNTAX:  SET_DISPLAY_MODE
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OPERATION:  The Video Interrupt (INT 10H, AH = 0) is performed to set
			     C	;;	 the display to 80 column mode.
			     C	;;
			     C	;;************************************************************************
			     C	SET_DISPLAY_MODE	MACRO		;;AN000;
			     C	
			     C	    CALL SET_DISPLAY_MODE_ROUTINE	;;AN000;
			     C	    ENDM				;;AN000;
			     C	
			     C	;;************************************************************************
			     C	;;
			     C	;;   CHECK_EXPANDED_MEMORY:  Check if the system supports expanded memory.
			     C	;;
			     C	;;   SYNTAX:  CHECK_EXPANDED_MEMORY   var_xma
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_xma   = 0: Expanded memory is NOT supported.
			     C	;;		   = 1: Expanded memory is supported.
			     C	;;	 var_mod80 = 0: Not model 80
			     C	;;		   = 1: Model 80
			     C	;;
			     C	;;   OPERATION:  A call to the system services (INT 15H, AH = C0H) is performed
			     C	;;	 to get the system configuration parameters. (model byte).
			     C	;;
			     C	;;	 The Personal System/2 Model 80 (model byte = 0F8h) always support
			     C	;;	 expanded memory.
			     C	;;
			     C	;;	 The Personal System/2 Models 50 and 60 (model byte = 0FCh) support
			     C	;;	 expanded memory if the ??? 2 is present.  The ??? 2 card has
			     C	;;	 the identity number of F7FEh.	F7H is read through the port address
			     C	;;	 101h and FEH is read through port 100H
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-37
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;	 All other models do not support expanded memory.
			     C	;;
			     C	;;************************************************************************
			     C	CHECK_EXPANDED_MEMORY	MACRO	VAR_XMA, VAR_MOD80	;;AC000;JW
			     C	
			     C	    CALL CHK_EX_MEM_ROUTINE				;;AN000;
			     C	    MOV  VAR_XMA, SI					;;AN000;
			     C	    MOV  VAR_MOD80,BX					;;AN000;JW
			     C	    ENDM						;;AN000;
			     C	
			     C	INCLUDE  MACROS3.INC					;;AN000;
			     C	;;****************************************************************************
			     C	;;     Assembler MACROS for use with SELECT.
			     C	;;     File: MACROS3.INC
			     C	;;     Latest Change Date: July 28, 1987
			     C	;;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.
			     C	;;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing
			     C	;;	 parameters.  The string is defined below.
			     C	;;		   DW  count
			     C	;;		   DB  "string_variable",?
			     C	;;
			     C	;;	 COUNT is the length of the string and is a word.
			     C	;;	 It is necessary to follow the string with at least one byte for the
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.
			     C	;;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-38
selchild.asm			;AN000;                                      

			     C	page					;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_DEFAULT_DRIVE:  Determine if default drive is drive A:
			     C	;;
			     C	;;   SYNTAX:  CHECK_DEFAULT_DRIVE
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0:  Drive A is the default drive
			     C	;;	 CY = 1:  Drive A is NOT the default drive
			     C	;;
			     C	;;   OPERATION:  DOS Function Call 19h is performed to get the default drive.
			     C	;;	 If the default drive is not drive A (AL <> 0), the carry flag is set.
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_DEFAULT_DRIVE	MACRO			 ;;AN000;
			     C	    MOV  AH, 19H				 ;;AN000; Fn. Number for getting current drive
			     C	    DOSCALL					 ;;AN000;
			     C	    .IF < ZERO AL >				 ;;AN000; Is A the default drive?
			     C		 CLC					 ;;AN000; Yes!
			     C	    .ELSE					 ;;AN000;
			     C		 STC					 ;;AN000; No!
			     C	    .ENDIF					 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_DISK:  Check is the specified fixed disk is present.  If disk is
			     C	;;	 present, return disk partition status.
			     C	;;
			     C	;;   SYNTAX:  CHECK_DISK  immed_disk, var_disk, var_status, var_status_2, buffer
			     C	;;
			     C	;;   INPUT:
			     C	;;	 immed_disk = 1: First fixed disk.
			     C	;;		    = 2: Second fixed disk.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_disk = 0: Disk not present.
			     C	;;		  = 1: Disk present - No DOS or EDOS partitions
			     C	;;		  = 2: Disk present - DOS or EDOS partitions exist
			     C	;;	 var_status = 01H: Primary DOS partition exists
			     C	;;		    = 02H: Extended DOS partitions exists
			     C	;;		    = 04H: Logical drives exist
			     C	;;		    = 08H: Free space exists in EDOS partition
			     C	;;		    = 10H: Free space exists on disk
			     C	;;			       More than one status bit can be set
			     C	;;	 var_status_2 = 0: There is no free space in EDOS partition and the
			     C	;;			   disk.
			     C	;;		      = 1: There is free space in the EDOS partition.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-39
selchild.asm			;AN000;                                      

			     C	;;		      = 2: There is no EDOS partition, but there is free
			     C	;;			   disk space.
			     C	;;	 buffer   = Buffer for fixed disk status information.
			     C	;;
			     C	;;   OPERATION:  A call is performed to the FDISK utility (GET_DISK_STATUS)
			     C	;;	 to get the status of the specified fixed disk drive.  The returned
			     C	;;	 status information is checked and the memory variables are set as
			     C	;;	 specified above.
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_DISK	MACRO	IMMED_DISK, VAR_DISK, VAR_STATUS, VAR_STATUS_2, BUFFER ;;AN000;
			     C	
			     C	    LEA  DI, BUFFER				;;AN000;
			     C	    MOV  AX, IMMED_DISK 			;;AN000;
			     C	    CALL CHECK_DISK_ROUTINE			;;AN000;
			     C	    MOV  VAR_DISK, CX				;;AN000;
			     C	    MOV  VAR_STATUS, BX 			;;AN000;
			     C	    MOV  VAR_STATUS_2, DX			;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_DISKETTE:  Check the type of diskettes attached to the system.
			     C	;;
			     C	;;   SYNTAX:  CHECK_DISKETTE  var_disk_a, var_disk_b, var_tot, buffer
			     C	;;
			     C	;;   INPUT:
			     C	;;	 buffer  = Buffer for IOCTL
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_disk_a = 0FFH Diskette drive A not present
			     C	;;		    = 0 360k diskette (5.25 inch)
			     C	;;		    = 1 740K diskette (3.5  inch)
			     C	;;		    = 2 1.2M diskette (5.25 inch)
			     C	;;		    = 7 1.44M diskette (3.5 inch)
			     C	;;	 var_disk_b = 0FFH Diskette drive B not present
			     C	;;		    = 0, 1, 2, 7 as defined above for diskette A.
			     C	;;	 var_tot    = total number of diskettes attached (1 or 2)
			     C	;;
			     C	;;   OPERATION:  Interrupt 11H is performed to get equipment status.  The number
			     C	;;	 of diskettes attached will be returned as specified above.  A call
			     C	;;	 is then made to the IOCTL function of DOS (AH = 44h) to get the type
			     C	;;	 of media the disk drives are.	The function returns its data in a
			     C	;;	 26 byte buffer, where the second byte contains a description of the
			     C	;;	 drive.  The codes are as follows:
			     C	;;		0 = 320/360 KB 5-1/4-inch
			     C	;;		1 = 5-1/4-inch, 1.2 MB
			     C	;;		2 = 3-1/2-inch, 720 KB
			     C	;;		3 = 8 inch single density
			     C	;;		4 = 8 inch double density
			     C	;;		5 = Fixed disk
			     C	;;		6 = Tape drive
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-40
selchild.asm			;AN000;                                      

			     C	;;		7 = Other
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_DISKETTE	MACRO	VAR_DISK_A, VAR_DISK_B, VAR_TOT, BUFFER ;;AN000;
			     C	    INT     11H 				 ;;AN000; See how many diskette drives there are
			     C	    .IF < BIT AL NAND DISKETTES_EXIST > 	 ;;AN000; Are there diskettes?
			     C		 MOV	 AX, 0				 ;;AN000; There are no diskettes.
			     C	    .ELSE					 ;;AN000;
			     C		 MOV	 CL,6				 ;;AN000; Number of bits to shift
			     C		 SHR	 AL,CL				 ;;AN000; Diskette bits are 6 and 7.  Shift to right
			     C		 MOV	 AH, 0				 ;;AN000; Clear the high byte
			     C		 INC	 AX				 ;;AN000; Make into the actual number of diskettes
			     C		 .IF < AX GT MAX_NUM_DISKETTE > 	 ;;AN000; Are there more then 2 diskette drives?
			     C		      MOV     AX, MAX_NUM_DISKETTE	 ;;AN000; Yes, but we are only concern with two.
			     C		 .ENDIF 				 ;;AN000;
			     C	    .ENDIF					 ;;AN000;
			     C	    MOV     VAR_TOT, AL 			 ;;AN000; Store the number of diskette drives.
			     C	    ;;**********************************************************************
			     C	    ;; Examine diskette drive A first.
			     C	    ;;**********************************************************************
			     C	    MOV   VAR_DISK_A, E_DISKETTE_INV		 ;;AN000;
			     C	    MOV   VAR_DISK_B, E_DISKETTE_INV		 ;;AN000;
			     C	    MOV   DI, OFFSET VAR_DISK_A 		 ;;AN000;
			     C	    .FOR BL = 1 TO VAR_TOT			 ;;AN000;
			     C		 MOV  AX, 440DH 			 ;;AN000;
			     C		 MOV  CX, 0860H 			 ;;AN000;
			     C		 MOV  DX, OFFSET BUFFER 		 ;;AN000;
			     C		 DOSCALL				 ;;AN000;
			     C		 MOV  SI, OFFSET BUFFER + 1		 ;;AN000;
			     C		 MOV  AL, [SI]				 ;;AN000;
			     C		 .IF < AL EQ E_DISKETTE_1200 >		 ;;AN111;JW
			     C		    MOV  AL,E_DISKETTE_360		 ;;AN111;JW
			     C		 .ENDIF 				 ;;AN111;JW
			     C		 .IF < AL EQ E_DISKETTE_1440 >		 ;;AN000;
			     C		      .IF < <WORD PTR [SI+3]> NE E_1440_TRACKS > OR ;;AN000;
			     C		      .IF < <WORD PTR [SI+19]> NE E_1440_SECTORS >  ;;AN000;
			     C			   MOV	AL, E_DISKETTE_INV	 ;;AN000;
			     C		      .else				;yuk- don't have time to get this working on 1.4M dr
				ives
			     C			   mov al, e_diskette_720	;so pretend there is no such thing
			     C		      .ENDIF				 ;;AN000;
			     C		 .ENDIF 				 ;;AN000;
			     C		 MOV  [DI], AL				 ;;AN000;
			     C		 MOV  DI, OFFSET VAR_DISK_B		 ;;AN000;
			     C	    .NEXT BL					 ;;AN000;
			     C	    ;;**********************************************************************
			     C	    ;; Check for compatible A: to B: combinations ;AN000;JW
			     C	    ;;**********************************************************************
			     C	    .IF < VAR_DISK_A eq E_DISKETTE_720 > or	 ;;AN000;JW
			     C	    .IF < VAR_DISK_A eq E_DISKETTE_1440 >	 ;;AN000;JW
			     C	       .IF < VAR_DISK_B eq E_DISKETTE_360 >	 ;;AN000;JW
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-41
selchild.asm			;AN000;                                      

			     C		  MOV  VAR_DISK_B, E_DISKETTE_INV	 ;;AN000;JW
			     C		  DEC  VAR_TOT				 ;;AN000;JW
			     C	       .ENDIF					 ;;AN000;JW
			     C	    .ENDIF					 ;;AN000;JW
			     C	    .IF < VAR_DISK_A eq E_DISKETTE_360 >	 ;;AN000;JW
			     C	       .IF < VAR_DISK_B eq E_DISKETTE_720 > or	 ;;AN000;JW
			     C	       .IF < VAR_DISK_B eq E_DISKETTE_1440 >	 ;;AN000;JW
			     C		  MOV  VAR_DISK_B, E_DISKETTE_INV	 ;;AN000;JW
			     C		  DEC  VAR_TOT				 ;;AN000;JW
			     C	       .ENDIF					 ;;AN000;JW
			     C	    .ENDIF					 ;;AN000;JW
			     C							 ;;
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_VALID_MEDIA:  Check if the diskettes attached will support
			     C	;;	 installation of SELECT.  Also, check if install destination will
			     C	;;	 be selected by user or determined by SELECT.
			     C	;;
			     C	;;   SYNTAX:  CHECK_VALID_MEDIA  var_disk_a, var_disk_b, var_tot, var_disk,
			     C	;;				 var_def, var_index, var_option
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_disk_a  =	diskette A presence and type
			     C	;;	 var_disk_b  =	diskette B presence and type
			     C	;;	 var_tot     =	total number of dikettes
			     C	;;	 var_disk    =	0: first fixed disk is not present
			     C	;;		     >	0: first fixed disk is present
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0: Success variables are returned as defined below.
			     C	;;	 CY = 1: Error - invalid media
			     C	;;	 var_def   =  0 use default destination drive
			     C	;;		   =  1 default destination drive not applicable
			     C	;;	 var_index =  1 default destination is drive C
			     C	;;		   =  2 default destination is drive B
			     C	;;	 var_option = 1 possible drive B or C
			     C	;;		    = 2 possible drive A or C
			     C	;;		    = 3 possible drive A or B or C
			     C	;;		    = 4 possible drive A or B
			     C	;;
			     C	;;   OPERATION:  The diskette drive types are checked for valid media type.
			     C	;;	 If the diskette media types are valid, a check is made to determine if
			     C	;;	 install destination will be user selected or will be determined by
			     C	;;	 SELECT.  The following checks are made.
			     C	;;
			     C	;;	  - if one diskette, return valid media and default destination is A
			     C	;;
			     C	;;	  - If two diskettes only, return valid and:
			     C	;;		if A = B, default = B
			     C	;;		if A <> B, default = A
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-42
selchild.asm			;AN000;                                      

			     C	;;		if A and B are mixed 720 and 1.44, destination option is A or B
			     C	;;
			     C	;;	  - If one diskette and a fixed disk only, return valid media and
			     C	;;	    destination option is drive A or C.
			     C	;;
			     C	;;	  - If two diskettes and a fixed disk, return valid media and:
			     C	;;		if A = B, destination option is B or C
			     C	;;		if A <> B, destination option is A or C
			     C	;;		if A and B are mixed 720 and 1.44, destination option is
			     C	;;		  A or B or C
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_VALID_MEDIA	MACRO	VAR_DISK_A, VAR_DISK_B, VAR_TOT, VAR_DISK, VAR_DEF, VAR_INDEX, VAR_O
				PTION ;;AN111;JW
			     C	
			     C	    MOV  AL, VAR_DISK_A 			;;AN111;JW
			     C	    MOV  BL, VAR_DISK_B 			;;AN111;JW
			     C	    MOV  SI, VAR_DISK				;;AN111;JW
			     C	    CALL CHECK_VALID_MEDIA_ROUTINE		;;AN111;JW
			     C	    MOV  VAR_DEF, CL				;;AN111;JW
			     C	    MOV  VAR_INDEX, DX				;;AN111;JW
			     C	    MOV  VAR_OPTION, DI 			;;AN111;JW
			     C	    ENDM					;;AN111;JW
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   SCAN_DISK_TABLE:  Scan the specified disk status table from the
			     C	;;	 specified index item for specified field and return status information.
			     C	;;
			     C	;;   SYNTAX:  SCAN_DISK_TABLE	 immed_disk, var_index, var_ref
			     C	;;
			     C	;;   INPUT:
			     C	;;	 immed_disk  = 1: First fixed disk
			     C	;;		     = 2: Second fixed disk
			     C	;;	 var_index  = Index of the information to return
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_ret       = 0: Success - Index into table is valid
			     C	;;		       = 1: Error - Index invalid or end of table
			     C	;;	 N_NAME_PART   = Partition name.
			     C	;;	 N_SIZE_PART   = Partition size.
			     C	;;	 N_STATUS_PART = Partition status
			     C	;;	 P_DRIVE_PART  = Drive letter assigned.
			     C	;;
			     C	;;   OPERATION:
			     C	;;	Starts scanning the disk table from the point indicated by var_index
			     C	;;	for either the name, status or type.  The table is scanned until either
			     C	;;	the desired entry is found, or the end of the table is reached.  If
			     C	;;	the end of the table is reached before a marching entry is found, then
			     C	;;	var_ret returns 1, else if an entry is found, it returns 0.
			     C	;;	If found, var_index will also return the index of the entry.
			     C	;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-43
selchild.asm			;AN000;                                      

			     C	;;	Note:  The index of the first entry in the table is 1.
			     C	;;
			     C	;;************************************************************************;;
			     C	SCAN_DISK_TABLE MACRO	IMMED_DISK, VAR_INDEX, VAR_RET	;;AN000;
			     C	
			     C	    MOV  CX, IMMED_DISK 			;;AN000;
			     C	    MOV  AX, VAR_INDEX				;;AN000;
			     C	    CALL SCAN_DISK_TABLE_ROUTINE		;;AN000;
			     C	    MOV  VAR_RET, AX				;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   UPDATE_DISK_TABLE:  Update the specifed disk status table for the
			     C	;;	 specified index item.
			     C	;;
			     C	;;   SYNTAX:  UPDATE_DISK_TABLE  immed_disk, var_index, var_ref
			     C	;;
			     C	;;   INPUT:
			     C	;;	 immed_disk  = 1: First fixed disk
			     C	;;		     = 2: Second fixed disk
			     C	;;	 var_index   = Index into table
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_ret     = 0: Success - Index into table is valid
			     C	;;		     = 1: Error   - Index into table is not valid
			     C	;;	 partition name   = N_NAME_PART
			     C	;;	 partition size   = N_SIZE_PART
			     C	;;	 partition status = N_STATUS_PART
			     C	;;	 partition type   = N_TYPE_PART
			     C	;;	 drive letter	  = P_DRIVE_PART
			     C	;;
			     C	;;   OPERATION:  If the index into the disk table is valid, the disk table
			     C	;;	 is updated for the specifed index.  Disk status information is obtained
			     C	;;	 from pre-defined locations as specified above.
			     C	;;
			     C	;;************************************************************************;;
			     C	UPDATE_DISK_TABLE	MACRO	IMMED_DISK, VAR_INDEX, VAR_REF	;;AN000;
			     C	
			     C	    MOV  CX, IMMED_DISK 			;;AN000;
			     C	    MOV  AX, VAR_INDEX				;;AN000;
			     C	    CALL UPDATE_DISK_TABLE_ROUTINE		;;AN000;
			     C	    MOV  VAR_REF, AX				;;AN000;
			     C	    ENDM					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_PARTITION_SIZE:  Return DOS and EDOS partition size in ASCII-N format.
			     C	;;
			     C	;;   SYNTAX:  GET_PARTITION_SIZE  var_tot, var_dos, name_dos, name_edos
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_tot  =  Free disk space
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-44
selchild.asm			;AN000;                                      

			     C	;;	 var_dos  =  Size of DOS partition
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 name_dos = Size of DOS partition in ASCII-N format.
			     C	;;	 name_edos = Size of EDOS partition in ASCII-N format.
			     C	;;
			     C	;;   OPERATION:  The DOS partition size is converted to ASCII-N format.
			     C	;;	 The size of the Extended DOS partition is obtained by subtracting
			     C	;;	 the size of DOS partition from the free disk space.  If the size of
			     C	;;	 any partition is zero, a zero string length is returned.
			     C	;;
			     C	;;************************************************************************;;
			     C	GET_PARTITION_SIZE	MACRO	VAR_TOT, VAR_DOS, NAME_DOS, NAME_EDOS ;;AN000;
			     C							 ;;
			     C	    PUSH VAR_TOT				 ;;AN000; Save the variable
			     C	    MOV  AX, VAR_DOS				 ;;AN000; Size of the DOS partition.
			     C	    SUB  VAR_TOT, AX				 ;;AN000; Subtract the dos partition size
			     C	    WORD_TO_CHAR     VAR_TOT, NAME_EDOS 	 ;;AN000; Convert binay values to ASCII
			     C	    WORD_TO_CHAR     VAR_DOS, NAME_DOS		 ;;AN000;
			     C	    POP  VAR_TOT				 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_MACHINE: Return the model byte
			     C	;;
			     C	;;   SYNTAX:  CHECK_MACHINE mac_type p_flag
			     C	;;
			     C	;;   INPUT:
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 mac_type = model byte
			     C	;;	 p_flag   = PS2 presence (E_YES, E_NO)
			     C	;;
			     C	;;   OPERATION:  An INT 15H is executed to return a pointer to the system
			     C	;;	 descriptor vector.  The model byte is retrieved from this vector
			     C	;;	 and placed in the supplied variable. The ps2 flag is also set.
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_MACHINE  MACRO MAC_TYPE, P_FLAG		 ;;AN000;JW
			     C							 ;;
			     C		MOV  AH,0C0H				 ;;AN000; INT 15H system config request
			     C		INT  15H				 ;;AN000; system services
			     C		.IF < nc >				 ;;AN000;
			     C		   MOV	AH,ES: BYTE PTR [BX+2]		 ;;AN000; get the model byte
			     C		.ELSE					 ;;AN000;
			     C		   MOV	AH,00				 ;;AN000;
			     C		.ENDIF					 ;;AN000;
			     C		MOV  MAC_TYPE,AH			 ;;AN000; save the model byte
			     C		MOV  P_FLAG,E_YES			 ;;AN000;
			     C							 ;;
			     C		.IF < AH eq 0 > or			 ;;AN000; if old pc
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-45
selchild.asm			;AN000;                                      

			     C		.IF < AH eq 0FBH > or			 ;;AN000; if pc XT
			     C		.IF < AH eq 0F9H > or			 ;;AN000; if pc convertible
			     C		.IF < AH eq 0FCH > and			 ;;AN000; if pc AT and
			     C		.IF <<ES:BYTE PTR [BX+3]> le 02 >	 ;;AN000;   sub-model byte le 2
			     C		   MOV	P_FLAG,E_NO			 ;;AN000;     not a ps2
			     C		.ENDIF					 ;;AN000;
			     C		ENDM					 ;;AN000;
			     C	
			     C	INCLUDE  MACROS4.INC				 ;AN000;
			     C	;;****************************************************************************
			     C	;;     Assembler MACROS for use with SELECT.
			     C	;;     File: MACROS4.INC
			     C	;;     Latest Change Date: July 16, 1987
			     C	;;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.
			     C	;;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing
			     C	;;	 parameters.  The string is defined below.
			     C	;;		   DW  count
			     C	;;		   DB  "string_variable",?
			     C	;;
			     C	;;	 COUNT is the length of the string and is a word.
			     C	;;	 It is necessary to follow the string with at least one byte for the
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.
			     C	;;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-46
selchild.asm			;AN000;                                      

			     C	page					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   GET_DATE: Get the current system date.
			     C	;;
			     C	;;   SYNTAX:  GET_DATE	var_year, var_month, var_day
			     C	;;
			     C	;;   INPUT:   NONE
			     C	;;
			     C	;;   OUTPUT:  CY = 0: CURRENT SYSTEM DATE IS 1/1/80
			     C	;;	      CY = 1: CURRENT SYSTEM DATE IS NOT 1/1/80
			     C	;;		      VAR_YEAR	- SYSTEM YEAR	      (16 BITS)
			     C	;;		      VAR_MONTH - SYSTEM MONTH	     (16 BITS)
			     C	;;		      VAR_DAY	- SYSTEM DAY	     (16 BITS)
			     C	;;
			     C	;;   OPERATION:  DOS function call 2Ah is performed to get the current
			     C	;;		 system date.  If the system date is not 1/1/80, the
			     C	;;		 carry flag is set.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_DATE	MACRO	VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000;
			     C	
			     C		MOV	AH,2AH			;;AN000; get time dos interrupt
			     C		DOSCALL 			;;AN000;
			     C		MOV	VAR_YEAR, CX		;;AN000; Save the date.
			     C		MOV	CH,0			;;AN000; Clear the byte
			     C		MOV	CL,DH			;;AN000;
			     C		MOV	VAR_MONTH, CX		;;AN000;
			     C		MOV	CL,DL			;;AN000;
			     C		MOV	VAR_DAY, CX		;;AN000;
			     C		.IF < VAR_YEAR EQ 1980 > AND	;;AN000; See if it is the base year.
			     C		.IF < DX EQ 0101H>		;;AN000; i.e. 1/1/80
			     C		   CLC				;;AN000; Yes it is.
			     C		.ELSE				;;AN000;
			     C		   STC				;;AN000;
			     C		.ENDIF				;;AN000;
			     C	
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   GET_TIME: Get current system time.
			     C	;;
			     C	;;   SYNTAX:  GET_TIME	var_hour, var_minutes, var_seconds
			     C	;;
			     C	;;   INPUT:   None.
			     C	;;
			     C	;;   OUTPUT:  VAR_HOUR	  - SYSTEM HOUR 	 (16 BITS)
			     C	;;	      VAR_MINUTES - SYSTEM MINUTES	 (16 BITS)
			     C	;;	      VAR_SECONDS - SYSTEM SECONDS	 (16 BITS)
			     C	;;
			     C	;;   OPERATION:  DOS function call 2Ch is performed to get the current
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-47
selchild.asm			;AN000;                                      

			     C	;;	 system time.
			     C	;;
			     C	;;
			     C	;;****************************************************************************
			     C	GET_TIME   MACRO	VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000;
			     C	
			     C	
			     C		MOV	AH,2CH			;;AN000; get time dos interrupt
			     C		DOSCALL 			;;AN000;
			     C	
			     C		MOV	AH, 0			;;AN000;
			     C		MOV	AL, CH			;;AN000;
			     C		MOV	VAR_HOUR, AX		;;AN000;
			     C		MOV	AL, CL			;;AN000;
			     C		MOV	VAR_MINUTES, AX 	;;AN000;
			     C		MOV	AL, DH			;;AN000;
			     C		MOV	VAR_SECONDS, AX 	;;AN000;
			     C	
			     C	
			     C		ENDM				;;AN000;
			     C	;;************************************************************************;;
			     C	;;   SET_DATE: Sets the system date
			     C	;;
			     C	;;   SYNTAX:  SET_DATE	var_year, var_month, var_day
			     C	;;
			     C	;;   INPUT:   var_year	- 1980 - 2099		 ( 16 bits )
			     C	;;	      var_month - 1 - 12		 ( 16 bits )
			     C	;;	      var_day	- 1 - 31		 ( 16 bits )
			     C	;;
			     C	;;   OUTPUT:  CY = 0: SUCCESSFUL
			     C	;;	      CY = 1: ERROR - Date is not valid
			     C	;;
			     C	;;   OPERATION:  DOS function call 2Bh is performed to set the system date.
			     C	;;	 If the date is not valid, the carry flag is set.
			     C	;;
			     C	;;************************************************************;;
			     C	SET_DATE   MACRO	VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000;
			     C		MOV	CX, VAR_YEAR		;;AN000;
			     C		MOV	AX, VAR_MONTH		;;AN000;
			     C		MOV	DH, AL			;;AN000;
			     C		MOV	AX, VAR_DAY		;;AN000;
			     C		MOV	DL, AL			;;AN000;
			     C		MOV	AH,2BH			;;AN000; set date dos interrupt
			     C		DOSCALL 			;;AN000;
			     C		.IF < ZERO AL > 		;;AN000;
			     C		   CLC				;;AN000;
			     C		.ELSE				;;AN000;
			     C		   STC				;;AN000;
			     C		.ENDIF				;;AN000;
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-48
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   SET_TIME: Sets the current system time.
			     C	;;
			     C	;;   SYNTAX:  SET_TIME	var_hour, var_minutes, var_seconds
			     C	;;
			     C	;;   INPUT:   var_hour	  = 0 - 23		 ( 16 BITS )
			     C	;;	      var_minutes = 0 - 59		 ( 16 BITS )
			     C	;;	      var_seconds = 0 - 59		 ( 16 BITS )
			     C	;;	      hundredth   = Assumed to be zero
			     C	;;
			     C	;;   OUTPUT:  CY = 0: SUCCESSFUL
			     C	;;	      CY = 1: Error - Date is not valid
			     C	;;
			     C	;;   OPERATION:  DOS function call 2Dh is performed to set the current system
			     C	;;		 time.	If the time is not valid, the carry flag will be set.
			     C	;;
			     C	;;****************************************************************************
			     C	SET_TIME   MACRO	VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000;
			     C	
			     C		MOV	AX, VAR_HOUR		;;AN000;
			     C		MOV	CH, AL			;;AN000;
			     C		MOV	AX, VAR_MINUTES 	;;AN000;
			     C		MOV	CL, AL			;;AN000;
			     C		MOV	AX, VAR_SECONDS 	;;AN000;
			     C		MOV	DH, AL			;;AN000;
			     C		MOV	DL, 0			;;AN000; Hundredths of seconds is 0
			     C		MOV	AH,2DH			;;AN000; set time dos interrupt
			     C		DOSCALL 			;;AN000;
			     C		.IF < ZERO AL > 		;;AN000;
			     C		   CLC				;;AN000;
			     C		.ELSE				;;AN000;
			     C		   STC				;;AN000;
			     C		.ENDIF				;;AN000;
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   CHECK_TIME_CHANGE: Check if user entered time is different from the
			     C	;;		 specified system time.
			     C	;;
			     C	;;   SYNTAX:  CHECK_TIME_CHANGE: var_u_hour, var_u_min, var_u_sec,
			     C	;;				 var_s_hour, var_s_min, var_s_sec
			     C	;;
			     C	;;   INPUT:   var_u_hour = User specified hour		 ( 16 bits )
			     C	;;	      var_u_min  = User specified minutes	 ( 16 bits )
			     C	;;	      var_u_sec  = User specified seconds	 ( 16 bits )
			     C	;;	      var_s_hour = System hour			 ( 16 bits )
			     C	;;	      var_s_min  = System min			 ( 16 bits )
			     C	;;	      var_s_sec  = System sec			 ( 16 bits )
			     C	;;
			     C	;;   OUTPUT:  CY = 0: User specified time is the same as the system time.
			     C	;;	      CY = 1: User specified time is different from the system time.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-49
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   OPERATION:  The user time and system time are compared and the carry
			     C	;;		 flag is updated as specified above.
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_TIME_CHANGE	MACRO	VAR_U_HOUR, VAR_U_MIN, VAR_U_SEC, VAR_S_HOUR, VAR_S_MIN, VAR_S_SEC ;
				;AN000;
			     C		 LOCAL	   EXIT_CHECK_TIME_CHANGE ;;AN000;
			     C		 MOV  AX, VAR_S_HOUR		;;AN000;
			     C		.IF < VAR_U_HOUR EQ AX >	;;AN000;
			     C		      MOV  AX, VAR_S_MIN	;;AN000;
			     C		     .IF < VAR_U_MIN  EQ AX >	;;AN000;
			     C			   MOV	AX, VAR_S_SEC	;;AN000;
			     C			  .IF < VAR_U_SEC  EQ AX > ;;AN000;
			     C			       CLC		;;AN000;
			     C			       JMP   EXIT_CHECK_TIME_CHANGE;AN000;
			     C			   .ENDIF		;;AN000;
			     C		      .ENDIF			;;AN000;
			     C		 .ENDIF 			;;AN000;
			     C		 STC				;;AN000;
			     C	EXIT_CHECK_TIME_CHANGE: 		;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   CHECK_DATE_CHANGE: Check if user entered date is different from the
			     C	;;		 specified system date.
			     C	;;
			     C	;;   SYNTAX:  CHECK_DATE_CHANGE: var_u_year, var_u_month, var_u_day,
			     C	;;				 var_s_year, var_s_month, var_s_day
			     C	;;
			     C	;;   INPUT:   var_u_year   = User specified year	   ( 16 bits )
			     C	;;	      var_u_month  = User specified month	   ( 16 bits )
			     C	;;	      var_u_day    = User specified day 	   ( 16 bits )
			     C	;;	      var_s_year   = System year		   ( 16 bits )
			     C	;;	      var_s_month  = System month		   ( 16 bits )
			     C	;;	      var_s_day    = System day 		   ( 16 bits )
			     C	;;
			     C	;;   OUTPUT:  CY = 0: User specified date is the same as the system date.
			     C	;;	      CY = 1: User specified date is different from the system date.
			     C	;;
			     C	;;   OPERATION:  The user date and system date are compared and the carry
			     C	;;		 flag is updated as specified above.
			     C	;;
			     C	;;************************************************************************;;
			     C	CHECK_DATE_CHANGE	MACRO	VAR_U_YEAR, VAR_U_MONTH, VAR_U_DAY, VAR_S_YEAR, VAR_S_MONTH, VAR_S_D
				AY ;;AN000;
			     C		 LOCAL	   EXIT_CHECK_DATE_CHANGE	;;AN000;
			     C		 MOV  AX, VAR_S_YEAR			;;AN000;
			     C		.IF < VAR_U_YEAR  EQ AX >		;;AN000;
			     C		      MOV  AX, VAR_S_MONTH		;;AN000;
			     C		      .IF < VAR_U_MONTH EQ AX > 	;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-50
selchild.asm			;AN000;                                      

			     C			   MOV	AX, VAR_S_DAY		;;AN000;
			     C			   .IF < VAR_U_DAY   EQ AX >	;;AN000;
			     C			       CLC			;;AN000;
			     C			       JMP   EXIT_CHECK_DATE_CHANGE ;;AN000;
			     C			   .ENDIF			;;AN000;
			     C		      .ENDIF				;;AN000;
			     C		 .ENDIF 				;;AN000;
			     C		STC					;;AN000;
			     C	EXIT_CHECK_DATE_CHANGE: 			;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   SET_FILE_DATE_TIME:  Set a files date and time.
			     C	;;
			     C	;;   SYNTAX:  SET_FILE_DATE_TIME  file_handle, var_hour, var_minutes, var_seconds
			     C	;;				  var_year, var_month, var_day
			     C	;;
			     C	;;   INPUT:
			     C	;;	 file_handle = The handle of the file to set the time/date of.
			     C	;;	 var_hour    = 0 - 23			 ( 16 bits )
			     C	;;	 var_minutes = 0 - 59			 ( 16 bits )
			     C	;;	 var_seconds = 0 - 59			 ( 16 bits )
			     C	;;	 var_year    = 1980 - 2099		 ( 16 bits )
			     C	;;	 var_month   = 1 - 12			 ( 16 bits )
			     C	;;	 var_day     = 1 - 31			 ( 16 bits )
			     C	;;
			     C	;;   OUTPUTS:
			     C	;;	 CY = 0: Success
			     C	;;	 CY = 1: Error - Date/Time format is invalid
			     C	;;
			     C	;;   OPERATION:  The data and time values are converted to internal formats
			     C	;;	 defined below and DOS function call 57h is performed to set the
			     C	;;	 files date and time.
			     C	;;
			     C	;;
			     C	;;	 The internal time format is:
			     C	;;		 bits	 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
			     C	;;			 h  h  h  h  h	m  m  m  m  m  m  x  x	x  x  x
			     C	;;
			     C	;;		 h - Binary number of hours   ( 0 - 23 )
			     C	;;		 m - Binary number of minutes ( 0 - 59 )
			     C	;;		 x - Binary number of two second increments
			     C	;;
			     C	;;	 The internal date format is:
			     C	;;		 bits	 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
			     C	;;			 y  y  y  y  y	y  y  m  m  m  m  d  d	d  d  d
			     C	;;
			     C	;;		 y - 0 - 119 ( 1980 - 2099 )
			     C	;;		 m - 1 - 31
			     C	;;		 d - 1 - 31
			     C	;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-51
selchild.asm			;AN000;                                      

			     C	;;****************************************************************************
			     C	SET_FILE_DATE_TIME	MACRO	FILE_HANDLE, VAR_HOUR, VAR_MINUTES, VAR_SECONDS, VAR_YEAR, VAR_MONTH
				, VAR_DAY ;;AN000;
			     C	    CALL HOOK_INT_24				;;AN000;
			     C		;;
			     C		;; Handle the file's time first
			     C		;;
			     C		MOV	BX, VAR_SECONDS 	;;AN000; Get the number of seconds
			     C		SHR	BX, 1			;;AN000; Need the number of 2 seconds
			     C		MOV	AX, VAR_MINUTES 	;;AN000; Get the number of minutes
			     C		MOV	CL, 5			;;AN000;
			     C		SHL	AX, CL			;;AN000; Least significant bit #5
			     C		OR	BX, AX			;;AN000;
			     C		MOV	AX, VAR_HOUR		;;AN000; Get the number of hours
			     C		XCHG	AH, AL			;;AN000;
			     C		MOV	CL, 3			;;AN000;
			     C		SHL	AX, CL			;;AN000; Put hours at bit #11
			     C		OR	BX, AX			;;AN000;
			     C		;;
			     C		;; Handle the file's date now
			     C		;;
			     C		MOV	DX, VAR_DAY		;;AN000; Get the day.
			     C		MOV	AX, VAR_MONTH		;;AN000;
			     C		MOV	CL, 5			;;AN000;
			     C		SHL	AX, CL			;;AN000; Least significant month bit #5
			     C		OR	DX, AX			;;AN000;
			     C		MOV	AX, VAR_YEAR		;;AN000; Get the year (1980 - 2099)
			     C		SUB	AX, 1980		;;AN000; Put in the range 0 - 119
			     C		XCHG	AL, AH			;;AN000;
			     C		SHL	AX, 1			;;AN000;
			     C		OR	DX, AX			;;AN000;
			     C	
			     C		MOV	CX, BX			;;AN000;
			     C		MOV	BX, FILE_HANDLE 	;;AN000;
			     C		MOV	AX, 5701H		;;AN000;
			     C		DOSCALL 			;;AN000;
			     C		CALL  RESTORE_INT_24		;;AN000;
			     C	
			     C		ENDM				;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   CHECK_CLOCK:  Check if the real time clock is operating.
			     C	;;
			     C	;;   SYNTAX:  CHECK_CLOCK
			     C	;;
			     C	;;   INPUT:
			     C	;;	 None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 CY = 0: Real time clock is operating
			     C	;;	 CY = 1: Real time clock is not operating
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-52
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   OPERATION:  A call to the real time clock services (INT 1Ah, AH = 02h)
			     C	;;	 is performed to get the real time clock.  If the clock is operating,
			     C	;;	 the time is returned in the registers and CF = 0 is returned. If the
			     C	;;	 clock is not operating, CF = 1 is returned.
			     C	;;
			     C	;;	 Since the older machines may not have the clock services interrupt,
			     C	;;	 the registers are set to zero before the call is made and checked for
			     C	;;	 non-zero on return.
			     C	;;
			     C	;;****************************************************************************
			     C	CHECK_CLOCK	MACRO		;;AN000;
			     C		MOV	CX, 0		;;AN000; Zero the registers for later comparison
			     C		MOV	DX, 0		;;AN000;
			     C		MOV	AH, 02		;;AN000;
			     C		INT	1AH		;;AN000; Time of day service routine
			     C		.IF < ZERO CX > AND	;;AN000; If CX and DH are zero, clock is not there.
			     C		.IF < ZERO DH > 	;;AN000;
			     C		   STC			;;AN000;
			     C		.ELSE			;;AN000;
			     C		   CLC			;;AN000; The clock is there!
			     C		.ENDIF			;;AN000;
			     C	
			     C		ENDM			;;AN000;
			     C	INCLUDE  MACROS5.INC		;;AN000;
			     C	;;****************************************************************************
			     C	;;     Assembler MACROS for use with SELECT.
			     C	;;     File: MACROS5.INC
			     C	;;     Latest Change Date: July 28, 1987
			     C	;;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.
			     C	;;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing
			     C	;;	 parameters.  The string is defined below.
			     C	;;		   DW  count
			     C	;;		   DB  "string_variable",?
			     C	;;
			     C	;;	 COUNT is the length of the string and is a word.
			     C	;;	 It is necessary to follow the string with at least one byte for the
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.
			     C	;;
			     C	;;****************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-53
selchild.asm			;AN000;                                      

			     C	page					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_COUNTRY_DEFAULTS: Get country, keyboard and codepage for the
			     C	;;		 specified entry from the CTY_TABLE.
			     C	;;
			     C	;;   SYNTAX:  GET_COUNTRY_DEFAULTS  VAR_TABLE, VAR_INDEX
			     C	;;
			     C	;;   INPUT:
			     C	;;	 VAR_TABLE = 1: Use CTY_TAB_A
			     C	;;		   = 2: Use CTY_TAB_B
			     C	;;	 VAR_INDEX = index into country list table
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 N_COUNTRY    = Country code
			     C	;;	 N_KYBD_VAL   = 0: Keyboard code is not valid
			     C	;;		      = 1: Keyboard code is valid
			     C	;;	 S_KEYBOARD   = Keyboard code (ASCII-N format)
			     C	;;	 N_CP_PRI     = Primary code page
			     C	;;	 N_CP_SEC     = Secondary code page
			     C	;;	 N_DESIGNATES = Number of disignates
			     C	;;	 N_CPSW       = Cpsw status
			     C	;;	 N_CTY_RES    = Reserved
			     C	;;
			     C	;;
			     C	;;   OPERATION:  The country code, keyboard, primary codepage and the
			     C	;;	 seondary codepage from the CTY_TABLE for the specified index is
			     C	;;	 returned as spedified above.
			     C	;;
			     C	;;   Note:  Index of the first item is the table is 1.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_COUNTRY_DEFAULTS	MACRO	VAR_TABLE, VAR_INDEX ;;AN000;
			     C	
			     C	    MOV  BX, VAR_TABLE				 ;;AN000; Get which table to search
			     C	    MOV  AX, VAR_INDEX				 ;;AN000; Get where to start in the table
			     C	    CALL GET_CNTY_DEF_ROUTINE			 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_DOS_COUNTRY: Get current country information.
			     C	;;
			     C	;;   SYNTAX:  GET_DOS_COUNTRY  buffer, var_country
			     C	;;
			     C	;;   INPUT:
			     C	;;	 BUFFER = 38 byte data buffer area for country information.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 VAR_COUNTRY = Default country code
			     C	;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-54
selchild.asm			;AN000;                                      

			     C	;;   OPERATION:  DOS function call 65h (id=1) is performed to get the extended
			     C	;;	 country information into the specified data buffer for the default
			     C	;;	 and the active CON device.  The country code value from the data buffer
			     C	;;	 is returned in the memory variable specified.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_DOS_COUNTRY  MACRO	BUFFER, VAR_COUNTRY	 ;;AN000;
			     C	
			     C	
			     C		PUSH	ES				 ;;AN000;
			     C		PUSH	DS				 ;;AN000;
			     C		POP	ES				 ;;AN000;
			     C	
			     C		MOV	DI, OFFSET BUFFER		 ;;AN000; Get the address of the buffer
			     C		MOV	AX, 6501H			 ;;AN000; Fn call 65h with ID value = 1
			     C		MOV	BX, -1				 ;;AN000; Code page of interest (current)
			     C		MOV	DX, -1				 ;;AN000; Get information for default country
			     C		MOV	CX, 38				 ;;AN000; Amount of data to return
			     C		DOSCALL 				 ;;AN000;
			     C	
			     C		MOV	BX, [DI]+3			 ;;AN000; Get the country ID
			     C		MOV	VAR_COUNTRY, BX 		 ;;AN000;
			     C	
			     C		POP	ES				 ;;AN000;
			     C	
			     C		ENDM					 ;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   GET_COUNTRY_INDEX: Scan CTY_TABLE for the specified country code and
			     C	;;			 return index of country code into the table.
			     C	;;
			     C	;;   SYNTAX:  GET_COUNTRY_INDEX  var_country, var_tab, var_index
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_country = The country code
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_tab = 1: Country code is in table CTY_TAB_A
			     C	;;		 = 2: Country code is in table CTY_TAB_B
			     C	;;	 var_index = The index into the country list.
			     C	;;
			     C	;;   OPERATION:  The CTY_TABLE is scanned for the specified country code and
			     C	;;	 the index into the table is returned.
			     C	;;
			     C	;;   Note:  The index of the first item in the table is 1.
			     C	;;
			     C	;;************************************************************************;;
			     C	GET_COUNTRY_INDEX	MACRO	VAR_COUNTRY, VAR_TAB, VAR_INDEX  ;;AN000;
			     C	
			     C	    MOV  CX, VAR_COUNTRY			 ;;AN000; Get the country index
			     C	    CALL GET_CNTY_INDEX_ROUTINE 		 ;;AN000; Search the table for this value
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-55
selchild.asm			;AN000;                                      

			     C	    MOV  VAR_TAB, DX				 ;;AN000; Which table it was found in
			     C	    MOV  VAR_INDEX, BX				 ;;AN000; Which location in that table
			     C	    ENDM					 ;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   GET_KEYBOARD_INDEX: Scan KYBD_TABLE for the specified keyboard code and
			     C	;;			 return index of keyboard code in the table and the
			     C	;;			 alternate keyboard indicator.
			     C	;;
			     C	;;   SYNTAX:  GET_KEYBOARD_INDEX  name_kybd, var_table, var_index, var_alt
			     C	;;
			     C	;;   INPUT:
			     C	;;	 name_kybd = The keyboard code in ASCII-N format.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_table = 1: Keyboard is IN table KYBD_TAB_A
			     C	;;		   = 2: Keyboard is in table KYBD_TAB_B
			     C	;;	 var_index = The index into keyboard table.
			     C	;;	 var_alt   = 0: No alternate keyboard
			     C	;;		   = 1: Alternate keyboard present
			     C	;;
			     C	;;   OPERATION:  The KYBD_TABLE is scanned for the specifies keyboard code and
			     C	;;	 the index into the table is returned.
			     C	;;
			     C	;;   Note:  The index of the first item in the table is 1.
			     C	;;
			     C	;;************************************************************************
			     C	GET_KEYBOARD_INDEX	MACRO	NAME_KYBD, VAR_TABLE, VAR_INDEX, VAR_ALT ;;AN000;
			     C	
			     C	    MOV  DI, OFFSET NAME_KYBD			 ;;AN000; The name of the keyboard to search for
			     C	    CALL GET_KYBD_INDEX_ROUTINE 		 ;;AN000; Search for this keyboard code
			     C	    MOV  VAR_TABLE, DX				 ;;AN000; Which table the code was found in
			     C	    MOV  VAR_INDEX, BX				 ;;AN000; Which index in the table
			     C	    MOV  VAR_ALT, AL				 ;;AN000; Returned alternate keyboard byte
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_KEYBOARD: Get the keyboard code and the alternate keyboard
			     C	;;	 indicator from the KYBD_TABLE for the item specified by the index
			     C	;;	 into the keyboard table.
			     C	;;
			     C	;;   SYNTAX:  GET_KEYBOARD  var_table, var_index, name_kybd, var_alt
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_table = 1: Keyboard code is in table KYBD_TAB_A
			     C	;;		   = 2: Keyboard code is is table KYBD_TAB_B
			     C	;;	 var_index  = index into the keyboard table.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 name_kybd = keyboard code in ASCII-N format.
			     C	;;	 var_alt   = 0: No alternate keyboard
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-56
selchild.asm			;AN000;                                      

			     C	;;		   = 1: Alternate keyboard present
			     C	;;
			     C	;;   OPERATION:  The keyboard code from the KYBD_TABLE for the specified
			     C	;;	 index item is returned.  Also, the alternate keyboard present
			     C	;;	 variable is updated.
			     C	;;
			     C	;;   Note: Index of the first item in the table is 1.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_KEYBOARD	MACRO	VAR_TABLE, VAR_INDEX, NAME_KYBD, VAR_ALT  ;;AN000;
			     C	
			     C	    MOV  AX, VAR_INDEX				 ;;AN000; Where to start the search
			     C	    MOV  CX, VAR_TABLE				 ;;AN000; Which table to search
			     C	    MOV  DI, OFFSET NAME_KYBD			 ;;AN000; The name of the keyboard code returned
			     C	    CALL GET_KYBD_ROUTINE			 ;;AN000;
			     C	    MOV  VAR_ALT, AL				 ;;AN000; Returned alternate code
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_ALT_KYBD_TABLE: Scan the ALT_KYB_TABLE for the specified keyboard,
			     C	;;	 and return the pointer to the specified keyboards alternate keyboard
			     C	;;	 code list.
			     C	;;
			     C	;;   SYNTAX:  GET_ALT_KYBD_TABLE  name_kybd, var_table, var_kyb
			     C	;;
			     C	;;   INPUT:
			     C	;;	 name_kybd  = Keyboard code in ASCII-N format.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 var_table = Pointer to alternat keyboards list.
			     C	;;	 var_kyb   = 1: French
			     C	;;		   = 2: Italian
			     C	;;		   = 3: UK English
			     C	;;
			     C	;;   OPERATION:  The ALT_KYB_TABLE is scanned for the specified keyboard
			     C	;;	 code.	Pointer to a table of alternate keyboards available for the
			     C	;;	 specified keyboard code is returned as well as the keyboard identifier.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_ALT_KYBD_TABLE	MACRO	NAME_KYBD, VAR_TABLE, VAR_KYB ;;AN000;
			     C							 ;;
			     C	    MOV  SI, OFFSET ALT_KYB_TAB_1		 ;;AN000; Offset of the data in the table
			     C	    MOV  AL, ALT_KYB_TABLE			 ;;AN000; Number of entries in the table
			     C	    MOV  BX, 1					 ;;AN000; Index currently being scaned
			     C							 ;;
			     C	    MOV  DX, NAME_KYBD+2			 ;;AN000;
			     C	    .WHILE <<WORD PTR [SI]> NE DX > AND 	 ;;AN000;
			     C	    .WHILE < BL LE AL > 			 ;;AN000;
			     C		 INC  BL				 ;;AN000;
			     C		 ADD  SI, TYPE ALT_KYB_DEF		 ;;AN000;
			     C	    .ENDWHILE					 ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-57
selchild.asm			;AN000;                                      

			     C							 ;;
			     C	    .IF < BL GT AL >				 ;;AN000; Entry NOT found
			     C		 MOV  VAR_KYB, 0			 ;;AN000;
			     C		 MOV  VAR_TABLE, 0			 ;;AN000; Pointer is 0 since entry not found
			     C	    .ELSE					 ;;AN000;
			     C		 COPY_WORD   VAR_TABLE, [SI]+2		 ;;AN000; Copy the table entries
			     C		 COPY_BYTE   VAR_KYB, [SI]+4		 ;;AN000;
			     C	    .ENDIF					 ;;AN000;
			     C							 ;;
			     C	    ENDM					 ;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   GET_ALT_KEYBOARD: Get the alternate keyboard code from the specified
			     C	;;	 alternate keyboard table for the item specified by the index.
			     C	;;
			     C	;;   SYNTAX:  GET_ALT_KEYBOARD	var_table, var_kyb, var_index, name_kybd
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_table  = Pointer to alternate keyboard table
			     C	;;	 var_kyb    = 1: French
			     C	;;		    = 2: Italian
			     C	;;		    = 3: UK English
			     C	;;	 var_index  = Index into the keyboard table.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 name_kybd = The keyboard code in ASCII-N format.
			     C	;;
			     C	;;   OPERATION:  The keyboard code from the specified table for the
			     C	;;	 specified index item is returned.
			     C	;;
			     C	;;   NOTE:  The index of the first item is the table is 1.
			     C	;;
			     C	;;****************************************************************************
			     C	GET_ALT_KEYBOARD	MACRO	VAR_TABLE, VAR_KYB, VAR_INDEX, NAME_KYBD ;;AN000;
			     C	
			     C	    MOV  AX, VAR_INDEX				 ;;AN000; Get the table index
			     C	    DEC  AX					 ;;AN000; Make the index start at 0
			     C	    MOV  SI, VAR_TABLE				 ;;AN000; Pointer to the table
			     C	    INC  SI					 ;;AN000; Adjust pointer for table length byte
			     C	    .IF < VAR_KYB EQ ALT_FRENCH>		 ;;AN000;
			     C		 MOV  CX, TYPE FR_STRUC 		 ;;AN000;
			     C	    .ELSEIF < VAR_KYB EQ ALT_ITALIAN >		 ;;AN000;
			     C		 MOV  CX, TYPE IT_STRUC 		 ;;AN000;
			     C	    .ELSE					 ;;AN000;
			     C		 MOV  CX, TYPE UK_STRUC 		 ;;AN000;
			     C	    .ENDIF					 ;;AN000;
			     C	    MUL  CX					 ;;AN000;
			     C	    ADD  SI, AX 				 ;;AN000; Get the address of the required entry
			     C							 ;;
			     C	    PUSH ES					 ;;AN000;
			     C	    PUSH DS					 ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-58
selchild.asm			;AN000;                                      

			     C	    POP  ES					 ;;AN000;
			     C	    MOV  DI, OFFSET NAME_KYBD			 ;;AN000;
			     C	    MOV  CX, LEN_ALT_KYBD_ID			 ;;AN000; Number of bytes in the keyboard code
			     C	    MOV  [DI], CX				 ;;AN000;
			     C	    ADD  DI, 2					 ;;AN000;
			     C	    CLD 					 ;;AN000;
			     C	    REP  MOVSB					 ;;AN000;
			     C	    POP  ES					 ;;AN000;
			     C	    ENDM					 ;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   EXEC_PROGRAM: Loads another program into memory and begins execution.
			     C	;;
			     C	;;   SYNTAX:  EXEC_PROGRAM  child, name_com, parm_block, re_dir
			     C	;;
			     C	;;   INPUT:   child	 = Name of the program to execute (ASCII-N format)
			     C	;;	      name_com	 = The command line to be passed to parm_block
			     C	;;	      parm_block = Parameter block for child program.
			     C	;;	      re_dir = 1: Redirect Stdout and Stderr to null
			     C	;;		     = 0: Don't redirect output.
			     C	;;
			     C	;;   OUTPUT:  CY = 0: Successful
			     C	;;	      CY = 1: Error - AX has the error code.
			     C	;;
			     C	;;   OPERATION:  The command line to be passed to the parameter block is
			     C	;;	 copied to the command buffer specified for the parameter block and
			     C	;;	 a carrage return is appended to the end of the buffer.  (The
			     C	;;	 command line length can be zero.
			     C	;;
			     C	;;	 The segment offsets in the parameter block are defined and DOS
			     C	;;	 function call 29H is performed to set up the default FCB's.
			     C	;;
			     C	;;	 DOS function call 4Bh is performed to load and execute the
			     C	;;	 specified child program.  The contents of SS and SP are destroyed
			     C	;;	 during the call, so they must be save and restored later.  When the
			     C	;;	 parent program (SELECT) gets control, all available memory is
			     C	;;	 allocated to it.  It is assumed that memory has been freed (Function
			     C	;;	 call 4Ah - FREE_MEM) before invoking this function.
			     C	;;
			     C	;;************************************************************************;;
			     C	EXEC_PROGRAM	MACRO  CHILD, NAME_COM, PARM_BLOCK, RE_DIR ;;AN000;
			     C	
			     C	    MOV  AX, OFFSET CHILD			 ;;AN000;
			     C	    PUSH AX					 ;;AN000;
			     C	    MOV  AX, OFFSET NAME_COM			 ;;AN000;
			     C	    PUSH AX					 ;;AN000;
			     C	    MOV  AX, OFFSET PARM_BLOCK			 ;;AN000;
			     C	    PUSH AX					 ;;AN000;
			     C	    MOV  AX, RE_DIR				 ;;AN000;
			     C	    PUSH AX					 ;;AN000;
			     C	    CALL EXEC_PROGRAM_ROUTINE			 ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-59
selchild.asm			;AN000;                                      

			     C	    ENDM					 ;;AN000;
			     C	;;*****************************************************************************
			     C	;;
			     C	;;   FREE_MEM: Free memory by modifying the memory block
			     C	;;
			     C	;;   SYNTAX:  FREE_MEM	address
			     C	;;
			     C	;;   INPUT:
			     C	;;	 address - The address of the first free paragraph in memory.
			     C	;;
			     C	;;   OUTPUT: CY = 0, AX=undefined,  successful
			     C	;;	     CY = 1, AX= error code
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   FREEMEM MODIFIES ALLOCATED MEMORY BLOCKS TO
			     C	;;   CONTAIN THE NEW SPECIFIED BLOCK SIZE.
			     C	;;   IT MAKES USE OF DOS INT 21 (AH=4AH).
			     C	;;   IF AN ERROR OCCURS, THE CARRY FLAG IS SET, AND THE ERROR CODE
			     C	;;   IS RETURNED IN AX.
			     C	;;
			     C	;;****************************************************************************
			     C	FREE_MEM  MACRO  address			 ;;AN000;
			     C		PUSH	ES				 ;;AN000;
			     C		MOV	AH,62H				 ;;AN000;
			     C		DOSCALL 				;;AN000; Get the current PSP segment
			     C		MOV	ES,BX				;;AN000; Load current PSP segment
			     C		MOV	BX, ADDRESS			;;AN000; size of program in paragraphs in bx  reg
			     C	
			     C		MOV	AH,4AH				;;AN000; free memory function
			     C		DOSCALL 				;;AN000;
			     C		POP	ES				;;AN000;
			     C		ENDM					;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   CLEAR_SCREEN: clear the screen to white on blue
			     C	;;
			     C	;;   SYNTAX:  CLEAR_SCREEN
			     C	;;
			     C	;;   INPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OPERATION: Clears the screen using the BIOS function to scroll the
			     C	;;	screen completely.
			     C	;;
			     C	;;****************************************************************************
			     C	CLEAR_SCREEN	MACRO				;;AN000;
			     C		MOV	CX,0			;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-60
selchild.asm			;AN000;                                      

			     C		MOV	DX,184Fh		;;AN000;  scroll screen from (0,0) tO (24,79)
			     C		MOV	AX,0600h		;;AN000;  AH = 6, Scroll Function
			     C						;;  AL = 0, Clear scroll area
			     C		MOV	BH,01FH 		;;AN000;  video I/O interrupt
			     C		INT	10H			;;AN000;
			     C		MOV	DX,0			;;AN000; RKJ-set cursor posn to top right hand corner
			     C		MOV	BH,0			;;AN000; RKJ
			     C		MOV	AH,2			;;AN000; RKJ
			     C		INT	10H			;;AN000; RKJ
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   CLEAR_SCREEN2: clear the screen to white on black
			     C	;;
			     C	;;   SYNTAX:  CLEAR_SCREEN2
			     C	;;
			     C	;;   INPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OPERATION: Clears the screen using the BIOS function to scroll the
			     C	;;	screen completely.
			     C	;;
			     C	;;****************************************************************************
			     C	CLEAR_SCREEN2	MACRO			;;AN000;
			     C		MOV	CX,0			;;AN000;
			     C		MOV	DX,184Fh		;;AN000;  scroll screen from (0,0) tO (24,79)
			     C		MOV	AX,0600h		;;AN000;  AH = 6, Scroll Function
			     C						;;  AL = 0, Clear scroll area
			     C		MOV	BH,7			;;AN000;  video I/O interrupt
			     C		INT	10H			;;AN000;
			     C		MOV	DX,0			;;AN000; RKJ-set cursor posn to top right hand corner
			     C		MOV	BH,0			;;AN000; RKJ
			     C		MOV	AH,2			;;AN000; RKJ
			     C		INT	10H			;;AN000; RKJ
			     C		ENDM				;;AN000;
			     C	;;****************************************************************************
			     C	;;
			     C	;;   POS_CURSOR: position the cursor to top left corner of screen
			     C	;;
			     C	;;   SYNTAX:  POS_CURSOR
			     C	;;
			     C	;;   INPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	None.
			     C	;;
			     C	;;   OPERATION: Homes the cursor using the BIOS function call.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-61
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;****************************************************************************
			     C	POS_CURSOR	MACRO			;;AN085; SEH
			     C		PUSH	AX			;;AN085; SEH
			     C		PUSH	BX			;;AN085; SEH
			     C		PUSH	CX			;;AN085; SEH
			     C		PUSH	DX			;;AN085; SEH
			     C		PUSH	SI			;;AN085; SEH
			     C		PUSH	DI			;;AN085; SEH
			     C		PUSH	ES			;;AN085; SEH
			     C		MOV	DX,0			;;AN085; SEH-set cursor posn to top left hand corner
			     C		XOR	BH,BH			;;AN085; SEH
			     C		MOV	AH,2			;;AN085; SEH
			     C		INT	10H			;;AN085; SEH
			     C		POP	ES			;;AN085; SEH
			     C		POP	DI			;;AN085; SEH
			     C		POP	SI			;;AN085; SEH
			     C		POP	DX			;;AN085; SEH
			     C		POP	CX			;;AN085; SEH
			     C		POP	BX			;;AN085; SEH
			     C		POP	AX			;;AN085; SEH
			     C	ENDM					;;AN085; SEH
			     C	;;****************************************************************************
			     C	;;
			     C	;;   BEEP:    Produce a tone on the PC speaker
			     C	;;
			     C	;;   SYNTAX:  BEEP frequency, duration
			     C	;;
			     C	;;   INPUT:   frequency = 37 to 32767
			     C	;;	      duration	= 1 to 65535
			     C	;;
			     C	;;   OUTPUT:  A SOUND
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;   BEEP CREATES A TONE USING THE PC SPEAKER
			     C	;;
			     C	;;****************************************************************************
			     C	BEEP	MACRO	FREQ,DUR		;;AN000;
			     C	
			     C	
			     C		MOV	DI, FREQ		;;AN000; set the frequency
			     C		MOV	BX, DUR 		;;AN000; set the duration
			     C		CALL	BEEP_ROUTINE		;;AN000;
			     C	
			     C		ENDM				;;AN000;
			     C	;;**************************************************************************
			     C	;;
			     C	;;   GOTO : used instead of branching assembler intructions
			     C	;;
			     C	;;   SYNTAX:  GOTO  label
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-62
selchild.asm			;AN000;                                      

			     C	;;
			     C	;;   INPUT:   label = an assembler label for a branching instruction
			     C	;;
			     C	;;   OUTPUT:  none
			     C	;;
			     C	;;   OPERATION:
			     C	;;
			     C	;;
			     C	;;**************************************************************************
			     C	GOTO	MACRO	LABEL				;;AN000;
			     C		JMP	LABEL				;;AN000; jump to label
			     C		ENDM					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   BYTE_TO_CHAR:  Convert a 8-bit binary number to ASCII format.
			     C	;;
			     C	;;   SYNTAX:  BYTE_TO_CHAR  var_num, name_str
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_num  =  binary number to convert.	(8 bits)
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 name_str =  ASCII-N string for the specifed value.
			     C	;;
			     C	;;   OPERATION:  The specified 8 bit numeric variable contents are converted
			     C	;;	 to ASCII and stored in ASCII-N format.  Leading zeros will not be
			     C	;;	 stored.
			     C	;;
			     C	;;************************************************************************;;
			     C	BYTE_TO_CHAR	 MACRO	 VAR_NUM, NAME_STR	;;AN000;
			     C	
			     C	
			     C		MOV	AL, VAR_NUM			;;AN000;
			     C		MOV	AH, 0				;;AN000;
			     C		MOV	DI, OFFSET NAME_STR		;;AN000;
			     C		CALL	BIN_TO_CHAR_ROUTINE		;;AN000;
			     C		ENDM					;;AN000;
			     C	;;************************************************************************;;
			     C	;;
			     C	;;   WORD_TO_CHAR:  Convert a binary number to ASCII format.
			     C	;;
			     C	;;   SYNTAX:  WORD_TO_CHAR  var_num, name_str
			     C	;;
			     C	;;   INPUT:
			     C	;;	 var_num  =  binary number to convert.	(16 bits)
			     C	;;
			     C	;;   OUTPUT:
			     C	;;	 name_str =  ASCII-N string for the specifed value.
			     C	;;
			     C	;;   OPERATION:  The specified 16 bit numeric variable contents are converted
			     C	;;	 to ASCII and stored in ASCII-N format.  Leading zeros will not be
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-63
selchild.asm			;AN000;                                      

			     C	;;	 stored.
			     C	;;
			     C	;;************************************************************************;;
			     C	WORD_TO_CHAR	 MACRO	 VAR_NUM, NAME_STR	;;AN000;
			     C	
			     C		MOV	AX, VAR_NUM			;;AN000;
			     C		MOV	DI, OFFSET NAME_STR		;;AN000;
			     C		CALL	BIN_TO_CHAR_ROUTINE		;;AN000;
			     C		ENDM					;;AN000;
			     C	
			     C	INCLUDE  MACROS6.INC				;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;     Assembler MACROS for use with SELECT.							
					  ;;AN000;
			     C	;;     File: MACROS6.INC									
					  ;;AN000;
			     C	;;     Latest Change Date: July 27, 1987							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;; These macros define powerful assembler verbs neccessary for SELECT.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;; Note: Many of the macros make use of an ASCII-N string for passing				
					  ;;AN000;
			     C	;;	 parameters.  The string is defined below.						
					  ;;AN000;
			     C	;;		   DW  count									
					  ;;AN000;
			     C	;;		   DB  "string_variable",?                                                          
				      ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 COUNT is the length of the string and is a word.					
					  ;;AN000;
			     C	;;	 It is necessary to follow the string with at least one byte for the			
					  ;;AN000;
			     C	;;	 purpose of changing the ASCII-N string to an ASCII-Z string.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-64
selchild.asm			;AN000;                                      

			     C	page					;;AN000;						
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SCAN_PARAMETERS: Scan SELECT command line for parameters.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  SCAN_PARAMETERS	mode								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 PSP command line									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 mode	  = Install mode								
					  ;;AN000;
			     C	;;		  = 0: Parameter is MENU							
					  ;;AN000;
			     C	;;		  = 1: Parameter is FDISK							
					  ;;AN000;
			     C	;;		  = 0FFH: Parameter is invalid							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION:  The SELECT command line is scanned for parameters.  The			
					  ;;AN000;
			     C	;;	 return codes for the various parameters are provided in variables			
					  ;;AN000;
			     C	;;	 defined above. 									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;  Note:											
					  ;;AN000;
			     C	;;	 Before this macro is executed, there must be as ASSUME ES:DATA 			
					  ;;AN000;
			     C	;;	 statement.  If not, the parser will not execute properly and				
					  ;;AN000;
			     C	;;	 either the computer will hang or erroneous values will be returned.			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-65
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	SCAN_PARAMETERS    MACRO     MODE								
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    CALL SCAN_PARAMETERS_ROUTINE								
					  ;;AN000;
			     C	    MOV  MODE, AX										
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SCAN_INFO_FILE: Scan SELECT.TMP for parameters.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  SCAN_INFO_FILE   option_0, option_1, option_2, option_3, path, filename, buffer, buff_
				size		  ;;AC033;SEH add option_3 parameter
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 filename  = The name of the file which contains the FDISK parameters.			
					  ;;AN000;
			     C	;;		     (ASCII-N format)								
					  ;;AN000;
			     C	;;	 buffer    = A buffer where the data read from the file can be stored.			
					  ;;AN000;
			     C	;;	 buff_size = The size of the buffer.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 option_1 = 1										
					  ;;AC033;
			     C	;;		  = 2										
					  ;;AC033;
			     C	;;		  = 3										
					  ;;AC033;
			     C	;;		  = 0FFh: Parameter is invalid (not 1, 2, 3)					
					  ;;AC033;
			     C	;;	 option_2 = 1										
					  ;;AC033;
			     C	;;		  = 2										
					  ;;AC033;
			     C	;;		  = 0FFh: Parameter is invalid (not 1, 2)					
					  ;;AC033;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-66
selchild.asm			;AN000;                                      

			     C	;;	 option_3 = 1										
					  ;;AC033;
			     C	;;		  = 2										
					  ;;AC033;
			     C	;;		  = 0FFh: Parameter is invalid (not 1, 2)					
					  ;;AC033;
			     C	;;	 path	  = Install path in ASCII-N format						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;	 If the parameter on the command line is FDISK, then the				
					  ;;AN000;
			     C	;;	 file specified in FILENAME is opened and additional parameters 			
					  ;;AN000;
			     C	;;	 are read.  If the parameters in the file are invalid, or if the file			
					  ;;AN000;
			     C	;;	 cannot be found, then 0FFh is returned in MODE and OPTION, and the			
					  ;;AN000;
			     C	;;	 path length is set to zero.								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	SCAN_INFO_FILE	  MACRO     OPTION_0, OPTION_1, OPTION_2, OPTION_3, PATH, FILENAME, BUFFER, BUFF_SIZ
				E
			     C													
					  ;;AN000;
			     C	    MOV  AX, OFFSET PATH									
					  ;;AN000;
			     C	    PUSH AX											
					  ;;AN000;
			     C	    MOV  AX, OFFSET FILENAME									
					  ;;AN000;
			     C	    PUSH AX											
					  ;;AN000;
			     C	    MOV  AX, OFFSET BUFFER									
					  ;;AN000;
			     C	    PUSH AX											
					  ;;AN000;
			     C	    MOV  AX, BUFF_SIZE										
					  ;;AN000;
			     C	    PUSH AX											
					  ;;AN000;
			     C	    CALL SCAN_INFO_FILE_ROUTINE 								
					  ;;AN000;
			     C	    mov  option_0, ax
			     C	    MOV  OPTION_1, BX										
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-67
selchild.asm			;AN000;                                      

			     C	    MOV  OPTION_2, CX										
					  ;;AN000;
			     C	    MOV  OPTION_3, DX										
					  ;;AN033;SEH return OPTION_3, also
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   COPY_FILES:  Copy a list of files from the A diskette to either the B			
					  ;;AN000;
			     C	;;	 or C drive.										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  COPY_FILES target_disk, file_table, num_files, path				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 target_disk = 1: Copy the files to the B drive 					
					  ;;AN000;
			     C	;;		     = 2: Copy the files to the C drive 					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 path	     = The path where the files are to be copied if the 			
					  ;;AN000;
			     C	;;		       destination is the hard disk.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 file_table  = A table listing the files to copy.  It is of the 			
					  ;;AN000;
			     C	;;		       following format.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;		       db     filename								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      - The filename must be padded out to 12 characters.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 num_files   = The number of files in the list. 					
					  ;;AN000;
			     C	;;												
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-68
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION:  The files listed in the table are copied to the destination			
					  ;;AN000;
			     C	;;	      from the A drive.  If the destination is C, then a path				
					  ;;AN000;
			     C	;;	      path can be specified.								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	COPY_FILES    MACRO	DEST, FILE_TABLE, NUM_FILES						
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  AX, DEST										
					  ;;AN000;
			     C	    MOV  BX, OFFSET FILE_TABLE									
					  ;;AN000;
			     C	    MOV  CX, NUM_FILES										
					  ;;AN000;
			     C	    CALL HOOK_INT_24		;AN000;JW							
					  ;;AN000;JW
			     C	    CALL MOD_XCOPY										
					  ;;AN000;
			     C	    CALL  RESTORE_INT_24	;AN000;JW							
					  ;;AN000;JW
			     C	    ENDM											
					  ;;AN000;
			     C													
					  ;;AN000;JW
			     C	COPY_FILES2   MACRO	DEST, FILE_TABLE, NUM_FILES, PATH					
					  ;;AN111;JW
			     C													
					  ;;AN111;JW
			     C	    MOV  AX, DEST										
					  ;;AN111;JW
			     C	    MOV  BX, OFFSET FILE_TABLE									
					  ;;AN111;JW
			     C	    MOV  CX, NUM_FILES										
					  ;;AN111;JW
			     C	    MOV  SI, OFFSET PATH									
					  ;;AN111;JW
			     C	    CALL HOOK_INT_24		;AN000;JW							
					  ;;AN111;JW
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-69
selchild.asm			;AN000;                                      

			     C	    CALL MOD_XCOPY										
					  ;;AN111;JW
			     C	    CALL  RESTORE_INT_24	;AN000;JW							
					  ;;AN111;JW
			     C	    ENDM											
					  ;;AN111;JW
			     C													
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INSTALL_FILES: Install the files from the original diskettes to the			
					  ;;AN000;
			     C	;;	 startup and the operations diskette.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  INSTALL_FILES  source_disk, target_disk						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 source_disk = 1: Read the files from the first diskette				
					  ;;AN000;
			     C	;;		     = 2: Read the files from the second diskette				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 target_disk = 1: Copy the files to the start-up diskette				
					  ;;AN000;
			     C	;;		     = 2: Copy the files to the operations diskette				
					  ;;AN000;
			     C	;;		     = 3: Copy the files to the hard disk					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	INSTALL_FILES MACRO	SOURCE_DISK, TARGET_DISK						
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-70
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    COPY_FILES	   SOURCE_DISK, TARGET_DISK, S_INSTALL_PATH, DOS_FILES, NUM_DOS_FILES		
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   GET_PRINTER_TITLES: Read the printer profile file and load the printer			
					  ;;AN000;
			     C	;;	 names into a table.									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_PRINTER_TITLES   filename							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 filename = A ASCII-N string containing the name of the file containing 		
					  ;;AN000;
			     C	;;		    the printer profile.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;    If CY = 0, No error was encountered.  The following information is returned:		
					  ;;AN000;
			     C	;;	 SEGMENT_LOCATION	= The segment where the printer names table is held ( 16 bit )	
					  ;;AN000;
			     C	;;	 NAMES_TABLE_OFFSET	= The offset in the segment of the printer names table ( 16 bit )
					  ;;AN000;
			     C	;;	 LONGEST_NAME		= The longest printer name in the file ( 16 bit )		
					  ;;AN000;
			     C	;;	 SIZE_NAMES_TABLE_ENTRY = The number of bytes between each printer name in the table (abs va
				lue ) ;;AN000;
			     C	;;	 PRINTER_NAME_INDEX	= The number of names in the table. ( 16 bit )			
					  ;;AN000;
			     C	;;    If CY = 1, An error was encountered.							
					  ;;AN000;
			     C	;;	 BX - Contains an error number as defined below.					
					  ;;AN000;
			     C	;;	 AX - Contains the DOS error number if the error listed in BX is a			
					  ;;AN000;
			     C	;;	      file related error.								
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-71
selchild.asm			;AN000;                                      

			     C	;;												
					  ;;AN000;
			     C	;;	 Error number			    Explaination.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      1 	     There is not enough memory to build the names			
					  ;;AN000;
			     C	;;			     table and provide a data buffer for reading the			
					  ;;AN000;
			     C	;;			     file information.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      2 	     There was an error opening the printer profile file.		
					  ;;AN000;
			     C	;;			     AX contains the DOS error code.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      3 	     There was an error reading the printer profile file.		
					  ;;AN000;
			     C	;;			     AX contains the DOS error code.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      4 	     The number at the beginning of the printer profile 		
					  ;;AN000;
			     C	;;			     giving the number of definitions in the file was			
					  ;;AN000;
			     C	;;			     either missing or was greater then 255.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      5 	     A line in the printer profile file was found to			
					  ;;AN000;
			     C	;;			     be longer then allowed in the buffer.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      6 	     There was an error find a printer name in the file 		
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      7 	     There was an error updating the file pointer			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      8 	     There are more then 255 printer definitions in the 		
					  ;;AN000;
			     C	;;			     file.								
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-72
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	      9 	     The number of actual definitions in the printer profile		
					  ;;AN000;
			     C	;;			     file did not agree with the number given at the			
					  ;;AN000;
			     C	;;			     beginning of the file.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	     10 	     There was an error allocating the memory needed for		
					  ;;AN000;
			     C	;;			     the data.								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	GET_PRINTER_TITLES MACRO     FILENAME								
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  DI, OFFSET FILENAME	       ; The name of the printer definition file		
					  ;;AN000;
			     C	    CALL GET_PRINTER_TITLES_ROUTINE    ; Subroutine to perform the function.			
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   GET_PRINTER_INFO:	Given the number of a printer, this routines retrieves			
					  ;;AN000;
			     C	;;	 the information for this printer from the profile file.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_PRINTER_INFO	 printer_num							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-73
selchild.asm			;AN000;                                      

			     C	;;	 printer_num = The number the printer to get the information on.			
					  ;;AN000;
			     C	;;		       The number is the location of this printer in the			
					  ;;AN000;
			     C	;;		       printer names list.							
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;	 The following variable are updated with the information found in			
					  ;;AN000;
			     C	;;	 the file:										
					  ;;AN000;
			     C	;;	       I_PRINTER									
					  ;;AN000;
			     C	;;	       N_PRINTER_TYPE									
					  ;;AN000;
			     C	;;	       S_MODE_PARM									
					  ;;AN000;
			     C	;;	       S_CP_DRIVER									
					  ;;AN000;
			     C	;;	       S_CP_PREPARE									
					  ;;AN000;
			     C	;;	       S_GRAPH_PARM									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 If CY = 1, There were errors encountered.						
					  ;;AN000;
			     C	;;	      BX = An error code indicating the type of error that occured.			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;		 = 3  There was an error reading the file					
					  ;;AN000;
			     C	;;		 = 7  There was a error accessing the file					
					  ;;AN000;
			     C	;;		 = 11 A printer definition has either a CDP or a CPP				
					  ;;AN000;
			     C	;;			Prefix, but BOTH were not present.					
					  ;;AN000;
			     C	;;		 = 12 There was an error in the printer definition.				
					  ;;AN000;
			     C	;;			- A line was found with an invalid prefix				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;		 If the error was a result of a DOS function, then				
					  ;;AN000;
			     C	;;		 on return, AX will contain the DOS error code. 				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-74
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	GET_PRINTER_INFO       MACRO	 VAR_PRT							
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  AX, VAR_PRT										
					  ;;AN000;
			     C	    CALL GET_PRINTER_INFO_ROUTINE								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   RELEASE_PRINTER_INFO: Close the printer profile file and free the				
					  ;;AN000;
			     C	;;	 allocated memory.									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  RELEASE_PRINTER_INFO								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 0, There were no error encountered.						
					  ;;AN000;
			     C	;;	 If CY = 1, There was an error. 							
					  ;;AN000;
			     C	;;	     AX = The DOS error code for the deallocate memory function 			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-75
selchild.asm			;AN000;                                      

			     C	;;   OPERATION: Closes the printer profile file and deallocted memory.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	RELEASE_PRINTER_INFO	MACRO									
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    CALL RELEASE_PRINTER_INFO_ROUTINE								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   GET_PRINTER_PARAMS: Get parameters for specified printer.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_PRINTER_PARAMS  var_prt, var_port, var_status 				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 var_prt  = The printer number. 							
					  ;;AN000;
			     C	;;	 var_port = The number of the port to retrieve the information on.			
					  ;;AN000;
			     C	;;		    If var_port = 0, the information that is returned is			
					  ;;AN000;
			     C	;;		    that which cooresponds to var_prt.						
					  ;;AN000;
			     C	;;	   var_port = 0 : Get the information on printer number VAR_PRT 			
					  ;;AN000;
			     C	;;		    = 1 : Get the information for the printer attached to LPT1			
					  ;;AN000;
			     C	;;		    = 2 : Get the information for the printer attached to LPT2			
					  ;;AN000;
			     C	;;		    = 3 : Get the information for the printer attached to LPT3			
					  ;;AN000;
			     C	;;		    = 4 : Get the information for the printer attached to COM1			
					  ;;AN000;
			     C	;;		    = 5 : Get the information for the printer attached to COM2			
					  ;;AN000;
			     C	;;		    = 6 : Get the information for the printer attached to COM3			
					  ;;AN000;
			     C	;;		    = 7 : Get the information for the printer attached to COM4			
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-76
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 var_status = 1: Printer information is valid						
					  ;;AN000;
			     C	;;		    = 0: Printer not valid: default values returned				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: Printer information for the specified printer is returned.			
					  ;;AN000;
			     C	;;	 If the specified printer is not defined, default values will be			
					  ;;AN000;
			     C	;;	 returned.										
					  ;;AN000;
			     C	;;	      I_PRINTER      = Index into printer list (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      N_PRINTER_TYPE = P: Parallel printer						
					  ;;AN000;
			     C	;;			     = S: Serial printer						
					  ;;AN000;
			     C	;;	      I_PORT	     = Port number	       (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      I_REDIRECT     = Redirection port number (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      S_MODE_PARM    = Mode parameters		   - ASCII-N format			
					  ;;AN000;
			     C	;;	      S_CP_DRIVER    = Code page driver parameters - ASCII-N format			
					  ;;AN000;
			     C	;;	      S_CP_PREPARE   = Code prepare parameters	   - ASCII-N format			
					  ;;AN000;
			     C	;;	      S_GRAPH_PARM   = Graphics parameters	   - ASCII-N format			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 The structures of printer information are searched for the one with			
					  ;;AN000;
			     C	;;	 the same number as specified by VAR_PRT.  If found, the information			
					  ;;AN000;
			     C	;;	 in that structure is returned in the variables listed above.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	GET_PRINTER_PARAMS MACRO     VAR_PRT, VAR_PORT, VAR_STATUS					
					  ;;AN000;
			     C													
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-77
selchild.asm			;AN000;                                      

			     C	    MOV  AX, VAR_PRT										
					  ;;AN000;
			     C	    MOV  BX, VAR_PORT										
					  ;;AN000;
			     C	    CALL GET_PRINTER_PARAMS_ROUTINE								
					  ;;AN000;
			     C	    MOV  VAR_STATUS, AX 									
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SAVE_PRINTER_PARAMS: Save the printer information in the printer structures		
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  SAVE_PRINTER_PARAMS  var_prt							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 var_prt = The printer number.								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: Printer information for the specified printer is stored.			
					  ;;AN000;
			     C	;;	      I_PRINTER      = Index into printer list (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      N_PRINTER_TYPE = P: Parallel printer						
					  ;;AN000;
			     C	;;			     = S: Serial printer						
					  ;;AN000;
			     C	;;	      I_PORT	     = Port number	       (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      I_REDIRECT     = Redirection port number (16 bit variable) : default 1		
					  ;;AN000;
			     C	;;	      S_MODE_PARM    = Mode parameters		   - ASCII-N format			
					  ;;AN000;
			     C	;;	      S_CP_DRIVER    = Code page driver parameters - ASCII-N format			
					  ;;AN000;
			     C	;;	      S_CP_PREPARE   = Code prepare parameters	   - ASCII-N format			
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-78
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;	      S_GRAPH_PARM   = Graphics parameters	   - ASCII-N format			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 The information is stored in the structures according to the type			
					  ;;AN000;
			     C	;;	 and port number of this printer.  The first three structures are for			
					  ;;AN000;
			     C	;;	 LPT1 - LPT3, while the next four are for COM1 - COM2.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	SAVE_PRINTER_PARAMS	MACRO	  VAR_PRT							
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  AX, VAR_PRT										
					  ;;AN000;
			     C	    CALL SAVE_PRINTER_PARAMS_ROUTINE								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   CHANGE_AUTOEXEC:  Search for the SELECT command in the autoexec.bat and			
					  ;;AN000;
			     C	;;	 change the parameters for that line.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  CHANGE_AUTOEXEC	FILENAME, APPEND_STRING 					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 FILENAME = An ASCII-N string containing the name of the file to change.		
					  ;;AN000;
			     C	;;	      Since the string has to be converted into an ASCII-Z string,			
					  ;;AN000;
			     C	;;	      an extra byte must always be available following the string.			
					  ;;AN000;
			     C	;;	 APPEND_STRING = An ASCII-N string containing the parameters to add to			
					  ;;AN000;
			     C	;;	      the SELECT command.								
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-79
selchild.asm			;AN000;                                      

			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	CHANGE_AUTOEXEC    MACRO     FILENAME, APPEND_STRING						
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  DI, OFFSET FILENAME									
					  ;;AN000;
			     C	    MOV  SI, OFFSET APPEND_STRING								
					  ;;AN000;
			     C	    CALL CHANGE_AUTOEXEC_ROUTINE								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   LOAD_MESSAGES:  Load the messages and initialize the message retriever.			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  LOAD_MESSAGES									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, there was an error loading the messages.					
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-80
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	LOAD_MESSAGES MACRO										
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    CALL SYSLOADMSG										
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   DISPLAY_MESSAGE:  Call the message retriever to display a message. 			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  DISPLAY_MESSAGE	 msg_number							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 msg_number = The number of the message to be displayed. (16 bit value) 		
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, there was an error displaying the message.					
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	DISPLAY_MESSAGE    MACRO     MSG_NUMBER 							
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-81
selchild.asm			;AN000;                                      

			     C													
					  ;;AN000;
			     C	    MOV  AX, MSG_NUMBER 									
					  ;;AN000;
			     C	    CALL DISPLAY_MESSAGE_ROUTINE								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   CHECK_DOS_PATH:  Check to see if a path for the SET PATH command is valid			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  CHECK_DOS_PATH	path_str							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 path_str - An ASCII-N string containing the path to check.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;    If CY = 0, the path is valid.								
					  ;;AN000;
			     C	;;    If CY = 1, The path is NOT valid: 							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	CHECK_DOS_PATH	   MACRO     PATH_STR								
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  SI, PATH_STR										
					  ;;AN000;
			     C	    CALL CHECK_DOS_PATH_ROUTINE 								
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-82
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   CHECK_PATH:  Check to see if a path is valid.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  CHECK_PATH    path_str, drive, root						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 path_str - An ASCII-N string containing the path to check.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 drive	  = 0: Drive letter cannot be specified.  (8 bit or immediate value)		
					  ;;AN000;
			     C	;;		  = 1: Drive letter is optional and can be specified.				
					  ;;AN000;
			     C	;;		  = 2: Drive letter must be specified.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;	 root	  = 0: First non-drive character cannot be a backslash ('\') (8 bit or immediate val
				ue)   ;;AN000;
			     C	;;		  = 1: First non-drive character may be a backslash ('\')                           
				      ;;AN000;
			     C	;;		  = 2: First non-drive character must be a backslash ('\')                          
				      ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;; OUTPUT:											
					  ;;AN000;
			     C	;;    If CY = 0, the path is valid.								
					  ;;AN000;
			     C	;;    If CY = 1, The path is NOT valid: 							
					  ;;AN000;
			     C	;;	   AX = 1, The drive specified is invalid.						
					  ;;AN000;
			     C	;;	      = 2, There was no drive specified.						
					  ;;AN000;
			     C	;;	      = 3, There was a drive specified. 						
					  ;;AN000;
			     C	;;	      = 4, There was a leading backslash						
					  ;;AN000;
			     C	;;	      = 5, The leading backslash was NOT present.					
					  ;;AN000;
			     C	;;	      = 6, There was a trailing backslash.						
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-83
selchild.asm			;AN000;                                      

			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	CHECK_PATH    MACRO	PATH_STR, DRIVE, ROOT							
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  SI, PATH_STR										
					  ;;AN000;
			     C	    MOV  DI, SI 										
					  ;;AN000;
			     C	    CALL POS_ZERO										
					  ;;AN000;
			     C	    MOV  CX, [SI]										
					  ;;AN000;
			     C	    ADD  SI, 2											
					  ;;AN000;
			     C	    MOV  AL, DRIVE										
					  ;;AN000;
			     C	    MOV  AH, ROOT										
					  ;;AN000;
			     C	    CALL CHECK_VALID_PATH									
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   GET_NUMBER_PORTS: Get the number of parallel and serial ports attached			
					  ;;AN000;
			     C	;;	      to the computer.									
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_NUMBER_PORTS	 parallel, serial						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 None.											
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-84
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;	 parallel = The number of parallel ports attached. (8 bit value)			
					  ;;AN000;
			     C	;;	 serial   = The number of serial ports attached. (8 bit value)				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: The macro performs a call to interrupt 11H to determine 			
					  ;;AN000;
			     C	;;	 the number of ports available. 							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	GET_NUMBER_PORTS   MACRO     PARALLEL, SERIAL							
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    INT  11H					 ;; Determine equipment attached		
					  ;;AN000;
			     C	    SHR  AH, 1					 ;; Put the number of serial ports in L.S. Bits 
					  ;;AN000;
			     C	    MOV  BH, 0											
					  ;;AN000;
			     C	    MOV  BL, AH 										
					  ;;AN000;
			     C	    MOV  SERIAL, BX										
					  ;;AN000;
			     C	    AND  SERIAL, 0000000000000111B		 ;; Mask off the unwanted information		
					  ;;AN000;
			     C	    MOV  CL, 5					 ;; Number of bits to shift			
					  ;;AN000;
			     C	    SHR  AH, CL 				 ;; Put the number of parallel ports in L.S. Bits
					  ;;AN000;
			     C	    MOV  BL, AH 										
					  ;;AN000;
			     C	    MOV  PARALLEL, BX				 ;; Store					
					  ;;AN000;
			     C	    AND  PARALLEL, 0000000000000011B		 ;; Mask off the unwanted infromation		
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   CHANGE_ATTRIBUTE: Change the attributes on a group of file to be hidden			
					  ;;AN000;
			     C	;;	      files.										
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-85
selchild.asm			;AN000;                                      

			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  CHANGE_ATTRIBUTE	  list_ptr, num_files						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 list_ptr = A pointer to a the list of files to change the attributes			
					  ;;AN000;
			     C	;;		    of.  The list must be of the form:						
					  ;;AN000;
			     C	;;			db   filename,?,?							
					  ;;AN000;
			     C	;;		    Where the filename takes up 12 bytes.					
					  ;;AN000;
			     C	;;	 num_file  = The number of files in the list.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, there was an error encountered.						
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: The macro reads the attribute of the file, stores it in the			
					  ;;AN000;
			     C	;;	 word following the filename in the list, and then assigns the new			
					  ;;AN000;
			     C	;;	 attribute to the file. 								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	CHANGE_ATTRIBUTE   MACRO     LIST_PTR, NUM_FILES						
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  SI, LIST_PTR				 ;; Get the address of the file list		
					  ;;AN000;
			     C	    MOV  AX, 0					 ;; Indicate we are to attach a new attribute to the
				 file ;;AN000;
			     C	    MOV  BX, NUM_FILES				 ;; Load the number of files in the list	
					  ;;AN000;
			     C	    CALL CHANGE_ATTRIBUTE_ROUTINE		 ;; Change the attributes			
					  ;;AN000;
			     C	    ENDM											
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-86
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   RESTORE_ATTRIBUTE: Restore the original attributes on a group of file.			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  RESTORE_ATTRIBUTE  list_ptr, num_files						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 list_ptr = A pointer to a the list of files to change the attributes			
					  ;;AN000;
			     C	;;		    of.  The list must be of the form:						
					  ;;AN000;
			     C	;;			db   filename,?,?							
					  ;;AN000;
			     C	;;		    Where the filename takes up 12 bytes.					
					  ;;AN000;
			     C	;;	 num_files = The number of files in the list.						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, there was an error encountered.						
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: This macros restores the attribute previously stored for the			
					  ;;AN000;
			     C	;;	 listed files.										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	RESTORE_ATTRIBUTE   MACRO     LIST_PTR, NUM_FILES						
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  SI, LIST_PTR				 ;; Get the address of the file list		
					  ;;AN000;
			     C	    MOV  AX, 1					 ;; Indicate we are to attach a new attribute to the
				 file ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-87
selchild.asm			;AN000;                                      

			     C	    MOV  BX, NUM_FILES				 ;; Load the number of files in the list	
					  ;;AN000;
			     C	    CALL CHANGE_ATTRIBUTE_ROUTINE		 ;; Change the attributes			
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   COMPARE_STRINGS:  Compare two strings.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  COMPARE_STRINGS	string_1, string_2						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 string_1 = The address of the first string. (ASCII-N string)				
					  ;;AN000;
			     C	;;	 string_2 = The address of the second string. (ASCII-N string)				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, the strings do no compare.							
					  ;;AN000;
			     C	;;	 If CY = 0, the strings are the same.							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	COMPARE_STRINGS    MACRO     STRING_1, STRING_2 						
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  SI, STRING_1										
					  ;;AN000;
			     C	    LEA  DI, STRING_2										
					  ;;AN000;
			     C	    CALL COMPARE_ROUTINE									
					  ;;AN000;
			     C	    ENDM											
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-88
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   CHECK_WRITE_PROTECT  Determine if the diskette in drive A/B is write			
					  ;;AC000;JW
			     C	;;			protected.								
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  CHECK_WRITE_PROTECT RET_CODE							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 DRIVE = A_DRIVE (0) Check the diskette in the A drive					
					  ;;AC000;JW
			     C	;;	 DRIVE = B_DRIVE (1) Check the diskette in the B drive					
					  ;;AC000;JW
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, There was an error accessing the drive.					
					  ;;AN000;
			     C	;;	 If CY = 0, There were no errors.							
					  ;;AN000;
			     C	;;	 RET_CODE = 1: The diskette IS write protected. 					
					  ;;AN000;
			     C	;;		  = 0: The diskette is NOT write protected.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	CHECK_WRITE_PROTECT	MACRO	  DRIVE, RET_CODE						
					  ;;AC000;JW
			     C	    MOV  CX,DRIVE										
					  ;;AN000;JW
			     C	    CALL CHECK_WRITE_ROUTINE									
					  ;;AN000;
			     C	    MOV  RET_CODE, AX										
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-89
selchild.asm			;AN000;                                      

			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   GET_FREE_SPACE  Determine the free disk space on a diskette.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_FREE_SPACE   drive, space							
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 drive = 1: Examine diskette in drive A 						
					  ;;AN000;
			     C	;;	       = 2: Examine diskette in drive B 						
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, there was an error accessing the disk					
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;	     space = The amount of free space on the disk (32-bit value)			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	GET_FREE_SPACE	   MACRO     DRIVE, SPACE							
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    MOV  DL, DRIVE										
					  ;;AN000;
			     C	    MOV  AH, 36H										
					  ;;AN000;
			     C	    DOSCALL											
					  ;;AN000;
			     C	    .IF < NC >											
					  ;;AN000;
			     C		 MUL  BX										
					  ;;AN000;
			     C		 MUL  CX										
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-90
selchild.asm			;AN000;                                      

					  ;;AN000;
			     C		 MOV  WORD PTR SPACE[0], AX								
					  ;;AN000;
			     C		 MOV  WORD PTR SPACE[2], DX								
					  ;;AN000;
			     C	    .ENDIF											
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   MATCH_DISK_FILES  Determine if a list of file exist on a disk.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   SYNTAX:  GET_FREE_SPACE   path, file_list, list_type, num_files, ret_code			
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   INPUT:											
					  ;;AN000;
			     C	;;	 path = ASCII-N string containing the drive, and path of where to			
					  ;;AN000;
			     C	;;		search. 									
					  ;;AN000;
			     C	;;	 file_list = The address of the list of files to use.  If AX=2, then			
					  ;;AN000;
			     C	;;		     the first two bytes are ignored.						
					  ;;AN000;
			     C	;;	 list_type = 1: Use a small list with 12 byte between filenames.			
					  ;;AN000;
			     C	;;		   = 2: Use a list with 14 bytes between filenames.				
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OUTPUT:											
					  ;;AN000;
			     C	;;	 If CY = 1, There was an error accessing the disk.					
					  ;;AN000;
			     C	;;	 If CY = 0, there were no errors.							
					  ;;AN000;
			     C	;;	     ret_code = 1: All the files are on the disk.					
					  ;;AN000;
			     C	;;	     ret_code = 0: All the file are NOT on the disk.					
					  ;;AN000;
			     C	;;												
					  ;;AN000;
			     C	;;   OPERATION: 										
					  ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-91
selchild.asm			;AN000;                                      

			     C	;;												
					  ;;AN000;
			     C	;;****************************************************************************			
					  ;;AN000;
			     C	MATCH_DISK_FILES   MACRO     PATH, FILE_LIST, LIST_TYPE, NUM_FILES, RET_CODE			
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	    LEA  DI, PATH										
					  ;;AN000;
			     C	    LEA  SI, FILE_LIST										
					  ;;AN000;
			     C	    MOV  AX, LIST_TYPE										
					  ;;AN000;
			     C	    MOV  CX, NUM_FILES										
					  ;;AN000;
			     C	    CALL MATCH_FILES_ROUTINE									
					  ;;AN000;
			     C	    MOV  RET_CODE, AX										
					  ;;AN000;
			     C	    ENDM											
					  ;;AN000;
			     C													
					  ;;AN000;
			     C	INCLUDE  MACROS7.INC										
					  ;;AN000;
			     C	PROCESS_ESC MACRO				;;AN000;
			     C		.IF < N_USER_FUNC eq E_ESCAPE > 	;;AN000;
			     C		.THEN					;;AN000;
			     C		   POP_HEADING				;;AN000;
			     C		.ENDIF					;;AN000;
			     C		ENDM					;;AN000;
			     C							;;AN000;
			     C	PROCESS_F3 MACRO				;;AN000;
			     C		.IF < N_USER_FUNC eq E_F3 >		;;AN000;
			     C		.THEN					;;AN000;
			     C		   GOTO 		EXIT_DOS	;;AN000;
			     C		.ENDIF					;;AN000;
			     C		ENDM					;;AN000;
			     C	
			     C	INIT_VAR_MINIMIZE MACRO
			     C		INIT_VAR		S_BUFFERS, 0				;;AN000;set BUFFERS = null (
				spaces)
			     C		INIT_VAR		S_FCBS, 0				;;AN000;set FCBS = null (spa
				ces)
			     C		INIT_VAR		F_ANSI, E_ANSI_NO			;;AN000;set ANSI = no
			     C		INIT_VAR		S_ANSI, 0				;;AN000;set ANSI field = nul
				l (spaces)
			     C		INIT_VAR		F_FASTOPEN, E_FASTOPEN_NO		;;AN000;set FASTOPEN = no
			     C		INIT_VAR		S_FASTOPEN, 0				;;AN000;set FASTOPEN = null 
				(spaces)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-92
selchild.asm			;AN000;                                      

			     C		INIT_VAR		F_GRAPHICS, E_GRAPHICS_NO		;;AN000;set GRAPHICS = no
			     C		INIT_VAR		S_GRAPHICS, 0				;;AN000;set GRAPHICS field =
				 null (spaces)
			     C		COPY_STRING		S_FILES, M_FILES, D_FILES_2		;AN000; set FILES = 8
			     C		ENDM
			     C	
			     C	INIT_VAR_BALANCE MACRO
			     C		COPY_STRING		S_BUFFERS, M_BUFFERS, D_BUFFERS_1	;;AN000;set BUFFERS = 20
			     C		INIT_VAR		S_FCBS, 0				;;AN000;set FCBS = null (spa
				ces)
			     C		INIT_VAR		F_ANSI, E_ANSI_YES			;;AN000;set ANSI = yes
			     C		INIT_VAR		S_ANSI, 0				;;AN000;set ANSI field = nul
				l (spaces)
			     C		INIT_VAR		F_FASTOPEN, E_FASTOPEN_YES		;;AN000;set FASTOPEN = yes
			     C		COPY_STRING		S_FASTOPEN, M_FASTOPEN, D_FASTOPEN_1	;;AN000;set FASTOPEN = C:=(5
				0,25)
			     C		INIT_VAR		F_GRAPHICS, E_GRAPHICS_YES		;;AN000;set GRAPHICS = yes
			     C		INIT_VAR		S_GRAPHICS, 0				;;AN000;set GRAPHICS field =
				 null (spaces)
			     C		COPY_STRING		S_FILES, M_FILES, D_FILES_1		;AN000; set FILES = 20
			     C		ENDM
			     C	
			     C	INIT_VAR_MAXIMIZE MACRO
			     C		COPY_STRING		S_BUFFERS, M_BUFFERS, D_BUFFERS_2	;;AN000;set BUFFERS = 50,4
			     C		COPY_STRING		S_FCBS, M_FCBS, D_FCBS_1		;;AN000;set FCBS = 20,8
			     C		INIT_VAR		F_ANSI, E_ANSI_YES			;;AN000;set ANSI = yes
			     C		COPY_STRING		S_ANSI, M_ANSI, D_ANSI_1		;;AN000;set ANSI field = /X
			     C		INIT_VAR		F_FASTOPEN, E_FASTOPEN_YES		;;AN000;set FASTOPEN = yes
			     C		COPY_STRING		S_FASTOPEN, M_FASTOPEN, D_FASTOPEN_2	;;AN000;set FASTOPEN = C:(15
				0,150)
			     C		INIT_VAR		F_GRAPHICS, E_GRAPHICS_YES		;;AN000;set GRAPHICS = yes
			     C		INIT_VAR		S_GRAPHICS, 0				;;AN000;set GRAPHICS field =
				 null (spaces)
			     C		COPY_STRING		S_FILES, M_FILES, D_FILES_1		;AN000; set FILES = 20
			     C		ENDM
			     C	
			     C	SAVE_PARAMETERS MACRO		SAV_FILE, RET_CODE		;;AN000;
			     C		PREPARE_FILE		SAV_FILE			;;AN000;
			     C		WORD_TO_CHAR		F_SHELL, S_STR120_1
			     C		WRITE_LINE		S_STR120_1
			     C		WORD_TO_CHAR		N_FORMAT_MODE, S_STR120_1	;;AN000;
			     C		WRITE_LINE		S_STR120_1			;;AN000;
			     C		WORD_TO_CHAR		N_DISK_1, S_STR120_1		;;AN000;
			     C		WRITE_LINE		S_STR120_1			;;AN000;
			     C		WORD_TO_CHAR		I_DESTINATION,S_STR120_1	;;AN033;SEH  save destination, too
			     C		WRITE_LINE		S_STR120_1			;;AN033;SEH
			     C		WRITE_LINE		S_INSTALL_PATH			;;AN000;
			     C		SAVE_FILE		SAV_FILE, RET_CODE		;;AN000;
			     C		ENDM							;;AN000;
			     C	
			     C	CREATE_CONFIG  MACRO	CONFIG_FILE, RET_CODE			;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-93
selchild.asm			;AN000;                                      

			     C		PREPARE_FILE	CONFIG_FILE				;;AN000;
			     C		CALL		CREATE_CONFIG_SYS			;;AN000;
			     C		SAVE_FILE	CONFIG_FILE, RET_CODE			;;AN000;
			     C		ENDM							;;AN000;
			     C	
			     C	CREATE_AUTOEXEC MACRO	AUTO_FILE, DEST, RET_CODE		;;AN000;
			     C		MOV		N_DEST, DEST				;;AN000;
			     C		PREPARE_FILE	AUTO_FILE				;;AN000;
			     C		CALL		CREATE_AUTOEXEC_BAT			;;AN000;
			     C		SAVE_FILE	AUTO_FILE, RET_CODE			;;AN000;
			     C		ENDM							;;AN000;
			     C	
			     C	CREATE_SHELL  MACRO	SHELL_FILE, RET_CODE	   ;;AN000;
			     C		PREPARE_FILE	SHELL_FILE		   ;;AN000;
			     C		CALL		CREATE_SHELL_BAT	   ;;AN000;
			     C		SAVE_FILE	SHELL_FILE, RET_CODE	   ;;AN000;
			     C		ENDM					   ;;AN000;
			     C	
			     C	ADD_WORD	MACRO  VAR1, VAR2		;;AN000;
			     C		MOV	AX,VAR2 			;;AN000;
			     C		ADD	VAR1,AX 			;;AN000;
			     C		ENDM					;;AN000;
			     C	
			     C	CHECK_DISPLAY	MACRO				;;AN000;
			     C		CALL	VIDEO_CHECK			;;AN000;
			     C		ENDM					;;AN000;
			     C	
			     C	SAVE_PANEL_LIST MACRO				;;AN000;
			     C		MOV	AX,0ADC0H			;;AN000;
			     C		MOV	BX,0FFFFH			;;AN000;
			     C		INT	2FH				;;AN000;
			     C		ENDM					;;AN000;
			     C	
			     C	PREP_FOR_ONE	MACRO  CPOS			;;AN000;
			     C			MOV	DH,CPOS 		;;AN000;
			     C			CALL	DO_PREP_FOR_ONE 	;;AN000;
			     C			ENDM				;;AN000;
			     C	
			     C	HOOK15		MACRO				;;AN000;
			     C			CALL	DO_HOOK15		;;AN000;
			     C			ENDM				;;AN000;
			     C	
			     C	UNHOOK15	MACRO				;;AN000;
			     C			CALL	DO_UNHOOK15		;;AN000;
			     C			ENDM				;;AN000;
			     C	
			     C	GET_INSTALLED_MEM MACRO MEMORY			;;AN000;
			     C			INT  12H			;;AN000;
			     C			MOV  MEMORY,AX			;;AN000;
			     C			ENDM				;;AN000;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-94
selchild.asm			;AN000;                                      

			     C	HOOK_2F_FORMAT	MACRO				;;AN000;
			     C			CALL	HOOK_INT_2F_FORMAT	;;AN000;
			     C			ENDM				;;AN000;
			     C	
			     C	UNHOOK_2F	MACRO				;;AN000;
			     C			CALL	RESTORE_INT_2F		;;AN000;
			     C			ENDM				;;AN000;
			     C	
			     C	INCLUDE MACROS8.INC				;AN000;
			     C	;DSKCPY_ERR	DB	  0
 = 0001                      C	DSKCPY_EXIT	EQU	  1	  ;AN000;DT user chose to exit diskcopy
			     C	
			     C	;DSKCPY_WHICH	DB
 = 0000                      C	DSKCPY_TO_A_720 EQU	  0	  ;AN000;DT
 = 0001                      C	DSKCPY_TO_A_360 EQU	  1	  ;AN000;DT
 = 0002                      C	DSKCPY_TO_B	EQU	  2	  ;AN000;DT
			     C	
			     C	;DSKCPY_OPTION	DB
 = 0000                      C	SOURCE1 	EQU	 0	  ;AN000;DT
 = 0001                      C	NO_SOURCE1	EQU	 1	  ;AN000;DT
			     C	
 = 0000                      C	NOCHECK 	EQU	  0
			     C	DISKCOPY_TO	MACRO	 WHERE,HOW,CHECK	     ;;AN000;
			     C			MOV  DSKCPY_WHICH,WHERE 	     ;;AN000;
			     C			MOV  DSKCPY_OPTION,HOW		     ;;AN000;
			     C			LEA  AX,CHECK			     ;;AN000;
			     C			MOV  DSKCPY_SOURCE,AX		     ;;AN000;
			     C			ENDM				     ;;AN000;
			     C	
 = 0000                      C	NOPANEL 	EQU	  0			     ;;AN000;
			     C	DISKCOPY_PANELS MACRO	 PANEL1, PANEL2, PANEL3      ;;AN000;
			     C			MOV	 DSKCPY_PAN1,PANEL1	     ;;AN000;
			     C			MOV	 DSKCPY_PAN2,PANEL2	     ;;AN000;
			     C			MOV	 DSKCPY_PAN3,PANEL3	     ;;AN000;
			     C			ENDM				     ;;AN000;
			     C	
			     C	INSERT_DISK	MACRO	 DSK_PANEL, SRCH_FILE	     ;;AN000;
			     C			MOV	 DISK_PANEL, DSK_PANEL	     ;;AN000;
			     C			LEA	 DI,SRCH_FILE		     ;;AN000;
			     C			MOV	 SEARCH_FILE, DI	     ;;AN000;
			     C			CALL	 INSERT_DISK_ROUTINE	     ;;AN000;
			     C			ENDM				     ;;AN000;
			     C	
			     C	HANDLE_FORMAT_ERROR MACRO			     ;;AN000;
			     C			LOCAL	FORERR1,FORERR2,FORERR3      ;;AN000;
			     C			CMP	SUB_ERROR,6		     ;;AN000;
			     C			JNE	FORERR1 		     ;;AN000;
			     C			MOV	AX,PAN_DRIVE_ERROR	     ;;AN000;
			     C			JMP	FORERR3 		     ;;AN000;
			     C	FORERR1:	CMP	SUB_ERROR,7		     ;;AN000;
			     C			JNE	FORERR2 		     ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-95
selchild.asm			;AN000;                                      

			     C			MOV	AX,PAN_WRITE_PROT	     ;;AN000;
			     C			JMP	FORERR3 		     ;;AN000;
			     C	FORERR2:	MOV	AX,ERR_GENERAL		     ;;AN000;
			     C	FORERR3:	HANDLE_ERROR AX,E_RETURN	     ;;AN000;
			     C			ENDM				     ;;AN000;
			     C	
			     C	
			     C	
									;
					PUBLIC	HANDLE_CHILDREN 	;AN000;
 0000				HANDLE_CHILDREN PROC			;AN000;
					PUSHH	<AX,BX,CX,DI,ES>	;AN000;
 0000  50                    2		PUSH	AX			; 
 0001  53                    2		PUSH	BX			; 
 0002  51                    2		PUSH	CX			; 
 0003  57                    2		PUSH	DI			; 
 0004  06                    2		PUSH	ES			; 
 0005  C7 06 0000 E 0002		MOV	QM_OPT1,QM_PUSHCHD	;AN000; push child panels
									;
 000B  8B 1E 0000 E			MOV	BX,QM_ACTIVEPAN 	;AN000;
 000F  E8 0000 E			CALL	GET_PCB 		;AN000; get panel control block
									; for active parent panel
 0012  26: 8B 4D 4F			MOV	CX,ES:[DI]+PCB_CHILDNUM ;AN000;
 0016  0B C9				OR	CX,CX			;AN000;
 0018  74 1C				JZ	HC_1			;AN000;
									;
 001A  26: FF 75 53			PUSH	ES:[DI]+PCB_CHILDSEG	;AN000; get address of first child panel
 001E  26: FF 75 51			PUSH	ES:[DI]+PCB_CHILDOFF	;AN000;
 0022  5F				POP	DI			;AN000;
 0023  07				POP	ES			;AN000;
									;
 0024  26: 8B 05		HC_0:	MOV	AX,ES:[DI]+CHD_PCB	;AN000;
 0027  A3 0000 E			MOV	QM_ID,AX		;AN000;
					PUSHH	<ES,DI> 		;AN000;
 002A  06                    2		PUSH	ES			; 
 002B  57                    2		PUSH	DI			; 
 002C  E8 0000 E			CALL	PCDISPQ_CALL		;AN000; push next child on the stack
					POPP	<DI,ES> 		;AN000;
 002F  5F                    2		POP	DI			; 
 0030  07                    2		POP	ES			; 
									;
 0031  83 C7 0E				ADD	DI,TYPE CHD_PB		;AN000; get next child control block
 0034  E2 EE				LOOP	HC_0			;AN000;
									;
 0036				HC_1:	POPP	<ES,DI,CX,BX,AX>	;AN000;
 0036  07                    2		POP	ES			; 
 0037  5F                    2		POP	DI			; 
 0038  59                    2		POP	CX			; 
 0039  5B                    2		POP	BX			; 
 003A  58                    2		POP	AX			; 
 003B  C3				RET				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Page     1-96
selchild.asm			;AN000;                                      

 003C				HANDLE_CHILDREN ENDP			;AN000;
 003C				SELECT	ENDS				;AN000;
					END				;AN000;

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-1


Macros:

		N a m e			Lines

ADD_WORD . . . . . . . . . . . .  	   2
APPEND_STRING  . . . . . . . . .  	   4
BEEP . . . . . . . . . . . . . .  	   3
BYTE_TO_CHAR . . . . . . . . . .  	   4
CHANGE_ATTRIBUTE . . . . . . . .  	   5
CHANGE_AUTOEXEC  . . . . . . . .  	   4
CHANGE_DIR . . . . . . . . . . .  	   7
CHECK_CLOCK  . . . . . . . . . .  	  10
CHECK_DATE_CHANGE  . . . . . . .  	  13
CHECK_DEFAULT_DRIVE  . . . . . .  	   7
CHECK_DISK . . . . . . . . . . .  	   6
CHECK_DISKETTE . . . . . . . . .  	  58
CHECK_DISPLAY  . . . . . . . . .  	   1
CHECK_DOS_PATH . . . . . . . . .  	   3
CHECK_DOS_VERSION  . . . . . . .  	   8
CHECK_EXPANDED_MEMORY  . . . . .  	   3
CHECK_MACHINE  . . . . . . . . .  	  18
CHECK_PATH . . . . . . . . . . .  	   9
CHECK_TIME_CHANGE  . . . . . . .  	  13
CHECK_VALID_MEDIA  . . . . . . .  	   7
CHECK_WRITE_PROTECT  . . . . . .  	   3
CHMOD_FILE . . . . . . . . . . .  	   2
CLEAR_SCREEN . . . . . . . . . .  	  10
CLEAR_SCREEN2  . . . . . . . . .  	  10
CLOSE_FILE . . . . . . . . . . .  	   3
COMPARE_STRINGS  . . . . . . . .  	   4
COMP_BYTES . . . . . . . . . . .  	   3
COMP_WORDS . . . . . . . . . . .  	   3
COPY_BYTE  . . . . . . . . . . .  	   2
COPY_FILES . . . . . . . . . . .  	   7
COPY_FILES2  . . . . . . . . . .  	   8
COPY_STRING  . . . . . . . . . .  	   5
COPY_WORD  . . . . . . . . . . .  	   2
CREATE_AUTOEXEC  . . . . . . . .  	   4
CREATE_CONFIG  . . . . . . . . .  	   3
CREATE_FILE  . . . . . . . . . .  	   4
CREATE_SHELL . . . . . . . . . .  	   3
DEC_VAR  . . . . . . . . . . . .  	   1
DIR  . . . . . . . . . . . . . .  	   6
DISKCOPY_PANELS  . . . . . . . .  	   3
DISKCOPY_TO  . . . . . . . . . .  	   4
DISPLAY_MESSAGE  . . . . . . . .  	   3
DOSCALL  . . . . . . . . . . . .  	   1
ERASE_FILE . . . . . . . . . . .  	   2
EXEC_PROGRAM . . . . . . . . . .  	   9
FIND_FILE  . . . . . . . . . . .  	   4
FIND_NEXT  . . . . . . . . . . .  	   5
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-2


FREE_MEM . . . . . . . . . . . .  	   8
GET_ALT_KEYBOARD . . . . . . . .  	  24
GET_ALT_KYBD_TABLE . . . . . . .  	  20
GET_COUNTRY_DEFAULTS . . . . . .  	   3
GET_COUNTRY_INDEX  . . . . . . .  	   4
GET_DATE . . . . . . . . . . . .  	  14
GET_DOS_COUNTRY  . . . . . . . .  	  12
GET_FREE_SPACE . . . . . . . . .  	  10
GET_INSTALLED_MEM  . . . . . . .  	   2
GET_KEYBOARD . . . . . . . . . .  	   5
GET_KEYBOARD_INDEX . . . . . . .  	   5
GET_NUMBER_PORTS . . . . . . . .  	  12
GET_PARTITION_SIZE . . . . . . .  	   7
GET_PRINTER_INFO . . . . . . . .  	   3
GET_PRINTER_PARAMS . . . . . . .  	   5
GET_PRINTER_TITLES . . . . . . .  	   3
GET_TIME . . . . . . . . . . . .  	   9
GOTO . . . . . . . . . . . . . .  	   1
HANDLE_FORMAT_ERROR  . . . . . .  	  10
HOOK15 . . . . . . . . . . . . .  	   1
HOOK_2F_FORMAT . . . . . . . . .  	   1
INC_VAR  . . . . . . . . . . . .  	   1
INIT . . . . . . . . . . . . . .  	   5
INIT_VAR . . . . . . . . . . . .  	   1
INIT_VAR_BALANCE . . . . . . . .  	   9
INIT_VAR_MAXIMIZE  . . . . . . .  	   9
INIT_VAR_MINIMIZE  . . . . . . .  	   9
INSERT_DISK  . . . . . . . . . .  	   4
INSTALL_FILES  . . . . . . . . .  	   2
LOAD_MESSAGES  . . . . . . . . .  	   2
MAKE_DIR . . . . . . . . . . . .  	   7
MAKE_DIR_PATHS . . . . . . . . .  	   2
MATCH_DISK_FILES . . . . . . . .  	   7
MERGE_STRING . . . . . . . . . .  	   8
OPEN_FILE  . . . . . . . . . . .  	   4
POPP . . . . . . . . . . . . . .  	   3
POP_HEADING  . . . . . . . . . .  	   2
POS_CURSOR . . . . . . . . . . .  	  18
PREPARE_FILE . . . . . . . . . .  	   2
PREP_FOR_ONE . . . . . . . . . .  	   2
PROCESS_ESC  . . . . . . . . . .  	   4
PROCESS_F3 . . . . . . . . . . .  	   4
PUSHH  . . . . . . . . . . . . .  	   3
PUSH_HEADING . . . . . . . . . .  	   2
READ_FILE  . . . . . . . . . . .  	   4
RELEASE_PRINTER_INFO . . . . . .  	   2
REMOVE_DIR . . . . . . . . . . .  	   7
RENAME_FILE  . . . . . . . . . .  	   4
RESTORE_ATTRIBUTE  . . . . . . .  	   5
SAVE_FILE  . . . . . . . . . . .  	   3
SAVE_PANEL_LIST  . . . . . . . .  	   3
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-3


SAVE_PARAMETERS  . . . . . . . .  	  11
SAVE_PRINTER_PARAMS  . . . . . .  	   3
SCAN_DISK_TABLE  . . . . . . . .  	   4
SCAN_INFO_FILE . . . . . . . . .  	  14
SCAN_PARAMETERS  . . . . . . . .  	   3
SET_DATE . . . . . . . . . . . .  	  12
SET_DISPLAY_MODE . . . . . . . .  	   1
SET_FILE_DATE_TIME . . . . . . .  	  33
SET_TIME . . . . . . . . . . . .  	  14
UNHOOK15 . . . . . . . . . . . .  	   1
UNHOOK_2F  . . . . . . . . . . .  	   1
UPDATE_DISK_TABLE  . . . . . . .  	   4
WORD_TO_CHAR . . . . . . . . . .  	   3
WRITE_FILE . . . . . . . . . . .  	   5
WRITE_LINE . . . . . . . . . . .  	   2

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

CHD_PB . . . . . . . . . . . . .  	000E	0007
  CHD_PCB  . . . . . . . . . . .  	0000
  CHD_ROW  . . . . . . . . . . .  	0002
  CHD_COL  . . . . . . . . . . .  	0004
  CHD_INX  . . . . . . . . . . .  	0006
ICB_PB . . . . . . . . . . . . .  	005E	002F
  ICB_OPT1 . . . . . . . . . . .  	0000
  ICB_OPT2 . . . . . . . . . . .  	0002
  ICB_OPT3 . . . . . . . . . . .  	0004
  ICB_OPT4 . . . . . . . . . . .  	0006
  ICB_ROW  . . . . . . . . . . .  	0008
  ICB_COL  . . . . . . . . . . .  	000A
  ICB_WIDTH  . . . . . . . . . .  	000C
  ICB_CCBID  . . . . . . . . . .  	000E
  ICB_STATUS . . . . . . . . . .  	0010
  ICB_CURCHAR  . . . . . . . . .  	0012
  ICB_HRSTART  . . . . . . . . .  	0014
  ICB_SOUND  . . . . . . . . . .  	0016
  ICB_KEYRET . . . . . . . . . .  	0018
  ICB_ENDBYTE  . . . . . . . . .  	001A
  ICB_FIELDLEN . . . . . . . . .  	001C
  ICB_FIELDOFF . . . . . . . . .  	001E
  ICB_FIELDSEG . . . . . . . . .  	0020
  ICB_ATTROFF  . . . . . . . . .  	0022
  ICB_ATTRSEG  . . . . . . . . .  	0024
  ICB_DEFLEN . . . . . . . . . .  	0026
  ICB_DEFOFF . . . . . . . . . .  	0028
  ICB_DEFSEG . . . . . . . . . .  	002A
  ICB_RETLEN . . . . . . . . . .  	002C
  ICB_RETOFF . . . . . . . . . .  	002E
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-4


  ICB_RETSEG . . . . . . . . . .  	0030
  ICB_ALLLEN . . . . . . . . . .  	0032
  ICB_ALLOFF . . . . . . . . . .  	0034
  ICB_ALLSEG . . . . . . . . . .  	0036
  ICB_SKIPLEN  . . . . . . . . .  	0038
  ICB_SKIPOFF  . . . . . . . . .  	003A
  ICB_SKIPSEG  . . . . . . . . .  	003C
  ICB_ALL1LEN  . . . . . . . . .  	003E
  ICB_ALL1OFF  . . . . . . . . .  	0040
  ICB_ALL1SEG  . . . . . . . . .  	0042
  ICB_DECPOS . . . . . . . . . .  	0044
  ICB_RANUML1  . . . . . . . . .  	0046
  ICB_RANUMH1  . . . . . . . . .  	0048
  ICB_RANUML2  . . . . . . . . .  	004A
  ICB_RANUMH2  . . . . . . . . .  	004C
  ICB_MANDPROW . . . . . . . . .  	004E
  ICB_MANDPCOL . . . . . . . . .  	0050
  ICB_MINUSLEN . . . . . . . . .  	0052
  ICB_MINUSOFF . . . . . . . . .  	0054
  ICB_MINUSSEG . . . . . . . . .  	0056
  ICB_PLUSLEN  . . . . . . . . .  	0058
  ICB_PLUSOFF  . . . . . . . . .  	005A
  ICB_PLUSSEG  . . . . . . . . .  	005C
PCB_PB . . . . . . . . . . . . .  	0055	002A
  PCB_OPT1 . . . . . . . . . . .  	0000
  PCB_OPT2 . . . . . . . . . . .  	0002
  PCB_OPT3 . . . . . . . . . . .  	0003
  PCB_OPT4 . . . . . . . . . . .  	0004
  PCB_UROW . . . . . . . . . . .  	0005
  PCB_UCOL . . . . . . . . . . .  	0007
  PCB_WIDTH  . . . . . . . . . .  	0009
  PCB_MAXSIZE  . . . . . . . . .  	000B
  PCB_CCBID  . . . . . . . . . .  	000D
  PCB_BORDER . . . . . . . . . .  	000F
  PCB_COMPLEN  . . . . . . . . .  	0017
  PCB_COMPOFF  . . . . . . . . .  	0019
  PCB_COMPSEG  . . . . . . . . .  	001B
  PCB_EXPANDLEN  . . . . . . . .  	001D
  PCB_EXPANDOFF  . . . . . . . .  	001F
  PCB_EXPANDSEG  . . . . . . . .  	0021
  PCB_MIXEDLEN . . . . . . . . .  	0023
  PCB_MIXEDOFF . . . . . . . . .  	0025
  PCB_MIXEDSEG . . . . . . . . .  	0027
  PCB_LABELLEN . . . . . . . . .  	0029
  PCB_LABELOFF . . . . . . . . .  	002B
  PCB_LABELSEG . . . . . . . . .  	002D
  PCB_LABELROW . . . . . . . . .  	002F
  PCB_LABELCOL . . . . . . . . .  	0031
  PCB_FPANLEN  . . . . . . . . .  	0033
  PCB_FNAMEOFF . . . . . . . . .  	0035
  PCB_FNAMESEG . . . . . . . . .  	0037
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-5


  PCB_FTEXTLOCL  . . . . . . . .  	0039
  PCB_FTEXTLOCH  . . . . . . . .  	003B
  PCB_LROW . . . . . . . . . . .  	003D
  PCB_LCOL . . . . . . . . . . .  	003F
  PCB_VERTSHADE  . . . . . . . .  	0041
  PCB_HORZSHADE  . . . . . . . .  	0042
  PCB_GFILLOFF . . . . . . . . .  	0043
  PCB_GFILLSEG . . . . . . . . .  	0045
  PCB_SCRSV1OFF  . . . . . . . .  	0047
  PCB_SCRSV2OFF  . . . . . . . .  	0049
  PCB_SCRSAVSEG  . . . . . . . .  	004B
  PCB_RESERVED . . . . . . . . .  	004D
  PCB_CHILDNUM . . . . . . . . .  	004F
  PCB_CHILDOFF . . . . . . . . .  	0051
  PCB_CHILDSEG . . . . . . . . .  	0053
SCB_PB . . . . . . . . . . . . .  	00D6	006C
  SCB_OPT1 . . . . . . . . . . .  	0000
  SCB_OPT2 . . . . . . . . . . .  	0002
  SCB_OPT3 . . . . . . . . . . .  	0004
  SCB_OPT4 . . . . . . . . . . .  	0006
  SCB_FREQ . . . . . . . . . . .  	0008
  SCB_ROW  . . . . . . . . . . .  	000A
  SCB_COL  . . . . . . . . . . .  	000C
  SCB_RELROW . . . . . . . . . .  	000E
  SCB_RELCOL . . . . . . . . . .  	0010
  SCB_WIDTH  . . . . . . . . . .  	0012
  SCB_NUMLINE  . . . . . . . . .  	0014
  SCB_TOPELE . . . . . . . . . .  	0016
  SCB_NUMELE . . . . . . . . . .  	0018
  SCB_CURELE . . . . . . . . . .  	001A
  SCB_NUMCOL . . . . . . . . . .  	001C
  SCB_CURCOL . . . . . . . . . .  	001E
  SCB_NLISTCOL . . . . . . . . .  	0020
  SCB_NLISTSEP . . . . . . . . .  	0022
  SCB_SKLEN  . . . . . . . . . .  	0023
  SCB_SKOFF  . . . . . . . . . .  	0025
  SCB_SKSEG  . . . . . . . . . .  	0027
  SCB_RLLEN  . . . . . . . . . .  	0029
  SCB_RLOFF  . . . . . . . . . .  	002B
  SCB_RLSEG  . . . . . . . . . .  	002D
  SCB_RELEN  . . . . . . . . . .  	002F
  SCB_REOFF  . . . . . . . . . .  	0031
  SCB_RESEG  . . . . . . . . . .  	0033
  SCB_UALEN  . . . . . . . . . .  	0035
  SCB_UAOFF  . . . . . . . . . .  	0037
  SCB_UASEG  . . . . . . . . . .  	0039
  SCB_DALEN  . . . . . . . . . .  	003B
  SCB_DAOFF  . . . . . . . . . .  	003D
  SCB_DASEG  . . . . . . . . . .  	003F
  SCB_LALEN  . . . . . . . . . .  	0041
  SCB_LAOFF  . . . . . . . . . .  	0043
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-6


  SCB_LASEG  . . . . . . . . . .  	0045
  SCB_RALEN  . . . . . . . . . .  	0047
  SCB_RAOFF  . . . . . . . . . .  	0049
  SCB_RASEG  . . . . . . . . . .  	004B
  SCB_PULEN  . . . . . . . . . .  	004D
  SCB_PUOFF  . . . . . . . . . .  	004F
  SCB_PUSEG  . . . . . . . . . .  	0051
  SCB_PDLEN  . . . . . . . . . .  	0053
  SCB_PDOFF  . . . . . . . . . .  	0055
  SCB_PDSEG  . . . . . . . . . .  	0057
  SCB_PILEN  . . . . . . . . . .  	0059
  SCB_PIOFF  . . . . . . . . . .  	005B
  SCB_PISEG  . . . . . . . . . .  	005D
  SCB_PICOL  . . . . . . . . . .  	005F
  SCB_AILEN  . . . . . . . . . .  	0061
  SCB_AIOFF  . . . . . . . . . .  	0063
  SCB_AISEG  . . . . . . . . . .  	0065
  SCB_AICOL  . . . . . . . . . .  	0067
  SCB_CILEN  . . . . . . . . . .  	0069
  SCB_CIOFF  . . . . . . . . . .  	006B
  SCB_CISEG  . . . . . . . . . .  	006D
  SCB_CICOL  . . . . . . . . . .  	006F
  SCB_UILEN  . . . . . . . . . .  	0071
  SCB_UIOFF  . . . . . . . . . .  	0073
  SCB_UISEG  . . . . . . . . . .  	0075
  SCB_UIROW  . . . . . . . . . .  	0077
  SCB_UICOL  . . . . . . . . . .  	0079
  SCB_DILEN  . . . . . . . . . .  	007B
  SCB_DIOFF  . . . . . . . . . .  	007D
  SCB_DISEG  . . . . . . . . . .  	007F
  SCB_DIROW  . . . . . . . . . .  	0081
  SCB_DICOL  . . . . . . . . . .  	0083
  SCB_LILEN  . . . . . . . . . .  	0085
  SCB_LIOFF  . . . . . . . . . .  	0087
  SCB_LISEG  . . . . . . . . . .  	0089
  SCB_LIROW  . . . . . . . . . .  	008B
  SCB_LICOL  . . . . . . . . . .  	008D
  SCB_RILEN  . . . . . . . . . .  	008F
  SCB_RIOFF  . . . . . . . . . .  	0091
  SCB_RISEG  . . . . . . . . . .  	0093
  SCB_RIROW  . . . . . . . . . .  	0095
  SCB_RICOL  . . . . . . . . . .  	0097
  SCB_NCRAYOFF . . . . . . . . .  	0099
  SCB_NCRAYSEG . . . . . . . . .  	009B
  SCB_CCBID  . . . . . . . . . .  	009D
  SCB_CCBVECNUM  . . . . . . . .  	009F
  SCB_CCBVECOFF  . . . . . . . .  	00A1
  SCB_CCBVECSEG  . . . . . . . .  	00A3
  SCB_INDEXOFF . . . . . . . . .  	00A5
  SCB_INDEXSEG . . . . . . . . .  	00A7
  SCB_SELOFF . . . . . . . . . .  	00A9
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-7


  SCB_SELSEG . . . . . . . . . .  	00AB
  SCB_OAOPT  . . . . . . . . . .  	00AD
  SCB_OAPOFF . . . . . . . . . .  	00AF
  SCB_OAPSEG . . . . . . . . . .  	00B1
  SCB_OASLEN . . . . . . . . . .  	00B3
  SCB_OASSEG . . . . . . . . . .  	00B5
  SCB_OASTERMC . . . . . . . . .  	00B7
  SCB_KS . . . . . . . . . . . .  	00B8
  SCB_LVBOFF . . . . . . . . . .  	00BA
  SCB_LVBSEG . . . . . . . . . .  	00BC
  SCB_FMOPT1 . . . . . . . . . .  	00BE
  SCB_FMOPT2 . . . . . . . . . .  	00C0
  SCB_TRANLEN  . . . . . . . . .  	00C2
  SCB_TRANOFF  . . . . . . . . .  	00C4
  SCB_TRANSEG  . . . . . . . . .  	00C6
  SCB_MONOOFF  . . . . . . . . .  	00C8
  SCB_MONOSEG  . . . . . . . . .  	00CA
  SCB_DBCSLEN  . . . . . . . . .  	00CC
  SCB_DBCSOFF  . . . . . . . . .  	00CE
  SCB_DBCSSEG  . . . . . . . . .  	00D0
  SCB_FONTOFF  . . . . . . . . .  	00D2
  SCB_FONTSEG  . . . . . . . . .  	00D4

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

SELECT . . . . . . . . . . . . .  	003C	PARA	PUBLIC	'SELECT'

Symbols:            

                N a m e         	Type	 Value	 Attr

A_DRIVE  . . . . . . . . . . . .  	NUMBER	0003	

B_DRIVE  . . . . . . . . . . . .  	NUMBER	0001	

CRD_BUFSIZE  . . . . . . . . . .  	NUMBER	0001	
CRD_IDNOTFOUND . . . . . . . . .  	NUMBER	0008	
CRD_NOCOLORS . . . . . . . . . .  	NUMBER	0002	
CRD_NOTCASFILE . . . . . . . . .  	NUMBER	0004	
C_DRIVE  . . . . . . . . . . . .  	NUMBER	0002	

DATA_INVALID . . . . . . . . . .  	NUMBER	0001	
DATA_VALID . . . . . . . . . . .  	NUMBER	0000	
DEF_DEST_A . . . . . . . . . . .  	NUMBER	0003	
DEF_DEST_B . . . . . . . . . . .  	NUMBER	0002	
DEF_DEST_C . . . . . . . . . . .  	NUMBER	0001	
DISKETTES_EXIST  . . . . . . . .  	NUMBER	0001	
DNARROW  . . . . . . . . . . . .  	NUMBER	5000	
DO_NOT_USE_DEFAULT . . . . . . .  	NUMBER	0001	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-8


DSKCPY_EXIT  . . . . . . . . . .  	NUMBER	0001	
DSKCPY_TO_A_360  . . . . . . . .  	NUMBER	0001	
DSKCPY_TO_A_720  . . . . . . . .  	NUMBER	0000	
DSKCPY_TO_B  . . . . . . . . . .  	NUMBER	0002	

ENTER  . . . . . . . . . . . . .  	NUMBER	000D	
ERR_ACCESSING_FILE . . . . . . .  	NUMBER	0007	
ERR_ALLOCATING_MEM . . . . . . .  	NUMBER	000A	
ERR_CDP_CPP  . . . . . . . . . .  	NUMBER	000B	
ERR_FINDING_NAME . . . . . . . .  	NUMBER	0006	
ERR_FINDING_VALUE  . . . . . . .  	NUMBER	0004	
ERR_LINE_TOO_LONG  . . . . . . .  	NUMBER	0005	
ERR_NOT_ENOUGH_MEM . . . . . . .  	NUMBER	0001	
ERR_NUMBER_MATCH . . . . . . . .  	NUMBER	0009	
ERR_OPENING_FILE . . . . . . . .  	NUMBER	0002	
ERR_PRN_DEFN . . . . . . . . . .  	NUMBER	000C	
ERR_READING_FILE . . . . . . . .  	NUMBER	0003	
ERR_TOO_MANY_DEFS  . . . . . . .  	NUMBER	0008	
ESCAPE . . . . . . . . . . . . .  	NUMBER	001B	
EXEC_DIR . . . . . . . . . . . .  	NUMBER	0001	
EXEC_NO_DIR  . . . . . . . . . .  	NUMBER	0000	
EXPECTED_VERSION . . . . . . . .  	NUMBER	0004	
E_1440_SECTORS . . . . . . . . .  	NUMBER	0012	
E_1440_TRACKS  . . . . . . . . .  	NUMBER	0050	

F1 . . . . . . . . . . . . . . .  	NUMBER	003B	
F10  . . . . . . . . . . . . . .  	NUMBER	0044	
F2 . . . . . . . . . . . . . . .  	NUMBER	003C	
F3 . . . . . . . . . . . . . . .  	NUMBER	003D	
F4 . . . . . . . . . . . . . . .  	NUMBER	003E	
F5 . . . . . . . . . . . . . . .  	NUMBER	003F	
F6 . . . . . . . . . . . . . . .  	NUMBER	0040	
F7 . . . . . . . . . . . . . . .  	NUMBER	0041	
F8 . . . . . . . . . . . . . . .  	NUMBER	0042	
F9 . . . . . . . . . . . . . . .  	NUMBER	0043	
FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FREE_EDOS_SPACE  . . . . . . . .  	NUMBER	0001	

GET_PCB  . . . . . . . . . . . .  	L NEAR	0000	SELECT	External
GV_128K  . . . . . . . . . . . .  	NUMBER	0800	
GV_192K  . . . . . . . . . . . .  	NUMBER	1000	
GV_256K  . . . . . . . . . . . .  	NUMBER	2000	
GV_64K . . . . . . . . . . . . .  	NUMBER	0400	
GV_CGA . . . . . . . . . . . . .  	NUMBER	0002	
GV_CGAA  . . . . . . . . . . . .  	NUMBER	0040	
GV_CGAP  . . . . . . . . . . . .  	NUMBER	0080	
GV_COLOR . . . . . . . . . . . .  	NUMBER	0010	
GV_EGA . . . . . . . . . . . . .  	NUMBER	0004	
GV_EGAA  . . . . . . . . . . . .  	NUMBER	0020	
GV_EGACM . . . . . . . . . . . .  	NUMBER	0080	
GV_EGAP  . . . . . . . . . . . .  	NUMBER	0100	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-9


GV_HS  . . . . . . . . . . . . .  	NUMBER	0200	
GV_MGA . . . . . . . . . . . . .  	NUMBER	0010	
GV_MONOP . . . . . . . . . . . .  	NUMBER	0040	
GV_P5140 . . . . . . . . . . . .  	NUMBER	0002	
GV_P5151 . . . . . . . . . . . .  	NUMBER	0008	
GV_P5153 . . . . . . . . . . . .  	NUMBER	0004	
GV_PGA . . . . . . . . . . . . .  	NUMBER	0008	
GV_PGAEM . . . . . . . . . . . .  	NUMBER	0100	
GV_TEXTGRAPH . . . . . . . . . .  	NUMBER	0020	
GV_TURBOP  . . . . . . . . . . .  	NUMBER	0200	
GV_TV  . . . . . . . . . . . . .  	NUMBER	0001	
GV_TVW . . . . . . . . . . . . .  	NUMBER	0001	
GV_UM  . . . . . . . . . . . . .  	NUMBER	4000	

HANDLE_CHILDREN  . . . . . . . .  	N PROC	0000	SELECT	Global	Length = 003C
HC_0 . . . . . . . . . . . . . .  	L NEAR	0024	SELECT
HC_1 . . . . . . . . . . . . . .  	L NEAR	0036	SELECT
HLP_CONT . . . . . . . . . . . .  	NUMBER	0001	
HLP_HELP . . . . . . . . . . . .  	NUMBER	0004	
HLP_INDX . . . . . . . . . . . .  	NUMBER	0008	
HLP_KEYS . . . . . . . . . . . .  	NUMBER	0002	
HLP_OVER . . . . . . . . . . . .  	NUMBER	0010	
HRD_BUFSIZE  . . . . . . . . . .  	NUMBER	0001	
HRD_DISPID . . . . . . . . . . .  	NUMBER	0004	
HRD_NOHELPID . . . . . . . . . .  	NUMBER	0008	
HRD_NOHLPOBJ . . . . . . . . . .  	NUMBER	0002	
HRD_NOOBJLST . . . . . . . . . .  	NUMBER	0004	
HRD_NOTCASFILE . . . . . . . . .  	NUMBER	0010	
HRD_TEXT . . . . . . . . . . . .  	NUMBER	0002	
HRD_TOPIC  . . . . . . . . . . .  	NUMBER	0001	

ICB_AXC  . . . . . . . . . . . .  	NUMBER	0020	
ICB_AXD  . . . . . . . . . . . .  	NUMBER	0040	
ICB_BEN  . . . . . . . . . . . .  	NUMBER	0008	
ICB_BEX  . . . . . . . . . . . .  	NUMBER	0010	
ICB_BKS  . . . . . . . . . . . .  	NUMBER	8000	
ICB_BOX  . . . . . . . . . . . .  	NUMBER	0020	
ICB_CAP  . . . . . . . . . . . .  	NUMBER	2000	
ICB_CLR  . . . . . . . . . . . .  	NUMBER	0200	
ICB_CSW  . . . . . . . . . . . .  	NUMBER	0080	
ICB_CTE  . . . . . . . . . . . .  	NUMBER	0008	
ICB_DEL  . . . . . . . . . . . .  	NUMBER	0002	
ICB_ECL  . . . . . . . . . . . .  	NUMBER	0001	
ICB_END  . . . . . . . . . . . .  	NUMBER	0010	
ICB_FGS  . . . . . . . . . . . .  	NUMBER	0400	
ICB_FIN  . . . . . . . . . . . .  	NUMBER	4000	
ICB_HOM  . . . . . . . . . . . .  	NUMBER	0004	
ICB_HOR  . . . . . . . . . . . .  	NUMBER	0008	
ICB_INS  . . . . . . . . . . . .  	NUMBER	0001	
ICB_LFA  . . . . . . . . . . . .  	NUMBER	4000	
ICB_MUS  . . . . . . . . . . . .  	NUMBER	0040	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-10


ICB_NUM  . . . . . . . . . . . .  	NUMBER	1000	
ICB_OUT  . . . . . . . . . . . .  	NUMBER	0100	
ICB_PAD  . . . . . . . . . . . .  	NUMBER	4000	
ICB_PSW  . . . . . . . . . . . .  	NUMBER	0400	
ICB_RJU  . . . . . . . . . . . .  	NUMBER	0800	
ICB_RTA  . . . . . . . . . . . .  	NUMBER	2000	
ICB_SCAP . . . . . . . . . . . .  	NUMBER	0040	
ICB_SCR  . . . . . . . . . . . .  	NUMBER	0800	
ICB_SDEF . . . . . . . . . . . .  	NUMBER	0001	
ICB_SINS . . . . . . . . . . . .  	NUMBER	0080	
ICB_SMU  . . . . . . . . . . . .  	NUMBER	0080	
ICB_SMUS . . . . . . . . . . . .  	NUMBER	0002	
ICB_SNUM . . . . . . . . . . . .  	NUMBER	0020	
ICB_SPUS . . . . . . . . . . . .  	NUMBER	0004	
ICB_SSCR . . . . . . . . . . . .  	NUMBER	0010	
ICB_STRU . . . . . . . . . . . .  	NUMBER	0008	
ICB_SWK  . . . . . . . . . . . .  	NUMBER	1000	
ICB_TBX  . . . . . . . . . . . .  	NUMBER	0004	
ICB_TSA  . . . . . . . . . . . .  	NUMBER	1000	
ICB_TSD  . . . . . . . . . . . .  	NUMBER	0800	
ICB_TSR  . . . . . . . . . . . .  	NUMBER	2000	
ICB_UDO  . . . . . . . . . . . .  	NUMBER	0400	
ICB_UFK  . . . . . . . . . . . .  	NUMBER	0200	
ICB_UPC  . . . . . . . . . . . .  	NUMBER	0100	
ICB_USC  . . . . . . . . . . . .  	NUMBER	0004	
ICB_WAE  . . . . . . . . . . . .  	NUMBER	0002	
ICB_WAR  . . . . . . . . . . . .  	NUMBER	0100	
ICB_WBS  . . . . . . . . . . . .  	NUMBER	0200	
ICB_WCE  . . . . . . . . . . . .  	NUMBER	0040	
ICB_WDL  . . . . . . . . . . . .  	NUMBER	0080	
ICB_WEN  . . . . . . . . . . . .  	NUMBER	0020	
ICB_WHM  . . . . . . . . . . . .  	NUMBER	0010	
ICB_WIN  . . . . . . . . . . . .  	NUMBER	0001	
ICB_WRP  . . . . . . . . . . . .  	NUMBER	8000	
ICB_XCL  . . . . . . . . . . . .  	NUMBER	0002	
INC_AMONO  . . . . . . . . . . .  	NUMBER	0020	
INC_DBCS . . . . . . . . . . . .  	NUMBER	0002	
INC_DDBCS  . . . . . . . . . . .  	NUMBER	0008	
INC_KFND . . . . . . . . . . . .  	NUMBER	0001	
INC_KWAIT  . . . . . . . . . . .  	NUMBER	0001	
INC_RSCAN  . . . . . . . . . . .  	NUMBER	0040	
INC_UDBCS  . . . . . . . . . . .  	NUMBER	0004	
INC_UMONO  . . . . . . . . . . .  	NUMBER	0010	
INC_UTRAN  . . . . . . . . . . .  	NUMBER	0002	
INSTALLRW  . . . . . . . . . . .  	NUMBER	0080	
INS_FKS  . . . . . . . . . . . .  	NUMBER	0001	
IN_ADBCS . . . . . . . . . . . .  	NUMBER	0002	
IN_AMONO . . . . . . . . . . . .  	NUMBER	0020	
IN_DDBCS . . . . . . . . . . . .  	NUMBER	0008	
IN_LICBX . . . . . . . . . . . .  	NUMBER	0040	
IN_LVBOV . . . . . . . . . . . .  	NUMBER	0080	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-11


IN_RANG  . . . . . . . . . . . .  	NUMBER	0001	
IN_UDBCS . . . . . . . . . . . .  	NUMBER	0004	
IN_UMONO . . . . . . . . . . . .  	NUMBER	0010	
IN_UTRAN . . . . . . . . . . . .  	NUMBER	0001	

LEN_ALT_KYBD_ID  . . . . . . . .  	NUMBER	0003	
LFARROW  . . . . . . . . . . . .  	NUMBER	4B00	

MAJOR_VERSION  . . . . . . . . .  	NUMBER	0004	
MAX_NUM_DISKETTE . . . . . . . .  	NUMBER	0002	
MINOR_VERSION  . . . . . . . . .  	NUMBER	0000	
MSG_INV_BOOT_MEDIA . . . . . . .  	NUMBER	0004	
MSG_INV_DISK_MEDIA . . . . . . .  	NUMBER	0005	
MSG_INV_DOS  . . . . . . . . . .  	NUMBER	0001	
MSG_INV_INSTALL  . . . . . . . .  	NUMBER	0007	
MSG_INV_PARMS  . . . . . . . . .  	NUMBER	0006	
MSG_LOADING  . . . . . . . . . .  	NUMBER	0008	
MSG_RELOADING  . . . . . . . . .  	NUMBER	0009	
M_DOS_EDOS_PART  . . . . . . . .  	NUMBER	0003	
M_DOS_EXISTS . . . . . . . . . .  	NUMBER	0001	
M_EDOS_EXISTS  . . . . . . . . .  	NUMBER	0002	
M_EDOS_SPACE . . . . . . . . . .  	NUMBER	0008	
M_FREE_SPACE . . . . . . . . . .  	NUMBER	0010	
M_LOGICAL_EXISTS . . . . . . . .  	NUMBER	0004	

NOCHECK  . . . . . . . . . . . .  	NUMBER	0000	
NOPANEL  . . . . . . . . . . . .  	NUMBER	0000	
NOT_PRESENT  . . . . . . . . . .  	NUMBER	0000	
NO_EDOS_BUT_SPACE  . . . . . . .  	NUMBER	0002	
NO_EDOS_SPACE  . . . . . . . . .  	NUMBER	0000	
NO_SOURCE1 . . . . . . . . . . .  	NUMBER	0001	

PCB_ASC  . . . . . . . . . . . .  	NUMBER	0040	
PCB_ASZ  . . . . . . . . . . . .  	NUMBER	0020	
PCB_CMP  . . . . . . . . . . . .  	NUMBER	0002	
PCB_CRE  . . . . . . . . . . . .  	NUMBER	0001	
PCB_DBB  . . . . . . . . . . . .  	NUMBER	0200	
PCB_DLB  . . . . . . . . . . . .  	NUMBER	0400	
PCB_DRB  . . . . . . . . . . . .  	NUMBER	0800	
PCB_DSHADOW  . . . . . . . . . .  	NUMBER	1000	
PCB_DTB  . . . . . . . . . . . .  	NUMBER	0100	
PCB_EXP  . . . . . . . . . . . .  	NUMBER	0004	
PCB_LAB  . . . . . . . . . . . .  	NUMBER	0080	
PCB_LB . . . . . . . . . . . . .  	NUMBER	0010	
PCB_MXP  . . . . . . . . . . . .  	NUMBER	0008	
PCB_PELCOORD . . . . . . . . . .  	NUMBER	2000	
PCDISPQ_CALL . . . . . . . . . .  	L NEAR	0000	SELECT	External
PGDN . . . . . . . . . . . . . .  	NUMBER	0051	
PGUP . . . . . . . . . . . . . .  	NUMBER	0049	
PM_BK  . . . . . . . . . . . . .  	NUMBER	0004	
PM_CHDTAB  . . . . . . . . . . .  	NUMBER	0008	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-12


PM_CL  . . . . . . . . . . . . .  	NUMBER	0008	
PM_COLORX  . . . . . . . . . . .  	NUMBER	0010	
PM_DOA . . . . . . . . . . . . .  	NUMBER	0010	
PM_DOQ . . . . . . . . . . . . .  	NUMBER	0040	
PM_DOV . . . . . . . . . . . . .  	NUMBER	0020	
PM_PANPDQ  . . . . . . . . . . .  	NUMBER	0001	
PM_PCBVEC  . . . . . . . . . . .  	NUMBER	0002	
PM_RF  . . . . . . . . . . . . .  	NUMBER	0001	
PM_SRF . . . . . . . . . . . . .  	NUMBER	0002	
PM_UNKNPANS  . . . . . . . . . .  	NUMBER	0004	
PRD_APPEND . . . . . . . . . . .  	NUMBER	0004	
PRD_BUFSIZE  . . . . . . . . . .  	NUMBER	0001	
PRD_INITIAL  . . . . . . . . . .  	NUMBER	0001	
PRD_NOINITIAL  . . . . . . . . .  	NUMBER	0010	
PRD_NOPANELID  . . . . . . . . .  	NUMBER	0020	
PRD_NOPANELS . . . . . . . . . .  	NUMBER	0002	
PRD_NOTCASFILE . . . . . . . . .  	NUMBER	0004	
PRD_PANELSFULL . . . . . . . . .  	NUMBER	0008	
PRD_READALL  . . . . . . . . . .  	NUMBER	0008	
PRD_READONE  . . . . . . . . . .  	NUMBER	0002	
PRD_SIZEMALL . . . . . . . . . .  	NUMBER	0010	
PRESENT_WITHOUT_PART . . . . . .  	NUMBER	0001	
PRESENT_WITH_PART  . . . . . . .  	NUMBER	0002	
PT_BK  . . . . . . . . . . . . .  	NUMBER	0001	
PT_SRF . . . . . . . . . . . . .  	NUMBER	0002	

QM_ACTIVEPAN . . . . . . . . . .  	V WORD	0000		External
QM_BREAKOFF  . . . . . . . . . .  	NUMBER	0002	
QM_BREAKON . . . . . . . . . . .  	NUMBER	0001	
QM_CLSCHD  . . . . . . . . . . .  	NUMBER	0800	
QM_CLSPAN  . . . . . . . . . . .  	NUMBER	1000	
QM_ERRBU . . . . . . . . . . . .  	NUMBER	0040	
QM_ERRCN . . . . . . . . . . . .  	NUMBER	0100	
QM_ERRMC . . . . . . . . . . . .  	NUMBER	0002	
QM_ERRMCQ  . . . . . . . . . . .  	NUMBER	0008	
QM_ERRMP . . . . . . . . . . . .  	NUMBER	0001	
QM_ERRMPQ  . . . . . . . . . . .  	NUMBER	0004	
QM_ERROC . . . . . . . . . . . .  	NUMBER	0020	
QM_ERROP . . . . . . . . . . . .  	NUMBER	0010	
QM_ERRPN . . . . . . . . . . . .  	NUMBER	0080	
QM_ID  . . . . . . . . . . . . .  	V WORD	0000		External
QM_INIT  . . . . . . . . . . . .  	NUMBER	0001	
QM_OPT1  . . . . . . . . . . . .  	V WORD	0000		External
QM_POPCHD  . . . . . . . . . . .  	NUMBER	0008	
QM_POPCQU  . . . . . . . . . . .  	NUMBER	0100	
QM_POPPAN  . . . . . . . . . . .  	NUMBER	0040	
QM_POPPQU  . . . . . . . . . . .  	NUMBER	0400	
QM_PUSHCHD . . . . . . . . . . .  	NUMBER	0002	
QM_PUSHCQU . . . . . . . . . . .  	NUMBER	0080	
QM_PUSHPAN . . . . . . . . . . .  	NUMBER	0010	
QM_PUSHPQU . . . . . . . . . . .  	NUMBER	0200	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-13


QM_RVMCHD  . . . . . . . . . . .  	NUMBER	0004	
QM_RVMPAN  . . . . . . . . . . .  	NUMBER	0020	
QM_SRFOFF  . . . . . . . . . . .  	NUMBER	0008	
QM_SRFON . . . . . . . . . . . .  	NUMBER	0004	

RTARROW  . . . . . . . . . . . .  	NUMBER	4D00	

SCB_ACTIVEON . . . . . . . . . .  	NUMBER	0002	
SCB_AHIGH  . . . . . . . . . . .  	NUMBER	8000	
SCB_CFO  . . . . . . . . . . . .  	NUMBER	0008	
SCB_CHIGH  . . . . . . . . . . .  	NUMBER	0010	
SCB_CPHY . . . . . . . . . . . .  	NUMBER	0800	
SCB_CS . . . . . . . . . . . . .  	NUMBER	0001	
SCB_DACTIVE  . . . . . . . . . .  	NUMBER	4000	
SCB_DBCS . . . . . . . . . . . .  	NUMBER	0800	
SCB_DCHECK . . . . . . . . . . .  	NUMBER	2000	
SCB_DPOINT . . . . . . . . . . .  	NUMBER	8000	
SCB_DYN  . . . . . . . . . . . .  	NUMBER	0200	
SCB_EXCSING  . . . . . . . . . .  	NUMBER	0004	
SCB_FINDE  . . . . . . . . . . .  	NUMBER	0040	
SCB_FM . . . . . . . . . . . . .  	NUMBER	0400	
SCB_FRAL . . . . . . . . . . . .  	NUMBER	0008	
SCB_FRBF . . . . . . . . . . . .  	NUMBER	0004	
SCB_IPAGE  . . . . . . . . . . .  	NUMBER	0020	
SCB_LANDR  . . . . . . . . . . .  	NUMBER	0400	
SCB_LCOX . . . . . . . . . . . .  	NUMBER	0010	
SCB_LL . . . . . . . . . . . . .  	NUMBER	0010	
SCB_LVBOVR . . . . . . . . . . .  	NUMBER	0200	
SCB_MON  . . . . . . . . . . . .  	NUMBER	0400	
SCB_NUML . . . . . . . . . . . .  	NUMBER	1000	
SCB_NUMS . . . . . . . . . . . .  	NUMBER	0020	
SCB_NUMUIND  . . . . . . . . . .  	NUMBER	0008	
SCB_PM1  . . . . . . . . . . . .  	NUMBER	0040	
SCB_RD . . . . . . . . . . . . .  	NUMBER	0040	
SCB_RELSCR . . . . . . . . . . .  	NUMBER	0100	
SCB_RELUIND  . . . . . . . . . .  	NUMBER	0080	
SCB_ROTN . . . . . . . . . . . .  	NUMBER	0002	
SCB_RUK  . . . . . . . . . . . .  	NUMBER	0080	
SCB_SELACT . . . . . . . . . . .  	NUMBER	0001	
SCB_SELECTON . . . . . . . . . .  	NUMBER	0001	
SCB_SELEXC . . . . . . . . . . .  	NUMBER	0002	
SCB_SHIGH  . . . . . . . . . . .  	NUMBER	4000	
SCB_SKIP . . . . . . . . . . . .  	NUMBER	2000	
SCB_SKIPON . . . . . . . . . . .  	NUMBER	0004	
SCB_TBL  . . . . . . . . . . . .  	NUMBER	1000	
SCB_TRN  . . . . . . . . . . . .  	NUMBER	0200	
SCB_UC . . . . . . . . . . . . .  	NUMBER	0001	
SCB_UET  . . . . . . . . . . . .  	NUMBER	0004	
SCB_UI . . . . . . . . . . . . .  	NUMBER	0100	
SCB_UIND . . . . . . . . . . . .  	NUMBER	0080	
SCB_UKS  . . . . . . . . . . . .  	NUMBER	0020	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36
SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-14


SCB_UNCA . . . . . . . . . . . .  	NUMBER	0100	
SCB_WRAP . . . . . . . . . . . .  	NUMBER	0002	
SOURCE1  . . . . . . . . . . . .  	NUMBER	0000	
SPACE  . . . . . . . . . . . . .  	NUMBER	0020	
SRD_ALLOCRES . . . . . . . . . .  	NUMBER	0010	
SRD_APPEND . . . . . . . . . . .  	NUMBER	0004	
SRD_BUFSIZE  . . . . . . . . . .  	NUMBER	0001	
SRD_FIELDSFULL . . . . . . . . .  	NUMBER	0008	
SRD_INITIAL  . . . . . . . . . .  	NUMBER	0001	
SRD_NOFIELDID  . . . . . . . . .  	NUMBER	0020	
SRD_NOFIELDS . . . . . . . . . .  	NUMBER	0002	
SRD_NOINITIAL  . . . . . . . . .  	NUMBER	0010	
SRD_NOTCASFILE . . . . . . . . .  	NUMBER	0004	
SRD_READALL  . . . . . . . . . .  	NUMBER	0008	
SRD_READONE  . . . . . . . . . .  	NUMBER	0002	
SSC_PTSB . . . . . . . . . . . .  	NUMBER	0002	
SSC_SBE  . . . . . . . . . . . .  	NUMBER	0002	
SSC_SBTC . . . . . . . . . . . .  	NUMBER	0020	
SSC_SLSB . . . . . . . . . . . .  	NUMBER	0010	
SSC_TBSL . . . . . . . . . . . .  	NUMBER	0001	
SSC_VTASO  . . . . . . . . . . .  	NUMBER	0008	
SSC_VTE  . . . . . . . . . . . .  	NUMBER	0001	
SSC_VTSAO  . . . . . . . . . . .  	NUMBER	0004	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	

TAB  . . . . . . . . . . . . . .  	NUMBER	0009	
TABLE_ONE  . . . . . . . . . . .  	NUMBER	0001	
TABLE_TWO  . . . . . . . . . . .  	NUMBER	0002	
TRUE . . . . . . . . . . . . . .  	NUMBER	0001	

UPARROW  . . . . . . . . . . . .  	NUMBER	4800	
USE_DEFAULT  . . . . . . . . . .  	NUMBER	0000	

WWP_BUFSIZE  . . . . . . . . . .  	NUMBER	0001	
WWP_DESTBUFFER . . . . . . . . .  	NUMBER	0010	
WWP_DUPSYMBOL  . . . . . . . . .  	NUMBER	0002	
WWP_HYPHEN . . . . . . . . . . .  	NUMBER	0008	
WWP_LEFTJUST . . . . . . . . . .  	NUMBER	0001	
WWP_LEFTNRIGHT . . . . . . . . .  	NUMBER	0004	
WWP_LONGWORD . . . . . . . . . .  	NUMBER	0004	
WWP_NOBUFFER . . . . . . . . . .  	NUMBER	0008	
WWP_NOJUSTOPT  . . . . . . . . .  	NUMBER	0010	
WWP_RIGHTJUST  . . . . . . . . .  	NUMBER	0002	
WWP_SRCBUFFER  . . . . . . . . .  	NUMBER	0020	

@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  selchild		
@VERSION . . . . . . . . . . . .  	TEXT  510		

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:36

SELCHILD - CHILD processing for SELECT.EXE;AN000;           Symbols-15






   3990 Source  Lines
   4016 Total   Lines
    675 Symbols

  45654 + 103803 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
