Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-1


					Page 84,132 ;
				Title	FASTOPEN
				;Date: May 13,1988
				;==============================================================================
				;		 EQUATES
				;==============================================================================
 = 0001				Is_drive_head	   EQU	   00000001b								   ;
				AN000;
 = 0002				Is_delete	   EQU	   00000010b								   ;
				AN000;
 = 0004				Is_insert	   EQU	   00000100b								   ;
				AN000;
 = 00FE				Not_drive_head	   EQU	   11111110b								   ;
				AN000;
 = 00FD				Not_delete	   EQU	   11111101b								   ;
				AN000;
 = 00FB				Not_insert	   EQU	   11111011b
				
 = 004F				EMS_SAVE_STATE	   EQU	   4FH									   ;
				AN000;
 = 004F				EMS_RESTORE_STATE  EQU	   4FH									   ;
				AN000;
 = 0067				EMS_INT 	   EQU	   67H									   ;
				AN000;
 = 00FE				DOS_PAGE1	   EQU	   0FEH 								   ;
				AN000;
				
				
				;==============================================================================
				;		   INCLUDE  FILES
				;==============================================================================
				.xcref
				.list
				.cref
				INCLUDE  dirent.inc										    
				;AN000;
			     C	;	SCCSID = @(#)dirent.asm 1.1 85/04/10
			     C	;	SCCSID = @(#)dirent.asm 1.1 85/04/10
			     C	Break <Directory entry>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-2
Directory entry                                             

			     C	
			     C	;
			     C	;	+---------------------------+
			     C	;	|  (12 BYTE) filename/ext   |	    0	    0
			     C	;	+---------------------------+
			     C	;	|     (BYTE) attributes     |	    11	    B
			     C	;	+---------------------------+
			     C	;	|    (10 BYTE) reserved     |	    12	    C
			     C	;	+---------------------------+
			     C	;	| (WORD) time of last write |	    22	    16
			     C	;	+---------------------------+
			     C	;	| (WORD) date of last write |	    24	    18
			     C	;	+---------------------------+
			     C	;	|   (WORD) First cluster    |	    26	    1A
			     C	;	+---------------------------+
			     C	;	|     (DWORD) file size     |	    28	    1C
			     C	;	+---------------------------+
			     C	;
			     C	;   First byte of filename  = E5 -> free directory entry
			     C	;			    = 00 -> end of allocated directory
			     C	;   Time:   Bits 0-4=seconds/2, bits 5-10=minute, 11-15=hour
			     C	;   Date:   Bits 0-4=day, bits 5-8=month, bits 9-15=year-1980
			     C	;
			     C	
			     C	dir_entry   STRUC
 0000  000B[                 C	dir_name    DB	    11 DUP (?)		; file name
	   ??                C	
			 ]   C	
			     C	
 000B  00                    C	dir_attr    DB	    ?			; attribute bits
 000C  0000                  C	dir_codepg  dw	    ?			; code page DOS 4.00
 000E  0000                  C	dir_extcluster dw   ?			; extended attribute starting cluster
 0010  00                    C	dir_attr2   db	    ?			; reserved
 0011  0005[                 C	dir_pad     DB	    5  DUP (?)		; reserved for expansion
	   ??                C	
			 ]   C	
			     C	
 0016  0000                  C	dir_time    DW	    ?			; time of last write
 0018  0000                  C	dir_date    DW	    ?			; date of last write
 001A  0000                  C	dir_first   DW	    ?			; first allocation unit of file
 001C  0000                  C	dir_size_l  DW	    ?			; low 16 bits of file size
 001E  0000                  C	dir_size_h  DW	    ?			; high 16 bits of file size
 0020                        C	dir_entry   ENDS
			     C	
 = 0001                      C	attr_read_only	    EQU      1h
 = 0002                      C	attr_hidden	    EQU      2h
 = 0004                      C	attr_system	    EQU      4h
 = 0008                      C	attr_volume_id	    EQU      8h
 = 0010                      C	attr_directory	    EQU     10h
 = 0020                      C	attr_archive	    EQU     20h
 = 0040                      C	attr_device	    EQU     40h 	; This is a VERY special bit.
			     C						;   NO directory entry on a disk EVER
			     C						;   has this bit set. It is set non-zero
			     C						;   when a device is found by GETPATH
			     C	
 = 0016                      C	attr_all	    EQU     attr_hidden+attr_system+attr_directory
			     C						; OR of hard attributes for FINDENTRY
			     C	
 = 0061                      C	attr_ignore	    EQU     attr_read_only+attr_archive+attr_device
			     C						; ignore this(ese) attribute(s) during
			     C						; search first/next
			     C	
 = 0027                      C	attr_changeable     EQU     attr_read_only+attr_hidden+attr_system+attr_archive
			     C						; changeable via CHMOD
				INCLUDE  fastsegs.inc	   ; this cannot include in Fastopen.inc
			     C	
			     C	
			     C	
			     C	.seq
 0000                        C	stack       segment  Stack  'STACK' ; represents STACK                            ;AN000;
 0000                        C	stack       ends                                                             ;AN000;
			     C	
 0000                        C	cseg_main   segment   Public 'CODE'; represents MAIN
 0000                        C	cseg_main   ends
			     C	
 0000                        C	cseg_open   segment   Public 'CODE'; represents  FASTOPEN                          ;AN000;
 0000                        C	cseg_open   ends                                                             ;AN000;
			     C	
 0000                        C	cseg_seek   segment   Public 'CODE'; represents FASTSEEK                           ;AN000;
 0000                        C	cseg_seek   ends                                                             ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-3
Directory entry                                             

			     C	
 0000                        C	cseg_init   segment  Public 'CODE' ; represents INIT
 0000                        C	cseg_init   ends
			     C	
			     C	
				INCLUDE  fastopen.inc	   ; this include file also contains DOS equates			    
				;AN000;
			     C	;
			     C	; EXPORT DATE: 9/11
			     C	;Equates for FASTOPEN.
			     C	
			     C	;FASTOPEN NAME CACHING Subfunctions
 = 0001                      C	FONC_Look_up	equ	1
 = 0002                      C	FONC_insert	equ	2
 = 0003                      C	FONC_delete	equ	3
 = 0004                      C	FONC_update	equ	4
 = 0005                      C	FONC_purge	equ	5		;reserved for the future use.
			     C	
			     C	;FASTOPEN EXTENT  CACHING Subfunctions
 = 000B                      C	FSK_Open       equ     11					       ;AN000;
 = 000C                      C	FSK_Close      equ     12					       ;AN000;
 = 000D                      C	FSK_Delete     equ     13					       ;AN000;
 = 000E                      C	FSK_Lookup     equ     14					       ;AN000;
 = 000F                      C	FSK_Insert     equ     15					       ;AN000;
 = 0010                      C	FSK_Trunc      equ     16					       ;AN000;
			     C	
 = 0008                      C	HeaderSize     equ    8        ; size of file header (8 bytes)	       ;AN000;
 = 0008                      C	ExtendSize     equ    8        ; size of extend (8 bytes)	       ;AN000;
 = 0001                      C	Num_Of_Pages   equ    1        ; number of pages		       ;AN000;
 = 0002                      C	Num_Of_Segs    equ    2        ; number of frame segments	       ;AN000;
 = 004C                      C	Stayresident  equ    04ch     ; terminate and stay resident function code
			     C	
			     C	
			     C	;Equates used in DOS.
 = 0001                      C	FastOpen_Set	       equ     00000001B
 = 00FE                      C	FastOpen_Reset	       equ     11111110B
 = 0002                      C	Lookup_Success	       equ     00000010B
 = 00FD                      C	Lookup_Reset	       equ     11111101B
 = 0004                      C	Special_Fill_Set       equ     00000100B
 = 00FB                      C	Special_Fill_Reset     equ     11111011B
 = 0008                      C	No_Lookup	       equ     00001000B
 = 0010                      C	Set_For_Search	       equ     00010000B	     ;DCR 167
			     C	
			     C	
			     C	;============= FastOpen Data Structures =====================
			     C	
			     C	Fastopen_Entry	STRUC			;Fastopen Entry pointer in DOS
 0000  0004                  C	Fastopen_Entry_size	dw	4	;size of the following
 0002  00000000              C	Fastopen_Name_Caching	dd	?
			     C	;Fastopen_FatChain_Caching dd	  ?	;reserved for future use
 0006                        C	Fastopen_Entry	ENDS
			     C	;
			     C	
			     C	
			     C	CMPCT_DIR_INFO	STRUC			;compact version of Dir Info.
 0000  000B[                 C	CDI_file_name	db	11 dup (' ')
	   20                C	
			 ]   C	
			     C	
 000B  00                    C	CDI_file_attr	db	?
 000C  0000                  C	CDI_codepage	dw	?
 000E  0000                  C	CDI_extcluster	dw	?
 0010  00                    C	CDI_attr2	db	?
 0011  0000                  C	CDI_time	dw	?
 0013  0000                  C	CDI_date	dw	?
 0015  0000                  C	CDI_cluster	dw	?
 0017  00000000              C	CDI_filesize	dd	?
 001B                        C	CMPCT_DIR_INFO	ENDS
			     C	;
			     C	
			     C	ORIG_DIR_INFO	STRUC
 0000  0011[                 C	ODI_head	db	17 dup (?)
	   ??                C	
			 ]   C	
			     C	
 0011  0005[                 C	ODI_skip	db	5  dup (0)	;reserved for DOS. FASTOPEN does not
	   00                C	
			 ]   C	
			     C	
 0016  000A[                 C	ODI_tail	db	10 dup (?)	;  use ODI_skip part.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-4
Directory entry                                             

	   ??                C	
			 ]   C	
			     C	
 0020                        C	ORIG_DIR_INFO	ENDS
			     C	;
			     C	
 = 0011                      C	ODI_head_leng	equ	17
 = 0005                      C	ODI_skip_leng	equ	5
 = 000A                      C	ODI_tail_leng	equ	10
			     C	;
			     C	
			     C	FASTOPEN_EXTENDED_INFO	STRUC
 0000  00                    C	FEI_dirpos	db	0
 0001  00000000              C	FEI_dirsec	dd	0
 0005  0000                  C	FEI_clusnum	dw	0
 0007  0000                  C	FEI_lastent	dw	0		; for search first
 0009  0000                  C	FEI_dirstart	dw	0		; for search first
 000B                        C	FASTOPEN_EXTENDED_INFO	ENDS
			     C	;
			     C	
			     C	NAME_RECORD	STRUC
 0000  FFFF                  C	nLRU_ptr	dw	-1
 0002  FFFF                  C	nMRU_ptr	dw	-1		;reverse of nLRU_ptr
 0004  FFFF                  C	nChild_ptr	dw	-1
 0006  FFFF                  C	nSibling_ptr	dw	-1
 0008  FFFF                  C	nBackward_ptr	dw	-1		;points to preceding node
 000A  001B[                 C	nCmpct_Dir_Info db	size Cmpct_Dir_Info dup (' ')
	   20                C	
			 ]   C	
			     C	
 0025  000B[                 C	nExtended_Info	db	size Fastopen_Extended_Info dup (?)
	   ??                C	
			 ]   C	
			     C	
 0030                        C	NAME_RECORD	ENDS
			     C	;
			     C	
			     C	DRIVE_CACHE_HEADER	STRUC		;drive cache header
 0000  0000                  C	DCH_LRU_ROOT	 dw	 0		;Header of the LRU chain of this drive
 0002  0000                  C	DCH_MRU_ROOT	 dw	 0		;offset to the last entry of LRU chain
 0004  FFFF                  C	DCH_Child_ptr	 dw	 -1		;the first child in Name cache seg.
 0006  FFFF                  C	DCH_Sibling_ptr  dw	 -1		;points to the next drive cache header
 0008  43                    C	DCH_Drive_letter db	'C'             ;drive letter
 0009  0000                  C	DCH_Num_Entries  dw	 0		;Number of entries in the Name cache.
 000B  0000                  C	DCH_Name_Buff	 dw	 0		;pointer to name cahe buffer
 000D                        C	DRIVE_CACHE_HEADER	ENDS
			     C	;
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	;======== FAST SEEK FUNCTION  DATA  STRUCTURES =======================
			     C	
			     C	DRIVE_HEADER	STRUC		   ; Drive header structure		;AN000;
 0000  0000                  C	Drive_Number	     dw     0	   ; drive number			;AN000;
 0002  0000                  C	Extent_Count	     dw     0	   ; reserved for debugging
 0004  0000                  C	MRU_Hdr_Ptr	     dw     0	   ; pointer to OPEN Queue
 0006  0000                  C	Free_ptr	     dw     0	   ; pointer to FREE buffer		;AN000;
 0008  0000                  C	Close_Ptr	     dw     0	   ; pointer to CLOSE Queue	     ;AN000;
 000A  0000                  C	Buff_Size	     dw     0	   ; cache buffer size including header ;AN000;
 000C  0000                  C	Free_Size	     dw     0	   ; size of Free area in bytes
 000E  0000                  C	Next_Drv_Hdr_Ptr     dw     0	   ; pointer to next drive header
 0010                        C	DRIVE_HEADER   ENDS
			     C	
			     C	
			     C	
			     C	FILE_HEADER	STRUC		   ; File header structure		;AN000;
 0000  0000                  C	FH_Phys_Clus_Num     dw     0	   ; starting physcial clustnum of file ;AN000;
 0002  0000                  C	FH_Refer_Count	     dw     0	   ; reference count			;AN000;
 0004  0000                  C	FH_Next_Extn_Ptr     dw     0	   ; pointer to first extent of the file;AN000;
 0006  0000                  C	FH_Next_Hdr_Ptr      dw     0	   ; pointer to next file header	;AN000;
 0008  0000                  C	FH_MRU_Extn_Ptr      dw     0	   ; pointer to  MRU extent
 000A  0000                  C			     dw     0
 000C  0000                  C			     dw     0
 000E  0000                  C			     dw     0
 0010                        C	FILE_HEADER	ENDS							;AN000;
			     C	
			     C	
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-5
Directory entry                                             

			     C	EXTENT_HEADER	STRUC		   ; extend header structure		;AN000;
 0000  0000                  C	EH_Logic_Clus_Num    dw     0	   ; starting logical clus num of extent;AN000;
 0002  0000                  C	EH_Phys_Clus_Num     dw     0	   ; starting physical clus numof  extnt;AN000;
 0004  0000                  C	EH_Count	     dw     0	   ; range of logical clusnum in the extnt
 0006  0000                  C	EH_Next_Extn_Ptr     dw     0	   ; pointer to next extent		;AN000;
 0008  0000                  C	EH_Prev_Extn_Ptr     dw     0	   ; pointer to previous extent  ;AN000;
 000A  0000                  C	EH_Next_LRU_Ptr      dw     0	   ; pointer to next LRU extent
 000C  0000                  C	EH_Prev_LRU_Ptr      dw     0	   ; pointer tp previous LRU extent
 000E  0000                  C			     dw     0
 0010                        C	EXTENT_HEADER	ENDS
			     C	
			     C	
			     C	
				include  version.inc
			     C	; Some modules really want TRUE to be 0FFH.  Best to let them have their way.
			     C	
			     C	;
			     C	; Use the following switches to control cmacros.inc
			     C	;
 = 0000                      C	?PLM       =       0
 = 0000                      C	?WIN       =       0
			     C	
 = 0001                      C	memS       EQU     1			; Small model
			     C	;
			     C	; Use the switches below to produce the standard Microsoft version or the IBM
			     C	; version of the operating system
			     C	;
			     C	; The below chart will indicate how to set the switches to build the various
			     C	; versions
			     C	;
			     C	;                     IBMVER          IBMCOPYRIGHT
			     C	; --------------------------------------------------------
			     C	;  IBM Version   |     TRUE              TRUE
			     C	; --------------------------------------------------------
			     C	;  MS Version    |     FALSE             FALSE
			     C	; --------------------------------------------------------
			     C	;  Clone Version |     TRUE              FALSE
			     C	;
 =                           C	IBMVER     EQU     TRUE
 =                           C	IBMCOPYRIGHT EQU   FALSE
			     C	
 = FFFF                      C	BUFFERFLAG	EQU	NOT IBMCOPYRIGHT
			     C	
 =                           C	IBM	   EQU	   IBMVER
			     C	;
			     C	;
			     C	;
			     C	;
			     C	;***************************************************************************
			     C	;*          The following switches are for DBCS or SBCS support            *
			     C	;*                                                                         *
			     C	;*                     Set INTERNAT EQU TRUE FOR DBCS                      *
			     C	;*                     Set INTERNAT EQU FALSE FOR SBCS                     *
			     C	;*                                                                         *
			     C	;***************************************************************************
			     C	;
 =                           C	IBMJAPVER  EQU	   FALSE		;If TRUE set KANJI true also
			     C	
			     C	;
			     C	; Switch INTERNAT for DBCS support
			     C	;
 =                           C	INTERNAT   EQU	   FALSE
			     C	;
			     C		ELSE
 =                           C	KANJI	   EQU	   FALSE
 =                           C	IBMJAPAN   EQU	   FALSE
			     C		ENDIF
			     C	
			     C	
			     C	;
			     C	; Country code switches
			     C	; The default contry code is assumed as USA.
			     C	;
			     C		ELSE
 =                           C	 KOREA	   EQU	   FALSE
 =                           C	 JAPAN	   EQU	   FALSE
			     C		ENDIF
			     C	;
				
				;==============================================================================
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-6
Directory entry                                             

				
				
				
				EXTRN	FK_OPEN:FAR										   ;
				AN000;
				EXTRN	FK_CLOSE:FAR										   ;
				AN000;
				EXTRN	FK_INSERT:FAR										   ;
				AN000;
				EXTRN	FK_DELETE:FAR										   ;
				AN000;
				EXTRN	FK_LOOKUP:FAR										   ;
				AN000;
				EXTRN	FK_TRUNCATE:FAR 									   ;
				AN000;
				EXTRN	FK_PURGE:FAR										;AN0
				00;
				
				
				;============================================================================
				
 0000				CSEG_MAIN   SEGMENT   PARA   PUBLIC 'code'
					ASSUME	cs:cseg_main, ds:nothing,es:nothing,ss:nothing
				;============================================================================
				
				PUBLIC	MAIN											   ;
				AN000;
				
				IF	BUFFERFLAG
				PUBLIC	SAVE_EMS_PAGE_STATE
				PUBLIC	EMS_PAGE_NUMBER
				ENDIF
				
				PUBLIC	RESTORE_PAGE_STATE
				PUBLIC	EMS_SAVE_HANDLE1
				
				PUBLIC	Main_name_cache_seg									   ;
				AN000;
				PUBLIC	Main_Num_Of_drives									   ;
				AN000;
				PUBLIC	Main_Ext_Count										   ;
				AN000;
				PUBLIC	Main_extent_drive_Buff									   ;
				AN000;
				PUBLIC	Main_ext_cache_size									   ;
				AN000;
				PUBLIC	Main_name_cache_Buff									   ;
				AN000;
				PUBLIC	Main_EMS_FLAG										   ;
				AN000;
				PUBLIC	Main_Res_Segs										   ;
				AN000;
				PUBLIC	Main_EMS_PAGE_SIZE									   ;
				AN000;
				PUBLIC	Main_EMS_PAGE_SEG									   ;
				AN000;
				PUBLIC	Main_Total_Ext_Count									   ;
				AN000;
				PUBLIC	Main_Total_Name_Count									   ;
				AN000;
				PUBLIC	Main_Name_Drive_Buff									   ;
				AN000;
				PUBLIC	Main_ParamBuff										   ;
				AN000;
				
				PUBLIC	FOPEN_Insert										   ;
				AN000;
				PUBLIC	FOPEN_Update										   ;
				AN000;
				PUBLIC	FOPEN_Delete										   ;
				AN000;
				PUBLIC	FOPEN_Lookup										   ;
				AN000;
				PUBLIC	FOPEN_PURGE										  ;A
				N000;
				
				PUBLIC	FSEEK_Open										   ;
				AN000;
				PUBLIC	FSEEK_Close										   ;
				AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-7
Directory entry                                             

				PUBLIC	FSEEK_Insert										   ;
				AN000;
				PUBLIC	FSEEK_Delete										   ;
				AN000;
				PUBLIC	FSEEK_Lookup										   ;
				AN000;
				PUBLIC	FSEEK_Truncate										   ;
				AN000;
				PUBLIC	FSEEK_Purge										   ;
				AN000;
				
				PUBLIC	 VECTOR_LookUp										  ;A
				N000;
				PUBLIC	 VECTOR_Delete										  ;A
				N000;
				
				
				; Following data variables are accessed by all other segments
 0000  0000			call_cnt	       DW    0									;AN0
				00;
 0002  0000			Purge_Flag	       DW    0		   ; =1 if last call is PURGE function
 0004  FF			Prev_drv_id	       DB    -1 	   ; previous request drive id
 0005  ---- R			Main_name_cache_seg    DW    Cseg_Init	   ; default to Init1 seg				;AN0
				00;
 0007  0000			Main_Num_Of_drives     DW    0		   ; number of drives					;AN0
				00;
 0009  0000			Main_Ext_Count	       DW    0		   ; total name extent entries				;AN0
				00;
 000B  0000			Main_extent_drive_Buff DW    0		   ; addrs to extent drive				  ;A
				N000;
 000D  0000			Main_name_cache_Buff   DW    0		   ; address of Name cache buffer			;AN0
				00;
 000F  0000			Main_ext_cache_size    DW    0		   ; extent cache size
 0011  0000			Main_EMS_FLAG	       DW    0		   ; EMI flag  1= if EMI is enabled			;AN0
				00;
 0013  0000			Main_Res_Segs	       DW    0		   ; number of segs to be stay resident 		;AN0
				00;
 0015  0000			Main_Total_Ext_Count   DW    0		   ; Total extent count entries 			;AN0
				00;
 0017  0000			Main_Total_Name_Count  DW    0		   ; Total name count entries				;AN0
				00;
 0019  0000			Main_Name_Drive_Buff   DW    0		   ; EMS data page segment ID				;AN0
				00;
 001B  0032[			Main_ParamBuff	       DW    50  dup (0)   ; Drive ID/extent count buffer			;AN0
				00;
	   0000			
			 ]	
				
				
				; The following structure is for saving and restoring EMS page state
 007F				EMS_PAGE_MAP	     LABEL    WORD
 007F  0001			Main_EMS_SEG_COUNT     DW    1		   ; EMS segment count
 0081  0000			Main_EMS_PAGE_SEG      DW    0		   ; EMS page segment ID				;AN0
				00;
				
				
 0083  0000			Main_EMS_PAGE_SIZE     DW    0		   ; EMS page size					;AN0
				00;
 0085  001E[			EMS_PAGE_ARRAY	       DW  30	dup  (0)   ; EMS state save array
	   0000			
			 ]	
				
				
				; The following data values are used by MAIN segment
 00C1  0000			EMS_SAVE_LOG_PAGE1     DW    ?		   ;HOLDS PREVIOUS PAGE1				    
				;AN000;
 00C3  0000			EMS_SAVE_HANDLE1       DW    ?		   ;HOLDS PREVIOUS handle1				    
				;AN000;
				
				IF	BUFFERFLAG
				;----------------------------------------------------------HKN 8/26/88
				
 00C5  0000			EMS_PAGE_NUMBER		DW	?			; holds the ems 
											; physical page no.
				
				ENDIF
				;
				;-----------------------------------------------------------------------------
				;	  Fastopen/Fastseek function jump vectors
				; Inititally the jump vectors have default offset and segment values.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-8
Directory entry                                             

				; If the modules are relocated, the offset and the segID in the jump vectors
				; may be changed to the new segID of the new location.
				;-----------------------------------------------------------------------------
 00C7  0100 ---- R		FOPEN_Insert	 DD   Insert									 ;AN
				000;
 00CB  0206 ---- R		FOPEN_Update	 DD   Update									 ;AN
				000;
 00CF  018B ---- R		FOPEN_Delete	 DD   delete									 ;AN
				000;
 00D3  0031 ---- R		FOPEN_Lookup	 DD   lookup									 ;AN
				000;
 00D7  026A ---- R		FOPEN_Purge	 DD   FP_purge									 ;AN
				000;
				
 00DB  0000 ---- E		FSEEK_Open	 DD   Fk_Open									 ;AN
				000;
 00DF  0000 ---- E		FSEEK_Close	 DD   Fk_Close									 ;AN
				000;
 00E3  0000 ---- E		FSEEK_Insert	 DD   Fk_Insert 								 ;AN
				000;
 00E7  0000 ---- E		FSEEK_Delete	 DD   Fk_Delete 								 ;AN
				000;
 00EB  0000 ---- E		FSEEK_Lookup	 DD   Fk_Lookup 								 ;AN
				000;
 00EF  0000 ---- E		FSEEK_Truncate	 DD   Fk_Truncate								 ;AN
				000;
 00F3  0000 ---- E		FSEEK_Purge	 DD   Fk_Purge									 ;AN
				000;
				
 00F7  0031 ---- R		VECTOR_LookUp	 DD   LookUp	      ; jump vector to LookUp used by Insert call
 00FB  0000 ---- E		VECTOR_Delete	 DD   Fk_Delete       ; jump vector to Delete used by Free_buffer routine
				
				
				
				
				
				;==============================================================================
				
 00FF				MAIN	PROC	FAR			  ; FAR procedure for FAR call from DOS
 00FF  51				push	cx			  ; save DOS registers				     ;AN000;
 0100  52				push	dx			  ; makesure to restore the necessary			   ;
				AN000;
 0101  1E				push	ds			  ; ones on return					  ;A
				N000;
 0102  06				push	es										   ;
				AN000;
 0103  55				push	bp										   ;
				AN000;
 0104  57				push	di										   ;
				AN000;
 0105  53				push	bx										   ;
				AN000;
				
				;-----------------------------------------------------------------------------
				; The cache buffers are maintained in a seperate segement whose segment ID is
				; in Name_Cache_Seg.  The ES will be used as the seg register during the access
				; of data in the cache buffers, while DS will be used to access the Fastopen
				; resident and non-resident data area.
				;-----------------------------------------------------------------------------
 0106  2E: 83 3E 0011 R 01		cmp	cs:Main_EMS_flag,1	  ; EMS enabled ??					    
				 ;AN000;
 010C  75 35				jne	dispatch_funcs		  ; no - dispatch functions			   ;AN000;
									  ; yes - save EMS page state
				ELSE
				
				
				;------------------------------------------------------------HKN 8/26/88--
				;	Before dispatching off the fastopen functions we must do the 
				;	following:
				;		1. save the map for this page
				;		2. map this page to log. page 0 with the fastopen handle in
				;		   ems_save_handle1.
				;		3. dispatch
				;
				
				;	int	3
				
 010E  50				push	ax
 010F  51				push	cx
 0110  52				push	dx
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-9
Directory entry                                             

 0111  1E				push	ds
 0112  06				push	es
 0113  55				push	bp
 0114  56				push	si
 0115  57				push	di
 0116  53				push	bx
				
 0117  9A 0255 ---- R			call	far ptr	save_ems_page_state
 011C  72 11				jc	ems_failed
				
 011E  E8 02BD R			call	map_page
 0121  72 0C				jc	ems_failed
				
 0123  5B				pop	bx
 0124  5F				pop	di
 0125  5E				pop	si
 0126  5D				pop	bp
 0127  07				pop	es
 0128  1F				pop	ds
 0129  5A				pop	dx
 012A  59				pop	cx
 012B  58				POP	AX			 ; restore registers
				
 012C  EB 15 90				JMP	DISPATCH_FUNCS		 ; yes, dispatch functions
				
 012F				EMS_FAILED:
 012F  5B				pop	bx
 0130  5F				pop	di
 0131  5E				pop	si
 0132  5D				pop	bp
 0133  07				pop	es
 0134  1F				pop	ds
 0135  5A				pop	dx
 0136  59				pop	cx
				
				ENDIF
				
				
 0137  58				POP	AX			 ; restore registers
				
 0138  5B				POP	BX			 ; no, restore DOS registers 				   ;
				AN000;
 0139  5F				POP	DI										   ;
				AN000;
 013A  5D				POP	BP										   ;
				AN000;
 013B  07				POP	ES										   ;
				AN000;
 013C  1F				POP	DS										   ;
				AN000;
 013D  5A				POP	DX										   ;
				AN000;
 013E  59				POP	CX										   ;
				AN000;
 013F  F9				STC
 0140  E9 0254 R			JMP	ERROR_RET		 ; error return
				
				
				;-----------------------------------------------------------------------------
				; FASTOPEN/FASTSEEK DISPATCHER
				;-----------------------------------------------------------------------------
 0143				DISPATCH_FUNCS:
 0143  3C 05				cmp	al,5		      ; buffer purge ??
 0145  74 07				je	Check_Drive_id	      ; yes - check drive id
 0147  3C 0B				cmp	al,11		      ; Fastopen function call ??				   ;
				AN000;
 0149  7D 03				jge	Check_drive_id	      ; no - dispatch Fastseek functions
 014B  E9 0204 R			jmp	Dispatch_fopen	      ; yes - dispatch Fastopen functions			
							 ;AN000;
				
				
				;-----------------------------------------------------------------------------
				; Check to see the Drive ID in DL is the valid. If not error and return DI=1
				; if Fastseek LookUp function. Makesure to preserve AL, DS, SI and DI
				;-----------------------------------------------------------------------------
 014E				CHECK_DRIVE_ID:
 014E  2E: 38 16 0004 R			cmp	cs:Prev_drv_id, dl	    ; current id same as previous valid
 0153  74 26				je	Dispatch_Fseek		    ; yes - dont check drive ID
				
 0155  56				push	si										   ;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-10
Directory entry                                             

				AN000;
 0156  53				push	bx			    ;DS=addressability to Cseg_Main			   ;
				AN000;
 0157  51				push	cx										   ;
				AN000;
 0158  8D 36 001B R			lea	si,cs:Main_ParamBuff	    ; DS:SI-->drive ID buffer				   ;
				AN000;
 015C  2E: 8B 0E 0007 R			mov	cx,cs:Main_Num_Of_Drives    ; number of drives					   ;
				AN000;
				
 0161				Get_Drive_Id:											   ;
				AN000;
 0161  2E: 8B 1C			mov	bx,cs:[si]									   ;
				AN000;
 0164  3A DA				cmp	bl,dl			    ; drive ID match ?? 				   ;
				AN000;
 0166  74 0B				je	drive_found		    ; yes, drive ID found				   ;
				AN000;
 0168  83 C6 04				add	si,4			    ; (2/11) no, move pointer to next ID		
					  ;AN000;
 016B  E2 F4				LOOP	get_drive_id		    ; check next drive id				   ;
				AN000;
				
 016D				Drive_Not_Found:			    ; drive id not found
 016D  59				pop	cx			    ; restore registers 			       ;AN00
				0;
 016E  5B				pop	bx										   ;
				AN000;
 016F  5E				pop	si										   ;
				AN000;
 0170  E9 0238 R			jmp	Error_Exit		    ; return
				
 0173				Drive_Found:				    ; drive ID found
 0173  2E: 88 16 0004 R			mov	cs:Prev_drv_id,dl	    ; save drive id as prev drive id
 0178  59				pop	cx			    ; restore registers 				   ;
				AN000;
 0179  5B				pop	bx			    ; and do the specified function		      ;AN000
				;
 017A  5E				pop	si										   ;
				AN000;
				
				;-----------------------------------------------------------------------------
				;     FASTSEEK FUNCTION DISPATCHER
				;-----------------------------------------------------------------------------
 017B				DISPATCH_FSEEK:
 017B  3C 10				cmp	al,010H
 017D  7E 05				jle	Fsk_Cont
 017F  2E: FF 06 0000 R			inc	cs:call_cnt									   ;
				AN000;
				;	cmp	cs:call_cnt,0efffH	   ; for debugging
				;	jne	 fsk_cont		   ; for debugging
				
				
 0184				Fsk_Cont:
 0184  0E				push	cs			   ; set addressability
 0185  1F				pop	ds			   ; CS = DS = Cseg_Main segment
					ASSUME	ds:Cseg_Main
 0186  3C 05				cmp	al,FONC_Purge		   ; PURGE call ??					    
				   ;AN000;
 0188  74 4C				je	chk_05			   ; yes - continue					
					;AN000;
				
 018A  2E: C7 06 0002 R 0000		mov	cs:Purge_Flag, 0	   ; reset purge flag
 0191  3C 0B				cmp	al,FSK_Open		   ; OPEN call						
					;AN000;
 0193  75 07				jne	chk_12			   ; jump if not					
					;AN000;
 0195  FF 1E 00DB R			CALL	FSEEK_OPEN									
					;AN000;
 0199  E9 024A R			jmp	exit										
					;AN000;
 019C				Chk_12:
 019C  3C 0C				cmp	al,FSK_Close		   ; CLOSE ??						
					;AN000;
 019E  75 07				jne	chk_14										
					;AN000;
 01A0  FF 1E 00DF R			CALL	FSEEK_CLOSE		   ; process close function				
					;AN000;
 01A4  E9 024A R			jmp	exit										
					;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-11
Directory entry                                             

 01A7				Chk_14:
 01A7  3C 0E				cmp	al,FSK_Lookup		   ; LOOKUP ??						
					;AN000;
 01A9  75 0C				jne	chk_15										
					;AN000;
 01AB  FF 1E 00EB R			CALL	FSEEK_LOOKUP		   ; process lookup					
					;AN000;
 01AF  E8 0289 R			CALL	RESTORE_PAGE_STATE	   ; restore EMS page					
					;AN000;
 01B2  5A				pop	dx			   ; dont restore original BX and DI			
					;AN000;
 01B3  5A				pop	dx			   ; from DOS since BX and DI contins return values	   ;
				AN000;
 01B4  E9 024F R			jmp	exit_1			   ; exit
				
 01B7				Chk_15:
 01B7  3C 0F				cmp	al,FSK_Insert		   ; INSERT ??						
					;AN000;
 01B9  75 07				jne	chk_13										
					;AN000;
 01BB  FF 1E 00E3 R			CALL	FSEEK_INSERT		   ; Process insert					
					;AN000;
 01BF  E9 024A R			jmp	exit										
					;AN000;
 01C2				Chk_13:
 01C2  3C 0D				cmp	al,FSK_DELETE		   ; DELETE ??						
					;AN000;
 01C4  75 06				jne	chk_16										
					;AN000;
 01C6  FF 1E 00E7 R			CALL	FSEEK_DELETE		   ; process delete					
					;AN000;
 01CA  EB 7E				jmp	short  exit									
					       ;AN000;
 01CC				Chk_16:
 01CC  3C 10				cmp	al,FSK_Trunc		   ; TRUNCATE ??					
					;AN000;
 01CE  75 06				jne	Chk_05			   ;
 01D0  FF 1E 00EF R			CALL	FSEEK_TRUNCATE		   ; process truncate					
					;AN000;
 01D4  EB 74				jmp	short exit									
					      ;AN000;
				
 01D6				Chk_05:
 01D6  2E: 83 3E 0002 R 01		cmp	cs:Purge_Flag, 1	   ; previous call is purge ??				    
				;AN000;
 01DC  75 03				jne	Purge_buffs		   ; no - purge the buffers
 01DE  F8				clc				   ; yes - exit
 01DF  EB 69				jmp	short exit									
					      ;AN000;
				
 01E1				Purge_Buffs:
 01E1  2E: C7 06 0002 R 0001		mov	cs:Purge_Flag,1 	   ; set purge flag
 01E8  2E: 83 3E 0015 R 00		cmp	CS:Main_Total_Ext_Count,0	    ; reset fseek buffs??
 01EE  74 04				je	reset_fopen		   ; no - reset fopen
 01F0  FF 1E 00F3 R			CALL	FSEEK_PURGE		   ; reset extent cache 			    ;AN000;
				
 01F4				Reset_Fopen:
 01F4  2E: 83 3E 0017 R 00		cmp	CS:Main_Total_Name_Count,0	    ; reset fopen buffs??
 01FA  74 05				je	Reset_Exit		   ; no - reset f
 01FC  2E: FF 1E 00D7 R			CALL	CS:FOPEN_PURGE		      ; reset extent cache			       ;AN00
				0;
				
 0201				Reset_Exit:
 0201  F8				clc
 0202  EB 46				jmp	short exit									
					 ;AN000;
				
				
				; NOTE: Carry Flag state from Function calls must be correctly returned
				;	to the DOS, especially from Fastseek Lookup function
				
				
				;-----------------------------------------------------------------------------
				;	FASTOPEN FUNCTION DISPATCHER
				;-----------------------------------------------------------------------------
 0204				DISPATCH_FOPEN: 		      ; dispatch FOPEN functions
 0204  FC				cld											   ;
				AN000;
 0205  2E: C7 06 0002 R 0000		mov	cs:Purge_Flag, 0      ; reset purge flag
 020C  3C 04				cmp	al, FONC_update 								   ;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-12
Directory entry                                             

				AN000;
 020E  75 07				jne	Chk_02										   ;
				AN000;
 0210  2E: FF 1E 00CB R			CALL	CS:Fopen_Update       ; UPDATE							   ;
				AN000;
 0215  EB 33				jmp	short exit									
					 ;AN000;
				
 0217				Chk_02:
 0217  3C 02				cmp	al, FONC_insert 								   ;
				AN000;
 0219  75 07				jne	Chk_01										   ;
				AN000;
 021B  2E: FF 1E 00C7 R			CALL	CS:Fopen_Insert       ; INSERT							   ;
				AN000;
 0220  EB 28				jmp	short exit									
					 ;AN000;
 0222				Chk_01:
 0222  3C 01				cmp	al, FONC_look_up								   ;
				AN000;
 0224  75 07				jne	chk_03										   ;
				AN000;
 0226  2E: FF 1E 00D3 R			CALL	CS:Fopen_lookup       ; LOOKUP							   ;
				AN000;
 022B  EB 1D				jmp	short exit									
					 ;AN000;
 022D				Chk_03:
 022D  3C 03				cmp	al, FONC_delete 								   ;
				AN000;
 022F  75 07				jne	Error_Exit									   ;
				AN000;
 0231  2E: FF 1E 00CF R			CALL	CS:Fopen_delete       ; DELETE							   ;
				AN000;
 0236  EB 12				jmp	short exit									
					 ;AN000;
				
				
				
				;-----------------------------------------------------------------------------
				;  EXIT TO DOS FROM FUNCTIONS
				;-----------------------------------------------------------------------------
				
 0238				ERROR_EXIT:	     ; EXIT from invalid drive id search loop
 0238  E8 0289 R			CALL	RESTORE_PAGE_STATE     ; restore frame buff status				   ;
				AN000;
								       ; on return AX should have function code
 023B  5B				pop	bx		       ; restore first two regs of DOS
 023C  5F				pop	di										   ;
				AN000;
 023D  3C 0E				cmp	al,FSK_Lookup									   ;
				AN000;
 023F  75 06				jne	exit_2										   ;
				AN000;
 0241  BF 0001				mov	di,1		       ; set error flag - invalid drive id			   ;
				AN000;
 0244  F9				stc											   ;
				AN000;
 0245  EB 08				jmp	short Exit_1									   ;
				AN000;
				
 0247				EXIT_2:
 0247  F8				clc											   ;
				AN000;
 0248  EB 05				jmp	short Exit_1									   ;
				AN000;
				
				
				; Normal Exit from Fastopen Functions except Fastseek Lookup function
 024A				EXIT:
 024A  E8 0289 R			CALL	RESTORE_PAGE_STATE     ; restore EMS page state 				   ;
				AN000;;AN000;
 024D  5B				pop	bx		       ; restore BX						   ;
				AN000;
 024E  5F				pop	di		       ; restore DI						   ;
				AN000;
				
				
				; Exit from FastSeek Lookup function. Dont restore BX and DI
 024F				EXIT_1:
 024F  5D				pop	bp		       ; restore remaining DOS registers
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-13
Directory entry                                             

 0250  07				pop	es		       ; except BX and DI since they contain			
									;AN000;
 0251  1F				pop	ds		       ; return values. 					    
				;AN000;
 0252  5A				pop	dx										   ;
				AN000;
 0253  59				pop	cx										   ;
				AN000;
				
 0254				ERROR_RET:
 0254  CB				ret											   ;
				AN000;
				
 0255				MAIN	ENDP
				
				IF	BUFFERFLAG
				;---------------------------------------------------------------------------
				;	Procedure name	:	save_ems_page_state
				;	
				;	Description:
				;		Saves the state of the page whose physical segment value is
				;	specified in Main_EMS_PAGE_SEG. 
				;---------------------------------------------------------------------------
				
 0255				SAVE_EMS_PAGE_STATE	PROC	FAR
				
 0255  50				PUSH	AX			  ; save registers
 0256  51				PUSH	CX
 0257  52				PUSH	DX										   ;
				AN000;
 0258  1E				PUSH	DS										   ;
				AN000;
 0259  06				PUSH	ES										   ;
				AN000;
 025A  55				PUSH	BP										   ;
				AN000;
 025B  56				PUSH	SI										   ;
				AN000;
 025C  57				PUSH	DI										   ;
				AN000;
 025D  53				PUSH	BX										   ;
				AN000;
				
 025E  B8 ---- R			MOV	AX, SEG EMS_PAGE_MAP	  ; get segid
 0261  8E D8				MOV	DS,AX
 0263  8D 36 007F R			LEA	SI,EMS_PAGE_MAP 	  ; DS:SI-->page map struc
 0267  B8 ---- R			MOV	AX, SEG EMS_PAGE_ARRAY	  ; get segid
 026A  8E C0				MOV	ES,AX
 026C  8D 3E 0085 R			LEA	DI,EMS_PAGE_ARRAY	  ; ES:DI-->Page ARRAY
 0270  B4 4F				MOV	AH,EMS_SAVE_STATE	  ;
 0272  B0 00				MOV	AL,0			  ; subfunction code
 0274  CD 67				INT	EMS_INT 		  ; save page state					
						    ;AN000;
				
 0276  5B				POP	BX										   ;
				AN000;
 0277  5F				POP	DI										   ;
				AN000;
 0278  5E				POP	SI										   ;
				AN000;
 0279  5D				POP	BP										   ;
				AN000;
 027A  07				POP	ES										   ;
				AN000;
 027B  1F				POP	DS										   ;
				AN000;
 027C  5A				POP	DX										   ;
				AN000;
 027D  59				POP	CX										   ;
				AN000;
				
 027E  80 FC 00				CMP	AH,0			 ; save ok??
 0281  74 03				JE	SAVE_OK			 ; 
 0283  F9				STC
 0284  EB 01				JMP	SHORT DONE
 0286				SAVE_OK:
 0286  F8				CLC
 0287				DONE:
 0287  58				POP	AX
 0288  CB				RET
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-14
Directory entry                                             

				
 0289				SAVE_EMS_PAGE_STATE	ENDP
				
				ENDIF
				
				
				;-----------------------------------------------------------------------------
				; PROCERDURE:  RESTORE_PAGE_STATE
				;
				; Function:    Restore state of EMS page
				;
				; Input:       None
				; Output:      Page is restored
				;
				;-----------------------------------------------------------------------------
				
 0289				RESTORE_PAGE_STATE    PROC  NEAR	;RESTORE EMS PAGE STATE
 0289  9C				PUSHF				;save flag					     ;AN000;
 028A  2E: 83 3E 0011 R 00		CMP	CS:MAIN_EMS_FLAG, 0	;EMS enabled ?? 					   ;
				AN000;
 0290  75 02				JNE	REST_PUSH_REGS		;yes, restore registers
 0292  EB 27				JMP	SHORT RESTORE_EXIT	;no, exit						   ;
				AN000;
									;yes, restore page registers
 0294				REST_PUSH_REGS:
 0294  50				PUSH	AX			; save function code
 0295  51				PUSH	CX			; save caller registers 				    
				;AN000;
 0296  52				PUSH	DX										   ;
				AN000;
 0297  1E				PUSH	DS										   ;
				AN000;
 0298  06				PUSH	ES										   ;
				AN000;
 0299  55				PUSH	BP										   ;
				AN000;
 029A  56				PUSH	SI										   ;
				AN000;
 029B  57				PUSH	DI										   ;
				AN000;
 029C  53				PUSH	BX										   ;
				AN000;
				
 029D  B8 ---- R			MOV	AX, SEG EMS_PAGE_ARRAY
 02A0  8E D8				MOV	DS,AX
 02A2  8D 36 0085 R			LEA	SI,EMS_PAGE_ARRAY	; DS:SI-->Page array
 02A6  B4 4F				MOV	AH,EMS_RESTORE_STATE	;
 02A8  B0 01				MOV	AL,1			;
 02AA  CD 67				INT	EMS_INT 		; restre page state					
						      ;AN000;
 02AC  80 FC 00				CMP	AH,0			; restore OK ??
 02AF  74 01				JE	REST_POP_REGS		; yes
 02B1  F9				STC				; set carry
				
 02B2				REST_POP_REGS:
 02B2  5B				POP	BX			; RESTORE REGISTERS					   ;
				AN000;
 02B3  5F				POP	DI										   ;
				AN000;
 02B4  5E				POP	SI										   ;
				AN000;
 02B5  5D				POP	BP										   ;
				AN000;
 02B6  07				POP	ES										   ;
				AN000;
 02B7  1F				POP	DS										   ;
				AN000;
 02B8  5A				POP	DX										   ;
				AN000;
 02B9  59				POP	CX										   ;
				AN000;
 02BA  58				POP	AX			; restore function code
				
 02BB				RESTORE_EXIT:
 02BB  9D				POPF
 02BC  C3				RET											   ;
				AN000;
				
 02BD				RESTORE_PAGE_STATE    ENDP
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-15
Directory entry                                             

				
				IF	BUFFERFLAG
				
				;---------------------------------------------------------HKN 8/26/88-------
				;	procedure name		:	map_page
				;	Inputs			: 	ems_page_number = physical page frame
				;							  number.
				;					ems_save_handle1 = emm_handle.
				;	Output			: 	CY - error
				;					NC - page is mapped to logical page 0
				;----------------------------------------------------------------------------
 02BD				map_page	proc	near
				
 02BD  50				push	ax
 02BE  53				push	bx
 02BF  52				push	dx
				
 02C0  33 DB				xor	bx, bx
 02C2  2E: A1 00C5 R			mov	ax, cs:ems_page_number	; contains the page number obtained 
									; during fastopen intialization.
 02C6  B4 44				mov	ah, 44h
 02C8  2E: 8B 16 00C3 R			mov	dx, cs:ems_save_handle1	; contains the emm handle that was
									; obtained during fast init.
 02CD  CD 67				int	ems_int
 02CF  0A E4				or	ah, ah
 02D1  75 03				jnz	err_map_page
 02D3  F8				clc
 02D4  EB 01				jmp	short map_page_done
				
 02D6				err_map_page:
 02D6  F9				stc
				
 02D7				map_page_done:
 02D7  5A				pop	dx
 02D8  5B				pop	bx
 02D9  58				pop	ax
 02DA  C3				ret
				
 02DB				map_page	endp
				
				ENDIF
					
					
									 ; NOTE:
 02DB				CSEG_MAIN   ENDS			 ; End of the first portion of the
									 ; Cseg_Main segment.  Remaining
									 ; portion is in Fastinit.asm
				
				;-----------------------------------------------------------------------------
				
				
				
				
				
				;==============================================================================
				; All Fastopen functions are kept in a seperate segment.  These are accessed
				; by a FAR indirect call from the MAIN routine.
				; ADDRESSABILTY: CS is used for accessing local data in Cseg_Open segment
				;		 DS is used for accessing data in the drive cache buffer
				;					  in the Cseg_Init segment
				;		 ES is used for accessing data in the name cache buffer
				;					  in the Cseg_Init segment
				;
				;*****************************************************************************
 0000				CSEG_OPEN   SEGMENT   PARA   PUBLIC 'code'
				  ASSUME  cs:cseg_open,ds:nothing,es:nothing,ss:nothing
				;*****************************************************************************
				
				PUBLIC	 Open_name_cache_seg									   ;
				AN000;
				PUBLIC	 Open_name_Drive_Buff									   ;
				AN000;
				PUBLIC	 End_Open										   ;
				AN000;
				PUBLIC	 Chk_Flag										   ;
				AN000;
				
				;---- FastOpen Functions Local Variables --------------
				
 0000  0000			Current_Node	     DW    ?	     ;address of current node entry buffer		     ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-16
Directory entry                                             

 0002  0000			Current_Sibling      DW    ?	     ;address of current sibling node entry buffer		;AN0
				00;
 0004  0000			Current_Drive	     DW    ?	     ;address of current drive header			     ;AN000;
 0006  FFFF			Matching_Node	     DW    -1	     ;flag						       ;AN00
				0;
 0008  0000			From_Delete	     DW    0	     ;= 1 if call is from DELETE function		    ;AN000;
 000A  0000			Old_SI		     DW    0	     ;SI save area				     ;AN000;
 000C  00			Flag		     DB    0									;AN0
				00;
 000D  00			Level		     DB    0	     ;depth level of the path					;AN0
				00;
 000E  00000000			Dir_Info_Buffer      DD    ?	     ;Dir_Info buffer inside DOS				;AN0
				00;
 0012  00000000			Extended_Info_Buffer DD    ?	     ;Extended Info buffer inside DOS			;AN000;
 0016  0000			New_FEI_clusnum      DW    0									;AN0
				00;
 0018  000B[			Packed_Name	     DB    11 dup (0)	   ;Space for packed dir name				;AN0
				00;
	   00			
			 ]	
				
 0023  0000			Top		     DW    0									;AN0
				00;
 0025  0000			Temp		     DW    0									;AN0
				00;
 0027  0000			Bottom		     DW    0									;AN0
				00;
 0029  00			Depth		     DB    0									;AN0
				00;
				
 002A  0000			Chk_Flag	     dw    0	     ; flag used by the analyser
 002C  00			func_cod	     db    0	     ; function code for analyser
				
				;Following data area is filled during initialization
 002D  ---- R			Open_name_cache_seg	   DW	 Cseg_Init     ; address of name cache buffer
 002F  0000			Open_name_Drive_Buff	   DW	 0	       ; address of first drive buffer
				
				
				
				
				;
				;==============================================================================
				;		    Pathname Tree Search
				;
				;  Element of each path name is represented by a node in the tree.  First
				;  node is connected to the the Drive header through first child pointer
				;  (DCH_Child_Ptr).  The first node may have one or more nodes underneath.
				;  The first one is called the Child of this node and the others are the siblings
				;  of the child node.  Previous node is connected to the first node through
				;  the child pointer (nChild_Ptr) and the siblings are connected through the
				;  sibling pointer (nSibling_Ptr).  Each node is connected to the previous
				;  node through a backward pointer (nBackward_Ptr).  For example, to go to the
				;  previous node from any of the siblings. It is necessary to go to the
				;  child through previous siblings (if any) and then to the previous from the
				;  child.  All this backward movement is using nBackward_Ptr.
				;  Similarly to go to a child or sibling, nChild_ptr or nSibling_Ptr should be
				;  used.  The strucure of drive header and the node are defined in Fastopen.inc
				;
				
				;==============================================================================
				;Subroutine:  LOOKUP
				;
				;INPUT:
				;    DS:SI -> path  (drive letter D: will be validated by Find_Drive_Cache_hdr)
				;    ES:DI -> DIR_INFO buffer to be returned inside DOS
				;    ES:CX -> FASTOPEN_Extended_Info buffer inside DOS
				;    ES:BP -> Drive_Cache_Heade
				;
				;
				;OUTPUT:
				;     If the whole path is found,
				;	 DS:SI--> 0
				;	 ES:DI--> DIR_INFO buffer is filled with directory info
				;	 ES:CX--> EXT_INFO buffer is filled with extended info
				;
				;     If partially found the path,
				;	 DS:SI--> '\' after the matching directory name
				;	 ES:DI--> DIR_INFO buffer is filled with directory info
				;	 ES:CX--> EXT_INFO buffer is filled with extended info
				;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-17
Directory entry                                             

				;     If the Name_cache tree is empty, i.e.,no root directory name,
				;	 DS:SI--> '\' after ':'
				;	 ES:DI--> DIR_INFO buffer is undetermined
				;	 ES:CX--> EXT_INFO buffer is undetermined
				;
				;==============================================================================
				
 0031				LOOKUP	PROC   FAR
				
 0031  2E: A2 002C R			mov	cs:func_cod,al		   ; save function code
 0035  2E: 83 3E 0008 R 00		cmp	From_Delete, 0		   ;call from DELETE function ??
 003B  74 04				je	Look_Pack_Dir		   ;no, dont restore DS
 003D  8E DB				mov	DS,bx			   ;yes, restore DS
					ASSUME	DS:Cseg_Init
 003F  EB 0B				jmp	short Look_save_regs	   ;save registers
				
 0041				Look_Pack_Dir:
 0041  E8 050C R			CALL	PACK_DIR_NAME		   ;on return drive letter => DL,
				
 0044  E8 02D7 R			CALL	FIND_DRIVE_CACHE_HEADER    ;find drive header address
									   ;on return ES:BP-->drive header
 0047  73 03				jnc	look_save_regs		   ;drive buffer found
 0049  E9 00F8 R			jmp	lookup_error		   ;drive buffer not found
				
 004C				Look_Save_Regs:
 004C  06				push	es
 004D  57				push	di
 004E  51				push	cx
 004F  2E: A1 002D R			mov	ax, cs:Open_Name_Cache_Seg							   ;
				AN000;
 0053  8E C0				mov	es, ax			   ;ES = Name_Cache_Seg 				    
				  ;AN000;
					ASSUME	es:Cseg_Init									   ;
				AN000;
 0055  E8 03A4 R			CALL	SET_LRU 		   ;set the Real LRU, if any.
				
 0058  2E: 80 0E 000C R 01		or	cs:Flag,Is_drive_head	   ;level of the tree. Drive header
 005E  2E: C7 06 0006 R FFFF		mov	cs:Matching_Node, -1	   ;Nothing found yet.
 0065  2E: 89 2E 0004 R			mov	cs:Current_Drive, BP	   ;drive header
 006A  2E: C6 06 000D R 00		mov	cs:Level, 0		   ;path level is 0
				
 0070				Lookup_Path:
 0070  2E: 89 2E 0000 R			mov	cs:Current_Node, BP	   ;save current node address
 0075  2E: C7 06 0002 R FFFE		mov	cs:Current_Sibling,0fffeh  ;set no sibligs yet.
 007C  2E: 89 36 000A R			mov	cs:Old_SI, si		   ;save current path address
				
 0081  E8 050C R			CALL	PACK_DIR_NAME		   ;get the next dir name from the path
 0084  72 52				jc	Lookup_Done		   ;yes, found the whole path.
				
 0086  2E: F6 06 000C R 01		test	cs:Flag, Is_drive_head	   ;dir name = drive header ?
 008C  74 0D				jz	Lp_Path1		   ;no-
				
 008E  1E				push	ds			   ;yes-drive header
 008F  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init
 0094  3E: 8B 6E 04			mov	BP, DS:[BP.DCH_Child_ptr]  ;BP-->first child node under drive hdr
 0098  1F				pop	ds
					ASSUME	ds:nothing
 0099  EB 04				jmp	short Lp_Path2
				
 009B				Lp_Path1:
 009B  26: 8B 6E 04			mov	BP, ES:[BP.nChild_ptr]	   ;BP--> child of current node
				
 009F				Lp_Path2:
 009F  83 FD FF				cmp	BP, -1			   ;no child?
 00A2  74 34				je	Lookup_Done		   ;Not found or partially found
 00A4  2E: 89 2E 0000 R			mov	cs:Current_Node, BP	   ;current_node = found node
 00A9  2E: 80 26 000C R FE		and	cs:Flag, Not_drive_head    ;reset the flag.
				
 00AF				Lp_Cmpare:
 00AF  E8 0489 R			CALL	CMPARE			   ;look for path in current node
 00B2  74 15				je	Lookup_Found		   ;Yes, found a match. Next level for
									   ;possible remianing path
				
 00B4  26: 8B 6E 06			mov	BP, ES:[BP.nSibling_ptr]   ;not found. Any siblings?
 00B8  2E: 89 2E 0002 R			mov	cs:Current_Sibling,BP
 00BD  83 FD FF				cmp	BP, -1			   ;any more sibling?
 00C0  74 16				je	Lookup_Done		   ;no - done
				
 00C2  2E: 89 2E 0000 R			mov	cs:Current_Node, BP	   ;yes- make the found sibling as a current
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-18
Directory entry                                             

 00C7  EB E6				jmp	short Lp_Cmpare 	   ;node and search path in this node
				
 00C9				Lookup_Found:
 00C9  2E: FE 06 000D R			inc	cs:Level
 00CE  2E: 89 2E 0006 R			mov	cs:Matching_Node,BP	   ;Used by Unfold_Name_Record
				
 00D3  E8 0341 R			CALL	PRE_LRU_STACK		   ;set the TEMP_LRU_Stack
 00D6  EB 98				jmp	Lookup_Path		   ;continue to the next dir
				
 00D8				Lookup_Done:
 00D8  2E: 8B 36 000A R			mov	si, cs:Old_SI
 00DD  59				pop	cx			   ;restore Extended_Info buffer
 00DE  5F				pop	di			   ;restore Dir_Info buffer
 00DF  07				pop	es			   ;the segment for the above buffers
				
 00E0  3D FFFF				cmp	ax, -1
 00E3  74 03				je	Lookup_ERR		   ;error occured in Pack_Dir_Name.
 00E5  F8				clc				   ;clear carry.
 00E6  EB 01				jmp	short Lookup_Done1
				
 00E8				Lookup_ERR:				   ;error exit
 00E8  F9				stc
				
 00E9				Lookup_Done1:
 00E9  2E: F6 06 000C R 02		test	cs:Flag, is_delete	   ;called by delete?
 00EF  75 0B				jnz	Lookup_Return
 00F1  72 03				jc	Lookup_Exit		   ;If it was an error, don't change the carry flag
				
 00F3  E8 04D8 R			CALL	UNFOLD_NAME_RECORD	   ;unfold the current node's record
 00F6				Lookup_Exit:
 00F6  EB 04				jmp	short Lookup_Return	   ;return to DOS.
				
 00F8				Lookup_Error:				   ;error exit
 00F8  F9				stc
 00F9  B8 FFFF				mov    ax,-1
				
 00FC				Lookup_Return:				   ;return to Delete routine.
 00FC  E8 0603 R			CALL	Check_It		   ;check tree structure
 00FF  CB				ret
				
 0100				LOOKUP	 ENDP
				
				
				
				
				
				;==============================================================================
				;SUBROUTINE: INSERT
				;
				;INPUT:    DS:DI -> Dir_Info in DOS
				;	   ES:BX -> Fastopen_Extended_Info in DOS
				;	   Current_Node, Current_Sibling, Current_Drive, Flag
				;
				;OUTPUT:   Information inserted into Name_cache_tree.
				;
				;   Any Sequential Insert operation should be preceded by a Look_up
				;   operation. For ex., if the DOS wants to insert C:\DIR1\DIR2\File1
				;   and suppose there is no matching name cache record for DIR1 in the tree.
				;   Firstly DOS will try to look up C:\DIR1\DIR2\File1.  FASTOPEN will
				;   return to DOS with DS:SI points to "\" after the drive letter.
				;   Then, DOS will simply ask an insert operation with DS:DI, ES:BX
				;   points to the information on "DIR1".  FASTOPEN will insert DIR1
				;   onto the tree.  After that DOS will ask another insert
				;   operation for DIR2.  FASTOPEN will insert DIR2.  Finally DOS will
				;   ask to insert File1.
				;
				;   Suppose when DOS try to look up C:\DIR1\DIR2\File2 at this moment.
				;   FASTOPEN will return to DOS with DS:SI points to "\" after DIR2 (since
				;   DIR2 information is already in the name cache tree).  Then DOS will ask
				;   to insert File2.
				;
				;   Any Insert operation of subdirectory name which is deeper than (Number_
				;   of_Entries - 1) will not be inserted but will just return.
				;   Also, for the safety reason, if the would be freed node (=LRU node) is
				;   the same as the Current_Node, there will be no insertion. (This is a simple
				;   safety valve.  A more smart logic can look for the next **legitimately
				;   available** LRU node to use, or sometimes, simply replace the contents of the
				;   entry if adequate. But this will increase the complexity greatly, and I
				;   think the current logic is still practical enough to use despite of the
				;   possible small window of performance degradation in a very special cases. J.K.)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-19
Directory entry                                             

				;
				;==============================================================================
				
 0100				INSERT	PROC   FAR
 0100  2E: A2 002C R			mov	cs:func_cod,al			; save function code
 0104  2E: FE 06 000D R			inc	cs:Level			;increment directory level
 0109  33 C0				xor	ax,ax
 010B  2E: A0 000D R			mov	al, cs:Level
 010F  FE C0				inc	al
 0111  2E: 8B 2E 0004 R			mov	bp, cs:Current_Drive		;BP-->address of current drive header
 0116  1E				push	ds
 0117  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg	;DS=name cache segment
				
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 011C  3E: 3B 46 09			cmp	ax, ds:[bp.DCH_Num_Entries]	;Level > (Num_Entries - 1) ?
 0120  1F				pop	ds
					ASSUME	ds:nothing
 0121  76 02				jbe	Insert_it			;no- insert it
 0123  EB 62				jmp	short Insert_return		;yes return
				
 0125				Insert_it:
 0125  2E: 80 0E 000C R 04		or	cs:Flag, is_insert
				
 012B  E8 02FA R			CALL	GET_FREE_NODE		   ;AX = offset value of the available
									   ;name_record in Name_Cache_Seg.
 012E  72 51				jc	I_Exit			   ;Current node = would-be freed node.
				
 0130  E8 049D R			CALL	MAKE_NAME_RECORD	   ;Fill the above name record entry.
									   ;ES was changed to Name_Cache_Seg.
				
 0133  2E: 8B 2E 0000 R			mov	bp, cs:Current_Node	   ;set BP to current_node
 0138  8B DD				mov	bx, bp			   ;save it into bx
 013A  2E: 83 3E 0002 R FE		cmp	cs:Current_Sibling,0fffeh  ;current node sibling node ??
 0140  74 06				je	I_Child 		   ;no-child of preceding node
 0142  26: 89 46 06			mov	es:[bp.nSibling_ptr], ax   ;yes-make new node sibling of
 0146  EB 24				jmp	short I_Done		   ;current node
				
 0148				I_Child:				   ;set nChild_ptr
 0148  2E: F6 06 000C R 01		test	cs:Flag,Is_drive_head	   ;drive level?
 014E  75 06				jnz	I_Child_first		   ;Yes, must be the first child
 0150  26: 89 46 04			mov	es:[bp.nChild_ptr], ax	   ;no-make ndew node child of
 0154  EB 16				jmp	short I_Done		   ;current node
				
 0156				I_Child_first:				   ;this is the first child in this drive.
 0156  1E				push	ds
 0157  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg							   ;
				AN000;
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 015C  3E: 89 46 04			mov	ds:[bp.DCH_Child_ptr],ax   ;make new node 1st child current drive
 0160  1F				pop	ds
					ASSUME	ds:nothing
 0161  2E: 8B 1E 0004 R			mov	bx, cs:Current_Drive	   ;change bx to Current_Drive
 0166  2E: 80 26 000C R FE		and	cs:Flag, Not_drive_head    ;reset the flag
				
 016C				I_Done:
 016C  8B E8				mov	bp, ax
 016E  26: 89 5E 08			mov	es:[bp.nBackward_ptr],bx ;set the backward ptr of the inserted node.
				
 0172  E8 0341 R			CALL	PRE_LRU_STACK		   ;save this inserted record temporarily.
				
 0175  2E: 89 2E 0000 R			mov	cs:Current_Node,bp	   ;make new node current node
									   ;any subsequent insert operation
 017A  2E: C7 06 0002 R FFFE		mov	cs:Current_Sibling,0fffeh  ;should be installed as a child
				
 0181				I_Exit:
 0181  2E: 80 26 000C R FB		and	cs:Flag, not_insert	   ;set not insert flag
				
 0187				Insert_return:
 0187  E8 0603 R			CALL	Check_It		   ;check tree structure
 018A  CB				ret				   ;return
				
 018B				INSERT	ENDP
				
				
				
				
				
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-20
Directory entry                                             

				;==============================================================================
				;Subroutine: DELETE
				;
				;INPUT:   DS:SI -> path
				;	  ES:BP -> drive_cache_header (for Look_Up operation)
				;
				;OUTPUT:  if found, then remove the matching Name_Record will be removed from
				;	  the tree and from the LRU chain.  The freed entry will be placed
				;	  on top of the LRU chain.
				;
				;==============================================================================
				
 018B				DELETE	 PROC	FAR
				
 018B  2E: A2 002C R			mov	cs:func_cod,al		   ; save function code
 018F  E8 050C R			CALL	PACK_DIR_NAME		   ;drive letter => DL, 				    
				  ;AN000;
				
 0192  E8 02D7 R			CALL	FIND_DRIVE_CACHE_HEADER    ;find drive header address
									   ;on return ES:BP-->drive header
 0195  72 61				jc	d_err_exit		   ;error exit
				
 0197  2E: 80 0E 000C R 02		or	cs:Flag, is_delete	   ;set the flag for Look_up.
 019D  1E				push	ds			   ;save DS in BX since it is going to be
 019E  5B				pop	bx			   ;changed for jumping to other segment
 019F  1E				push	ds
 01A0  B8 ---- R			mov	ax,cseg_Main
 01A3  8E D8				mov	ds,ax			   ;DS=Main segment ID
					assume	ds:Cseg_Main
 01A5  2E: C7 06 0008 R 0001		mov	cs:From_Delete, 1	   ;set flag indicate that the call
									   ;is from DELETE function
 01AC  FF 1E 00F7 R			CALL	VECTOR_LOOKUP		   ;FAR call to Lookup function
				
 01B0  2E: C7 06 0008 R 0000		mov	cs:From_Delete, 0	   ;reset from delete flag
 01B7  1F				pop	ds
					ASSUME	ds:nothing
 01B8  72 3E				jc	D_err_Exit		   ;indirectly in the same segment
				
 01BA  80 3C 00				cmp	byte ptr ds:[si], 0	   ;found the whole path?
 01BD  75 39				jne	D_err_Exit		   ;No.
				
				;At this point, Current_Node = BP.
 01BF  2E: 8B 1E 002D R			mov	bx, cs:Open_Name_Cache_Seg
 01C4  8E C3				mov	es, bx			   ;set ES to name_cache_seg.
					ASSUME	es:Cseg_Init
				
 01C6				Delete_Node:
 01C6  26: 83 7E 04 FF			cmp	es:[bp.nChild_ptr], -1	   ;No children?
 01CB  75 2B				jne	D_err_Exit
 01CD  E8 043C R			CALL	REMOVEFROMTREE		   ;remove the node while maintaing the
									   ;integrity of the tree.
				
 01D0  26: C6 46 0A 20			mov	es:[bp.nCmpct_Dir_Info], ' ' ;mark that this entry is free!!!
				
 01D5				D_LRU_MRU:
 01D5  E8 03F5 R			CALL	REMOVEFROMLRUCHAIN	   ;Remove BP from the LRU,MRU chain
				
 01D8  2E: 8B 36 0004 R			mov	si, cs:Current_Drive	   ;Now let the deleted node to be the
 01DD  1E				push	ds			   ; LRU node
 01DE  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init									   ;
				AN000;
				
 01E3  8B 1C				mov	bx, ds:[si.DCH_LRU_ROOT]   ;es:bx -> first node
 01E5  26: 89 5E 00			mov	es:[bp.nLRU_ptr],bx	   ;Target.nLRU_ptr -> first node
 01E9  26: 89 6F 02			mov	es:[bx.nMRU_ptr],bp	   ;First_node.nMRU_ptr -> target
 01ED  89 2C				mov	ds:[si.DCH_LRU_ROOT],bp    ;LRU_ROOT -> target
 01EF  26: C7 46 02 FFFF		mov	es:[bp.nMRU_ptr],-1
 01F5  1F				pop	ds
					ASSUME	ds:nothing
 01F6  EB 04				jmp	short	D_Exit		   ;exit
				
 01F8				D_err_Exit:				   ;error exit
 01F8  F9				stc
 01F9  B8 FFFF				mov	ax, -1
				
 01FC				D_Exit:
 01FC  2E: 80 26 000C R FD		and	cs:Flag, not_delete	   ;reset the flag
 0202  E8 0603 R			CALL	Check_It		   ;check tree structure
 0205  CB				ret				   ;return
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-21
Directory entry                                             

				
 0206				DELETE	 ENDP
				
				
				
				
				
				;==============================================================================
				;Subroutine:  UPDATE
				;
				;INPUT:  If AH = 0, then update Dir_Entry area.
				;	     ES:DI -> Dir_entry ("dir_first" is the key to search).
				;	     DL = Logical Drive number (0 = A, 1 = B, ...).
				;
				;	 If AH = 1, then update "Fastopen_extended_info.FEI_clusnum".
				;	     DL = Logical Drive number (0 = A, 1 = B, ...)
				;	     CX = The value of "dir_first" to search.
				;	     BP = new value of FEI_clusnum in the extended_info area.
				;
				;	If AH = 2, then delete the entry. Same effect as Delete function
				;	     except this time the keys used to delete are;
				;	     DL = logical drive number
				;	     CX = the value of "dir_first" to search.
				;
				;	If AH = 3, then delete the entry. Same effect as Delete function
				;	     except this time the keys used to delete are;
				;	     DL = logical drive number
				;	     DH = directory position
				;	     DI = directory sector (low value)
				;	     CX = directory sector (high value)
				;
				;
				;OUT:  if found, then data is updated
				;      else CY and AX = -1.
				;
				;    This routine use "starting cluster number" and "drive letter"
				;    as a key to find the name record.	Usually the reason is DOS
				;    does not have any "full path" information about the file when
				;    it has to call this routine to update the information.
				;    It follows the MRU chain until it finds the name record or
				;    until it reaches the free name record (identified by the
				;    Directory name starting with ' '), or until the end of
				;    the MRU chain.
				;
				;==============================================================================
				
 0206				UPDATE	PROC	FAR
				
 0206  2E: A2 002C R			mov	cs:func_cod,al		 ; save function code
 020A  80 FC 00				cmp	ah, 0			 ;update directory entry ?
 020D  74 20				je	Update_Dir_Entry	 ;yes-
 020F  80 FC 01				cmp	ah, 1			 ;update extended info ?
 0212  74 3C				je	Update_Extended_clusnum  ;yes-
 0214  80 FC 02				cmp	ah, 2			 ;delete based on first clus num ?
 0217  74 08				je	Update_Delete		 ;yes-
 0219  80 FC 03				cmp	ah, 3			 ;delete based directory sector ?
 021C  74 0A				je	Update_Delete1		 ;yes-
				
 021E				U_ERROR:				 ;no - error exit
 021E  F9				stc
 021F  EB 45				jmp	short  Update_Exit
				
 0221				Update_Delete:				; same as delete
 0221  E8 0569 R			CALL	FIND_CLUSTER_NUMBER	; find name entry using first cluster
 0224  72 F8				jc	U_ERROR
 0226  EB 9E				jmp	Delete_Node		; if found, delete entry
				
 0228				Update_Delete1: 			; same as delete (PTR P3718  3/10/88)
 0228  E8 05B0 R			CALL	FIND_DIR_SECTOR 	; find name entry using directory
 022B  72 F1				jc	U_ERROR 		; sector and directory position
 022D  EB 97				jmp	Delete_Node		; if found, delete node
				
 022F				Update_Dir_Entry:
 022F  26: 8B 4D 1A			mov	cx, es:[di.dir_first]
 0233  06				push	es			;save Dir_Info pointer ES:DI
 0234  57				push	di
 0235  E8 0569 R			CALL	FIND_CLUSTER_NUMBER
 0238  5E				pop	si			;restore Dir_Info pointer in DS:SI
 0239  1F				pop	ds
 023A  72 E2				jc	U_ERROR 		;error-if not found
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-22
Directory entry                                             

				
 023C  55				push	bp			;found the entry
 023D  5F				pop	di
 023E  83 C7 0A				add	di, nCmpct_Dir_Info	;ES:DI->Name_Record.nCmpct_Dir_Info
 0241  B9 0011				mov	cx, ODI_head_leng
 0244  F3/ A4				REP	MOVSB			;update Cmpct_dir_info head section
 0246  83 C6 05				add	si, ODI_skip_leng
 0249  B9 000A				mov	cx, ODI_tail_leng
 024C  F3/ A4				REP	MOVSB			;update tail section
 024E  EB 16				jmp	short  Update_Exit	;exit
				
 0250				Update_Extended_clusnum:		;update extended info field
 0250  2E: 89 2E 0016 R			mov	cs:New_FEI_clusnum,bp
 0255  E8 0569 R			CALL	FIND_CLUSTER_NUMBER	;Find entry based first cluster number
 0258  72 C4				jc	U_ERROR
				
 025A  83 C5 25				add	bp, nExtended_Info	;es:bp -> Name_record.nExtended_Info
 025D  2E: 8B 1E 0016 R			mov	bx, cs:New_FEI_clusnum
 0262  26: 89 5E 05			mov	es:[bp.FEI_clusnum],bx
				
 0266				Update_Exit:
 0266  E8 0603 R			CALL	Check_It		   ;check tree structure
 0269  CB				ret				;return
				
 026A				UPDATE	 ENDP
				
				
				
				
				
				
				;==============================================================================
				;Subroutine:  FP_PURGE	  Rest Name Cache Buffers
				;
				;INPUT:  Main_Name_Drive_Buff  -  Offset to Name cache buffer
				;	 Main_Name_Cache_Seg   -  Name cache seg id
				;	 DL = Drive ID
				;
				;OUT:	 Buffer is purged
				;
				;==============================================================================
				
 026A				FP_PURGE   PROC    FAR
				
 026A  2E: 8B 36 002F R			mov	si,Open_Name_Drive_Buff        ; SI-->first Name drive cache buff
 026F  2E: 8E 06 002D R			mov	es,Open_Name_Cache_Seg	       ; ES = name cache seg ID
 0274  26: 8B 5C 0B			mov	bx,es:[si].DCH_Name_Buff       ; BX-->Name cache buffer
 0278  FE C2				inc	dl			       ; DL=drive number
 027A  80 C2 40				add	dl,040H 		       ; convert drive num to drive letter
				
				; Search for the name drive header corresponds to the drive letter
 027D				Purge_Drv_Loop:
 027D  26: 38 54 08			cmp	es:[si].DCH_Drive_Letter,dl    ; drive letter match ??
 0281  74 05				je	Purge_drive_cache	       ; yes - set drive cache
 0283  83 C6 0D				add	si, size Drive_Cache_Header    ; no - get address of next drive cache
 0286  EB F5				jmp	purge_drv_loop		       ; try next name drive header
				
 0288				Purge_Drive_Cache:			       ; SI-->drive header
 0288  26: 8B 5C 0B			mov	bx,es:[si].DCH_Name_Buff       ; BX-->Name cache buffer
 028C  26: 8B 4C 09			mov	cx,es:[si].DCH_num_entries     ; get number of name records
 0290  8B C3				mov	ax,bx			       ; save last name record address
 0292  26: C7 47 02 FFFF		mov	es:[bx].nMRU_ptr, -1	       ; make first MRU -1
 0298  EB 07				jmp	short set_start
				
 029A				Set_Up_Names:
 029A  26: 89 47 02			mov	es:[bx].nMRU_ptr,ax		;save last name record as MRU entry
 029E  05 0030				add	ax, size Name_Record		;AX = last name record = current name record
				
 02A1				Set_Start:
 02A1  26: C7 47 04 FFFF		mov	es:[bx].nChild_ptr, -1		;no children or siblings
 02A7  26: C7 47 06 FFFF		mov	es:[bx].nsibling_ptr, -1	;right now
 02AD  26: C7 47 08 FFFF		mov	es:[bx].nBackward_ptr, -1
				
 02B3  57				push	di
 02B4  50				push	ax
 02B5  B8 2020				mov	ax, '  '                        ;AX = ' '
 02B8  8B FB				mov	di, bx				;DI-->current name record
 02BA  83 C7 0A				add	di, nCmpct_Dir_Info		;blank out the Dir name area
 02BD  AA				stosb					;in the name record
 02BE  AB				stosw
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-23
Directory entry                                             

 02BF  AB				stosw
 02C0  AB				stosw
 02C1  AB				stosw
 02C2  AB				stosw
 02C3  58				pop	ax				; AX = last name record address
 02C4  5F				pop	di
				
 02C5  49				dec	cx				;update record count
 02C6  E3 0D				jcxz	purge_exit			;exit if last name record is done
 02C8  8B D3				mov	dx,bx
 02CA  83 C2 30				add	dx, size Name_Record		;DX-->next name record
 02CD  26: 89 17			mov	es:[bx].nLRU_ptr,dx		   ;set LRU pointer - next name record
 02D0  83 C3 30				add	bx, size Name_Record
 02D3  EB C5				jmp	set_up_names			;set next name record
				
 02D5				Purge_exit:
 02D5  F8				clc
 02D6  CB				ret
				
 02D7				FP_PURGE    ENDP
				
				
				
				;----------------------------------------------------------------------------
				;		    FASTOPEN  SUPPORT ROUTINES
				;----------------------------------------------------------------------------
				;
				; PROCEDURE:  Find_Drive_Cache_Header
				;
				; Function:  Validate drive ID and find address of drive cache header
				;
				;IN:   DL - drive letter
				;      Drive_Header_Start ;label
				;      Flag.
				;
				;OUT:  If CY = 0    Drive Header found
				;	     ES:BP -> Drive_Cache_Header,
				;
				;      If CY = 1    Drive Header not found
				;
				;----------------------------------------------------------------------------
				
 02D7				FIND_DRIVE_CACHE_HEADER   PROC	  NEAR
				
 02D7  2E: 8B 2E 002F R			mov	bp, cs:Open_name_drive_buff
 02DC  1E				push	ds
 02DD  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg							   ;
				AN000;
					ASSUME	ds:Cseg_Init				;DS:BP-->first drive header    ;AN000;
				
 02E2				FDCH_while:
 02E2  3E: 38 56 08			cmp	byte ptr ds:[bp.DCH_Drive_Letter], dl	; drive letter match
 02E6  75 03				jne	fdch_chk_end				; no - check next header
 02E8  F8				clc						; yes - exit
 02E9  EB 0D				jmp	short FDCH_Exit
				
 02EB				FDCH_Chk_End:
 02EB  3E: 80 7E 06 FF			cmp	byte ptr ds:[bp.DCH_Sibling_ptr], -1	; is this last header ?
 02F0  74 05				je	FDCH_Not_Found				; yes - header not found
 02F2  83 C5 0D				add	bp, size Drive_Cache_Header		; no - get next header
 02F5  EB EB				jmp	short	FDCH_while			; look for match
				
 02F7				FDCH_Not_Found:
 02F7  F9				stc						;not found
				
 02F8				FDCH_Exit:						;ES:BP-->header if found
 02F8  1F				pop    ds
					ASSUME ds:nothing				;return
 02F9  C3				ret
				
 02FA				FIND_DRIVE_CACHE_HEADER     endp
				
				
				
				
				;----------------------------------------------------------------------
				; PROCEDURE:  GET_FREE_NODE
				;
				; called by Insert. The LRU node pointed DCH_LRU_ROOT is returned in AX
				; and DCH_LRU_ROOT points to the following node in LRU chain.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-24
Directory entry                                             

				; If the node is not an empty node, then it will be removed from the
				; tree.
				;
				; IN:  Current_Drive, Current_Node
				;
				; OUT: AX = offset of the free node in Name_Cache_Seg
				;     Other registers saved.
				;----------------------------------------------------------------------
				
 02FA				GET_FREE_NODE	PROC	NEAR
				
 02FA  06				push	es				 ;save registers
 02FB  57				push	di
 02FC  56				push	si
 02FD  55				push	bp
				
 02FE  2E: A1 002D R			mov	ax, cs:Open_Name_Cache_Seg							   ;
				AN000;
 0302  8E C0				mov	es, ax				;ES=Name cache segment				  ;A
				N000;
					ASSUME	es:Cseg_Init									   ;
				AN000;
 0304  2E: 8B 36 0004 R			mov	si, cs:Current_Drive		;SI-->drive_cache_header
 0309  1E				push	ds
 030A  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init
 030F  8B 04				mov	ax, ds:[si.DCH_LRU_ROOT]	;get the LRU node
 0311  1F				pop	ds
					ASSUME	ds:nothing
				
 0312  2E: 3B 06 0000 R			cmp	ax, cs:current_Node		;LRU node=Current Node ??
 0317  74 22				je	GFN_skip			;yes-
				
 0319  8B E8				mov	bp, ax				;BP=Current node
 031B  26: 8B 7E 00			mov	di, es:[bp.nLRU_ptr]		;DI= current LRU node's following node
 031F  26: C7 45 02 FFFF		mov	es:[di.nMRU_ptr],-1		;set that node's MRU ptr
 0325  1E				push	ds
 0326  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg	;DS=Name cache segment
					ASSUME	ds:Cseg_Init
 032B  89 3C				mov	ds:[si.DCH_LRU_ROOT],di 	;connect previous node to
 032D  1F				pop	ds				;next node
					ASSUME	ds:nothing
				
 032E  26: 80 7E 0A 20			cmp	byte ptr es:[bp.nCmpct_Dir_Info],' ';an empty node?
 0333  74 03				je	GFN_OK			      ;then no problem.
				
 0335  E8 043C R			CALL	RemoveFromTree		    ;otherwise, it should be removed
									    ;from the tree.
 0338				GFN_OK:
 0338  F8				clc
 0339  EB 01				jmp	short	GFN_ret
				
 033B				GFN_Skip:
 033B  F9				stc
				
 033C				GFN_ret:
 033C  5D				pop	bp
 033D  5E				pop	si
 033E  5F				pop	di
 033F  07				pop	es
 0340  C3				ret				    ;return
				
 0341				GET_FREE_NODE	endp
				
				
				
				
				;
				;----------------------------------------------------------------------
				; PROCEDURE:   PRE_LRU_STACK
				;
				; When called by Look_up, Insert routine, the requested target node (BP)
				; will be temporarily removed from LRU,MRU chain (until SET_LRU routine
				; call), and will be pushed into a logical stack.  Actually, this routine
				; will not use a stack, but try to get the effect of the use of stack
				; to keep the history of target nodes in "REVERSE" LRU order as follows;
				; {    inc Depth;
				;      if Depth == 1 then Bottom = BP;
				;			  Bottom.LRU_ptr = -1;
				;			  Bottom.MRU_ptr = -1;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-25
Directory entry                                             

				; else if Depth == 2 then Top = BP;
				;			  Top.LRU_ptr = Bottom;
				;			  Bottom.MRU_ptr = Top;
				;			  Top.MRU_ptr = -1;
				; else if Depth >= 3 then Temp = Top;
				;			  Top = BP;
				;			  Top.LRU_ptr = Temp;
				;			  Temp.MRU_ptr = Top;
				;			  Top.MRU_ptr = -1;
				; }
				;
				;IN:  Depth, Top, Bottom, Temp,
				;     Requested target node (BP)
				;     ES = Name_Cache_Seg
				;
				;OUT: Target node removed from LRU,MRU chain.
				;     Target node's history saved in reverse LRU order.
				;     If called by "Delete" routine, then will just exit.
				;     If called by "Insert" routine, then will not attempt
				;     to remove the target node.
				;----------------------------------------------------------------------
				
 0341				PRE_LRU_STACK	PROC	NEAR
				
 0341  2E: F6 06 000C R 02		test	cs:Flag, is_delete	   ;invoked by Delete routine
 0347  75 5A				jnz	PLS_Exit
 0349  2E: F6 06 000C R 04		test	cs:Flag, is_insert	   ;called by Insert routine
 034F  75 03				jnz	PLS_Push
				
 0351  E8 03F5 R			CALL	RemoveFromLRUChain	;remove BP from the chain.
				
 0354				PLS_Push:
 0354  57				push	di
				
 0355  2E: FE 06 0029 R			inc	cs:Depth
 035A  2E: 80 3E 0029 R 01		cmp	cs:Depth, 1
 0360  75 0D				jne	PLS_Top
 0362  2E: 89 2E 0027 R			mov	cs:Bottom, bp		   ;bottom = bp
 0367  26: C7 46 00 FFFF		mov	es:[bp.nLRU_ptr], -1
 036D  EB 2D				jmp	short PLS_Done
				
 036F				PLS_Top:
 036F  2E: 80 3E 0029 R 02		cmp	cs:Depth, 2
 0375  75 14				jne	PLS_Temp
 0377  2E: 89 2E 0023 R			mov	cs:Top, bp		   ;Top = bp
 037C  2E: 8B 3E 0027 R			mov	di, cs:bottom		   ;di = bottom
				
 0381				PLS_com:
 0381  26: 89 7E 00			mov	es:[bp.nLRU_ptr],di	;Top.LRU_ptr = bottom
 0385  26: 89 6D 02			mov	es:[di.nMRU_ptr],bp	;Bottom.MRU_ptr = top
 0389  EB 11				jmp	short PLS_Done
				
 038B				PLS_Temp:
 038B  2E: 8B 3E 0023 R			mov	di, cs:Top		   ;di = Top
 0390  2E: 89 3E 0025 R			mov	cs:Temp, di		   ;Temp = di
 0395  2E: 89 2E 0023 R			mov	cs:Top, bp		   ;Top = bp
 039A  EB E5				jmp	short PLS_com
				
 039C				PLS_Done:
 039C  26: C7 46 02 FFFF		mov	es:[bp.nMRU_ptr],-1
 03A2  5F				pop	di
				
 03A3				PLS_Exit:
 03A3  C3				ret
				
 03A4				PRE_LRU_STACK	endp
				;
				
				
				
				
				
				;----------------------------------------------------------------------
				;PROCEDURE:  SET_LRU
				;
				;INPUT:  Depth, Top, Bottom, Current_Drive, ES = Name_Cache_Seg
				;
				;OUT: If Depth == 0 then exit
				; Pre_LRU_Stack procedure already maintained a reverse order LRU
				; mini chain.  Set_LRU will just put the top after the last node
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-26
Directory entry                                             

				; of the current LRU chain;
				; { Get the last node of LRU chain.
				;   if Depth == 0 then exit;
				;   if Depth == 1 then Last_Node.LRU_ptr = Bottom;
				;		       Bottom.MRU_ptr = Last_Node;
				;		       MRU_ROOT = Bottom;
				;   if Depth >= 2 then Last_Node.LRU_ptr = Top;
				;		       Top.MRU_ptr = Last_Node;
				;		       MRU_ROOT = Bottom;
				;   Depth = 0;
				; }
				;----------------------------------------------------------------------
				
 03A4				SET_LRU   PROC	  NEAR
				
 03A4  2E: 80 3E 0029 R 00		cmp	cs:Depth, 0		   ;nothing in the stack?
 03AA  74 48				je	SL_Exit
				
 03AC  56				push	si
 03AD  57				push	di
 03AE  53				push	bx
 03AF  2E: 8B 36 0004 R			mov	si, cs:Current_Drive	   ;cs:si -> Drive_Cache_Header
 03B4  1E				push	ds
 03B5  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg							   ;
				AN000;
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 03BA  8B 7C 02				mov	di, ds:[si.DCH_MRU_ROOT] ;es:di -> Last node in LRU chain
				
 03BD  2E: 80 3E 0029 R 01		cmp	cs:Depth, 1
 03C3  75 11				jne	SL_Other
				
 03C5  2E: 8B 1E 0027 R			mov	bx, cs:Bottom
 03CA  26: 89 1D			mov	es:[di.nLRU_ptr],bx	;Last_Node.LRU_ptr = Bottom
 03CD  26: 89 7F 02			mov	es:[bx.nMRU_ptr],di	;Bottom.MRU_ptr = Last_Node
 03D1  89 5C 02				mov	ds:[si.DCH_MRU_ROOT],bx ;MRU_ROOT = Bottom
 03D4  EB 14				jmp	short SL_Done
				
 03D6				SL_Other:				;Depth >= 2
 03D6  2E: 8B 1E 0023 R			mov	bx, cs:Top
 03DB  26: 89 1D			mov	es:[di.nLRU_ptr],bx
 03DE  26: 89 7F 02			mov	es:[bx.nMRU_ptr],di
 03E2  2E: 8B 1E 0027 R			mov	bx, cs:Bottom
 03E7  89 5C 02				mov	ds:[si.DCH_MRU_ROOT],bx
				
 03EA				SL_Done:
 03EA  1F				pop	ds
					ASSUME	ds:nothing
 03EB  2E: C6 06 0029 R 00		mov	cs:Depth, 0		   ;reset the Depth
 03F1  5B				pop	bx
 03F2  5F				pop	di
 03F3  5E				pop	si
				
 03F4				SL_Exit:
 03F4  C3				ret
				
 03F5				Set_LRU endp
				
				
				
				
				
				;----------------------------------------------------------------------
				; Procedure RemoveFromLRUChain
				;
				;IN:  Target node (BP) to be removed
				;     Current_drive
				;     ES - Name_Cache_Seg
				;
				;OUT:  Target node removed from the LRU,MRU chain. LRU,MRU chain
				;     updated.
				;
				;----------------------------------------------------------------------
				
 03F5				RemoveFromLRUChain     PROC    near
				
 03F5  53				push	bx
 03F6  57				push	di
 03F7  56				push	si
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-27
Directory entry                                             

 03F8  2E: 8B 36 0004 R			mov	si, cs:Current_drive	   ;cs:si-> Drive_cache_header
 03FD  26: 8B 5E 02			mov	bx, es:[bp.nMRU_ptr]	;es:bx-> Preceding node
 0401  26: 8B 7E 00			mov	di, es:[bp.nLRU_ptr]	;es:di-> Following node
 0405  83 FB FF				cmp	bx, -1			;Is target the first node?
 0408  74 0E				je	RFLC_first_node
 040A  83 FF FF				cmp	di, -1			;Is target the last node of LRU chain?
 040D  74 1A				je	RFLC_last_node
 040F  26: 89 3F			mov	es:[bx.nLRU_ptr],di	;Preceding.LRU_ptr->following node
 0412  26: 89 5D 02			mov	es:[di.nMRU_ptr],bx	;Following.MRU_ptr->preceding node
 0416  EB 20				jmp	short RFLC_done
				
 0418				RFLC_first_node:
 0418  1E				push	ds
 0419  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg							   ;
				AN000;
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 041E  89 3C				mov	ds:[si.DCH_LRU_ROOT],di ;LRU_ROOT-> following node
 0420  1F				pop	ds
					ASSUME	ds:nothing
 0421  26: C7 45 02 FFFF		mov	es:[di.nMRU_ptr], -1	;Following node's MRU_ptr
 0427  EB 0F				jmp	short RFLC_done
				
 0429				RFLC_last_node:
 0429  1E				push	ds
 042A  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init
 042F  89 5C 02				mov	ds:[si.DCH_MRU_ROOT],bx ;MRU_ROOT-> preceding node
 0432  26: C7 07 FFFF			mov	es:[bx.nLRU_ptr], -1	;Preceding node's LRU_ptr
 0437  1F				pop	ds
					ASSUME	ds:nothing
				
 0438				RFLC_done:
 0438  5E				pop	si
 0439  5F				pop	di
 043A  5B				pop	bx
 043B  C3				ret
				
 043C				RemoveFromLRUChain	endp
				;
				
				
				
				;----------------------------------------------------------------------
				; Proceure  RemoveFromTree
				;
				;IN:  BP - offset of node to be removed from the tree
				;	   This node shoud not be a subdirectory that is not empty!!!
				;      ES - Name_Cache_Seg
				;      Current_Drive
				;
				;OUT:  The node will be freed from the tree.
				;     The neighbor's Child_ptr, Sibling_ptr, Backward_ptr are adjusted
				;     accordingly.
				;     The freed node's child_ptr, sibling_ptr, backward_ptr are reset to -1.
				;----------------------------------------------------------------------
				
 043C				REMOVEFROMTREE	 PROC	 NEAR
				
 043C  53				push	bx
 043D  52				push	dx
				
 043E  26: 8B 5E 08			mov	bx, es:[bp.nBackward_ptr]	;get the preceding node
 0442  26: 8B 56 06			mov	dx, es:[bp.nSibling_ptr]	;get the sibling node
 0446  2E: 3B 1E 0004 R			cmp	bx, cs:Current_Drive
 044B  74 0C				je	RFT_First_Child 	;bp is the first child
 044D  26: 39 6F 04			cmp	es:[bx.nChild_ptr],bp
 0451  74 12				je	RFT_Child		;bp is the child of the preceding node
 0453  26: 89 57 06			mov	es:[bx.nSibling_ptr],dx ;bp is the Sibling of the preceding node
									;Update the preceding node's Sibling ptr
 0457  EB 10				jmp	short RFT_Reset
				
 0459				RFT_First_Child:
 0459  1E				push	ds
 045A  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg							   ;
				AN000;
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 045F  89 57 04				mov	ds:[bx.DCH_Child_ptr],dx
 0462  1F				pop	ds
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-28
Directory entry                                             

					ASSUME	ds:nothing
 0463  EB 04				jmp	short RFT_Reset
				
 0465				RFT_Child:
 0465  26: 89 57 04			mov	es:[bx.nChild_ptr],dx
				
 0469				RFT_Reset:				;reset the deleted node's tree pointers
 0469  26: C7 46 04 FFFF		mov	es:[bp.nChild_ptr],-1
 046F  26: C7 46 06 FFFF		mov	es:[bp.nSibling_ptr],-1
 0475  26: C7 46 08 FFFF		mov	es:[bp.nBackward_ptr],-1
				
 047B  87 D3				xchg	dx,bx			;now, dx=preceding node, bx=following node
 047D  83 FB FF				cmp	bx,-1			;end of sibling?
 0480  74 04				je	RFT_ret
 0482  26: 89 57 08			mov	es:[bx.nBackward_ptr],dx;modify backward_ptr of the sibling node
				
 0486				RFT_ret:
 0486  5A				pop	dx
 0487  5B				pop	bx
 0488  C3				ret				;return
				
 0489				REMOVEFROMTREE	endp
				;
				
				
				
				
				;----------------------------------------------------------------------
				; Procedure CMPARE
				;
				;IN: Packed name
				;    BP = target node
				;
				;OUT: ZERO flag set when compare O.K.
				;     DI destroyed.
				;----------------------------------------------------------------------
				
 0489				CMPARE	PROC	near
				
 0489  1E				push	ds
 048A  56				push	si
 048B  B9 000B				mov	cx, 11
 048E  0E				push	cs
 048F  1F				pop	ds
 0490  BE 0018 R			mov	si, offset cs:Packed_Name	   ;ds:si -> Packed_Name
 0493  8B FD				mov	di,bp
 0495  83 C7 0A				add	di,nCmpct_Dir_Info		;es:di -> bp.nCmpact_Dir_Info
 0498  F3/ A6				REPE	CMPSB
 049A  5E				pop	si
 049B  1F				pop	ds
 049C  C3				ret
 049D				CMPARE	endp
				
				
				
				
				;
				;----------------------------------------------------------------------
				; Procedure:  MAKE_NAME_RECORD
				;
				;IN:  DS:DI -> Dir_Info, ES:BX -> Extended_Info
				;     AX = offset of the Name_Record entry in Name_Cache_Seg.
				;
				;OUT: Name_Record in Name_Cache_Seg filled.
				;     nLRU_ptr, nChild_ptr, nSibling_ptr and nMRU_ptr are set to -1 for now.
				;     ES, SI, DI destroyed.  ES will be Name_Cache_Seg.
				;----------------------------------------------------------------------
				
 049D				MAKE_NAME_RECORD      PROC     NEAR
				
 049D  1E				push	ds			;save DS
 049E  50				push	ax
				
 049F  06				push	es			;save Extended_Info seg in DOS
 04A0  57				push	di
 04A1  5E				pop	si			;DS:SI -> Dir_Info
 04A2  2E: 8B 3E 002D R			mov	di, cs:Open_Name_Cache_Seg							   ;
				AN000;
 04A7  8E C7				mov	es, di										   ;
				AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-29
Directory entry                                             

					ASSUME	es:Cseg_Init									   ;
				AN000;
 04A9  8B F8				mov	di, ax			;ES:DI -> Name_Record
 04AB  B8 FFFF				mov	ax, -1
 04AE  26: 89 05			mov	es:[di.nLRU_ptr],ax	;initialize pointers
 04B1  26: 89 45 04			mov	es:[di.nChild_ptr],ax
 04B5  26: 89 45 06			mov	es:[di.nSibling_ptr],ax
 04B9  26: 89 45 02			mov	es:[di.nMRU_ptr],ax
 04BD  83 C7 0A				add	di, nCmpct_Dir_Info	;ES:DI -> Name_Record.nCmpct_Dir_Info
 04C0  B9 0011				mov	cx, ODI_head_leng	;currently 10.
 04C3  F3/ A4				rep	movsb			;Move header part
 04C5  83 C6 05				add	si, ODI_skip_leng	;DS:SI -> tail part of Dir_Info
 04C8  B9 000A				mov	cx, ODI_tail_leng
 04CB  F3/ A4				REP	MOVSB			;move tail part.
				
 04CD  1F				pop	ds			;restore Extended_Info seg in DS!!!
 04CE  8B F3				mov	si, bx			;DS:SI -> Extended_Info
 04D0  B9 000B				mov	cx, size Fastopen_Extended_Info
 04D3  F3/ A4				rep	movsb			;Move Extended_Info
 04D5  58				pop	ax
 04D6  1F				pop	ds			;Restore DS
				
 04D7  C3				ret				;return
				
 04D8				MAKE_NAME_RECORD	ENDP
				;
				
				
				
				
				;----------------------------------------------------------------------
				; Procedure Unfold_Name_Record
				;
				;IN:  Matching_Node, ES:DI -> Dir_Info buffer, ES:CX -> Extended_Info buffer
				;
				;OUT: if no matching node is found, then just return
				;     else Dir_Info, Extended_Info buffer are filled.
				;----------------------------------------------------------------------
				
 04D8				Unfold_Name_Record     PROC	near
				
 04D8  2E: 83 3E 0006 R FF		cmp	cs:Matching_Node, -1
 04DE  74 2B				je	UNR_Exit		;just exit
 04E0  1E				push	ds
 04E1  56				push	si
 04E2  57				push	di
 04E3  51				push	cx			;save extended_info addr
				
 04E4  2E: 8B 36 002D R			mov	si, cs:Open_Name_Cache_Seg							   ;
				AN000;
 04E9  8E DE				mov	ds, si										   ;
				AN000;
					ASSUME	ds:Cseg_Init									   ;
				AN000;
 04EB  2E: 8B 36 0006 R			mov	si, cs:Matching_Node
 04F0  83 C6 0A				add	si, nCmpct_Dir_Info	;DS:SI -> Cmpct_Dir_Info
				
 04F3  B9 0011				mov	cx, ODI_head_leng	;Dir_Info header length
 04F6  F3/ A4				REP	MOVSB			;Cmpct_Dir_Info.CDI_file_name -> ODI_head
				
 04F8  83 C7 05				add	di, ODI_skip_leng	;length of Skiped part of Dir_Info
 04FB  B9 000A				mov	cx, ODI_tail_leng	;Dir_Info tail length
 04FE  F3/ A4				REP	movsb			;Cmpct_Dir_Info.CDI_Time -> ODI_tail
									;At this moment, SI -> nExtended_Info
				
 0500  5F				pop	di			;ES:DI -> Extended_info
 0501  57				push	di			;save di again for cx.
 0502  B9 000B				mov	cx, size Fastopen_Extended_Info
 0505  F3/ A4				REP	movsb
				
 0507  59				pop	cx			;restore extended_info addr
 0508  5F				pop	di
 0509  5E				pop	si
 050A  1F				pop	ds
					ASSUME	ds:nothing
 050B				UNR_Exit:
 050B  C3				ret				;return
				
 050C				Unfold_Name_Record	endp
				;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-30
Directory entry                                             

				
				
				
				
				;----------------------------------------------------------------------
				; PROCEDURE:  PACK DIR_NAME
				;
				; Parse the name off of DS:SI into Packed_Name.  If called first time and
				; DS:[SI+1] = ':' then it is ASSUMEd to be a drive letter and it will be
				; returned in DL and SI will points to '\' after ':'.  If it was a directory
				; name then Packed_Name will be set and SI points to '\' or 0 after the
				; parsed directory name or filename.  This routine will check DS:[SI] when
				; called to see if it points to '\' or 0.  If it points to '\' then
				; it is ASSUMEd that the user want to skip the delimiter.  If it was 0,
				; then this routine will set carry.  So, with a given drive,path string,
				; the user is going to keep calling this routine until it returns
				; with carry set that tells the end.
				;----------------------------------------------------------------------
				
 050C				PACK_DIR_NAME	PROC	NEAR
				
 050C  80 3C 00				cmp	byte ptr ds:[si], 0	;end of path ??
 050F  75 03				jne	PDN_Drive		;no-check for drive letter
 0511  F9				stc
 0512  EB 54				jmp	short PDN_Exit		;yes-exit
				
 0514				PDN_Drive:
 0514  80 7C 01 3A			cmp	byte ptr ds:[si+1], ':' ;drive letter terminater?
 0518  75 06				jnz	PDN_chk_skip		;no -
 051A  8A 14				mov	dl, byte ptr ds:[si]	;yes-set DL to the drive letter
 051C  46				inc	si
 051D  46				inc	si			;set SI -> '\' after ':'
 051E  EB 48				jmp	short PDN_Exit		;then exit
				
 0520				PDN_chk_skip:
 0520  80 3C 5C				cmp	byte ptr ds:[si], '\'   ;delimeter?
 0523  75 0C				jne	PDN_Path		;no-
 0525  46				inc	si			;yes-skip delimiter
 0526  80 3C 00				cmp	byte ptr ds:[si], 0	;end of path ??
 0529  75 06				jne	PDN_Path		;no-pack path name
 052B  F9				stc				;yes-In fact, the input from DOS was
 052C  B8 FFFF				mov	ax, -1			;D:\,0.  FASTOPEN will treate
 052F  EB 37				jmp	short PDN_Exit		;this as an error.
				
 0531				PDN_Path:				;pack path name
 0531  06				push	es
 0532  57				push	di
 0533  50				push	ax
				
 0534  0E				push	cs
 0535  07				pop	es
 0536  BF 0018 R			mov	di, offset cs:Packed_Name   ;ES:DI-->pack buffer
				
 0539  B8 2020				mov	ax,'  '
 053C  AA				STOSB				;blank out the Packed_Name
 053D  AB				STOSW
 053E  AB				STOSW
 053F  AB				STOSW
 0540  AB				STOSW
 0541  AB				STOSW
 0542  BF 0018 R			mov	di, offset cs:Packed_Name
				
 0545				PDN_GetName:
 0545  AC				LODSB				;DS:SI => AL, SI++
 0546  3C 2E				cmp	al,'.'
 0548  74 0B				jz	PDN_SetExt
 054A  0A C0				or	al,al
 054C  74 16				jz	PDN_GetDone
 054E  3C 5C				cmp	al,'\'
 0550  74 12				jz	PDN_GetDone
 0552  AA				STOSB
 0553  EB F0				jmp	short PDN_GetName
				
 0555				PDN_SetExt:
 0555  BF 0020 R			mov	di, offset cs:Packed_Name+8
				
 0558				PDN_GetExt:
 0558  AC				LODSB
 0559  0A C0				or	al,al
 055B  74 07				jz	PDN_GetDone
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-31
Directory entry                                             

 055D  3C 5C				cmp	al,'\'
 055F  74 03				jz	PDN_GetDone
				
 0561				PDN_StoExt:
 0561  AA				STOSB
 0562  EB F4				jmp	PDN_GetExt
				
 0564				PDN_GetDone:
 0564  4E				dec	si			;set SI back to the delimeter or 0.
 0565  58				pop	ax
 0566  5F				pop	di
 0567  07				pop	es
				
 0568				PDN_Exit:
 0568  C3				ret
				
 0569				PACK_DIR_NAME	endp
				
				
				
				
				
				;----------------------------------------------------------------------
				; PROCEDURE:  FIND_CLUSTER_NUMBER
				;
				;IN:  DL = driver # (0 = A, 1 = B,...)
				;     CX = The value of Dir_First in Name_Record to search.
				;     Search Name_Record entries to find the matching starting cluster number.
				;     The search uses MRU chain for efficiency.
				;
				;OUT: ES = Name_Cache_Seg
				;     BP = Name_Record
				;     if not found, carry bit.
				;     ES, BP register changed.
				;----------------------------------------------------------------------
				
 0569				FIND_CLUSTER_NUMBER    PROC    NEAR
				
 0569  50				push	ax
 056A  51				push	cx
 056B  52				push	dx
 056C  80 C2 41				add	dl, 'A'                 ;convert to a drive letter
				
 056F  E8 02D7 R			CALL	FIND_DRIVE_CACHE_HEADER ;ES:BP -> driver header if found
 0572  72 38				jc	FCN_exit		;exit if not found
				
 0574  8B D1				mov	dx, cx			;save the key in DX					   ;
				AN000;
 0576  2E: A1 002D R			mov	ax, cs:Open_Name_Cache_Seg							   ;
				AN000;
 057A  8E C0				mov	es, ax										   ;
				AN000;
					ASSUME	es:Cseg_Init
				
 057C  E8 03A4 R			CALL	SET_LRU 		;clean up the LRU stack
				
 057F  2E: 89 2E 0004 R			mov	cs:Current_Drive,bp   ;set Current_Drive (You should not set
									;Current_Drive before SET_LRU at any time!!!
 0584  1E				push	ds
 0585  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init
 058A  3E: 8B 4E 09			mov	cx, ds:[bp.DCH_Num_Entries]	;Max number to try
 058E  3E: 8B 6E 02			mov	bp, ds:[bp.DCH_MRU_ROOT]	;get the start of MRU chaing
 0592  1F				pop	ds
					ASSUME	ds:nothing
				
 0593				FCN_while:
 0593  26: 80 7E 0A 20			cmp	es:[bp.nCmpct_Dir_Info], ' ' ;Is it a free node ?
 0598  74 11				je	FCN_not_found		;then no reason to continue search.
				
 059A  26: 3B 56 1F			cmp	dx, es:[bp.nCmpct_Dir_Info.CDI_cluster] ;matching starting cluster # ?
 059E  74 0C				je	FCN_exit		;found it!!!
				
 05A0  26: 8B 6E 02			mov	bp, es:[bp.nMRU_ptr]	;next MRU entry address
 05A4  83 FD FF				cmp	bp, -1			;It was the end of MRU chain?
 05A7  74 02				je	FCN_not_found		;not found. End of search
 05A9  E2 E8				LOOP	FCN_while		;else compare cluster and contine...
				
 05AB				FCN_Not_found:
 05AB  F9				stc
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-32
Directory entry                                             

				
 05AC				FCN_exit:
 05AC  5A				pop	dx
 05AD  59				pop	cx
 05AE  58				pop	ax
 05AF  C3				ret
				
 05B0				FIND_CLUSTER_NUMBER	ENDP
				
				
				
				
				;----------------------------------------------------------------------
				; PROCEDURE:  FIND_DIR_SECTOR	 (PTR 3718  3/10/88)
				;
				;     Search Name_Record using directory sector and directory position
				;     for the name entry.
				;
				;IN:  DL = driver # (0 = A, 1 = B,...)
				;     DI = Dirctory sector Low	value
				;     CX = Dirctory sector high value
				;     DH = Dirctory position
				;
				;OUT: ES = Name_Cache_Seg
				;     BP = Name_Record
				;     if not found, carry bit.
				;     ES, BP register changed.
				;----------------------------------------------------------------------
				
 05B0				FIND_DIR_SECTOR   PROC	  NEAR
				
 05B0  50				push	ax
 05B1  51				push	cx
 05B2  52				push	dx
 05B3  80 C2 41				add	dl, 'A'                  ;convert to a drive letter
				
 05B6  E8 02D7 R			CALL	FIND_DRIVE_CACHE_HEADER  ;ES:BP -> driver header if found
 05B9  72 44				jc	FDIR_exit		 ; error if not found
				
 05BB  2E: A1 002D R			mov	ax, cs:Open_Name_Cache_Seg							   ;
				AN000;
 05BF  8E C0				mov	es, ax										   ;
				AN000;
					ASSUME	es:Cseg_Init
				
 05C1  E8 03A4 R			CALL	SET_LRU 		;clean up the LRU stack
				
 05C4  8B C1				mov	ax,cx			; save directory sector high value
 05C6  2E: 89 2E 0004 R			mov	cs:Current_Drive,bp	;set Current_Drive (You should not set
									;Current_Drive before SET_LRU at any time!!!
 05CB  1E				push	ds
 05CC  2E: 8E 1E 002D R			mov	ds,cs:Open_Name_Cache_Seg
					ASSUME	ds:Cseg_Init
 05D1  3E: 8B 4E 09			mov	cx, ds:[bp.DCH_Num_Entries]	;Max number to try
 05D5  3E: 8B 6E 02			mov	bp, ds:[bp.DCH_MRU_ROOT]	;get the start of MRU chaing
 05D9  1F				pop	ds
					ASSUME	ds:nothing
				
 05DA				FDIR_while:
 05DA  26: 80 7E 0A 20			cmp	es:[bp.nCmpct_Dir_Info], ' ' ;Is it a free node ?
 05DF  74 1D				je	FDIR_NOT_FOUND		;then no reason to continue search.
				
 05E1  26: 3B 7E 26			cmp	di, word ptr es:[bp.nExtended_Info.FEI_dirsec] ;matching directory sector hi?
 05E5  75 0C				jne	FDIR_Next		;check next entry
				
 05E7  26: 3B 46 28			cmp	ax, word ptr es:[bp.nExtended_Info.FEI_dirsec+2] ;matching directory sector low ?
 05EB  75 06				jne	FDIR_Next		;check next entry
				
 05ED  26: 3A 76 25			cmp	dh, es:[bp.nExtended_Info.FEI_dirpos] ;matching directory postion ?
 05F1  74 0C				je	FDIR_Exit		;check next entry
				
 05F3				FDIR_Next:
 05F3  26: 8B 6E 02			mov	bp, es:[bp.nMRU_ptr]	;next MRU entry address
 05F7  83 FD FF				cmp	bp, -1			;It was the end of MRU chain?
 05FA  74 02				je	FDIR_not_found		;not found. End of search
 05FC  E2 DC				loop	FDIR_while		;else compare cluster and contine...
				
 05FE				FDIR_Not_found: 			; no found
 05FE  F9				stc
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Page     1-33
Directory entry                                             

 05FF				FDIR_exit:
 05FF  5A				pop	dx
 0600  59				pop	cx
 0601  58				pop	ax
 0602  C3				ret
				
 0603				FIND_DIR_SECTOR     ENDP
				
				
				
				
				
				;--------------------------------------------------------------------------
				; Procedure: CHECK_IT	   Call Fastopen  Tree Analyser to check the
				;			   consistency of the Directory/File Tree strucutre.
				;--------------------------------------------------------------------------
 0603				CHECK_IT   PROC    NEAR
				
 0603  9C			       pushf				      ; save all registers
 0604  50			       push   ax
 0605  53			       push   bx
 0606  51			       push   cx
 0607  52			       push   dx
 0608  56			       push   si
 0609  57			       push   di
 060A  1E			       push   ds
 060B  06			       push   es
 060C  2E: 83 3E 002A R 00	       cmp    cs:Chk_flag,0		      ;Fastopen analyser enabled ??
 0612  74 18			       je     Check_Exit		      ;no - exit
				
 0614  2E: A1 002D R		       mov    ax,cs:Open_Name_Cache_Seg       ;yes-set multiplex function call
 0618  8E C0			       mov    es,ax
 061A  B4 91			       mov    ah,091h			      ;load Multiplex ID
 061C  32 C0			       xor    al,al
 061E  33 C9			       xor    cx,cx
 0620  2E: 8A 0E 002C R		       mov    cl,cs:func_cod		      ;CL=Fastopen Function code
 0625  2E: 8B 3E 0004 R		       mov    di,cs:Current_Drive	      ;ES:DI-->current drive header
 062A  CD 2F			       INT    2FH			      ;call the analyser
				
 062C				Check_Exit:
 062C  07			       pop    es			      ;restore all registers
 062D  1F			       pop    ds
 062E  5F			       pop    di
 062F  5E			       pop    si
 0630  5A			       pop    dx
 0631  59			       pop    cx
 0632  5B			       pop    bx
 0633  58			       pop    ax
 0634  9D			       popf				      ;return
 0635  C3			       ret
				
 0636				CHECK_IT    ENDP
				
				
				
				
				
				; Calculate the size of the CSEG_OPEN Module in bytes
					IF  ($-Cseg_Open) MOD 16								   ;
				AN000;
 0640					   ORG ($-Cseg_Open)+16-(($-Cseg_Open) MOD 16)						   ;
				AN000;
					ENDIF											   ;
				AN000;
				
 0640				END_OPEN   label   word
				
				
				
				
 0640				CSEG_OPEN    ends
				     end

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-1


Macros:

		N a m e			Lines

ARGVAR . . . . . . . . . . . . .  	  23
ASMVAR . . . . . . . . . . . . .  	   3
ASMVARS  . . . . . . . . . . . .  	   3
ASSERT . . . . . . . . . . . . .  	   0
CALLINSTALL  . . . . . . . . . .  	  12
DOSASSUME  . . . . . . . . . . .  	   3
ENTER  . . . . . . . . . . . . .  	   3
ENTERCRIT  . . . . . . . . . . .  	   1
ERRNZ  . . . . . . . . . . . . .  	   4
FMT  . . . . . . . . . . . . . .  	   0
LEAVE  . . . . . . . . . . . . .  	   2
LEAVECRIT  . . . . . . . . . . .  	   1
LOCALVAR . . . . . . . . . . . .  	  23

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

CMPCT_DIR_INFO . . . . . . . . .  	001B	0009
  CDI_FILE_NAME  . . . . . . . .  	0000
  CDI_FILE_ATTR  . . . . . . . .  	000B
  CDI_CODEPAGE . . . . . . . . .  	000C
  CDI_EXTCLUSTER . . . . . . . .  	000E
  CDI_ATTR2  . . . . . . . . . .  	0010
  CDI_TIME . . . . . . . . . . .  	0011
  CDI_DATE . . . . . . . . . . .  	0013
  CDI_CLUSTER  . . . . . . . . .  	0015
  CDI_FILESIZE . . . . . . . . .  	0017
DIR_ENTRY  . . . . . . . . . . .  	0020	000B
  DIR_NAME . . . . . . . . . . .  	0000
  DIR_ATTR . . . . . . . . . . .  	000B
  DIR_CODEPG . . . . . . . . . .  	000C
  DIR_EXTCLUSTER . . . . . . . .  	000E
  DIR_ATTR2  . . . . . . . . . .  	0010
  DIR_PAD  . . . . . . . . . . .  	0011
  DIR_TIME . . . . . . . . . . .  	0016
  DIR_DATE . . . . . . . . . . .  	0018
  DIR_FIRST  . . . . . . . . . .  	001A
  DIR_SIZE_L . . . . . . . . . .  	001C
  DIR_SIZE_H . . . . . . . . . .  	001E
DRIVE_CACHE_HEADER . . . . . . .  	000D	0007
  DCH_LRU_ROOT . . . . . . . . .  	0000
  DCH_MRU_ROOT . . . . . . . . .  	0002
  DCH_CHILD_PTR  . . . . . . . .  	0004
  DCH_SIBLING_PTR  . . . . . . .  	0006
  DCH_DRIVE_LETTER . . . . . . .  	0008
  DCH_NUM_ENTRIES  . . . . . . .  	0009
  DCH_NAME_BUFF  . . . . . . . .  	000B
DRIVE_HEADER . . . . . . . . . .  	0010	0008
  DRIVE_NUMBER . . . . . . . . .  	0000
  EXTENT_COUNT . . . . . . . . .  	0002
  MRU_HDR_PTR  . . . . . . . . .  	0004
  FREE_PTR . . . . . . . . . . .  	0006
  CLOSE_PTR  . . . . . . . . . .  	0008
  BUFF_SIZE  . . . . . . . . . .  	000A
  FREE_SIZE  . . . . . . . . . .  	000C
  NEXT_DRV_HDR_PTR . . . . . . .  	000E
EXTENT_HEADER  . . . . . . . . .  	0010	0008
  EH_LOGIC_CLUS_NUM  . . . . . .  	0000
  EH_PHYS_CLUS_NUM . . . . . . .  	0002
  EH_COUNT . . . . . . . . . . .  	0004
  EH_NEXT_EXTN_PTR . . . . . . .  	0006
  EH_PREV_EXTN_PTR . . . . . . .  	0008
  EH_NEXT_LRU_PTR  . . . . . . .  	000A
  EH_PREV_LRU_PTR  . . . . . . .  	000C
FASTOPEN_ENTRY . . . . . . . . .  	0006	0002
  FASTOPEN_ENTRY_SIZE  . . . . .  	0000
  FASTOPEN_NAME_CACHING  . . . .  	0002
FASTOPEN_EXTENDED_INFO . . . . .  	000B	0005
  FEI_DIRPOS . . . . . . . . . .  	0000
  FEI_DIRSEC . . . . . . . . . .  	0001
  FEI_CLUSNUM  . . . . . . . . .  	0005
  FEI_LASTENT  . . . . . . . . .  	0007
  FEI_DIRSTART . . . . . . . . .  	0009
FILE_HEADER  . . . . . . . . . .  	0010	0008
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-2


  FH_PHYS_CLUS_NUM . . . . . . .  	0000
  FH_REFER_COUNT . . . . . . . .  	0002
  FH_NEXT_EXTN_PTR . . . . . . .  	0004
  FH_NEXT_HDR_PTR  . . . . . . .  	0006
  FH_MRU_EXTN_PTR  . . . . . . .  	0008
NAME_RECORD  . . . . . . . . . .  	0030	0007
  NLRU_PTR . . . . . . . . . . .  	0000
  NMRU_PTR . . . . . . . . . . .  	0002
  NCHILD_PTR . . . . . . . . . .  	0004
  NSIBLING_PTR . . . . . . . . .  	0006
  NBACKWARD_PTR  . . . . . . . .  	0008
  NCMPCT_DIR_INFO  . . . . . . .  	000A
  NEXTENDED_INFO . . . . . . . .  	0025
ORIG_DIR_INFO  . . . . . . . . .  	0020	0003
  ODI_HEAD . . . . . . . . . . .  	0000
  ODI_SKIP . . . . . . . . . . .  	0011
  ODI_TAIL . . . . . . . . . . .  	0016

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

CSEG_INIT  . . . . . . . . . . .  	0000	PARA	PUBLIC	'CODE'
CSEG_MAIN  . . . . . . . . . . .  	02DB	PARA	PUBLIC	'CODE'
CSEG_OPEN  . . . . . . . . . . .  	0640	PARA	PUBLIC	'CODE'
CSEG_SEEK  . . . . . . . . . . .  	0000	PARA	PUBLIC	'CODE'
STACK  . . . . . . . . . . . . .  	0000	PARA	STACK	'STACK'

Symbols:            

                N a m e         	Type	 Value	 Attr

ALTVECT  . . . . . . . . . . . .  	ALIAS	 FALSE		
ATTR_ALL . . . . . . . . . . . .  	NUMBER	0016	
ATTR_ARCHIVE . . . . . . . . . .  	NUMBER	0020	
ATTR_CHANGEABLE  . . . . . . . .  	NUMBER	0027	
ATTR_DEVICE  . . . . . . . . . .  	NUMBER	0040	
ATTR_DIRECTORY . . . . . . . . .  	NUMBER	0010	
ATTR_HIDDEN  . . . . . . . . . .  	NUMBER	0002	
ATTR_IGNORE  . . . . . . . . . .  	NUMBER	0061	
ATTR_READ_ONLY . . . . . . . . .  	NUMBER	0001	
ATTR_SYSTEM  . . . . . . . . . .  	NUMBER	0004	
ATTR_VOLUME_ID . . . . . . . . .  	NUMBER	0008	

BOTTOM . . . . . . . . . . . . .  	L WORD	0027	CSEG_OPEN
BUFFERFLAG . . . . . . . . . . .  	NUMBER	FFFF	

CALL_CNT . . . . . . . . . . . .  	L WORD	0000	CSEG_MAIN
CARGS  . . . . . . . . . . . . .  	NUMBER	0000	
CHECK_DRIVE_ID . . . . . . . . .  	L NEAR	014E	CSEG_MAIN
CHECK_EXIT . . . . . . . . . . .  	L NEAR	062C	CSEG_OPEN
CHECK_IT . . . . . . . . . . . .  	N PROC	0603	CSEG_OPEN	Length = 0033
CHK_01 . . . . . . . . . . . . .  	L NEAR	0222	CSEG_MAIN
CHK_02 . . . . . . . . . . . . .  	L NEAR	0217	CSEG_MAIN
CHK_03 . . . . . . . . . . . . .  	L NEAR	022D	CSEG_MAIN
CHK_05 . . . . . . . . . . . . .  	L NEAR	01D6	CSEG_MAIN
CHK_12 . . . . . . . . . . . . .  	L NEAR	019C	CSEG_MAIN
CHK_13 . . . . . . . . . . . . .  	L NEAR	01C2	CSEG_MAIN
CHK_14 . . . . . . . . . . . . .  	L NEAR	01A7	CSEG_MAIN
CHK_15 . . . . . . . . . . . . .  	L NEAR	01B7	CSEG_MAIN
CHK_16 . . . . . . . . . . . . .  	L NEAR	01CC	CSEG_MAIN
Chk_Flag . . . . . . . . . . . .  	L WORD	002A	CSEG_OPEN	Global
CMPARE . . . . . . . . . . . . .  	N PROC	0489	CSEG_OPEN	Length = 0014
CURRENT_DRIVE  . . . . . . . . .  	L WORD	0004	CSEG_OPEN
CURRENT_NODE . . . . . . . . . .  	L WORD	0000	CSEG_OPEN
CURRENT_SIBLING  . . . . . . . .  	L WORD	0002	CSEG_OPEN

DEBUG  . . . . . . . . . . . . .  	NUMBER	0000	
DELETE . . . . . . . . . . . . .  	F PROC	018B	CSEG_OPEN	Length = 007B
DELETE_NODE  . . . . . . . . . .  	L NEAR	01C6	CSEG_OPEN
DEPTH  . . . . . . . . . . . . .  	L BYTE	0029	CSEG_OPEN
DIR_INFO_BUFFER  . . . . . . . .  	L DWORD	000E	CSEG_OPEN
DISPATCH_FOPEN . . . . . . . . .  	L NEAR	0204	CSEG_MAIN
DISPATCH_FSEEK . . . . . . . . .  	L NEAR	017B	CSEG_MAIN
DISPATCH_FUNCS . . . . . . . . .  	L NEAR	0143	CSEG_MAIN
DONE . . . . . . . . . . . . . .  	L NEAR	0287	CSEG_MAIN
DOS_PAGE1  . . . . . . . . . . .  	NUMBER	00FE	
DRIVE_FOUND  . . . . . . . . . .  	L NEAR	0173	CSEG_MAIN
DRIVE_NOT_FOUND  . . . . . . . .  	L NEAR	016D	CSEG_MAIN
D_ERR_EXIT . . . . . . . . . . .  	L NEAR	01F8	CSEG_OPEN
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-3


D_EXIT . . . . . . . . . . . . .  	L NEAR	01FC	CSEG_OPEN
D_LRU_MRU  . . . . . . . . . . .  	L NEAR	01D5	CSEG_OPEN

EMS_FAILED . . . . . . . . . . .  	L NEAR	012F	CSEG_MAIN
EMS_INT  . . . . . . . . . . . .  	NUMBER	0067	
EMS_PAGE_ARRAY . . . . . . . . .  	L WORD	0085	CSEG_MAIN	Length = 001E
EMS_PAGE_MAP . . . . . . . . . .  	L WORD	007F	CSEG_MAIN
EMS_PAGE_NUMBER  . . . . . . . .  	L WORD	00C5	CSEG_MAIN	Global
EMS_RESTORE_STATE  . . . . . . .  	NUMBER	004F	
EMS_SAVE_HANDLE1 . . . . . . . .  	L WORD	00C3	CSEG_MAIN	Global
EMS_SAVE_LOG_PAGE1 . . . . . . .  	L WORD	00C1	CSEG_MAIN
EMS_SAVE_STATE . . . . . . . . .  	NUMBER	004F	
End_Open . . . . . . . . . . . .  	L WORD	0640	CSEG_OPEN	Global
ERROR_EXIT . . . . . . . . . . .  	L NEAR	0238	CSEG_MAIN
ERROR_RET  . . . . . . . . . . .  	L NEAR	0254	CSEG_MAIN
ERR_MAP_PAGE . . . . . . . . . .  	L NEAR	02D6	CSEG_MAIN
EXIT . . . . . . . . . . . . . .  	L NEAR	024A	CSEG_MAIN
EXIT_1 . . . . . . . . . . . . .  	L NEAR	024F	CSEG_MAIN
EXIT_2 . . . . . . . . . . . . .  	L NEAR	0247	CSEG_MAIN
EXTENDED_INFO_BUFFER . . . . . .  	L DWORD	0012	CSEG_OPEN
EXTENDSIZE . . . . . . . . . . .  	NUMBER	0008	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FASTOPEN_RESET . . . . . . . . .  	NUMBER	00FE	
FASTOPEN_SET . . . . . . . . . .  	NUMBER	0001	
FCN_EXIT . . . . . . . . . . . .  	L NEAR	05AC	CSEG_OPEN
FCN_NOT_FOUND  . . . . . . . . .  	L NEAR	05AB	CSEG_OPEN
FCN_WHILE  . . . . . . . . . . .  	L NEAR	0593	CSEG_OPEN
FDCH_CHK_END . . . . . . . . . .  	L NEAR	02EB	CSEG_OPEN
FDCH_EXIT  . . . . . . . . . . .  	L NEAR	02F8	CSEG_OPEN
FDCH_NOT_FOUND . . . . . . . . .  	L NEAR	02F7	CSEG_OPEN
FDCH_WHILE . . . . . . . . . . .  	L NEAR	02E2	CSEG_OPEN
FDIR_EXIT  . . . . . . . . . . .  	L NEAR	05FF	CSEG_OPEN
FDIR_NEXT  . . . . . . . . . . .  	L NEAR	05F3	CSEG_OPEN
FDIR_NOT_FOUND . . . . . . . . .  	L NEAR	05FE	CSEG_OPEN
FDIR_WHILE . . . . . . . . . . .  	L NEAR	05DA	CSEG_OPEN
FIND_CLUSTER_NUMBER  . . . . . .  	N PROC	0569	CSEG_OPEN	Length = 0047
FIND_DIR_SECTOR  . . . . . . . .  	N PROC	05B0	CSEG_OPEN	Length = 0053
FIND_DRIVE_CACHE_HEADER  . . . .  	N PROC	02D7	CSEG_OPEN	Length = 0023
FK_CLOSE . . . . . . . . . . . .  	L FAR 	0000		External
FK_DELETE  . . . . . . . . . . .  	L FAR 	0000		External
FK_INSERT  . . . . . . . . . . .  	L FAR 	0000		External
FK_LOOKUP  . . . . . . . . . . .  	L FAR 	0000		External
FK_OPEN  . . . . . . . . . . . .  	L FAR 	0000		External
FK_PURGE . . . . . . . . . . . .  	L FAR 	0000		External
FK_TRUNCATE  . . . . . . . . . .  	L FAR 	0000		External
FLAG . . . . . . . . . . . . . .  	L BYTE	000C	CSEG_OPEN
FONC_DELETE  . . . . . . . . . .  	NUMBER	0003	
FONC_INSERT  . . . . . . . . . .  	NUMBER	0002	
FONC_LOOK_UP . . . . . . . . . .  	NUMBER	0001	
FONC_PURGE . . . . . . . . . . .  	NUMBER	0005	
FONC_UPDATE  . . . . . . . . . .  	NUMBER	0004	
FOPEN_Delete . . . . . . . . . .  	L DWORD	00CF	CSEG_MAIN	Global
FOPEN_Insert . . . . . . . . . .  	L DWORD	00C7	CSEG_MAIN	Global
FOPEN_Lookup . . . . . . . . . .  	L DWORD	00D3	CSEG_MAIN	Global
FOPEN_PURGE  . . . . . . . . . .  	L DWORD	00D7	CSEG_MAIN	Global
FOPEN_Update . . . . . . . . . .  	L DWORD	00CB	CSEG_MAIN	Global
FP_PURGE . . . . . . . . . . . .  	F PROC	026A	CSEG_OPEN	Length = 006D
FROM_DELETE  . . . . . . . . . .  	L WORD	0008	CSEG_OPEN
FSEEK_Close  . . . . . . . . . .  	L DWORD	00DF	CSEG_MAIN	Global
FSEEK_Delete . . . . . . . . . .  	L DWORD	00E7	CSEG_MAIN	Global
FSEEK_Insert . . . . . . . . . .  	L DWORD	00E3	CSEG_MAIN	Global
FSEEK_Lookup . . . . . . . . . .  	L DWORD	00EB	CSEG_MAIN	Global
FSEEK_Open . . . . . . . . . . .  	L DWORD	00DB	CSEG_MAIN	Global
FSEEK_Purge  . . . . . . . . . .  	L DWORD	00F3	CSEG_MAIN	Global
FSEEK_Truncate . . . . . . . . .  	L DWORD	00EF	CSEG_MAIN	Global
FSK_CLOSE  . . . . . . . . . . .  	NUMBER	000C	
FSK_CONT . . . . . . . . . . . .  	L NEAR	0184	CSEG_MAIN
FSK_DELETE . . . . . . . . . . .  	NUMBER	000D	
FSK_INSERT . . . . . . . . . . .  	NUMBER	000F	
FSK_LOOKUP . . . . . . . . . . .  	NUMBER	000E	
FSK_OPEN . . . . . . . . . . . .  	NUMBER	000B	
FSK_TRUNC  . . . . . . . . . . .  	NUMBER	0010	
FUNC_COD . . . . . . . . . . . .  	L BYTE	002C	CSEG_OPEN

GET_DRIVE_ID . . . . . . . . . .  	L NEAR	0161	CSEG_MAIN
GET_FREE_NODE  . . . . . . . . .  	N PROC	02FA	CSEG_OPEN	Length = 0047
GFN_OK . . . . . . . . . . . . .  	L NEAR	0338	CSEG_OPEN
GFN_RET  . . . . . . . . . . . .  	L NEAR	033C	CSEG_OPEN
GFN_SKIP . . . . . . . . . . . .  	L NEAR	033B	CSEG_OPEN
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-4



HEADERSIZE . . . . . . . . . . .  	NUMBER	0008	

IBM  . . . . . . . . . . . . . .  	ALIAS	 IBMVER		
IBMCOPYRIGHT . . . . . . . . . .  	ALIAS	 FALSE		
IBMJAPAN . . . . . . . . . . . .  	ALIAS	 FALSE		
IBMJAPVER  . . . . . . . . . . .  	ALIAS	 FALSE		
IBMVER . . . . . . . . . . . . .  	ALIAS	 TRUE		
INSERT . . . . . . . . . . . . .  	F PROC	0100	CSEG_OPEN	Length = 008B
INSERT_IT  . . . . . . . . . . .  	L NEAR	0125	CSEG_OPEN
INSERT_RETURN  . . . . . . . . .  	L NEAR	0187	CSEG_OPEN
INSTALLEDDATA  . . . . . . . . .  	NUMBER	0000	
INTERNAT . . . . . . . . . . . .  	ALIAS	 FALSE		
IS_DELETE  . . . . . . . . . . .  	NUMBER	0002	
IS_DRIVE_HEAD  . . . . . . . . .  	NUMBER	0001	
IS_INSERT  . . . . . . . . . . .  	NUMBER	0004	
I_CHILD  . . . . . . . . . . . .  	L NEAR	0148	CSEG_OPEN
I_CHILD_FIRST  . . . . . . . . .  	L NEAR	0156	CSEG_OPEN
I_DONE . . . . . . . . . . . . .  	L NEAR	016C	CSEG_OPEN
I_EXIT . . . . . . . . . . . . .  	L NEAR	0181	CSEG_OPEN

JAPAN  . . . . . . . . . . . . .  	ALIAS	 FALSE		

KANJI  . . . . . . . . . . . . .  	ALIAS	 FALSE		
KOREA  . . . . . . . . . . . . .  	ALIAS	 FALSE		

LEVEL  . . . . . . . . . . . . .  	L BYTE	000D	CSEG_OPEN
LOOKUP . . . . . . . . . . . . .  	F PROC	0031	CSEG_OPEN	Length = 00CF
LOOKUP_DONE  . . . . . . . . . .  	L NEAR	00D8	CSEG_OPEN
LOOKUP_DONE1 . . . . . . . . . .  	L NEAR	00E9	CSEG_OPEN
LOOKUP_ERR . . . . . . . . . . .  	L NEAR	00E8	CSEG_OPEN
LOOKUP_ERROR . . . . . . . . . .  	L NEAR	00F8	CSEG_OPEN
LOOKUP_EXIT  . . . . . . . . . .  	L NEAR	00F6	CSEG_OPEN
LOOKUP_FOUND . . . . . . . . . .  	L NEAR	00C9	CSEG_OPEN
LOOKUP_PATH  . . . . . . . . . .  	L NEAR	0070	CSEG_OPEN
LOOKUP_RESET . . . . . . . . . .  	NUMBER	00FD	
LOOKUP_RETURN  . . . . . . . . .  	L NEAR	00FC	CSEG_OPEN
LOOKUP_SUCCESS . . . . . . . . .  	NUMBER	0002	
LOOK_PACK_DIR  . . . . . . . . .  	L NEAR	0041	CSEG_OPEN
LOOK_SAVE_REGS . . . . . . . . .  	L NEAR	004C	CSEG_OPEN
LP_CMPARE  . . . . . . . . . . .  	L NEAR	00AF	CSEG_OPEN
LP_PATH1 . . . . . . . . . . . .  	L NEAR	009B	CSEG_OPEN
LP_PATH2 . . . . . . . . . . . .  	L NEAR	009F	CSEG_OPEN

MAIN . . . . . . . . . . . . . .  	F PROC	00FF	CSEG_MAIN	Global	Length = 0156
Main_EMS_FLAG  . . . . . . . . .  	L WORD	0011	CSEG_MAIN	Global
Main_EMS_PAGE_SEG  . . . . . . .  	L WORD	0081	CSEG_MAIN	Global
Main_EMS_PAGE_SIZE . . . . . . .  	L WORD	0083	CSEG_MAIN	Global
MAIN_EMS_SEG_COUNT . . . . . . .  	L WORD	007F	CSEG_MAIN
Main_extent_drive_Buff . . . . .  	L WORD	000B	CSEG_MAIN	Global
Main_ext_cache_size  . . . . . .  	L WORD	000F	CSEG_MAIN	Global
Main_Ext_Count . . . . . . . . .  	L WORD	0009	CSEG_MAIN	Global
Main_name_cache_Buff . . . . . .  	L WORD	000D	CSEG_MAIN	Global
Main_name_cache_seg  . . . . . .  	L WORD	0005	CSEG_MAIN	Global
Main_Name_Drive_Buff . . . . . .  	L WORD	0019	CSEG_MAIN	Global
Main_Num_Of_drives . . . . . . .  	L WORD	0007	CSEG_MAIN	Global
Main_ParamBuff . . . . . . . . .  	L WORD	001B	CSEG_MAIN	Global	Length = 0032
Main_Res_Segs  . . . . . . . . .  	L WORD	0013	CSEG_MAIN	Global
Main_Total_Ext_Count . . . . . .  	L WORD	0015	CSEG_MAIN	Global
Main_Total_Name_Count  . . . . .  	L WORD	0017	CSEG_MAIN	Global
MAKE_NAME_RECORD . . . . . . . .  	N PROC	049D	CSEG_OPEN	Length = 003B
MAP_PAGE . . . . . . . . . . . .  	N PROC	02BD	CSEG_MAIN	Length = 001E
MAP_PAGE_DONE  . . . . . . . . .  	L NEAR	02D7	CSEG_MAIN
MATCHING_NODE  . . . . . . . . .  	L WORD	0006	CSEG_OPEN
MEMS . . . . . . . . . . . . . .  	NUMBER	0001	
MSVER  . . . . . . . . . . . . .  	NUMBER	0000	

NEW_FEI_CLUSNUM  . . . . . . . .  	L WORD	0016	CSEG_OPEN
NOT_DELETE . . . . . . . . . . .  	NUMBER	00FD	
NOT_DRIVE_HEAD . . . . . . . . .  	NUMBER	00FE	
NOT_INSERT . . . . . . . . . . .  	NUMBER	00FB	
NO_LOOKUP  . . . . . . . . . . .  	NUMBER	0008	
NUM_OF_PAGES . . . . . . . . . .  	NUMBER	0001	
NUM_OF_SEGS  . . . . . . . . . .  	NUMBER	0002	

ODI_HEAD_LENG  . . . . . . . . .  	NUMBER	0011	
ODI_SKIP_LENG  . . . . . . . . .  	NUMBER	0005	
ODI_TAIL_LENG  . . . . . . . . .  	NUMBER	000A	
OLD_SI . . . . . . . . . . . . .  	L WORD	000A	CSEG_OPEN
Open_name_cache_seg  . . . . . .  	L WORD	002D	CSEG_OPEN	Global
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-5


Open_name_Drive_Buff . . . . . .  	L WORD	002F	CSEG_OPEN	Global

PACKED_NAME  . . . . . . . . . .  	L BYTE	0018	CSEG_OPEN	Length = 000B
PACK_DIR_NAME  . . . . . . . . .  	N PROC	050C	CSEG_OPEN	Length = 005D
PDN_CHK_SKIP . . . . . . . . . .  	L NEAR	0520	CSEG_OPEN
PDN_DRIVE  . . . . . . . . . . .  	L NEAR	0514	CSEG_OPEN
PDN_EXIT . . . . . . . . . . . .  	L NEAR	0568	CSEG_OPEN
PDN_GETDONE  . . . . . . . . . .  	L NEAR	0564	CSEG_OPEN
PDN_GETEXT . . . . . . . . . . .  	L NEAR	0558	CSEG_OPEN
PDN_GETNAME  . . . . . . . . . .  	L NEAR	0545	CSEG_OPEN
PDN_PATH . . . . . . . . . . . .  	L NEAR	0531	CSEG_OPEN
PDN_SETEXT . . . . . . . . . . .  	L NEAR	0555	CSEG_OPEN
PDN_STOEXT . . . . . . . . . . .  	L NEAR	0561	CSEG_OPEN
PLS_COM  . . . . . . . . . . . .  	L NEAR	0381	CSEG_OPEN
PLS_DONE . . . . . . . . . . . .  	L NEAR	039C	CSEG_OPEN
PLS_EXIT . . . . . . . . . . . .  	L NEAR	03A3	CSEG_OPEN
PLS_PUSH . . . . . . . . . . . .  	L NEAR	0354	CSEG_OPEN
PLS_TEMP . . . . . . . . . . . .  	L NEAR	038B	CSEG_OPEN
PLS_TOP  . . . . . . . . . . . .  	L NEAR	036F	CSEG_OPEN
PREV_DRV_ID  . . . . . . . . . .  	L BYTE	0004	CSEG_MAIN
PRE_LRU_STACK  . . . . . . . . .  	N PROC	0341	CSEG_OPEN	Length = 0063
PURGE_BUFFS  . . . . . . . . . .  	L NEAR	01E1	CSEG_MAIN
PURGE_DRIVE_CACHE  . . . . . . .  	L NEAR	0288	CSEG_OPEN
PURGE_DRV_LOOP . . . . . . . . .  	L NEAR	027D	CSEG_OPEN
PURGE_EXIT . . . . . . . . . . .  	L NEAR	02D5	CSEG_OPEN
PURGE_FLAG . . . . . . . . . . .  	L WORD	0002	CSEG_MAIN

REDIRECTOR . . . . . . . . . . .  	NUMBER	0000	
REMOVEFROMLRUCHAIN . . . . . . .  	N PROC	03F5	CSEG_OPEN	Length = 0047
REMOVEFROMTREE . . . . . . . . .  	N PROC	043C	CSEG_OPEN	Length = 004D
RESET_EXIT . . . . . . . . . . .  	L NEAR	0201	CSEG_MAIN
RESET_FOPEN  . . . . . . . . . .  	L NEAR	01F4	CSEG_MAIN
RESTORE_EXIT . . . . . . . . . .  	L NEAR	02BB	CSEG_MAIN
RESTORE_PAGE_STATE . . . . . . .  	N PROC	0289	CSEG_MAIN	Global	Length = 0034
REST_POP_REGS  . . . . . . . . .  	L NEAR	02B2	CSEG_MAIN
REST_PUSH_REGS . . . . . . . . .  	L NEAR	0294	CSEG_MAIN
RFLC_DONE  . . . . . . . . . . .  	L NEAR	0438	CSEG_OPEN
RFLC_FIRST_NODE  . . . . . . . .  	L NEAR	0418	CSEG_OPEN
RFLC_LAST_NODE . . . . . . . . .  	L NEAR	0429	CSEG_OPEN
RFT_CHILD  . . . . . . . . . . .  	L NEAR	0465	CSEG_OPEN
RFT_FIRST_CHILD  . . . . . . . .  	L NEAR	0459	CSEG_OPEN
RFT_RESET  . . . . . . . . . . .  	L NEAR	0469	CSEG_OPEN
RFT_RET  . . . . . . . . . . . .  	L NEAR	0486	CSEG_OPEN

SAVE_EMS_PAGE_STATE  . . . . . .  	F PROC	0255	CSEG_MAIN	Global	Length = 0034
SAVE_OK  . . . . . . . . . . . .  	L NEAR	0286	CSEG_MAIN
SET_FOR_SEARCH . . . . . . . . .  	NUMBER	0010	
SET_LRU  . . . . . . . . . . . .  	N PROC	03A4	CSEG_OPEN	Length = 0051
SET_START  . . . . . . . . . . .  	L NEAR	02A1	CSEG_OPEN
SET_UP_NAMES . . . . . . . . . .  	L NEAR	029A	CSEG_OPEN
SHAREF . . . . . . . . . . . . .  	NUMBER	0000	
SL_DONE  . . . . . . . . . . . .  	L NEAR	03EA	CSEG_OPEN
SL_EXIT  . . . . . . . . . . . .  	L NEAR	03F4	CSEG_OPEN
SL_OTHER . . . . . . . . . . . .  	L NEAR	03D6	CSEG_OPEN
SPECIAL_FILL_RESET . . . . . . .  	NUMBER	00FB	
SPECIAL_FILL_SET . . . . . . . .  	NUMBER	0004	
STAYRESIDENT . . . . . . . . . .  	NUMBER	004C	

TEMP . . . . . . . . . . . . . .  	L WORD	0025	CSEG_OPEN
TOP  . . . . . . . . . . . . . .  	L WORD	0023	CSEG_OPEN
TRUE . . . . . . . . . . . . . .  	NUMBER	FFFF	
TRUEBYTE . . . . . . . . . . . .  	NUMBER	00FF	

UNFOLD_NAME_RECORD . . . . . . .  	N PROC	04D8	CSEG_OPEN	Length = 0034
UNR_EXIT . . . . . . . . . . . .  	L NEAR	050B	CSEG_OPEN
UPDATE . . . . . . . . . . . . .  	F PROC	0206	CSEG_OPEN	Length = 0064
UPDATE_DELETE  . . . . . . . . .  	L NEAR	0221	CSEG_OPEN
UPDATE_DELETE1 . . . . . . . . .  	L NEAR	0228	CSEG_OPEN
UPDATE_DIR_ENTRY . . . . . . . .  	L NEAR	022F	CSEG_OPEN
UPDATE_EXIT  . . . . . . . . . .  	L NEAR	0266	CSEG_OPEN
UPDATE_EXTENDED_CLUSNUM  . . . .  	L NEAR	0250	CSEG_OPEN
U_ERROR  . . . . . . . . . . . .  	L NEAR	021E	CSEG_OPEN

VECTOR_Delete  . . . . . . . . .  	L DWORD	00FB	CSEG_MAIN	Global
VECTOR_LookUp  . . . . . . . . .  	L DWORD	00F7	CSEG_MAIN	Global

?PLM . . . . . . . . . . . . . .  	NUMBER	0000	
?WIN . . . . . . . . . . . . . .  	NUMBER	0000	
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  fastopen		
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:45:31
FASTOPEN                                                    Symbols-6


@VERSION . . . . . . . . . . . .  	TEXT  510		


   3016 Source  Lines
   3079 Total   Lines
    390 Symbols

  45636 + 180858 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
