Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-1


				page	,132				;
				TITLE	RECOVER.SAL - MS-DOS File/Disk Recovery Utility
				;----------------------------------------------------------
				;
				;	Recover - Program to rebuild an ms.dos directory
				;
				;	Copyright 1988 by Microsoft Corporation
				;
				;-----------------------------------------------------------
				.list
				
				;*****************************************************************************	;an005;bgb
				;   calc_fat_addr - calculate the seg/off of the fat cell from the cell number	;an005;bgb
				;										;an005;bgb
				;   Inputs:	AX the fat cell number						;an005;bgb
				;		BX the fat table offset
				;		ES the fat table segment (same as program seg)			;an005;bgb
				;   Outputs:	BX contains the offset of the fat cell				;an005;bgb
				;		ES contains the segment of the fat cell 			;an005;bgb
				;										;an005;bgb
				; LARGE FAT SUPPORT								;an005;bgb
				;*******************								;an005;bgb
				; the offset into the fat table is cluster number times 2 (2 bytes per fat entry) ;an005;bgb
				; This will result not only in the segment boundary being passed, but also in	;an005;bgb
				; a single-word math overflow.	  So, we calculate the the address as follows:	;an005;bgb
				; 0. start with cluster number (1-65535)					;an005;bgb
				; 1. divide by 8 to get the number of paragraphs per fat-cell  (0-8191) 	;an005;bgb
				;    remainder =					       (0-7)		;an005;bgb
				; 2. multiply the remainder by 2 to get offset in bytes        (0-15)		;an005;bgb
				; You now have a paragraph-offset number that you can use to calc the addr into ;an005;bgb
				; the fat table.  To get the physical addr you must add it to the offset of the ;an005;bgb
				; table in memory.								;an005;bgb
				; 3. add the paras to the segment register					;an005;bgb
				; 4. add the offset to the offset register					;an005;bgb
				;****************************************************************************** ;an005;bgb
				Procedure calc_fat_addr,near							;an005;bgb
			     1							; 
			     1	Public	calc_fat_addr				;				;AN000; 
 0000                        1	calc_fat_addr    proc				;				;AN000; 
			     1							; 
				    savereg <ax,dx>		    ; ax already has cluster number		;an005;bgb
			     1	IRP reg,<ax,dx> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 0000  50                    2		PUSH    ax 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 0001  52                    2		PUSH    dx 
 0002  8D 1E 0000 R		    lea     bx,fattbl		    ;point to fat table in memory		;an005;bgb
 0006  E8 0000 E		    call    seg_adj		    ;es:bx = es:00
 0009  BB 0008			    mov     bx,0008h		    ;  set up div by para (* 2 bytes per clus)	;an005;bgb
 000C  33 D2			    xor     dx,dx		    ; zero dx for word divide			;an005;bgb
 000E  F7 F3			    div     bx			    ; do it					;an005;bgb
 0010  8C C3			    mov     bx,es		    ; get fat table segment			;an005;bgb
 0012  03 D8			    add     bx,ax		    ; add number of paras to the cluster	;an005;bgb
 0014  8E C3			    mov     es,bx		    ; move it back				;an005;bgb
 0016  D1 E2			    shl     dx,1		    ; remainder times 2 			;an005;bgb
 0018  8B DA			    mov     bx,dx		    ; offset = 00 + remainder			;an005;bgb
				    restorereg <dx,ax>								;an005;bgb
			     1	IRP reg,<dx,ax> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 001A  5A                    2		POP     dx 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 001B  58                    2		POP     ax 
				  return									;an005;bgb
			     1	.xcref 
 001C                        1	??0000: 
 001C  C3                    1		RET 
 = 001C                      1	ret_l = ??0000 
			     1	.cref 
				EndProc calc_fat_addr								;an005;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-2
DOS - Message Retriever - MSGSTR.INC Module                 

			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 001D                        1	calc_fat_addr    ENDP 
				
				
				
					break	<GetFat - return the contents of a fat entry>
			     1		SUBTTL  GetFat - return the contents of a fat entry 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-3
GetFat - return the contents of a fat entry                 

			     1		PAGE 
				;*****************************************************************************
				;   GetFat - return the contents of a fat cell
				;
				;   Inputs:	AX the fat cell number
				;   Outputs:	BX contains the contents of the fat cell AX
				;		CX contains the number of bytes per sector
				;   Registers Revised: SI
				;
				; pseudocode:
				; ----------
				;    if large-fat, then
				;	double fat-number			 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
				;	fat-table offset = fat-num * 2		 2  4  6  8  10 12 14 16 18 20
				;    else
				;	fat-table offset = fat-num + (fat-num/2)
				;
				; LARGE FAT SUPPORT  - if this is a 16-bit fat, use the new calc algorithm
				; *****************
				;******************************************************************************
				Procedure GetFat,NEAR
			     1							; 
			     1	Public	GetFat				;				;AN000; 
 001D                        1	GetFat    proc				;				;AN000; 
			     1							; 
					set_data_segment
 001D  50                    1		push	ax 
 001E  B8 ---- R             1		mov	ax,dg				;Point to data segment 
 0021  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 0023  1E                    1		push	ds 
 0024  07                    1		pop	es 
 0025  58                    1		pop	ax 
 0026  8D 1E 0000 R			lea	bx,fattbl		;point to fat table in memory			   ;AC000;bg
				b
 002A  81 3E 02A0 R 0FF6		cmp	MaxClus,4086		;   if (MaxClus >= 4086) {
				;	$IF	AE			;changed to above because max clusters	;an005;bgb
 0030  72 08				JNAE $$IF1
									;can now be 'FFFF'hex			;an005;bgb
 0032  E8 0000 R				call	calc_fat_addr		; ;set up div by para		;an005;bgb
 0035  26: 8B 1F				mov	bx,word ptr es:[bx]	; get contents of fat		;an005;bgb
				;	$ELSE	;small fat		    ;AN000;bgb
 0038  EB 15				JMP SHORT $$EN1
 003A				$$IF1:
 003A  50			getSmall:   push    ax			    ;save fat-num     ;       i = clus + clus/2;
 003B  8B F0				    mov     si,ax		    ;save fat-num     ;
 003D  D1 F8				    sar     ax,1		    ;div by 2	      ;
 003F  9C				    pushf			    ;save low bit     ;
 0040  03 F0				    add     si,ax		    ;clus + clus/2    ;
 0042  8B 18				    mov     bx,word ptr [bx][si]    ;	    b = b[i];
 0044  9D				    popf			    ;get low bit      ;
				;	    $IF     C			;AN000;bgb
 0045  73 04				    JNC $$IF3
 0047  B1 04					mov	cl,4			;	    b >>= 4;
 0049  D3 EB					shr	bx,cl			;
				;	    $ENDIF			;AN000;bgb
 004B				$$IF3:
 004B  80 E7 0F			getfat1:    and bh,0fh	     ;even fat-num  ;	    b &= 0xFFF; AC000;bgb
 004E  58				    pop     ax			    ;	    }
				;	$ENDIF				;AN000;bgb
 004F				$$EN1:
 004F  8B 0E 0296 R		getret: mov	cx,secsiz		;   c = SecSize;
					return
			     1	.xcref 
 0053                        1	??0001: 
 0053  C3                    1		RET 
 = 0053                      1	ret_l = ??0001 
			     1	.cref 
				EndProc GetFat
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0054                        1	GetFat    ENDP 
				
				;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-4
GetFat - return the contents of a fat entry                 

					break	<SetFat - change the contents of a fat element>
			     1		SUBTTL  SetFat - change the contents of a fat element 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-5
SetFat - change the contents of a fat element               

			     1		PAGE 
				;*****************************************************************************
				;   SetFat - given a fat index and a value, change the contents of the fat
				;   cell to be the new value.
				;
				;   Inputs:	AX contains the fat cell to change
				;		DX contains the new value to put into the fat cell
				;   Outputs:	FAT [AX] = DX
				;   Registers Revised: CX, SI
				;
				; LARGE FAT SUPPORT  - if this is a 16-bit fat, use the new calc algorithm
				; *****************
				;*****************************************************************************
				Procedure SetFat,NEAR
			     1							; 
			     1	Public	SetFat				;				;AN000; 
 0054                        1	SetFat    proc				;				;AN000; 
			     1							; 
					set_data_segment
 0054  50                    1		push	ax 
 0055  B8 ---- R             1		mov	ax,dg				;Point to data segment 
 0058  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 005A  1E                    1		push	ds 
 005B  07                    1		pop	es 
 005C  58                    1		pop	ax 
 005D  8D 1E 0000 R			lea	bx,fattbl		;   b = &Table; 				   ;AC000;bg
				b
 0061  81 3E 02A0 R 0FF6		cmp	MaxClus,4086 ;12 bit fat?   if (MaxClus >= 4086) {
				;	$IF	AE  ;changed to above because max clusters now 'ffff'hex	;an005;bgb
 0067  72 08				JNAE $$IF6
 0069  E8 0000 R			    call    calc_fat_addr	    ; calc the fat cell addr		;an005;bgb
 006C  26: 89 17			    mov     word ptr es:[bx],dx     ; get the contents			;an005;bgb
				;	$ELSE
 006F  EB 20				JMP SHORT $$EN6
 0071				$$IF6:
 0071				setsmall:   SaveReg <ax,dx>  ;yes, 12 bit fat
			     1	IRP reg,<ax,dx> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 0071  50                    2		PUSH    ax 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 0072  52                    2		PUSH    dx 
 0073  8B F0				    mov     si,ax    ; fat cell number	    i = clus + clus / 2;
 0075  D1 F8				    sar     ax,1     ; fat cell num /2
 0077  9C				    pushf	     ; save result if ax was odd
 0078  03 F0				    add     si,ax    ; offset = 1 1/2 bytes * fat cell num
 007A  8B 00				    mov     ax,word ptr [bx][si]    ; get contents of fat cell
 007C  9D				    popf    ; get results from div  ;	    if ((clus&1) != 0) {
				;	    $IF     C	; was fat cell num odd?
 007D  73 09				    JNC $$IF8
 007F  25 000F					and	ax,000fh   ;yes 	;keep unchanged part
 0082  B1 04					mov	cl,4			;	    d <<= 4;
 0084  D3 E2					shl	dx,cl
				;	    $ELSE
 0086  EB 03				    JMP SHORT $$EN8
 0088				$$IF8:
 0088  25 F000			setfat2:	and	ax,0f000h  ; no, even	;keep unchanged part
				;	    $ENDIF
 008B				$$EN8:
 008B  0B C2			setfat1:    or ax,dx		   ; move new value into ax
 008D  89 00				    mov     word ptr [bx][si],ax    ;	    b[i] = a;
					    RestoreReg <dx,ax>
			     1	IRP reg,<dx,ax> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 008F  5A                    2		POP     dx 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 0090  58                    2		POP     ax 
				;	$ENDIF
 0091				$$EN6:
 0091				setret: return				;   return;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-6
SetFat - change the contents of a fat element               

			     1	.xcref 
 0091                        1	??0002: 
 0091  C3                    1		RET 
 = 0091                      1	ret_l = ??0002 
			     1	.cref 
				EndProc SetFat
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0092                        1	SetFat    ENDP 
				
				;
					Break	<GetKeystroke - await a single keystroke and flush all remaining>
			     1		SUBTTL  GetKeystroke - await a single keystroke and flush all remaining 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-7
GetKeystroke - await a single keystroke and flush all remain

			     1		PAGE 
				;*****************************************************************************
				;   GetKeystroke - let the user hit a key and flush the input buffer.  Kanji/
				;   Taiwanese force this
				;
				;   Inputs:	None.
				;   Outputs:	None.
				;   Registers Revised: AX
				;*****************************************************************************
				Procedure GetKeystroke,NEAR
			     1							; 
			     1	Public	GetKeystroke				;				;AN000; 
 0092                        1	GetKeystroke    proc				;				;AN000; 
			     1							; 
 0092  B8 0C08				MOV	AX,(Std_CON_Input_Flush SHL 8) + Std_CON_Input_No_Echo
 0095  CD 21				INT	21H
 0097  B8 0C00				MOV	AX,(Std_CON_Input_Flush SHL 8) + 0
 009A  CD 21				INT	21H
					return
			     1	.xcref 
 009C                        1	??0003: 
 009C  C3                    1		RET 
 = 009C                      1	ret_l = ??0003 
			     1	.cref 
				EndProc GetKeystroke
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 009D                        1	GetKeystroke    ENDP 
				
				
				;*****************************************************************************
				;PROMPT
				;*****************************************************************************
				Procedure Prompt,NEAR
			     1							; 
			     1	Public	Prompt				;				;AN000; 
 009D                        1	Prompt    proc				;				;AN000; 
			     1							; 
 009D  80 3E 00B2 R 00			Cmp	Prompted,0
					retnz
			     1	    condret nz,z 
			     2	.xcref 
			     2	.xcref ??0004 
			     2	.cref 
			     2	    ifdef   ret_l                       ; 
			     2		if (($ - ret_l) le 126) and ($ gt ret_l) 
			     2						; 
 00A2  75 F8                 2		    ??0004:  jnz    ret_l           ; 
 = 00A2                      2		    ret_nz = ??0004                 ; 
			     2		    exitm 
 00A4  C6 06 00B2 R 01			MOV	Prompted,1
 00A9  1E				push	ds
 00AA  0E				push	cs
				; move drive letter in message
 00AB  8D 16 0000 E			lea	dx,askmsg		; AC000;SM					   ;AC000;bg
				b
				; display msg
 00AF  E8 0000 E			call	DISPLAY_interface	;AC000;bgb
 00B2  58				pop	ax			; ;AN000;bgb
 00B3  1F				pop	ds
				; wait for user
 00B4  E8 0092 R			call	GetKeystroke
				
 00B7  2E: A0 00BA R			    MOV     AL,cs:DRIVE 	; This is for ibm's single drive sys;AN000;bgb
 00BB  3C 01				    CMP     AL,1
 00BD  77 0A				    JA	    NOSET		; Values other than 0,1 are not appropriate.
 00BF  1E				    PUSH    DS
 00C0  BB 0050				    MOV     BX,50H
 00C3  8E DB				    MOV     DS,BX
 00C5  A2 0004				    MOV     DS:(BYTE PTR 4),AL	; Indicate drive changed
 00C8  1F				    POP     DS
 00C9				NOSET:
				
					return
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-8
GetKeystroke - await a single keystroke and flush all remain

			     1	.xcref 
 00C9                        1	??0005: 
 00C9  C3                    1		RET 
 = 00C9                      1	ret_l = ??0005 
			     1	.cref 
				EndProc Prompt
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 00CA                        1	Prompt    ENDP 
				
				
				;
					Break	<Load	- set up registers for abs sector read/write>
			     1		SUBTTL  Load	- set up registers for abs sector read/write 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-9
Load	- set up registers for abs sector read/write           

			     1		PAGE 
				;******************************************************************************
				;   Load - load up all registers for absolute sector read/write of FAT
				;
				; called by: readft, writeft
				;
				;   Inputs:	none.
				;   Outputs:	AL    - drive number (a=0)
				;		ES:BX - point to FAT table					;an005;bgb
				;		CX    - number of sectors in FAT
				;		DX    - sector number of the first FAT sector
				;		FatCnt - is set to the number of fats
				;   Registers Revised: ax, dx, cx, bx
				;******************************************************************************
				Procedure Load,NEAR
			     1							; 
			     1	Public	Load				;				;AN000; 
 00CA                        1	Load    proc				;				;AN000; 
			     1							; 
					set_data_segment							;an005;bgb
 00CA  50                    1		push	ax 
 00CB  B8 ---- R             1		mov	ax,dg				;Point to data segment 
 00CE  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 00D0  1E                    1		push	ds 
 00D1  07                    1		pop	es 
 00D2  58                    1		pop	ax 
 00D3  8B 16 0286 R			mov	dx,firfat		;sector number of first fat 1-65535
 00D7  A0 0283 R			mov	al,fatnum		;number of fats 	    2		 ;AC000;bgb
 00DA  A2 0282 R			mov	fatcnt,al		;FatCnt = FatNum;	    1-65535	 ;AC000;bgb
 00DD  A0 00BA R			mov	al,drive		;drive number		    a=0 b=1	;AN000;bgb
 00E0  8B 0E 0284 R			mov	cx,fatsiz		;sectors in the fat	    1-65535
 00E4  8D 1E 0000 R			lea	bx,fattbl		; es:bx --> fat table			;an005;bgb
					return
			     1	.xcref 
 00E8                        1	??0006: 
 00E8  C3                    1		RET 
 = 00E8                      1	ret_l = ??0006 
			     1	.cref 
				EndProc Load
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 00E9                        1	Load    ENDP 
				
					Break	<ReadFT - read in the entire fat>
			     1		SUBTTL  ReadFT - read in the entire fat 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-10
ReadFT - read in the entire fat                             

			     1		PAGE 
				;******************************************************************************
				;   ReadFt - attempt to read in the fat.  If there are errors, step to
				;   successive fats until no more.
				;
				;   Inputs:	none.
				;   Outputs:	Fats are read until one succeeds.
				;		Carry set indicates no Fat could be read.
				;   Registers Revised: all
				; LOGIC
				; *****
				;  DO for each of the fats on the disk:
				;     read - all the sectors in the fat
				;     increase the starting sector by the number of sectors in each fat
				;
				; LARGE FAT SUPPORT - the big change here is in read disk.  since the fat must	;an005;bgb
				;     be within the first 32M, then the starting sector number of 65535 is ok,	;an005;bgb
				;     as is a larger number of sectors to read/write.				;an005;bgb
				;******************************************************************************
				Procedure ReadFt,NEAR
			     1							; 
			     1	Public	ReadFt				;				;AN000; 
 00E9                        1	ReadFt    proc				;				;AN000; 
			     1							; 
					set_data_segment							;an027;bgb;an005;bgb
 00E9  50                    1		push	ax 
 00EA  B8 ---- R             1		mov	ax,dg				;Point to data segment 
 00ED  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 00EF  1E                    1		push	ds 
 00F0  07                    1		pop	es 
 00F1  58                    1		pop	ax 
 00F2  8B 16 0286 R			mov	dx,firfat		;sector number of first fat 1-65535	;an027;bgb
 00F6  A0 0283 R			mov	al,fatnum		;number of fats 	    2		;an027;bgb ;AC000;bg
				b
 00F9  A2 0282 R			mov	fatcnt,al		;FatCnt = FatNum;	    1-65535	;an027;bgb ;AC000;bg
				b
 00FC  A0 00BA R			mov	al,drive		;drive number		    a=0 b=1	;an027;bgb;AN000;bgb
 00FF  8B 0E 0284 R			mov	cx,fatsiz		;sectors in the fat	    1-65535	;an027;bgb
 0103  8D 1E 0000 R			lea	bx,fattbl		; es:bx --> fat table			;an027;bgb;an005;bgb
 0107  F8				clc				;clear carry flag			;an027;bgb
 0108  89 2E 02AC R			mov	Read_Write_Relative.Start_Sector_High,bp ;set hi word to zero  ;AN000;
 010C  E8 0000 E			call	Read_Disk		; read in fat #1		;AC000;
				;	$IF  C				; was it a bad read?		     ;an027;bgb
 010F  73 05				JNC $$IF12
 0111  03 D1				    add     dx,cx		;point to 2nd fat
 0113  E8 0000 E			    call    Read_Disk		; read in 2nd fat		    ;AC000;
				;	$ENDIF				;carry flag set if both fats bad       ;AC000;bgb
 0116				$$IF12:
 0116  C3			ret										;an027;bgb
				EndProc ReadFt
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0117                        1	ReadFt    ENDP 
				
				
				;
					Break	<WrtFat - write out the fat>
			     1		SUBTTL  WrtFat - write out the fat 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-11
WrtFat - write out the fat                                  

			     1		PAGE 
				;*****************************************************************************
				;   WrtFat - using the results of a ReadFt, attempt to write out the fat
				;   until successful.
				;
				;   Inputs:	none.
				;   Outputs:	A write of the fat is attempted in each fat position until
				;		one succeeds.
				;   Registers Revised: all
				; LOGIC
				; *****
				;    DO for each fat on the disk
				;	write the fat to disk
				;	increase the starting sector number by the number of sectors per fat
				;
				; LARGE FAT SUPPORT - the big change here is in read disk.  since the fat must	;an005;bgb
				;     be within the first 32M, then the starting sector number of 65535 is ok,	;an005;bgb
				;     as is a larger number of sectors to read/write.				;an005;bgb
				;****************************************************************************
				Procedure WrtFat,NEAR
			     1							; 
			     1	Public	WrtFat				;				;AN000; 
 0117                        1	WrtFat    proc				;				;AN000; 
			     1							; 
 0117  E8 00CA R			call	load			;   load ();				;an005;bgb
				;	$DO									;an005;bgb
 011A				$$DO14:
 011A  E8 0000 E		wrtit:	    call    Write_Disk		    ;	    Write_Disk ();		;an005;bgb
				;	    $LEAVE  C								;an015;bgb
 011D  72 08				    JC $$EN14
 011F  03 D1			wrtok:	    add     dx,cx		    ;	    fatStart += fatsize;	;an005;bgb
 0121  FE 0E 0282 R			    dec     byte ptr fatcnt	    ;	} while (--fatcnt);		;an005;bgb
				;	$ENDDO	Z								;an005;bgb
 0125  75 F3				JNZ $$DO14
 0127				$$EN14:
					return
			     1	.xcref 
 0127                        1	??0007: 
 0127  C3                    1		RET 
 = 0127                      1	ret_l = ??0007 
			     1	.cref 
				EndProc WrtFat
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0128                        1	WrtFat    ENDP 
				
				
				;
					Break	<fEOF	- check to see if the argument is EOF>
			     1		SUBTTL  fEOF	- check to see if the argument is EOF 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-12
fEOF	- check to see if the argument is EOF                  

			     1		PAGE 
				;*****************************************************************************
				;   fEOF - test BX to see if it indicates EOF
				;
				;   Inputs:	BX - contains cluster
				;   Outputs:	Carry is set if BX indicates EOF
				;   Registers Revised: none
				;*****************************************************************************
				Procedure fEOF,NEAR
			     1							; 
			     1	Public	fEOF				;				;AN000; 
 0128                        1	fEOF    proc				;				;AN000; 
			     1							; 
 0128  3B 1E 02A0 R		    CMP     BX,MaxClus
 012C  76 07				JBE	EOFok
 012E  80 FB F7				CMP	BL,0F7h 		; bad sector indicator
 0131  74 02				JZ	EOFok
 0133  F9				STC
					return
			     1	.xcref 
 0134                        1	??0008: 
 0134  C3                    1		RET 
 = 0134                      1	ret_l = ??0008 
			     1	.cref 
 0135  F8			EOFok:	CLC
					return
			     1	.xcref 
 0136                        1	??0009: 
 0136  C3                    1		RET 
 = 0136                      1	ret_l = ??0009 
			     1	.cref 
				EndProc fEOF
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0137                        1	fEOF    ENDP 
				
				
				;*****************************************************************************
				;*****************************************************************************
				
				
				;
					Break	<sfFromFCB - take an FCB and convert it to a sf pointer>
			     1		SUBTTL  sfFromFCB - take an FCB and convert it to a sf pointer 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-13
sfFromFCB - take an FCB and convert it to a sf pointer      

			     1		PAGE 
				;*****************************************************************************
				; SFFromFCB - index into System File tables for SFN.
				;
				;   Input:	ES:DI has FCB pointer
				;   Output:	ES:DI points to Sys-File-table entry
				;   Registers Revised: ES:DI, BX only
				;
				;*****************************************************************************
				procedure SFFromFCB,NEAR
			     1							; 
			     1	Public	SFFromFCB				;				;AN000; 
 0137                        1	SFFromFCB    proc				;				;AN000; 
			     1							; 
 0137  26: 8A 5D 18			MOV	BL,ES:[DI].FCB_SFN ;fcb+18 = system file table 00
 013B  32 FF				XOR	BH,BH		   ; 00
					SaveReg <AX,BX>
			     1	IRP reg,<AX,BX> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 013D  50                    2		PUSH    AX 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 013E  53                    2		PUSH    BX 
 013F  B4 52				MOV	AH,Get_IN_Vars		;52h
 0141  CD 21				INT	21h			;   p = DOSBASE();
									; bx = 0026, ax=5200 es=0257
 0143  26: C4 7F 1A			LES	DI,DWORD PTR ES:[BX].SYSI_FCB ;load es:di w/ ptr to sf table
									; es:di = 0b37:0000
 0147  8D 7D 06				LEA	DI,[DI].sfTable 	; di=6			  AC000;bgb
					RestoreReg <BX>
			     1	IRP reg,<BX> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 014A  5B                    2		POP     BX 
					SaveReg <DX>
			     1	IRP reg,<DX> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 014B  52                    2		PUSH    DX 
 014C  B8 003B				MOV	AX,SIZE SF_Entry	;42
 014F  F7 E3				MUL	BX			;0
 0151  03 F8				ADD	DI,AX			;6
					RestoreReg <DX,AX>
			     1	IRP reg,<DX,AX> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 0153  5A                    2		POP     DX 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 0154  58                    2		POP     AX 
					return				;   return p;
			     1	.xcref 
 0155                        1	??000A: 
 0155  C3                    1		RET 
 = 0155                      1	ret_l = ??000A 
			     1	.cref 
				EndProc SFFromFCB
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0156                        1	SFFromFCB    ENDP 
				
				;*****************************************************************************
				;*****************************************************************************
				Procedure get_dpb_info,Near				      ;AN000;bgb
			     1							; 
			     1	Public	get_dpb_info				;				;AN000; 
 0156                        1	get_dpb_info    proc				;				;AN000; 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-14
sfFromFCB - take an FCB and convert it to a sf pointer      

			     1							; 
				; get dpb for drive indicated
 0156  1E				push	ds			;save ds seg reg
 0157  8A 16 00BA R			mov	dl,drive		; get drive number a=0 b=1 c=2		;AN000;bgb
 015B  FE C2				inc	dl			; a=1, b=2, c=3
 015D  B4 32				mov	ah,GET_DPB		; hidden system call (032h)
 015F  CD 21				int	21h			; call dos
				; note: ds is now changed !!!!
 0161  3C FF				cmp	al,0FFH 		; -1 = bad return code
				;	$IF	NZ  ;AN000;bgb
 0163  74 57				JZ $$IF17
				; get sector size
 0165  8B 47 02				    mov     ax,word ptr [bx].dpb_sector_size ; get physical sector size
 0168  26: A3 0294 R			    mov     es:bytes_per_sector,ax ; save bytes per sector 200		   ;AN000;bgb
				; get sectors per cluster
 016C  32 ED				    xor     ch,ch		; zero out high byte ;ac000;bgb
 016E  8A 4F 04				    mov     cl,byte ptr [bx].dpb_cluster_mask ; get sectors/cluster - 1
 0171  41				    inc     cx			;1+1=2		  ; get sectors / cluster
 0172  26: 89 0E 028A R			    mov     es:secall,cx	;2	   ; save sectors per cluster		   ;AC000;bg
				b
				; get bytes per cluster
 0177  F7 E1				    mul     cx			; ax = bytes per cluster
 0179  26: A3 0296 R			    mov     eS:secsiz,ax	;400	   ; save bytes per cluster		   ;AC000;bg
				b
				; first sector record
 017D  8B 47 0B				    mov     ax,[bx].dpb_first_sector ; get record of first sector
 0180  26: A3 0290 R			    mov     es:firrec,ax	;c	   ;					   ;AC000;bg
				b
				;first	 dir	 entry
 0184  8B 57 11				    mov     dx,[bx].dpb_dir_sector ; get record of first directory entry
 0187  26: 89 16 0292 R			    mov     es:firdir,dx	;5	   ;					   ;AC000;bg
				b
				; first fat record
 018C  8B 77 06				    mov     si,[bx].dpb_first_fat ; get record of first fat
 018F  26: 89 36 0286 R			    mov     es:firfat,si	;1     ; sector number of first fat		   ;AC000;bg
				b
				; records in fat
 0194  8B 4F 0F				    mov     cX,[bx].dpb_fat_size ; get size of fat (num of rcds)	 ;AC000;BGB
 0197  26: 89 0E 0284 R			    mov     es:fatsiz,cX	;2	      ;SIZE OF FAT FROM DPB ;AC000;BGB
				; number of cluster
 019C  8B 7F 0D				    mov     di,[bx].dpb_max_cluster ; get number of clusters
 019F  26: 89 3E 02A2 R			    mov     es:lastfat,di	;163	     ; number of fat entries		  ;AC000;bgb
 01A4  26: 89 3E 02A0 R			    mov     es:MaxClus,di	;163	     ; number of fat entries		  ;AC000;bgb
				; number of fats (1 or 2)
 01A9  8A 6F 08				    mov     ch,[bx].dpb_fat_count ; get number of fats on drive
 01AC  26: 88 2E 0283 R			    mov     byte ptr es:fatnum,ch ;2   ; save number of fats on disk	    ;AC000;bgb
				; max dir entries
 01B1  8B 5F 09				    mov     bx,[bx].dpb_root_entries ; get max number of dir entries
 01B4  26: 89 1E 028E R			    mov     ES:maxent,bx	;70	   ;					   ;AC000;bg
				b
 01B9  1F				    pop     ds			; restore ds register to group		   ;AC000;bgb
				;	$ELSE						      ;AN000;bgb
 01BA  EB 04				JMP SHORT $$EN17
 01BC				$$IF17:
 01BC  1F				    pop     ds			; restore ds register to group		   ;AC000;bgb
 01BD  E9 033D R			    jmp     noname		; bad return = display error msg
				;	$ENDIF						      ;AN000;bgb
 01C0				$$EN17:
 01C0  C3				ret				;		      ;AN000;bgb
				endproc get_dpb_info			    ;			  ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 01C1                        1	get_dpb_info    ENDP 
				;
				
				;
				;*****************************************************************************
				; assemble this part if doing japanese version
				;
				;INPUTS:  es:di - points to last char in filename
				;	  ds:dx - point to beginning of filename
				;
				;*****************************************************************************
				Procedure check_kanji,Near		;AN000;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-15
sfFromFCB - take an FCB and convert it to a sf pointer      

			     1							; 
			     1	Public	check_kanji				;				;AN000; 
 01C1                        1	check_kanji    proc				;				;AN000; 
			     1							; 
 01C1				check_kanji endp			;				;AN000;bgb
				;
				
				;****************************************************************************
				;****************************************************************************
					break
			     1		SUBTTL   
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-16
                                                            

			     1		PAGE 
				
				
				
				
				
				
				;*****************************************************************************;an020;bgb
				; copy the filename from the fcb to the data segment			      ;an020;bgb
				;*****************************************************************************;an020;bgb
				Procedure copy_fname,Near	       ;AN000;bgb				 ;an020;bgb
			     1							; 
			     1	Public	copy_fname				;				;AN000; 
 01C1                        1	copy_fname    proc				;				;AN000; 
			     1							; 
				;get fcb1 from the psp
 01C1  8B 0E 0184 R		slashok: mov	 cx,PSP_Segment 	 ;Get addrbility of psp 	 ;AN000;bgb
 01C5  8E D9				mov	ds,cx			;  "  "    "  "  "  "		;AN000;bgb
					assume	ds:dg,es:dg		; "   "    "  "  "  "		;AN000;bgb
 01C7  E8 01FB R			call	get_fcb
				
														;An018;bgb
				
				; remove leading blanks and tabs from filename
 01CA  BE 0081			nofspec: mov	 si,81h 		 ; point to command line		 ;AC000;bgb
 01CD  8D 3E 0102 R			lea	di,fname_buffer 	; point to filename			;ac000;bgb
 01D1  33 C9				xor	cx,cx			; zero pathname length
				;	$DO		;get source chars until neither tabs or blanks found
 01D3				$$DO20:
 01D3  AC			kill_bl:    lodsb			; get next char 			;AN000;bgb
 01D4  3C 09				    cmp     al,tab		; leading tabs? (hex 9) 		;AN000;bgb
				;	$LEAVE	NE,AND			; yes - done				    ;AN000;bgb
 01D6  74 04				JE $$LL21
 01D8  3C 20				    cmp     al,' '		; leading blanks? (hex 20)		;AN000;bgb
				;	$LEAVE	NE
 01DA  75 02				JNE $$EN20
 01DC				$$LL21:
				;	$ENDDO				;					;AN000;bgb
 01DC  EB F5				JMP SHORT $$DO20
 01DE				$$EN20:
				;
				
				;was any parameter entered at all?
 01DE  3C 0D			endl:	cmp	al,13			; no name found if the 1st char is CR
 01E0  75 03				jne	next_char		; file name or drive entered
 01E2  E9 033D R			jmp	noname			; no parameter entered
				
				
				
				;copy filename from cmd line to fname buffer
 01E5				next_char:
 01E5  AA				stosb				; move byte in al to fname_buffer
 01E6  41				inc	cx			;inc fname counter
 01E7  AC				lodsb				; get next byte
 01E8  3C 20				cmp	al,' '			; terminated by blank?
 01EA  74 08				je	name_copied		; yes
 01EC  3C 09				cmp	al,9			;terminated by tab?
 01EE  74 04				je	name_copied		; yes
 01F0  3C 0D				cmp	al,13			; terminated by CR?
 01F2  75 F1				jne	next_char		; yes
				
				
				;reset ds to data segment
 01F4				name_copied:				; got file name
 01F4  06				push	es
 01F5  1F				pop	ds			;ds now points to data seg
					assume	ds:dg
				
 01F6  C6 05 00				mov	byte ptr [di],0 	; nul terminate the pathname
 01F9  4F				dec	di			; adjust to the end of the pathname
 01FA  C3				    ret 								;an020;bgb
 01FB				copy_fname  endp			;					   ;an020;bgb
				
				
				
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-17
                                                            

				;*****************************************************************************;an020;bgb
				; get a copy of the fcb 						      ;an020;bgb
				;*****************************************************************************;an020;bgb
				Procedure get_fcb,Near		    ;AN000;bgb				      ;an020;bgb
			     1							; 
			     1	Public	get_fcb				;				;AN000; 
 01FB                        1	get_fcb    proc				;				;AN000; 
			     1							; 
 01FB  BE 005C				mov	si,fcb			; ds:si point to fcb in the psp 	;AN000;bgb
 01FE  8D 3E 0260 R			lea	di,fcb_copy		; es:di point to the copy in the data seg;AC000;bgb
 0202  B9 0020				mov	cx,32			; move 32 bytes 			;AN000;bgb
 0205  F3/ A4				rep	movsb			; from ds:si (fcb) to es:di (fcb-copy)	  ;AN000;bgb
				;check if it is not there (in psp)						;an024;bgb;an020;bgb
				;	mov	si,fcb			;point to fcb1				;an024;bgb;AN014;bgb
				;	cmp	byte ptr ds:[si+1],' '	;it will be blank if a filespec used	;an024;bgb;AN014;bgb
				;	$IF	E,AND								;an024;bgb;Ac015;bgb
				;	cmp	byte ptr ds:[84h],0dh	;this will be CR if drive letter used	;an024;bgb;AN015;bgb
				;	$IF	NE	    ;if no drive letter and fcb blank, then filespec!	;an024;bgb;AN015;bgb
				;now get the filename from the command line					;an024;bgb;an020;bgb
				; step 1 - point to end of cmd line						;an024;bgb
 0207  BE 0081				    mov     si,081h		;point to beginning of command line	;AN014;bgb
 020A  8A 0E 0080			    mov     cl,byte ptr ds:[80h] ;get length of cmd line		;AN014;bgb
 020E  32 ED				    xor     ch,ch		;zero out hi byte for word arith	;AN014;bgb
 0210  03 F1				    add     si,cx		;begin plus length of cmd line = end	;AN014;bgb
 0212  4E				    dec     si			;point to last char, not CR		;an020;bgb
				;step 2 - find the first backslash						;an020;bgb
 0213  89 2E 0090 R			    mov     exit_sw,bp ;false						;an024;bgb
				;	    $DO 			;do until back slash found		;AN014;bgb
 0217				$$DO23:
 0217  80 3C 5C					cmp	byte ptr ds:[si],'\'	 ;look for back slash		;AN014;bgb
				;		$IF	E		;find it?				;an024;bgb;AN014;bgb
 021A  75 0E					JNE $$IF24
 021C  8A 44 FF					    mov     al,[si-1]	;get possible leading byte		;an024;bgb
				;		    $IF     Z		;no- then it is subdir delimiter	;an024;bgb
 021F  75 08					    JNZ $$IF25
 0221  C7 06 0090 R FFFF				mov exit_sw,true    ;so exit the search loop		;an024;bgb
				;		    $ELSE		;yes it is DBCS leading byte		;an024;bgb
 0227  EB 01					    JMP SHORT $$EN25
 0229				$$IF25:
 0229  4E						dec	si	;so skip the leading byte		    ;an024;bgb
				;		    $ENDIF		;check for kanji			;an024;bgb
 022A				$$EN25:
				;		$ENDIF								;an024;bgb
 022A				$$IF24:
 022A  83 3E 0090 R FF				cmp	exit_sw,true						;an024;bgb
				;		$LEAVE	E							;an024;bgb
 022F  74 09					JE $$EN23
 0231  80 3C 00					cmp	byte ptr ds:[si],0	 ;look for 00 (not a filespec)	;AN018;bgb
				;		$IF	E							;an020;bgb
 0234  75 01					JNE $$IF30
 0236  C3					    ret 							;an020;bgb
				;;;;;;;;;;;;;;;;je	nofspec 	;filespec not found			;ac020;bgb
				;		$ENDIF								;an020;bgb
 0237				$$IF30:
 0237  4E					dec	si		;no , next char 			;AN014;bgb
				;	    $ENDDO								;AN014;bgb
 0238  EB DD				    JMP SHORT $$DO23
 023A				$$EN23:
				;found backslash, move it into fcb
 023A  46				    inc     si			;point to 1st char of filename		;AN014;bgb
 023B  8D 3E 0261 R			    lea     di,fcb_copy+1	    ; move addr of fcb_copy into di	;an024;bgb;AN014;bgb
				;	    $DO 			;do until eol - CR found		;AN014;bgb
 023F				$$DO33:
 023F  AC					lodsb			;get one byte of filename from cmd line ;AN014;bgb
 0240  3C 0D					cmp	al,0dh		;end of line?				;AN014;bgb
				;		$LEAVE	E		;if so, we are done			;AN014;bgb
 0242  74 10					JE $$EN33
 0244  3C 2E					cmp	al,'.'		;is it extension indicator?		;AN014;bgb
				;		$IF	E		;yes					;AN014;bgb
 0246  75 09					JNE $$IF35
 0248  8D 3E 0260 R				    lea     di,fcb_copy ;point to extension in fcb		;AN014;bgb
 024C  83 C7 09					    add     di,9	;point to extension in fcb		;AN014;bgb
				;		$ELSE			;dont move the period			;AN014;bgb
 024F  EB 01					JMP SHORT $$EN35
 0251				$$IF35:
 0251  AA					    stosb		;move char into fcb			;AN014;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-18
                                                            

				;		$ENDIF								;AN014;bgb
 0252				$$EN35:
				;	    $ENDDO								;AN014;bgb
 0252  EB EB				    JMP SHORT $$DO33
 0254				$$EN33:
				;	$ENDIF									;AN014;bgb
 0254  C3				    ret 								;an020;bgb
 0255				get_fcb  endp			     ;						;an020;bgb
														;an020;bgb
														;an020;bgb
				;
					Break	<Main	code of recover - Version check and exit if incorrect>
			     1		SUBTTL  Main	code of recover - Version check and exit if incorrect 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-19
Main	code of recover - Version check and exit if incorrect  

			     1		PAGE 
				;*****************************************************************************
				;Routine name:	Main_routine
				;*****************************************************************************
				;
				;description: Main routine for recovering a file from a bad sector
				;
				;Called from:	recover_ifs in RECINIT.SAL
				;
				;
				;Called Procedures: prompt
				;		    readft
				;		    read_file
				;		    getfat (sic)
				;		    feof
				;		    sffromFCB
				;		    bad-file-read
				;		    report
				;		    wrtfat
				;		    stdprintf
				;		    RECPROC.SAL
				;
				;Input: ????
				;
				;Output: FAT is changed if a bad sector is found.
				;	 The file is complete except for the data in the bad sector.
				;
				;Change History: header created 7-19-87 	BGB
				;
				;Psuedocode
				;----------
				;
				;*****************************************************************************
 0255				Main_Routine:
				
				;get system switch character
 0255  33 ED				xor	bp,bp
					set_data_segment		; set es,ds to data			;AN000;bgb
 0257  50                    1		push	ax 
 0258  B8 ---- R             1		mov	ax,dg				;Point to data segment 
 025B  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 025D  1E                    1		push	ds 
 025E  07                    1		pop	es 
 025F  58                    1		pop	ax 
						;;;;;;; call	change_blanks		; get dbcs blanks			;an0
				12;bgb
 0260  B8 3700				mov	ax,(char_oper shl 8)	; get switch character
 0263  CD 21				int	21h			; put into dl
 0265  80 FA 2F				cmp	dl,"/"			; is it / ?
				;	$IF	nz
 0268  74 03				JZ $$IF39
 026A  E9 01C1 R			    jmp     slashok		    ; if not / , then not PC
				;	$ENDIF
 026D				$$IF39:
 026D  C6 06 00BB R 5C			mov	[dirchar],"\"	     ; in PC, dir separator = \
 0272  C6 06 00BD R 5C			mov	[userdir],"\"
				
 0277  E8 01C1 R			call	copy_fname
				
				;check for dbcs double byte chars
 027A  57				push	di								;an019;bgb
 027B  51				push	cx								;an019;bgb
 027C  E8 01C1 R			call	check_kanji
 027F				same_dirj:
 027F  59				pop	cx							    ;an019;bgb
 0280  5F				pop	di							    ;an019;bgb
 0281  89 3E 0000 R			mov	lastchar,di
				
				
				;see if there are any '\' in filename parameter - means filespec		;an024;bgb
				;do until a \ is found or end-of-string 					;an024;bgb
				;	  if a \ is found							;an024;bgb
				;	     then test for dbcs leading byte					;an024;bgb
				;		  if it is not dbcs leading byte				;an024;bgb
				;		     then exit loop						;an024;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-20
Main	code of recover - Version check and exit if incorrect  

				;		     else continue loop 					;an024;bgb
				;   $DO 									;an024;bgb
 0285				$$DO41:
 0285  49				dec	cx								;an024;bgb
 0286  23 C9				and	cx,cx ;compare cx to zero					;an024;bgb
				;   $LEAVE  E									;an024;bgb
 0288  74 1A			    JE $$EN41
 028A  A0 00BB R			mov	al,[dirchar]	    ;05ch ; get directory separator character	;an024;bgb
 028D  3A 05				cmp	al,byte ptr [di]    ; (cx has the pathname length)		;an024;bgb
				;	$IF	E			; reset direction, just in case 	;an024;bgb
 028F  75 10				JNE $$IF43
 0291  8A 45 FF				    mov     al,[di-1]	    ;get possible leading byte			;an024;bgb
				;	    $IF      Z		    ;not a leading byte? then its a '\' 	;an024;bgb
 0294  75 0B				    JNZ $$IF44
 0296  89 3E 0002 R				mov lastbs,di							;an024;bgb
 029A  8B 3E 0000 R				mov di,lastchar 						;an024;bgb
 029E  EB 0E 90					jmp sja 	    ;zero = not a leading byte			;an024;bgb
				;	    $ENDIF								;an024;bgb
 02A1				$$IF44:
				;	$ENDIF									;an024;bgb
 02A1				$$IF43:
 02A1  4F				dec	di								;an024;bgb
				;   $ENDDO									;an024;bgb
 02A2  EB E1			    JMP SHORT $$DO41
 02A4				$$EN41:
				;save current disk								;an008;bgb
 02A4  B4 19				mov	ah,19h								;an008;bgb
 02A6  CD 21				int	21h								;an008;bgb
 02A8  A2 0094 R			mov	old_drive,al							;an008;bgb
 02AB  EB 7A 90				jmp	same_dir		; no dir separator char. found, the
									; file is in the current directory
									; of the corresponding drive. Ergo,
									; the FCB contains the data already.
				
				
				;handle filespec here
				;at least one '\' found in filename
 02AE				sja:
 02AE  E3 0C				jcxz	sjb			; no more chars left, it refers to root
 02B0  57				push	di								;an024;bgb
 02B1  8B 3E 0002 R			mov	di,lastbs							;an024;bgb
 02B5  80 7D FF 3A			cmp	byte ptr [di-1],':'	  ; is the prvious character a disk def?;an024;bgb
 02B9  5F				pop	di								;an024;bgb
 02BA  75 05				jne	not_root
 02BC				sjb:
 02BC  C6 06 00B7 R 01			mov	[the_root],01h		; file is in the root
 02C1				not_root:
 02C1  47				inc	di			; point to dir separator char.
 02C2  8B C5				mov	ax,bp ;set to zero
 02C4  AA				stosb				; nul terminate directory name
				;	pop	ax
				;	push	di			; save pointer to file name
 02C5  C6 06 00B8 R 01			mov	[fudge],01h		; remember that the current directory
									; has been changed.
				;save current disk								;an008;bgb
 02CA  B4 19				mov	ah,19h								;an008;bgb
 02CC  CD 21				int	21h								;an008;bgb
 02CE  A2 0094 R			mov	old_drive,al							;an008;bgb
				;----- Save current directory for exit ---------------------------------;
 02D1  8A 16 00BA R			mov	dl, drive		; get specified drive if any
				;;;;;;; or	dl,dl			; default disk? 			;an021;bgb
				;;;;;;; jz	same_drive							;an021;bgb
				;;;;;;;;dec	dl			; adjust to real drive (a=0,b=1,...)	;an021;bgb
 02D5  B4 0E				mov	ah,set_default_drive	; change disks
 02D7  CD 21				int	21h
				;	cmp	al,-1			; error?
				;	jne	same_drive
				;BADDRVSPEC:
				;	 lea	 dx,baddrv    ; AC000;SM					;AC000;bgb
				;	 jmp	 printerr
				
 02D9				same_drive:
 02D9  E8 009D R			call	prompt
 02DC  B4 47				mov	ah,Current_Dir		; userdir = current directory string
 02DE  8B D5				mov	dx,bp ;set to zero
 02E0  8D 36 00BE R			lea	si,userdir+1		;AC000;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-21
Main	code of recover - Version check and exit if incorrect  

 02E4  CD 21				int	21h
				
				;----- Change directories ----------------------------------------------;
 02E6  80 3E 00B7 R 01			cmp	[the_root],01h
 02EB  8D 16 00BB R			lea	dx,[dirchar]		; assume the root				   ;AC000;bg
				b
 02EF  74 04				je	sj1
 02F1  8D 16 0102 R			lea	dx,[fname_buffer]	;AC000;bgb
 02F5				sj1:
 02F5  57				push	di								;an024;bgb
 02F6  8B 3E 0002 R			mov	di,lastbs							;an024;bgb
 02FA  C6 05 00				mov	byte ptr [di],0 					   ;an024;bgb
 02FD  B4 3B				mov	ah,chdir		; change directory
 02FF  CD 21				int	21h
 0301  C6 05 5C				mov	byte ptr [di],'\'							 ;an024;bgb
 0304  5F				pop	di								;an024;bgb
 0305  A0 00BA R			mov	al,Drive		;Get drive number		;AN000;bgb
 0308  04 40				add	al,"A"-1		;Make it drive letter		;AN000;
 030A  A2 02B4 R			mov	Drive_Letter_Msg,al	;Put in message 		;AN000;
 030D  8D 16 0000 E			lea	dx,baddrv		;AC000;bgb
 0311  73 06				jnc	no_errors
 0313  E8 05BB R			call	printerr
 0316  E9 03AB R			jmp	rabort
				
				;
 0319				no_errors:
				
					Break	<Set	up exception handlers>
			     1		SUBTTL  Set	up exception handlers 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-22
Set	up exception handlers                                   

			     1		PAGE 
				
				;----- Parse filename to FCB -------------------------------------------;
				;	pop	si								;an024;bgb
 0319  8B 36 0002 R			mov	si,lastbs							;an024;bgb
 031D  46				inc	si								;an024;bgb
 031E  8D 3E 0260 R			lea	di,fcb_copy		;AC000;bgb
 0322  B8 2901				mov	ax,(parse_file_descriptor shl 8) or 1
 0325  CD 21				int	21h
				;;;;;;;;push	ax
				;-----------------------------------------------------------------------;
 0327				same_dir:
 0327  8D 1E 0260 R			lea	bx,fcb_copy		;point to 1st byte of fcb (drive num)  ;AC000;bgb
 032B  80 7F 01 20			cmp	byte ptr [bx+1],' '	; must specify file name
 032F  75 1A				jnz	drvok
 0331  80 3F 00				cmp	byte ptr [bx],0 ;or drive specifier
 0334  75 15				jnz	drvok
 0336  80 3E 02A4 R 01			cmp	dbcs_sw,1		; or dbcs				;an024;bgb
 033B  74 0E				jz	drvok								;an024;bgb
 033D				noname: 				;AC000;bgb
 033D  06				push	es
 033E  1F				pop	ds
 033F  8D 16 0000 E			lea	dx,baddrv		;AC000;bgb
 0343  E8 0000 E			call	display_interface	; AC000;bgb
 0346  58				pop	ax		 ;reset stack					;an024;bgb
 0347  58				pop	ax		 ;reset stack					;an024;bgb
 0348  EB 3C 90				jmp	int_23
				;****************************************************************************
				; we're finished with parsing here, do the main function of recover.
 034B				drvok:
 034B  E8 009D R			CALL	Prompt			;wait for user keystroke to begin ;AN000;bgb
 034E  E8 0156 R			call	get_dpb_info		;get device info		  ;AN000;bgb
 0351  E8 053A R			call	fill_fat		; fill fat table w/ null	  ;AN000;bgb
				;	$IF	C			;was there not enuff memory to run?	;an013;bgb
 0354  73 0A				JNC $$IF48
 0356  8D 16 0000 E			    lea     dx,no_mem_arg	;					;an013;bgb
 035A  E8 05BB R			    call    printerr							;an013;bgb
 035D  EB 4C 90				    jmp     rabort							;an013;bgb
				;	$ENDIF				;fat could be read from disk		;an013;bgb
 0360				$$IF48:
				
 0360  E8 00E9 R			call	readft			;   readft ();			  ;AN000;bgb
				;	$IF	C			; could the fat be read from disk? ;AN000;bgb
 0363  73 0A				JNC $$IF50
 0365  8D 16 0000 E			    lea     dx,FATErrRead	;					       ;AC000;bgb
 0369  E8 05BB R			    call    printerr
 036C  EB 3D 90				    jmp     rabort
				;	$ENDIF				;fat could be read from disk	   ;AN000;bgb
 036F				$$IF50:
 036F				See_If_File:				;					;AN000;
 036F  8D 1E 0102 R			lea	bx,fname_buffer 	;					;AC014;bgb
 0373  80 7F 01 3A			cmp	byte ptr [bx+1],':'	;if fname = 'a:' and.....		;ac020;bgb
				;	$IF	E,AND			    ;					;an020;bgb
 0377  75 0A				JNE $$IF52
 0379  39 6F 02				cmp	word ptr [bx+2],bp ;set to zero       ;all zeros following that, then	      ;an020
				;bgb
				;	$IF	E			;then drive spec			;AN202;BGB
 037C  75 05				JNE $$IF52
 037E  E8 06FB R			    call    drive_spec		;only drive specified ;AN000;bgb
				;	$ELSE				; file name specified ;AN000;bgb
 0381  EB 03				JMP SHORT $$EN52
 0383				$$IF52:
 0383  E8 03AC R			    call    file_spec ;file can be 'f' or 'a:,0,file' or 'a:file' or 'file.ext' ;an020;bgb
				;	$ENDIF						      ;AN000;bgb
 0386				$$EN52:
				
				
 0386  FB			int_23: sti				;allow interrupts			;an026;bgb
 0387  2E: C5 16 01B9 R			lds	dx,cs:dword ptr [int_24_old_off]     ;point to old vector	   ;an026;bgb
 038C  B0 24				mov	al,24h			;which interrupt to set?		;an026;bgb;AC000;
					DOS_Call Set_Interrupt_Vector	;set vector to old			;an026;bgb;AC000;
			     1							; 
 038E  B4 25                 1		mov	ah,Set_Interrupt_Vector			;				;AN000; 
 0390  CD 21                 1		int	21h				;				;AN000; 
			     1							; 
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-23
Set	up exception handlers                                   

 0392  2E: C5 16 01B5 R			lds	dx,cs:dword ptr [int_23_old_off]     ;point to old vector	;an026;bgb
 0397  B0 23				mov	al,23h			;which interrupt to set?		;an026;bgb;AC000;
					DOS_Call Set_Interrupt_Vector	;set vector to old			;an026;bgb;AC000;
			     1							; 
 0399  B4 25                 1		mov	ah,Set_Interrupt_Vector			;				;AN000; 
 039B  CD 21                 1		int	21h				;				;AN000; 
			     1							; 
				
 039D  0E				PUSH	CS			;reset ds				;an026;bgb
 039E  1F				POP	DS								;an026;bgb
				aSSUME	DS:DG									;an026;bgb
 039F  E8 0459 R			call	rest_dir
														;an026;bgb
 03A2  2E: C6 06 0186 R 00		mov	cs:ExitStatus,0 	   ; good return			   ;AC000;
 03A8  E9 0000 E			jmp	[exitpgm]						       ;an026;bgb
 03AB				rabort:
 03AB  C3				ret				;Return to RECINIT for exit		;AC000;
									; mov	  ah,exit
									; int	  21h
				
				
				;*************************************************************************
				; DO until either
				;*************************************************************************
				procedure file_spec,near				      ;AN000;bgb
			     1							; 
			     1	Public	file_spec				;				;AN000; 
 03AC                        1	file_spec    proc				;				;AN000; 
			     1							; 
				; try to open the file
 03AC  8D 16 0260 R		recfil: lea	dx,fcb_copy		;   if (FCBOpen (FCB) == -1) {		;AC000;bgb
 03B0  B4 0F				mov	ah,FCB_OPEN   ; function ofh = open
 03B2  CD 21				int	21h			;returns -1 in al if bad open
 03B4  3C FF				cmp	al,0ffh 		;was file opened ok?  ;AN000;bgb
				;	$IF	E			; no		 ;AN000;bgb
 03B6  75 1A				JNE $$IF55
				; display error msg
 03B8  8D 36 0261 R			    lea     si,FCB_Copy.fcb_name ;Point at filename in FCB	 ;	;AC000;bgb
 03BC  8D 3E 0102 R			    lea     di,Fname_Buffer	;Point at buffer		;	;AC000;bgb
 03C0  B9 000B				    mov     cx,FCB_Filename_Length ;Length of filename		   ;AN000;
 03C3  E8 0000 E			    call    Change_Blanks	;Convert DBCS blanks to SBCS	;AN000;
 03C6  E8 0000 E			    call    Build_String	;Build ASCIIZ string ending	;AN000;
 03C9  8D 16 0000 E			    lea     dx,opnerr		; AC000;SM	printf (Can't open);    ;AC000;bgb
 03CD  E8 0000 E			    call    display_interface	; AC000;bgb
				;ecfil0: $ELSE				;   LastFat = 1; ;AN000;bgb
 03D0				recfil0:
 03D0  EB 18				 JMP SHORT $$EN55
 03D2				$$IF55:
 03D2  E8 03EB R		f_exists:   call    process_file	;file was opend ok
 03D5  B4 0D			rexit1:     mov     ah,DISK_RESET
 03D7  CD 21				    int     21h
 03D9  E8 0117 R			    call    wrtfat		; save the fat
				;	    $IF     C			;Couldn't write it                       ;AN000;
 03DC  73 09				    JNC $$IF57
 03DE  8D 16 0000 E				lea	dx,FATErrWrite	;Just tell user he is in deep!		;AC000;bgb
 03E2  E8 0000 E				call	display_interface ;					;AN000;bgb
				;	    $ELSE
 03E5  EB 03				    JMP SHORT $$EN57
 03E7				$$IF57:
 03E7  E8 0000 E				call	report			    ;	report ();		;ac015;bgb
				;	    $ENDIF			;AN000;bgb;				;AN000;
 03EA				$$EN57:
				;	$ENDIF				;AN000;bgb
 03EA				$$EN55:
 03EA  C3				ret				;AN000;bgb
				endproc file_spec			    ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 03EB                        1	file_spec    ENDP 
				
				;*************************************************************************
				; DO until either
				;*************************************************************************
				Procedure process_file,Near		    ;				    ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-24
Set	up exception handlers                                   

			     1							; 
			     1	Public	process_file				;				;AN000; 
 03EB                        1	process_file    proc				;				;AN000; 
			     1							; 
 03EB				recfile0:
 03EB  C7 06 02A2 R 0001	    mov     lastfat,1			;set to 1 : means 1st fat read in
 03F1  8D 3E 0260 R		    lea     di,fcb_copy 		;   d = &FCB				;AC000;bgb
 03F5  8B 45 10			    mov     ax,[di].FCB_FilSiz		;55    siztmp = filsiz = d->filsiz;
 03F8  A3 029C R		    mov     filsiz,ax
 03FB  A3 0298 R		    mov     siztmp,ax
 03FE  8B 45 12			    mov     ax,[di].FCB_FilSiz+2	;00
 0401  A3 029E R		    mov     filsiz+2,ax
 0404  A3 029A R		    mov     siztmp+2,ax
				    SaveReg <ES,DI>			;   fatptr =
			     1	IRP reg,<ES,DI> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 0407  06                    2		PUSH    ES 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 0408  57                    2		PUSH    DI 
 0409  E8 0137 R		    call    sfFromFCB			;	sfFromFCB(d)->firclus;
 040C  26: 8B 45 0B		    mov     ax,ES:[DI].sf_firclus	; es:di +0b = 84
				    RestoreReg <DI,ES>
			     1	IRP reg,<DI,ES> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 0410  5F                    2		POP     DI 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 0411  07                    2		POP     ES 
 0412  A3 0288 R		    mov     fatptr,ax
 0415  0B C0			    or	    ax,ax			;   if (fatptr == 0)
				;   $IF     NZ				;AN000;bgb
 0417  74 37			    JZ $$IF61
				; read each fat in the file
				;	$DO				;Loop until entire file read in ;AN000;bgb
 0419				$$DO62:
 0419  8B 1E 0288 R			    mov     bx,fatptr		;Get current cluster
 041D  E8 0128 R			    call    fEOF		;Got to the end of the file?
				;	$LEAVE	C			;Yes if CY			;AN000;bgb
 0420  72 2E				JC $$EN62
 0422  E8 049D R		STOP_read:	call	Read_File	;Go read in the cluster
				;	    $IF     C			;CY indicates an error		;AN000;bgb
 0425  73 05				    JNC $$IF64
 0427  E8 04C6 R				call	Bad_File_Read	;Go play in the FAT
				;	    $ELSE			;Read cluster in okay		;AN000;bgb
 042A  EB 1B				    JMP SHORT $$EN64
 042C				$$IF64:
 042C  A1 0296 R				mov	ax,secsiz	;Get bytes/cluster
 042F  29 06 0298 R				sub	siztmp,ax	;Is size left < 1 cluster?
 0433  19 2E 029A R				sbb	siztmp+2,bp ;zero      ;
				;		$IF	C		;Yes				;AN000;bgb
 0437  73 08					JNC $$IF66
 0439  33 C0					    xor     ax,ax	;Set our running count to 0
 043B  A3 0298 R				    mov     siztmp,ax
 043E  A3 029A R				    mov     siztmp+2,ax
				;		$ENDIF			;AN000; 			;AN000;bgb
 0441				$$IF66:
 0441  A1 0288 R				mov	ax,fatptr	;The previous cluster is now
 0444  A3 02A2 R				mov	lastfat,ax	; the current cluster
				;	    $ENDIF			;AX has current cluster 	;AN000;bgb
 0447				$$EN64:
 0447  E8 001D R			    call    getfat		;Get the next cluster
 044A  89 1E 0288 R			    mov     fatptr,bx		;Save it
				;	$ENDDO				;Keep chasing the chain 	;AN000;bgb
 044E  EB C9				JMP SHORT $$DO62
 0450				$$EN62:
				;   $ENDIF				;All done with data		;AN000;bgb
 0450				$$IF61:
				; recover extended attributes							;an032;bgb
				;   SaveReg <ES,DI>			;Save regs			;AN000; ;an032;bgb
				;   call    sfFromFCB			;Get sf pointer 		;AN000; ;an032;bgb
				;   mov     ax,[di].sf_ExtCluster	;Look at extended attrib entry	;AN000; ;an032;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-25
Set	up exception handlers                                   

				;   cmp word ptr [di].sf_ExtCluster,bp ;zero   ;Is there extended attribs?     ;;an032;bgbAN000;
				;   $IF     NE				;Yes				;AN000; ;an032;bgb
				;	call	Read_File		;Try to read it in		;AN000; ;an032;bgb
				;	$IF	C			;CY means we couldn't           ;AN000; ;an032;bgb
				;	    mov word ptr [di].sf_ExtCluster,bp ;zero	     ;Off with its head!;an032;bgb;AN000;
				;	    and ES:[di].sf_flags,NOT devid_file_clean ; mark file dirty ;AN000; ;an032;bgb
				;	$ENDIF				;				;AN000; ;an032;bgb
				;   $ENDIF				;				;AN000; ;an032;bgb
				;   RestoreReg <DI,ES>			;				;AN000; ;an032;bgb
 0450  8D 16 0260 R		    lea     dx,fcb_copy 		;   close (FCB);		;AC000;bgb
 0454  B4 10			    mov     ah,FCB_CLOSE
 0456  CD 21			    int     21h 			;
				  return				;AN000;bgb
			     1	.xcref 
 0458                        1	??000B: 
 0458  C3                    1		RET 
 = 0458                      1	ret_l = ??000B 
			     1	.cref 
				endproc process_file			;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0459                        1	process_file    ENDP 
				
				;*************************************************************************
				;***************************************************************************
					break
			     1		SUBTTL   
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-26
                                                            

			     1		PAGE 
				;----- Restore INT 24 vector and old current directory -----------------;
				Procedure Rest_dir,Near 		;				;AN000;
			     1							; 
			     1	Public	Rest_dir				;				;AN000; 
 0459                        1	Rest_dir    proc				;				;AN000; 
			     1							; 
 0459  2E: 80 3E 00B8 R 00		cmp	cs:[fudge],0
				;	$IF	NE
 045F  74 14				JE $$IF71
 0461  B8 2524				    mov     ax,(set_interrupt_vector shl 8) or 24h
 0464  2E: C5 16 00B3 R			    lds     dx,cs:[hardch]
 0469  CD 21				    int     21h
 046B  0E				    push    cs
 046C  1F				    pop     ds
 046D  8D 16 00BD R			    lea     dx,userdir		    ; restore directory 		;AC000;bgb
 0471  B4 3B				    mov     ah,chdir
 0473  CD 21				    int     21h
				;	$ENDIF
 0475				$$IF71:
 0475				no_fudge:
 0475  8A 16 0094 R			mov	dl,old_drive		; restore old current drive		;an008;bgb
 0479  B4 0E				mov	ah,set_default_drive
 047B  CD 21				int	21h
 047D  C3				ret
				endproc rest_dir
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 047E                        1	rest_dir    ENDP 
				
				;;----- INT 24 Processing -----------------------------------------------;
				;*************************************************************************
 047E  0492 R				int_24_retaddr dw int_24_back
				
 0480					int_24	proc	far
					assume	ds:nothing,es:nothing,ss:nothing
 0480  9C				pushf				; ** MAKE CHANGES **
 0481  0E				push	cs
 0482  2E: FF 36 047E R			push	[int_24_retaddr]
 0487  2E: FF 36 00B5 R			push	word ptr [hardch+2]
 048C  2E: FF 36 00B3 R			push	word ptr [hardch]
					assume	ds:dg,es:dg,ss:dg	;AN000;bgb
 0491  CB				ret
				endproc int_24
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0492                        1	int_24    ENDP 
				;*************************************************************************
 0492				int_24_back:
 0492  3C 02				cmp	al,2			; abort?
 0494  75 06				jnz	ireti
 0496  0E				push	cs
 0497  1F				pop	ds
				assume	ds:dg,es:dg,ss:dg
 0498  E8 0459 R			call	rest_dir
 049B  C3				ret				;Ret for common exit	     ;AC000;
 049C				ireti:
 049C  CF				iret
				
					break	< read in a cluster of the file>
			     1		SUBTTL   read in a cluster of the file 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-27
read in a cluster of the file                               

			     1		PAGE 
				;****************************************************************************
				; READ_FILE
				;Read in cluster of file.
				;
				; Input: Secall = sectors/cluster
				;	 FatPtr = cluster to read
				;	 Firrec = Start of data area - always in first 32mb of partition
				;	 dx	= offset of fcb_copy ???
				;
				; Output: CY set if error on read on ret
				;	  DI = pointer to FCB
				;*****************************************************************************
				Procedure Read_File,Near		;				;AN000;
			     1							; 
			     1	Public	Read_File				;				;AN000; 
 049D                        1	Read_File    proc				;				;AN000; 
			     1							; 
 049D  8B 0E 028A R			mov	cx,secall   ;2		;if (aread((fatptr-2)*secall+firrec) == -1) {
 04A1  A1 0288 R			mov	ax,fatptr   ;84 	;cluster number to read
 04A4  2D 0002				sub	ax,2	    ;ax=82	; -1 ;AN000;bgb
 04A7  F7 E1				mul	cx	    ;ax=104	; sectors/clus * (clus-2)
 04A9  03 06 0290 R			add	ax,firrec   ;ax=110	; plus beg of data area
 04AD  13 D5				adc	dx,bp	    ;0		;Handle high word of sector	      ;AN000;
 04AF  89 16 02AC R			mov	Read_Write_Relative.Start_Sector_High,dx ;Start sector		      ;AN000;
 04B3  8B D0				mov	dx,ax	    ;110	;clus-2
 04B5  8E 06 02BA R			mov	es,table    ;2b62	;segment of area past fat table 	;an005;bgb
 04B9  33 DB				xor	bx,bx			;es:bx --> dir/file area		;an005;bgb
 04BB  A0 00BA R			mov	al,drive    ;0		;drive num  ;AN000;bgb
 04BE  E8 0000 E			call	Read_Disk		;	    ;					    ;AC000;
 04C1  8D 3E 0260 R			lea	di,fcb_copy		;					;AC000;bgb
 04C5  C3				ret				;				;AN000;
				endproc Read_File			    ;				    ;AN000;
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 04C6                        1	Read_File    ENDP 
				
				
					break	< found a bad cluster in the file >
			     1		SUBTTL   found a bad cluster in the file  
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-28
found a bad cluster in the file                             

			     1		PAGE 
				;*************************************************************************
				;Play around with the FAT cluster chain, by marking the cluster that failed
				;to read as bad. Then point the preceding cluster at the one following it.
				;Special case if there is only one cluster, than file gets set to zero
				;length with no space allocated.
				;
				; Input: FatPtr = Cluster that failed to read
				;	 LastFat = Previous cluster, equals 1 if first cluster
				;
				; Output: AX = previous cluster
				;	  File size = file size - cluster size ( = 0 if cluster size > file)
				;***************************************************************************
				Procedure Bad_File_Read,Near
			     1							; 
			     1	Public	Bad_File_Read				;				;AN000; 
 04C6                        1	Bad_File_Read    proc				;				;AN000; 
			     1							; 
 04C6  A1 0288 R			mov	ax,fatptr		;Get current cluster
 04C9  E8 001D R			call	getfat			;Get the next cluster in BX
 04CC  83 3E 02A2 R 01			cmp	lastfat,1		;Is this the first entry?
				;	$IF	E			;Yes				      ;AC000;
 04D1  75 16				JNE $$IF73
 04D3  E8 0128 R			    call    fEOF		;Is the next the last cluster?
				;	    $IF     C			;Yes				      ;AC000;
 04D6  73 02				    JNC $$IF74
 04D8  33 DB					xor	bx,bx		;Need to zero out first cluster
				;	    $ENDIF			; because the first one is bad!       ;AN000;
 04DA				$$IF74:
					    SaveReg <ES,DI,BX>		;Save some info
			     1	IRP reg,<ES,DI,BX> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 04DA  06                    2		PUSH    ES 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 04DB  57                    2		PUSH    DI 
 = 0003                      2		?stackdepth = ?stackdepth + 1 
 04DC  53                    2		PUSH    BX 
 04DD  E8 0137 R			    call    sfFromFCB		;Get pointer to sf table
					    RestoreReg <BX>		;Get back clus to point to
			     1	IRP reg,<BX> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0002                      2		?stackdepth = ?stackdepth - 1 
 04E0  5B                    2		POP     BX 
 04E1  26: 89 5D 0B			    mov     ES:[DI].sf_firclus,BX ;Skip offending cluster
					    RestoreReg <DI,ES>		;Get back regs
			     1	IRP reg,<DI,ES> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 04E5  5F                    2		POP     DI 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 04E6  07                    2		POP     ES 
				;	$ELSE				;Not first entry in chain	;AC000;
 04E7  EB 08				JMP SHORT $$EN73
 04E9				$$IF73:
 04E9  8B D3				    mov     dx,bx		;DX = next cluster
 04EB  A1 02A2 R			    mov     ax,lastfat		;AX = Previous cluster
 04EE  E8 0054 R			    call    setfat  ;prev fat points to next fat
									; offending cluster
				;	$ENDIF				; Ta-Da!			;AN000;
 04F1				$$EN73:
 04F1  A1 0288 R			mov	ax,fatptr		;Get the offending cluster
 04F4  BA FFF7				mov	dx,0fff7h		;Mark it bad
 04F7  E8 0054 R			call	setfat			;Never use it again!
 04FA  A1 0296 R			mov	ax,secsiz		;Get bytes/sector
 04FD  39 2E 029A R			cmp	siztmp+2,bp		;Is file  < 32mb long?
				;	$IF	NE,AND			;     and			;AC000;
 0501  74 09				JE $$IF78
 0503  39 06 0298 R			cmp	siztmp,ax		;Shorter than cluster size?
				;	$IF	BE			;Yes				;AC000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-29
found a bad cluster in the file                             

 0507  77 03				JNBE $$IF78
 0509  A1 0298 R			    mov     ax,siztmp		;File size = smaller of the two
				;	$ENDIF				;AN000;
 050C				$$IF78:
					SaveReg <ES,DI> 		;Save regs
			     1	IRP reg,<ES,DI> 
			     1		?stackdepth = ?stackdepth + 1 
			     1		PUSH    reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth + 1 
 050C  06                    2		PUSH    ES 
 = 0002                      2		?stackdepth = ?stackdepth + 1 
 050D  57                    2		PUSH    DI 
 050E  E8 0137 R			call	sfFromFCB		;Get sf pointer
 0511  26: 29 45 11		sfsize: sub	word ptr ES:[di].sf_size,ax ;Adjust internal file sizes
 0515  26: 19 6D 13			sbb	word ptr ES:[di].sf_size+2,bp ;   "  "	 "  "
 0519  29 06 0298 R			sub	siztmp,ax		;Keep track of how much done
 051D  19 2E 0298 R			sbb	siztmp,bp		 ;
 0521  26: 83 65 05 BF			and	ES:[di].sf_flags,NOT devid_file_clean ; mark file dirty
					RestoreReg <DI,ES>		;	    sfFromFCB(d)->flags &= ~CLEAN;
			     1	IRP reg,<DI,ES> 
			     1		?stackdepth = ?stackdepth - 1 
			     1		POP     reg 
			     1	ENDM 
 = 0001                      2		?stackdepth = ?stackdepth - 1 
 0526  5F                    2		POP     DI 
 = 0000                      2		?stackdepth = ?stackdepth - 1 
 0527  07                    2		POP     ES 
 0528  8D 3E 0260 R			lea	di,fcb_copy
 052C  29 45 10				sub	word ptr [di].fcb_filsiz,ax ;And change the FCB
 052F  19 6D 12				sbb	word ptr [di].fcb_filsiz+2,bp ;
 0532  80 65 1A BF			and	byte ptr [di].fcb_nsl_bits,NOT devid_file_clean ; mark file dirty	  ;AN000;
 0536  A1 02A2 R			mov	ax,lastfat		;AX = previous cluster
 0539  C3				ret				;				      ;AN000;
				endproc Bad_File_Read			    ;				    ;AN000;
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 053A                        1	Bad_File_Read    ENDP 
				
				
				;*****************************************************************************	;an005;bgb
				; description: fill the fat table in memory with the 'E5' character		;an005;bgb
				;										;an005;bgb
				; called from: main-routine							;an005;bgb
				;										;an005;bgb
				;Change History: Created	8/7/87	       bgb				;an005;bgb
				;										;an005;bgb
				;Input: bytes-per-sector							;an005;bgb
				;	fatsiz									;an005;bgb
				;	maxent									;an005;bgb
				;										;an005;bgb
				;Output: ram-based fat table							;an005;bgb
				;										;an005;bgb
				; LOGIC 									;an005;bgb
				;----------									;an005;bgb
				;	calc number of para in fat table					;an005;bgb
				;	    = bytes-per-sector / 16 * sectors-per-fat				;an005;bgb
				;	calc segment of directory area in memory				;an005;bgb
				;	    = fat-table offset + length of fat-table				;an005;bgb
				;	calc number of para in directory					;an005;bgb
				;	    = entries-per-directory * bytes-per-entry / 16			;an005;bgb
				;	do for each para							;an005;bgb
				;	   move 16 bytes into memory						;an005;bgb
				;*****************************************************************************	;an005;bgb
					  even
				Procedure fill_fat,Near 		;AN000;bgb				;an005;bgb
			     1							; 
			     1	Public	fill_fat				;				;AN000; 
 053A                        1	fill_fat    proc				;				;AN000; 
			     1							; 
				; calc fat table length 							;an005;bgb
					set_data_segment							;an005;bgb
 053A  50                    1		push	ax 
 053B  B8 ---- R             1		mov	ax,dg				;Point to data segment 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-30
found a bad cluster in the file                             

 053E  8E D8                 1		mov	ds,ax				; 
			     1	assume	ds:dg,es:dg 
 0540  1E                    1		push	ds 
 0541  07                    1		pop	es 
 0542  58                    1		pop	ax 
 0543  A1 0294 R			mov	ax,bytes_per_sector	; bytes per sector			;an005;bgb
 0546  33 D2				xor	dx,dx								;an005;bgb
 0548  BB 0010				mov	bx,16								;an005;bgb
 054B  F7 F3				div	bx			; paras per sector			;an005;bgb
 054D  8B 0E 0284 R			mov	cx,fatsiz		;2	   ; get sectors per fat	;an005;bgb
 0551  33 D2				xor	dx,dx								;an005;bgb
 0553  F7 E1				mul	cx			; paras per fat 			;an005;bgb
 0555  A3 0088 R			mov	paras_per_fat,ax	;length of fat in paragraphs		;an005;bgb
				; calc dir area addr								;an005;bgb
 0558  8C C3				mov	bx,es
 055A  03 C3				add	ax,bx			;seg of dir area			;an005;bgb
 055C  8E C0				mov	es,ax
 055E  8D 1E 0000 R			lea	bx,fattbl		;off					;an005;bgb
 0562  E8 0000 E			call	seg_adj 		;seg:off = seg:0000			;an005;bgb
 0565  8C 06 02BA R			mov	table,es		;segment of beginning of fat table	;an005;bgb
				; calc dir area length								;an005;bgb
 0569  A1 028E R			mov	ax,maxent		;ax= max dir entries			;an005;bgb
 056C  BB 0020				mov	bx,32			; 32 bytes per dir entry		;an005;bgb
 056F  33 D2				xor	dx,dx								;an005;bgb
 0571  F7 E3				mul	bx			; bytes per dir 			;an005;bgb
 0573  33 D2				xor	dx,dx			;zero out for divide			;an005;bgb
 0575  BB 0010				mov	bx,16			;divide by bytes per para		;an005;bgb
 0578  F7 F3				div	bx			;paras per dir				;an005;bgb
				; calc total length to fill							;an005;bgb
 057A  03 06 0088 R			add	ax,paras_per_fat ;paras/fat + paras/dir = total paras		;an005;bgb
				; see if we have enough memory							;an013;bgb
 057E  50			    push    ax									;an013;bgb
 057F  1E			    push    ds				;save ds reg				;an013;bgb
 0580  8C C3			    mov     bx,es
 0582  03 C3			    add     ax,bx			;add in starting seg of fat table	;an013;bgb
 0584  40			    inc     ax				; one more to go past our area		;an013;bgb
				    DOS_Call GetCurrentPSP		;Get PSP segment address		;an013;bgb
			     1							; 
 0585  B4 62                 1		mov	ah,GetCurrentPSP			;				;AN000; 
 0587  CD 21                 1		int	21h				;				;AN000; 
			     1							; 
 0589  8E DB			    mov     ds,bx			;ds points to the psp			;an013;bgb
				    Assume  DS:Nothing			;point to psp				;an013;bgb
 058B  8B 16 0002		    MOV     DX,DS:[2]			;get the last para of memory		;an013;bgb
 058F  1F			    pop     ds									;an013;bgb
				    assume  ds:dg
 0590  3B D0			    cmp     dx,ax		     ;last-para must be greater or equal	;an013;bgb
				;   $IF     AE		;it was, so complete filling the fat			;an013;bgb
 0592  72 24			    JNAE $$IF80
 0594  58				pop	ax								    ;an013;bgb
				;fill each para 								;an005;bgb
 0595  1E				push	ds
 0596  07				pop	es
 0597  8D 1E 0000 R			lea	bx,fattbl		; es:di = point to beg of fat table	;an005;bgb
 059B  E8 0000 E			call	seg_adj
 059E  8B FB				mov	di,bx
 05A0  8B D8				mov	bx,ax			;total number of paras to do		;an005;bgb
 05A2  B8 E5E5				mov	ax,0e5e5h		;fill characters  Fill (d, 16*dirent, 0xe5e5);;an005;bgb
				;	$DO				;do for each para			;an005;bgb
 05A5				$$DO81:
 05A5  B9 0008				   mov	   cx,8 		   ; number of times to repeat		;an005;bgb
 05A8  33 FF				   xor	   di,di		;bump addr pointers by 16 bytes -
 05AA  F3/ AB				   rep	   stosw		   ; mov 2 bytes, 1 ea for 16 * num-of-entries	;an005;bgb
 05AC  4B				   dec	   bx			;loop counter				;an005;bgb
				;	$LEAVE	 Z			;until zero				;an005;bgb
 05AD  74 07				JZ $$EN81
 05AF  8C C2				   mov	   dx,es		;since we move more than 64k total, we
 05B1  42				   inc	   dx			;have to bump es by 1 para, keeping
 05B2  8E C2				   mov	   es,dx		;di at zero
				;	$ENDDO									;an005;bgb
 05B4  EB EF				JMP SHORT $$DO81
 05B6				$$EN81:
				;   $ELSE			     ;not enough memory 			;an013;bgb
 05B6  EB 02			    JMP SHORT $$EN80
 05B8				$$IF80:
 05B8  58				pop ax									;an013;bgb
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-31
found a bad cluster in the file                             

 05B9  F9				stc			     ;set carry flag indicating badddd!!!	;an013;bgb
				;   $ENDIF									;an013;bgb
 05BA				$$EN80:
				    return			    ;AN000;bgb				    ;an005;bgb
			     1	.xcref 
 05BA                        1	??000C: 
 05BA  C3                    1		RET 
 = 05BA                      1	ret_l = ??000C 
			     1	.cref 
				endproc fill_fat			;AN000;bgb				;an005;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 05BB                        1	fill_fat    ENDP 
				;
				
				;
				
				;*****************************************************************************
				;*****************************************************************************
				Procedure printerr,Near 		;AN000;bgb
			     1							; 
			     1	Public	printerr				;				;AN000; 
 05BB                        1	printerr    proc				;				;AN000; 
			     1							; 
 05BB  0E				push	cs
 05BC  1F				pop	ds
 05BD  52				PUSH	DX			; Save message pointer
 05BE  8A 16 00B9 R			mov	dl,[user_drive] 	; restore old current drive
 05C2  B4 0E				mov	ah,set_default_drive
 05C4  CD 21				int	21h
 05C6  5A				POP	DX
 05C7  E8 0000 E			call	display_interface	; AC000;bgb
 05CA  B0 FF				mov	al,0ffh 		;   erc = 0xFF;
 05CC  C3				ret				;AN000;bgb
				endproc printerr			    ;AN000;bgb		  ;AN000;
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 05CD                        1	printerr    ENDP 
				
				
				;*************************************************************************
				; CHK_FAT:
				;
				; inputs:  AX - last fat number for a file
				;	   CX - bytes per cluster
				;*************************************************************************
				Procedure chk_fat,Near			;				;AN000;bgb
			     1							; 
			     1	Public	chk_fat				;				;AN000; 
 05CD                        1	chk_fat    proc				;				;AN000; 
			     1							; 
 05CD  06				push es
 05CE  89 2E 029C R		step1a: mov	filsiz,bp		 ;start the file size at 0
 05D2  89 2E 029E R			mov	word ptr filsiz+2,bp	 ;start the file size at 0
 05D6  8B 16 02A0 R			mov	dx,MaxClus		;	dx = MaxClus;
 05DA  A3 028C R			mov	target,ax		; target = last fat in this file
 05DD  89 2E 0092 R			mov	exit_sw2,bp ;false	; set exit switch to no
				;	$DO	COMPLEX 		; DO until exit 		 ;AN000;bgb
 05E1  EB 03				JMP SHORT $$SD86
 05E3				$$DO86:
 05E3  A3 028C R			    mov     target,ax		;    do this 2+ times around
				;	$STRTDO 			;    START here 1st time	 ;AN000;bgb
 05E6				$$SD86:
 05E6  01 0E 029C R		step2:	    add     filsiz,cx		;add in cluster size
 05EA  11 2E 029E R			    adc     word ptr filsiz+2,bp ;inc 2nd word if there was a carry
 05EE  B8 0002				    mov     ax,2		;start at first cluster
				;	    $DO 			;DO until exit		     ;AN000;bgb
 05F1				$$DO88:
 05F1  E8 001D R		Step3:		call	getfat		;   bx= contents of fat cell
 05F4  3B 1E 028C R				cmp	bx,target	;   reached the end of file yet?
				;	    $LEAVE   E			;   yes - return to outer loop;AN000;bgb
 05F8  74 12				    JE $$EN88
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-32
found a bad cluster in the file                             

 05FA  40			step4:		inc	ax		;   no - inc target
 05FB  3B C2					cmp	ax,dx		;	target > max-clusters?
				;		$IF	NBE		;	yes			 ;AN000;bgb
 05FD  76 06					JBE $$IF90
 05FF  C7 06 0092 R FFFF			    mov     exit_sw2,true ;	      request exit both loops
				;		$ENDIF			;				 ;AN000;bgb
 0605				$$IF90:
 0605  83 3E 0092 R FF				cmp	exit_sw2,true	 ;	 exit requested?
				;	    $ENDDO  E			;    $ENDDO if exit requested	 ;AN000;bgb
 060A  75 E5				    JNE $$DO88
 060C				$$EN88:
 060C  83 3E 0092 R FF		endlop2:    cmp     exit_sw2,true	 ;    outer loop test- exit requested?
				;	$ENDDO	E			; ENDDO if exit requested	 ;AN000;bgb
 0611  75 D0				JNE $$DO86
 0613  07				pop es				;	else- go do mov target,ax
 0614  C3				ret								 ;AN000;bgb
				endproc chk_fat 						     ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0615                        1	chk_fat    ENDP 
				
				
				;*****************************************************************************
				;*****************************************************************************
 0615  90				  even
				Procedure main_loop1,Near		;AN000;bgb
			     1							; 
			     1	Public	main_loop1				;				;AN000; 
 0616                        1	main_loop1    proc				;				;AN000; 
			     1							; 
				;	$DO				;AN000;bgb
 0616				$$DO94:
 0616  E8 0657 R			    call    read_fats		;inner loop AN000;bgb
 0619  83 3E 0090 R FF			    cmp     exit_sw,true	; 1st way out of loop - fatptr>maxclus
				;	$LEAVE	E			;  goto step7		     AN000;bgb
 061E  74 36				JE $$EN94
 0620  E8 05CD R			    call    chk_fat		; ended read_fats on carry from feof
				; at this point target = head of list, filsiz = file size
 0623  FF 06 0280 R		step4a:     inc     filcnt		;   filcnt++;
 0627  A1 028E R			    mov     ax,maxent		;   if (filcnt > maxent)
 062A  39 06 0280 R			    cmp     filcnt,ax		; more files than possible dir entries?
				;	    $IF     A			; yes - this is an error	       ;AN000;bgb
 062E  76 11				    JNA $$IF96
 0630  FF 0E 0280 R		direrr: 	dec	filcnt
 0634  8D 16 0000 E				lea	dx,dirmsg	;						   ;AC000;bg
				b
 0638  E8 0000 E				call	display_interface ;					;an006;bgb
 063B  C7 06 0090 R FFFF			mov	exit_sw,true
				;	    $ENDIF			;AN000;bgb
 0641				$$IF96:
 0641  83 3E 0090 R FF		nodirerr:   cmp     exit_sw,true
				;	$LEAVE	E			;AN000;bgb
 0646  74 0E				JE $$EN94
 0648  E8 068C R			    call    fill_dir
 064B  A1 0288 R			    mov     ax,fatptr
 064E  3B 06 02A0 R			    cmp     ax,MaxClus
				;	$LEAVE	A			;AN000;bgb
 0652  77 02				JA $$EN94
				;ndlop1: $ENDDO 			 ;AN000;bgb
 0654				endlop1:
 0654  EB C0				 JMP SHORT $$DO94
 0656				$$EN94:
 0656  C3				ret								;AN000;bgb
				endproc main_loop1			    ;				    ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 0657                        1	main_loop1    ENDP 
				
				
				;*****************************************************************************
				; purpose: this procedure looks at all the fats for a particular file, until
				;	   the end of file marker is reached. then returns
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-33
found a bad cluster in the file                             

				; inputs:  AX = fat cell number 2
				; outputs: if any of the
				;*****************************************************************************
				Procedure read_fats,Near	       ;AN000;bgb
			     1							; 
			     1	Public	read_fats				;				;AN000; 
 0657                        1	read_fats    proc				;				;AN000; 
			     1							; 
 0657  06				push es
 0658  89 2E 029C R			mov	filsiz,bp		 ;start the file size at 0		;an027;bgb
 065C  89 2E 029E R			mov	word ptr filsiz+2,bp	 ;start the file size at 0		;an027;bgb
				;	$DO				;AN000;bgb
 0660				$$DO101:
 0660  E8 001D R		step1:	    call    getfat		;   if (fEOF (GetFat (a)) {
 0663  01 0E 029C R			    add     filsiz,cx		;add in cluster size			;an027;bgb
 0667  11 2E 029E R			    adc     word ptr filsiz+2,bp ;inc 2nd word if there was a carry	;an027;bgb
 066B  E8 0128 R			    call    fEOF		;
				;	$LEAVE	C			; goto step1a		       AN000;bgb
 066E  72 1A				JC $$EN101
 0670  FF 06 0288 R		step6:	    inc     fatptr		;   if (++fatptr <= MaxClus)
 0674  A1 0288 R			    mov     ax,fatptr
 0677  3B 06 02A0 R			    cmp     ax,MaxClus
				;	    $IF     A			;AN000;bgb
 067B  76 06				    JNA $$IF103
 067D  C7 06 0090 R FFFF			mov	exit_sw,true
				;	    $ENDIF			;AN000;bgb
 0683				$$IF103:
 0683  83 3E 0090 R FF			    cmp     exit_sw,true	; time to end?		      ;AN000;bgb
				;	$ENDDO	E			;	goto step7	      ;AN000;bgb
 0688  75 D6				JNE $$DO101
 068A				$$EN101:
 068A  07				pop es
 068B  C3				ret				;AN000;bgb
				endproc read_fats			   ;				   ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 068C                        1	read_fats    ENDP 
				
				;*****************************************************************************
				;*****************************************************************************
					even
				Procedure fill_dir,Near ;AN000;bgb
			     1							; 
			     1	Public	fill_dir				;				;AN000; 
 068C                        1	fill_dir    proc				;				;AN000; 
			     1							; 
 068C  8D 36 0247 R			lea	si,dirent+7		;   s = &dirent[7];				  ;AC000;bgb
				;	$DO				;AN000;bgb
 0690				$$DO106:
 0690  FE 04			nam0:	    inc     byte ptr [si]	;   while (++*s > '9')
 0692  80 3C 39				    cmp     byte ptr [si],'9'
				;	$LEAVE	LE			;AN000;bgb
 0695  7E 06				JLE $$EN106
 0697  C6 04 30				    mov     byte ptr [si],'0'	;	*s-- = '0';
 069A  4E				    dec     si
				;	$ENDDO							     ;AN000;bgb
 069B  EB F3				JMP SHORT $$DO106
 069D				$$EN106:
 069D  B4 2A			nam1:	mov	ah,GET_DATE		;   dirent.dir_date = GetDate ();
 069F  CD 21				int	21h
 06A1  81 E9 07BC			sub	cx,1980 		; cx = 87
 06A5  02 F6				add	dh,dh			; dh = 1-12
 06A7  02 F6				add	dh,dh
 06A9  02 F6				add	dh,dh
 06AB  02 F6				add	dh,dh
 06AD  02 F6				add	dh,dh			; dh = dh * 32 (32-384)
 06AF  D0 D1				rcl	cl,1
 06B1  0A F2				or	dh,dl
 06B3  88 36 0258 R			mov	byte ptr dirent+24,dh
 06B7  88 0E 0259 R			mov	byte ptr dirent+25,cl
 06BB  B4 2C				mov	ah,GET_TIME		;   dirent.dir_time = GetTime ();
 06BD  CD 21				int	21h
 06BF  D0 EE				shr	dh,1			;seconds/2
 06C1  02 C9				add	cl,cl			;minutes
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-34
found a bad cluster in the file                             

 06C3  02 C9				add	cl,cl
 06C5  02 C9				add	cl,cl			;mins * 8
 06C7  D0 D5				rcl	ch,1
 06C9  02 C9				add	cl,cl
 06CB  D0 D5				rcl	ch,1
 06CD  02 C9				add	cl,cl
 06CF  D0 D5				rcl	ch,1
 06D1  0A F1				or	dh,cl
 06D3  88 36 0256 R			mov	byte ptr dirent+22,dh
 06D7  88 2E 0257 R			mov	byte ptr dirent+23,ch
 06DB  A1 029C R			mov	ax,filsiz		;   dirent.dir_fsize = filsiz;
 06DE  A3 025C R			mov	word ptr dirent+28,ax
 06E1  A1 029E R			mov	ax,word ptr filsiz+2
 06E4  A3 025E R			mov	word ptr dirent+30,ax
 06E7  A1 028C R			mov	ax,target		;   dirent.dir_firclus = target;
 06EA  A3 025A R			mov	word ptr dirent+26,ax
 06ED  8D 36 0240 R			lea	si,dirent		; di:si --> directory entry		;an005;bgb
 06F1  B9 0020				mov	cx,32			;move 32 bytes - 1 dir entry		;an005;bgb
 06F4  F3/ A4				rep	movsb			;move ds:si to es:di, then		;an005;bgb
									;inc di and inc si			;an005;bgb
 06F6  FF 06 0288 R			inc	fatptr			;   if (++fatptr <= MaxClus)
 06FA  C3				ret				;AN000;bgb
				endproc fill_dir			   ;				   ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
			     1		ENDIF 
 06FB                        1	fill_dir    ENDP 
				;
				;*****************************************************************************
				; DRIVE_SPEC -	this procedure is executed if the user only specifies a drive
				;		letter to recover.
				;*****************************************************************************
				Procedure drive_spec,Near		;AN000;bgb
			     1							; 
			     1	Public	drive_spec				;				;AN000; 
 06FB                        1	drive_spec    proc				;				;AN000; 
			     1							; 
 06FB  33 FF			recdsk: xor	di,di			;init addr of dir/file area		;an005;bgb
 06FD  8E 06 02BA R			mov	es,table		;es:di --> area 			;an005;bgb
							 ;this addr is incremented by the rep movsb in fill_dir ;an005;bgb
 0701  C7 06 0288 R 0002		mov	fatptr,2		;INIT FATPTR	 ;   a = fatPtr = 2;
 0707  A1 0288 R			mov	ax,fatptr		;
 070A  89 2E 0090 R			MOV	exit_sw,bp ; false	; default to continue looping until true
 070E  E8 0616 R			call	main_loop1
 0711  A0 00BA R		step7:	mov	al,drive		;AN000;bgb
 0714  8B 16 0292 R			mov	dx,firdir		; write out constructed directory
 0718  8B 0E 0290 R			mov	cx,firrec
 071C  2B CA				sub	cx,dx
 071E  33 DB				xor	bx,bx			;addr of dir area			;an005;bgb
 0720  8E 06 02BA R			mov	es,table		;seg of dir area			;an005;bgb
 0724  E8 0000 E			call	Write_Disk
				;	$IF	NC			;good write?				;an015;bgb
 0727  72 0F				JC $$IF109
 0729  8D 16 0000 E			    lea     dx,recmsg		    ;						      ;AC000
				;bgb
 072D  8B 36 0280 R			    mov     si,filcnt
 0731  89 36 009D R			    mov     rec_num,si
 0735  E8 0000 E			    call    display_interface	    ; AC000;bgb
				;	$ENDIF									;an015;bgb
 0738				$$IF109:
 0738  B4 0D			rexit2: mov	ah,DISK_RESET
 073A  CD 21				int	21h
 073C  E8 0117 R			call	wrtfat			; save the fat
				;	$IF	C			;Couldn't write it              ;AN000;bgb         ;AN000;bg
				b
 073F  73 07				JNC $$IF111
 0741  8D 16 0000 E			    lea     dx,FATErrWrite	;Just tell user he is in deep!		;    ;AC000;bgb
 0745  E8 0000 E			    call    display_interface	;					;AN000;bgb
				;	$ENDIF				;				;AN000;bgb	  ;AN000;bgb
 0748				$$IF111:
 0748  C3				ret								;AN000;bgb
				endproc drive_spec			    ;				    ;AN000;bgb
			     1		IFDIF   <>,<NoCheck>       ; 
			     1		IF2 
			     1		ENDIF 
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-35
found a bad cluster in the file                             

			     1		ENDIF 
 0749                        1	drive_spec    ENDP 
				;
					pathlabl recover
				
				include msgdcl.inc
			     C	; This Macro was removed from sysmsg.inc. We had to remove this
			     C	; macro and put it into it's own include file in order to clear up
			     C	; some assembly errors. MS MASM will not allow a public declaration
			     C	; during the second pass of the assembler. IBM MASM will allow this.
			     C	;
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;;	$M_DECLARE	     Macro
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C					       ;
			     C	$M_DECLARE    macro	numcls	       ;
			     C	   $M_DCOUNT = 0		       ;
			     C	   REPT  numcls 		       ;
			     C	     $M_DCOUNT =  $M_DCOUNT + 1        ;
			     C	     $M_DECLARE2  %$M_DCOUNT	       ;
			     C	   ENDM 			       ;
			     C	
			     C	  IF COMR
			     C	    IFNDEF $M_RT2			;  If Resident table is not in this assembly,
			     C		EXTRN	$M_RT2:BYTE		;     Must be external
			     C	    ELSE
			     C		PUBLIC	$M_RT2
			     C	    ENDIF				;
			     C	  ELSE
			     C	    IFNDEF $M_RT			;  If Resident table is not in this assembly,
			     C		EXTRN	$M_RT:BYTE		;     Must be external
			     C	    ELSE
			     C		PUBLIC	$M_RT
			     C	    ENDIF				;
			     C	  ENDIF
			     C	
			     C	  $M_CHECK $M_GET_MSG_ADDRESS	      ;  If this subroutine is not in this assembly,
			     C	  $M_CHECK $M_MSGSERV_1 	      ;  If this subroutine is not in this assembly,
			     C	  $M_CHECK $M_MSGSERV_2 	      ;  If this subroutine is not in this assembly,
			     C	
			     C	ENDM				       ;
			     C					       ;
			     C	$M_DECLARE2   macro   innum	       ;
			     C	  IF NOT COMR			       ; IF Not resident COMMAND.COM
			     C	    IF NOT COMT 			 ; IF Not transient COMMAND.COM
			     C	      IFNDEF  $M_CLS_&innum		 ; IF class is not in this assembly,
			     C		IF	FARmsg			 ;
			     C		  EXTRN   $M_CLS_&innum:FAR	 ;    Must be external
			     C		ELSE				 ;
			     C		  EXTRN   $M_CLS_&innum:NEAR	 ;    Must be external
			     C		ENDIF				 ;
			     C	      ELSE				 ; ELSE
			     C		PUBLIC	$M_CLS_&innum		 ;    Label PUBLIC
			     C	      ENDIF				 ;
			     C	    ELSE				 ; ELSE
			     C	      IFDIF  <$M_CLS_&innum>,<$M_CLS_1>  ; IF NOT $M_CLS_1 or
			     C		IFDIF <$M_CLS_&innum>,<$M_CLS_2> ;   IF NOT $M_CLS_2 then
			     C		  IFNDEF  $M_CLS_&innum 	 ;     IF class is not in this assembly,
			     C		    IF	    FARmsg		 ;
			     C		      EXTRN   $M_CLS_&innum:FAR  ;	 Must be external
			     C		    ELSE			 ;
			     C		      EXTRN   $M_CLS_&innum:NEAR ;	 Must be external
			     C		    ENDIF			 ;
			     C		  ELSE				 ;     ELSE
			     C		    PUBLIC  $M_CLS_&innum	 ;	 Label PUBLIC
			     C		  ENDIF 			 ;
			     C		ENDIF				 ;
			     C	      ENDIF				 ;
			     C	    ENDIF				 ;
			     C	  ELSE					 ; ELSE
			     C	    IFDIF  <$M_CLS_&innum>,<$M_CLS_1>	 ; IF NOT $M_CLS_1 or
			     C	      IFDIF <$M_CLS_&innum>,<$M_CLS_2>	 ;   IF NOT $M_CLS_2 then
			     C		IFNDEF	$M_CLS_&innum		 ;     IF class is not in this assembly,
			     C		  IF	  FARmsg		 ;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Page     1-36
found a bad cluster in the file                             

			     C		    EXTRN   $M_CLS_&innum:FAR	 ;	 Must be external
			     C		  ELSE				 ;
			     C		    EXTRN   $M_CLS_&innum:NEAR	 ;	 Must be external
			     C		  ENDIF 			 ;
			     C		ELSE				 ;     ELSE
			     C		  PUBLIC  $M_CLS_&innum 	 ;	 Label PUBLIC
			     C		ENDIF				 ;
			     C	      ENDIF				 ;
			     C	    ENDIF				 ;
			     C	  ENDIF 			       ;
			     C	ENDM				       ;
			     C					       ;
			     C	$M_CHECK      macro   parm	       ;
			     C	  IFNDEF  parm			       ; IF class is not in this assembly,
			     C	    IF	    FARmsg		       ;
			     C	      EXTRN   parm:FAR		       ;    Must be external
			     C	    ELSE			       ;
			     C	      EXTRN   parm:NEAR 	       ;    Must be external
			     C	    ENDIF			       ;
			     C	  ELSE
			     C	    IF COMR
			     C	    ELSE
			     C	      PUBLIC parm
			     C	    ENDIF
			     C	  ENDIF 			       ;
			     C	ENDM				       ;
			     C					       ;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C					       ;
			     C					       ;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	
			     C	
				
 0749				code	ends
					end				;recover ;AC000;bgb

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-1


Macros:

		N a m e			Lines

$M_BUILD_PTRS  . . . . . . . . .  	  18
$M_CHECK . . . . . . . . . . . .  	  12
$M_DECLARE . . . . . . . . . . .  	  21
$M_DECLARE2  . . . . . . . . . .  	  41
$M_INC . . . . . . . . . . . . .  	   3
$M_MAKE  . . . . . . . . . . . .  	  10
$M_MAKE_COMR . . . . . . . . . .  	  21
$M_MAKE_COMT . . . . . . . . . .  	   5
$M_POPF  . . . . . . . . . . . .  	   5
ARGVAR . . . . . . . . . . . . .  	  23
ASMVAR . . . . . . . . . . . . .  	   3
ASMVARS  . . . . . . . . . . . .  	   3
ASSERT . . . . . . . . . . . . .  	   0
CALLINSTALL  . . . . . . . . . .  	  12
DOSASSUME  . . . . . . . . . . .  	   3
DOS_CALL . . . . . . . . . . . .  	   4
ENTER  . . . . . . . . . . . . .  	   3
ENTERCRIT  . . . . . . . . . . .  	   1
ERRNZ  . . . . . . . . . . . . .  	   4
EXTENDED_MESSAGE . . . . . . . .  	   8
FMT  . . . . . . . . . . . . . .  	   0
LEAVE  . . . . . . . . . . . . .  	   2
LEAVECRIT  . . . . . . . . . . .  	   1
LOCALVAR . . . . . . . . . . . .  	  23
MESSAGE  . . . . . . . . . . . .  	   3
MSG_SERVICES . . . . . . . . . .  	  34
MSG_SERVICES2  . . . . . . . . .  	  14
MSG_UTILNAME . . . . . . . . . .  	   5
PARSE_MESSAGE  . . . . . . . . .  	   8
PATHLABL . . . . . . . . . . . .  	  10
POPFF  . . . . . . . . . . . . .  	   4
SET_DATA_SEGMENT . . . . . . . .  	   7

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

$M_CLASS_ID  . . . . . . . . . .  	0004	0003
  $M_CLS_ID  . . . . . . . . . .  	0000
  $M_COMMAND_VER . . . . . . . .  	0001
  $M_NUM_CLS_MSG . . . . . . . .  	0003
$M_COUNTRY_INFO  . . . . . . . .  	0056	000A
  $M_HEADER  . . . . . . . . . .  	0000
  $M_DATE_FORMAT . . . . . . . .  	0044
  $M_CURR_SEPARA . . . . . . . .  	0046
  $M_THOU_SEPARA . . . . . . . .  	004B
  $M_DECI_SEPARA . . . . . . . .  	004D
  $M_DATE_SEPARA . . . . . . . .  	004F
  $M_TIME_SEPARA . . . . . . . .  	0051
  $M_CURR_FORMAT . . . . . . . .  	0053
  $M_SIG_DIGS_CU . . . . . . . .  	0054
  $M_TIME_FORMAT . . . . . . . .  	0055
$M_ID  . . . . . . . . . . . . .  	0004	0002
  $M_NUM . . . . . . . . . . . .  	0000
  $M_TXT_PTR . . . . . . . . . .  	0002
$M_RES_ADDRS . . . . . . . . . .  	0085	0017
  $M_EXT_ERR_ADDRS . . . . . . .  	0000
  $M_EXT_FILE  . . . . . . . . .  	0004
  $M_EXT_COMMAND . . . . . . . .  	0008
  $M_EXT_TERM  . . . . . . . . .  	000C
  $M_PARSE_COMMAND . . . . . . .  	0010
  $M_PARSE_ADDRS . . . . . . . .  	0014
  $M_PARSE_TERM  . . . . . . . .  	0018
  $M_CRIT_ADDRS  . . . . . . . .  	001C
  $M_CRIT_COMMAND  . . . . . . .  	0020
  $M_CRIT_TERM . . . . . . . . .  	0024
  $M_DISK_PROC_ADDR  . . . . . .  	0028
  $M_CLASS_ADDRS . . . . . . . .  	002C
  $M_CLS_TERM  . . . . . . . . .  	0030
  $M_DBCS_VEC  . . . . . . . . .  	0034
  $M_HANDLE  . . . . . . . . . .  	0038
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-2


  $M_SIZE  . . . . . . . . . . .  	003A
  $M_CRLF  . . . . . . . . . . .  	003B
  $M_CLASS . . . . . . . . . . .  	003D
  $M_RETURN_ADDR . . . . . . . .  	003E
  $M_MSG_NUM . . . . . . . . . .  	0040
  $M_DIVISOR . . . . . . . . . .  	0042
  $M_TEMP_BUF  . . . . . . . . .  	0044
  $M_BUF_TERM  . . . . . . . . .  	0084
$M_SUBLIST_STRUC . . . . . . . .  	000B	0008
  $M_S_SIZE  . . . . . . . . . .  	0000
  $M_S_RESV  . . . . . . . . . .  	0001
  $M_S_VALUE . . . . . . . . . .  	0002
  $M_S_ID  . . . . . . . . . . .  	0006
  $M_S_FLAG  . . . . . . . . . .  	0007
  $M_S_MAXW  . . . . . . . . . .  	0008
  $M_S_MINW  . . . . . . . . . .  	0009
  $M_S_PAD . . . . . . . . . . .  	000A
ARENA  . . . . . . . . . . . . .  	0010	0005
  ARENA_SIGNATURE  . . . . . . .  	0000
  ARENA_OWNER  . . . . . . . . .  	0001
  ARENA_SIZE . . . . . . . . . .  	0003
  ARENA_RESERVED . . . . . . . .  	0005
  ARENA_NAME . . . . . . . . . .  	0008
A_BPB  . . . . . . . . . . . . .  	001F	000F
  BPB_BYTESPERSECTOR . . . . . .  	0000
  BPB_SECTORSPERCLUSTER  . . . .  	0002
  BPB_RESERVEDSECTORS  . . . . .  	0003
  BPB_NUMBEROFFATS . . . . . . .  	0005
  BPB_ROOTENTRIES  . . . . . . .  	0006
  BPB_TOTALSECTORS . . . . . . .  	0008
  BPB_MEDIADESCRIPTOR  . . . . .  	000A
  BPB_SECTORSPERFAT  . . . . . .  	000B
  BPB_SECTORSPERTRACK  . . . . .  	000D
  BPB_HEADS  . . . . . . . . . .  	000F
  BPB_HIDDENSECTORS  . . . . . .  	0011
  BPB_BIGTOTALSECTORS  . . . . .  	0015
A_DEVICEPARAMETERS . . . . . . .  	0026	0012
  SPECIALFUNCTIONS . . . . . . .  	0000
  DEVICETYPE . . . . . . . . . .  	0001
  DEVICEATTRIBUTES . . . . . . .  	0002
  NUMBEROFCYLINDERS  . . . . . .  	0004
  MEDIATYPE  . . . . . . . . . .  	0006
  BYTEPERSECTOR  . . . . . . . .  	0007
  SECTORSPERCLUSTER  . . . . . .  	0009
  RESERVEDSECTORS  . . . . . . .  	000A
  NUMBEROFFATS . . . . . . . . .  	000C
  ROOTENTRIES  . . . . . . . . .  	000D
  TOTALSECTORS . . . . . . . . .  	000F
  MEDIADESCRIPTOR  . . . . . . .  	0011
  SECTORSPERFAT  . . . . . . . .  	0012
  SECTORSPERTRACK  . . . . . . .  	0014
  HEADS  . . . . . . . . . . . .  	0016
  HIDDENSECTORS  . . . . . . . .  	0018
  EXT_TOTAL_SECTORS  . . . . . .  	001C
  RESERVED_AREA  . . . . . . . .  	0020
BPBLOCK  . . . . . . . . . . . .  	000D	0008
  BPSECSZ  . . . . . . . . . . .  	0000
  BPCLUS . . . . . . . . . . . .  	0002
  BPRES  . . . . . . . . . . . .  	0003
  BPFTCNT  . . . . . . . . . . .  	0005
  BPDRCNT  . . . . . . . . . . .  	0006
  BPSCCNT  . . . . . . . . . . .  	0008
  BPMEDIA  . . . . . . . . . . .  	000A
  BPFTSEC  . . . . . . . . . . .  	000B
BUFFER_HASH_ENTRY  . . . . . . .  	0008	0004
  EMS_PAGE_NUM . . . . . . . . .  	0000
  BUFFER_BUCKET  . . . . . . . .  	0002
  DIRTY_COUNT  . . . . . . . . .  	0006
  BUFFER_RESERVED  . . . . . . .  	0007
BUFFINFO . . . . . . . . . . . .  	0023	000F
  HASH_PTR . . . . . . . . . . .  	0000
  HASH_COUNT . . . . . . . . . .  	0004
  CACHE_PTR  . . . . . . . . . .  	0006
  CACHE_COUNT  . . . . . . . . .  	000A
  EMS_SAFE_FLAG  . . . . . . . .  	000C
  EMS_LAST_PAGE  . . . . . . . .  	000D
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-3


  EMS_FIRST_PAGE . . . . . . . .  	0011
  EMS_NPA640 . . . . . . . . . .  	0015
  EMS_MODE . . . . . . . . . . .  	0017
  EMS_HANDLE . . . . . . . . . .  	0018
  EMS_PAGEFRAME_NUMBER . . . . .  	001A
  EMS_SEG_CNT  . . . . . . . . .  	001C
  EMS_PAGE_FRAME . . . . . . . .  	001E
  EMS_RESERVED . . . . . . . . .  	0020
  EMS_MAP_BUFF . . . . . . . . .  	0022
CURDIR_LIST  . . . . . . . . . .  	0058	000A
  CURDIR_TEXT  . . . . . . . . .  	0000
  CURDIR_FLAGS . . . . . . . . .  	0043
  CURDIR_DEVPTR  . . . . . . . .  	0045
  CURDIR_ID  . . . . . . . . . .  	0049
  CURDIR_USER_WORD . . . . . . .  	004D
  CURDIR_END . . . . . . . . . .  	004F
  CURDIR_TYPE  . . . . . . . . .  	0051
  CURDIR_IFS_HDR . . . . . . . .  	0052
  CURDIR_FSDA  . . . . . . . . .  	0056
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
DPB  . . . . . . . . . . . . . .  	0021	0012
  DPB_DRIVE  . . . . . . . . . .  	0000
  DPB_UNIT . . . . . . . . . . .  	0001
  DPB_SECTOR_SIZE  . . . . . . .  	0002
  DPB_CLUSTER_MASK . . . . . . .  	0004
  DPB_CLUSTER_SHIFT  . . . . . .  	0005
  DPB_FIRST_FAT  . . . . . . . .  	0006
  DPB_FAT_COUNT  . . . . . . . .  	0008
  DPB_ROOT_ENTRIES . . . . . . .  	0009
  DPB_FIRST_SECTOR . . . . . . .  	000B
  DPB_MAX_CLUSTER  . . . . . . .  	000D
  DPB_FAT_SIZE . . . . . . . . .  	000F
  DPB_DIR_SECTOR . . . . . . . .  	0011
  DPB_DRIVER_ADDR  . . . . . . .  	0013
  DPB_MEDIA  . . . . . . . . . .  	0017
  DPB_FIRST_ACCESS . . . . . . .  	0018
  DPB_NEXT_DPB . . . . . . . . .  	0019
  DPB_NEXT_FREE  . . . . . . . .  	001D
  DPB_FREE_CNT . . . . . . . . .  	001F
EXEC0  . . . . . . . . . . . . .  	000E	0004
  EXEC0_ENVIRON  . . . . . . . .  	0000
  EXEC0_COM_LINE . . . . . . . .  	0002
  EXEC0_5C_FCB . . . . . . . . .  	0006
  EXEC0_6C_FCB . . . . . . . . .  	000A
EXEC1  . . . . . . . . . . . . .  	0016	0008
  EXEC1_ENVIRON  . . . . . . . .  	0000
  EXEC1_COM_LINE . . . . . . . .  	0002
  EXEC1_5C_FCB . . . . . . . . .  	0006
  EXEC1_6C_FCB . . . . . . . . .  	000A
  EXEC1_SP . . . . . . . . . . .  	000E
  EXEC1_SS . . . . . . . . . . .  	0010
  EXEC1_IP . . . . . . . . . . .  	0012
  EXEC1_CS . . . . . . . . . . .  	0014
EXEC3  . . . . . . . . . . . . .  	0004	0002
  EXEC3_LOAD_ADDR  . . . . . . .  	0000
  EXEC3_RELOC_FAC  . . . . . . .  	0002
EXEC_BLOCK_PARMS . . . . . . . .  	000E	0007
  SEGMENT_ENV  . . . . . . . . .  	0000
  OFFSET_COMMAND . . . . . . . .  	0002
  SEGMENT_COMMAND  . . . . . . .  	0004
  OFFSET_FCB1  . . . . . . . . .  	0006
  SEGMENT_FCB1 . . . . . . . . .  	0008
  OFFSET_FCB2  . . . . . . . . .  	000A
  SEGMENT_FCB2 . . . . . . . . .  	000C
EXE_FILE . . . . . . . . . . . .  	0020	000F
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-4


  EXE_SIGNATURE  . . . . . . . .  	0000
  EXE_LEN_MOD_512  . . . . . . .  	0002
  EXE_PAGES  . . . . . . . . . .  	0004
  EXE_RLE_COUNT  . . . . . . . .  	0006
  EXE_PAR_DIR  . . . . . . . . .  	0008
  EXE_MIN_BSS  . . . . . . . . .  	000A
  EXE_MAX_BSS  . . . . . . . . .  	000C
  EXE_SS . . . . . . . . . . . .  	000E
  EXE_SP . . . . . . . . . . . .  	0010
  EXE_CHKSUM . . . . . . . . . .  	0012
  EXE_IP . . . . . . . . . . . .  	0014
  EXE_CS . . . . . . . . . . . .  	0016
  EXE_RLE_TABLE  . . . . . . . .  	0018
  EXE_IOV  . . . . . . . . . . .  	001A
  EXE_SYM_TAB  . . . . . . . . .  	001C
EXT_OPEN_PARM  . . . . . . . . .  	0006	0002
  EXT_SET_LIST . . . . . . . . .  	0000
  EXT_NUM_OF_PARM  . . . . . . .  	0004
FIND_BUF . . . . . . . . . . . .  	002B	000C
  FIND_BUF_DRIVE . . . . . . . .  	0000
  FIND_BUF_NAME  . . . . . . . .  	0001
  FIND_BUF_SATTR . . . . . . . .  	000C
  FIND_BUF_LASTENT . . . . . . .  	000D
  FIND_BUF_DIRSTART  . . . . . .  	000F
  FIND_BUF_NETID . . . . . . . .  	0011
  FIND_BUF_ATTR  . . . . . . . .  	0015
  FIND_BUF_TIME  . . . . . . . .  	0016
  FIND_BUF_DATE  . . . . . . . .  	0018
  FIND_BUF_SIZE_L  . . . . . . .  	001A
  FIND_BUF_SIZE_H  . . . . . . .  	001C
  FIND_BUF_PNAME . . . . . . . .  	001E
INTERNAT_BLOCK . . . . . . . . .  	0018	0015
  DATE_TIM_FORMAT  . . . . . . .  	0000
  CURRENCY_SYM . . . . . . . . .  	0002
  THOUS_SEP  . . . . . . . . . .  	0007
  DECIMAL_SEP  . . . . . . . . .  	0009
  DATE_SEP . . . . . . . . . . .  	000B
  TIME_SEP . . . . . . . . . . .  	000D
  BIT_FIELD  . . . . . . . . . .  	000F
  CURRENCY_CENTS . . . . . . . .  	0010
  TIME_24  . . . . . . . . . . .  	0011
  MAP_CALL . . . . . . . . . . .  	0012
  DATA_SEP . . . . . . . . . . .  	0016
MEDIA_ID . . . . . . . . . . . .  	0019	0004
  MEDIA_ID_INFO_LEVEL  . . . . .  	0000
  MEDIA_ID_SERIAL_NUMBER . . . .  	0002
  MEDIA_ID_VOLUME_LABEL  . . . .  	0006
  MEDIA_ID_FILE_SYSTEM . . . . .  	0011
PROCESS_DATA_BLOCK . . . . . . .  	005C	0011
  PDB_EXIT_CALL  . . . . . . . .  	0000
  PDB_BLOCK_LEN  . . . . . . . .  	0002
  PDB_CPM_CALL . . . . . . . . .  	0005
  PDB_EXIT . . . . . . . . . . .  	000A
  PDB_CTRL_C . . . . . . . . . .  	000E
  PDB_FATAL_ABORT  . . . . . . .  	0012
  PDB_PARENT_PID . . . . . . . .  	0016
  PDB_JFN_TABLE  . . . . . . . .  	0018
  PDB_ENVIRON  . . . . . . . . .  	002C
  PDB_USER_STACK . . . . . . . .  	002E
  PDB_JFN_LENGTH . . . . . . . .  	0032
  PDB_JFN_POINTER  . . . . . . .  	0034
  PDB_NEXT_PDB . . . . . . . . .  	0038
  PDB_PAD1 . . . . . . . . . . .  	003C
  PDB_CALL_SYSTEM  . . . . . . .  	0050
  PDB_PAD2 . . . . . . . . . . .  	0055
RELATIVE_SECTOR_BUFFER . . . . .  	000A	0005
  START_SECTOR_LOW . . . . . . .  	0000
  START_SECTOR_HIGH  . . . . . .  	0002
  NUMBER_SECTORS . . . . . . . .  	0004
  BUFFER_OFFSET  . . . . . . . .  	0006
  BUFFER_SEGMENT . . . . . . . .  	0008
SF . . . . . . . . . . . . . . .  	0008	0003
  SFLINK . . . . . . . . . . . .  	0000
  SFCOUNT  . . . . . . . . . . .  	0004
  SFTABLE  . . . . . . . . . . .  	0006
SF_ENTRY . . . . . . . . . . . .  	003B	0014
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-5


  SF_REF_COUNT . . . . . . . . .  	0000
  SF_MODE  . . . . . . . . . . .  	0002
  SF_ATTR  . . . . . . . . . . .  	0004
  SF_FLAGS . . . . . . . . . . .  	0005
  SF_DEVPTR  . . . . . . . . . .  	0007
  SF_FIRCLUS . . . . . . . . . .  	000B
  SF_TIME  . . . . . . . . . . .  	000D
  SF_DATE  . . . . . . . . . . .  	000F
  SF_SIZE  . . . . . . . . . . .  	0011
  SF_POSITION  . . . . . . . . .  	0015
  SF_CLUSPOS . . . . . . . . . .  	0019
  SF_DIRSEC  . . . . . . . . . .  	001B
  SF_DIRPOS  . . . . . . . . . .  	001F
  SF_NAME  . . . . . . . . . . .  	0020
  SF_CHAIN . . . . . . . . . . .  	002B
  SF_UID . . . . . . . . . . . .  	002F
  SF_PID . . . . . . . . . . . .  	0031
  SF_MFT . . . . . . . . . . . .  	0033
  SF_LSTCLUS . . . . . . . . . .  	0035
  SF_IFS_HDR . . . . . . . . . .  	0037
SYMBOL_ENTRY . . . . . . . . . .  	0106	0004
  SYM_VALUE  . . . . . . . . . .  	0000
  SYM_TYPE . . . . . . . . . . .  	0004
  SYM_LEN  . . . . . . . . . . .  	0006
  SYM_NAME . . . . . . . . . . .  	0007
SYSINITVARS  . . . . . . . . . .  	0047	0018
  SYSI_DPB . . . . . . . . . . .  	0000
  SYSI_SFT . . . . . . . . . . .  	0004
  SYSI_CLOCK . . . . . . . . . .  	0008
  SYSI_CON . . . . . . . . . . .  	000C
  SYSI_MAXSEC  . . . . . . . . .  	0010
  SYSI_BUF . . . . . . . . . . .  	0012
  SYSI_CDS . . . . . . . . . . .  	0016
  SYSI_FCB . . . . . . . . . . .  	001A
  SYSI_KEEP  . . . . . . . . . .  	001E
  SYSI_NUMIO . . . . . . . . . .  	0020
  SYSI_NCDS  . . . . . . . . . .  	0021
  SYSI_DEV . . . . . . . . . . .  	0022
  SYSI_ATTR  . . . . . . . . . .  	0026
  SYSI_STRAT . . . . . . . . . .  	0028
  SYSI_INTER . . . . . . . . . .  	002A
  SYSI_NAME  . . . . . . . . . .  	002C
  SYSI_SPLICE  . . . . . . . . .  	0034
  SYSI_IBMDOS_SIZE . . . . . . .  	0035
  SYSI_IFS_DOSCALL@  . . . . . .  	0037
  SYSI_IFS . . . . . . . . . . .  	003B
  SYSI_BUFFERS . . . . . . . . .  	003F
  SYSI_BOOT_DRIVE  . . . . . . .  	0043
  SYSI_DWMOVE  . . . . . . . . .  	0044
  SYSI_EXT_MEM . . . . . . . . .  	0045
SYSINITVARS_EXT  . . . . . . . .  	0008	0002
  SYSI_INITVARS  . . . . . . . .  	0000
  SYSI_COUNTRY_TAB . . . . . . .  	0004
SYS_FCB  . . . . . . . . . . . .  	0025	000C
  FCB_DRIVE  . . . . . . . . . .  	0000
  FCB_NAME . . . . . . . . . . .  	0001
  FCB_EXT  . . . . . . . . . . .  	0009
  FCB_EXTENT . . . . . . . . . .  	000C
  FCB_RECSIZ . . . . . . . . . .  	000E
  FCB_FILSIZ . . . . . . . . . .  	0010
  FCB_DRVBP  . . . . . . . . . .  	0012
  FCB_FDATE  . . . . . . . . . .  	0014
  FCB_FTIME  . . . . . . . . . .  	0016
  FCB_RESERVED . . . . . . . . .  	0018
  FCB_NR . . . . . . . . . . . .  	0020
  FCB_RR . . . . . . . . . . . .  	0021
USER_ENVIRON . . . . . . . . . .  	0018	000C
  USER_AX  . . . . . . . . . . .  	0000
  USER_BX  . . . . . . . . . . .  	0002
  USER_CX  . . . . . . . . . . .  	0004
  USER_DX  . . . . . . . . . . .  	0006
  USER_SI  . . . . . . . . . . .  	0008
  USER_DI  . . . . . . . . . . .  	000A
  USER_BP  . . . . . . . . . . .  	000C
  USER_DS  . . . . . . . . . . .  	000E
  USER_ES  . . . . . . . . . . .  	0010
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-6


  USER_IP  . . . . . . . . . . .  	0012
  USER_CS  . . . . . . . . . . .  	0014
  USER_F . . . . . . . . . . . .  	0016
XAL  . . . . . . . . . . . . . .  	0200	0005
  XAL_TSIZE  . . . . . . . . . .  	0000
  XAL_TCOUNT . . . . . . . . . .  	0002
  XAL_LSIZE  . . . . . . . . . .  	0004
  XAL_LCOUNT . . . . . . . . . .  	0006
  XAL_DATA . . . . . . . . . . .  	0008

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

DG . . . . . . . . . . . . . . .  	GROUP
  DATA . . . . . . . . . . . . .  	02BC	PARA	PUBLIC	'DATA'
  CONST  . . . . . . . . . . . .  	0000	PARA	PUBLIC	'CONST'
  CODE . . . . . . . . . . . . .  	0749	PARA	PUBLIC	'CODE'
  CSTACK . . . . . . . . . . . .  	01EA	WORD	STACK	'STACK'
  LASTSEG  . . . . . . . . . . .  	0001	PARA	PUBLIC	'LAST'

Symbols:            

                N a m e         	Type	 Value	 Attr

ABORT  . . . . . . . . . . . . .  	NUMBER	0000	
ACCESS_MASK  . . . . . . . . . .  	NUMBER	000F	
ACTION_39  . . . . . . . . . . .  	NUMBER	0004	
ACTION_CREATED_OPENED  . . . . .  	NUMBER	0002	
ACTION_OPENED  . . . . . . . . .  	NUMBER	0001	
ACTION_REPLACED_OPENED . . . . .  	NUMBER	0003	
ADDR_INT_ABORT . . . . . . . . .  	NUMBER	0080	
ADDR_INT_COMMAND . . . . . . . .  	NUMBER	0084	
ADDR_INT_CTRL_C  . . . . . . . .  	NUMBER	008C	
ADDR_INT_DISK_READ . . . . . . .  	NUMBER	0094	
ADDR_INT_DISK_WRITE  . . . . . .  	NUMBER	0098	
ADDR_INT_FASTCON . . . . . . . .  	NUMBER	00A4	
ADDR_INT_FATAL_ABORT . . . . . .  	NUMBER	0090	
ADDR_INT_IBM . . . . . . . . . .  	NUMBER	00A8	
ADDR_INT_KEEP_PROCESS  . . . . .  	NUMBER	009C	
ADDR_INT_SPOOLER . . . . . . . .  	NUMBER	00A0	
ADDR_INT_TERMINATE . . . . . . .  	NUMBER	0088	
ALLOC  . . . . . . . . . . . . .  	NUMBER	0048	
ALLOCOPER  . . . . . . . . . . .  	NUMBER	0058	
ALLOWED_FAIL . . . . . . . . . .  	NUMBER	0008	
ALLOWED_IGNORE . . . . . . . . .  	NUMBER	0020	
ALLOWED_RETRY  . . . . . . . . .  	NUMBER	0010	
ALTVECT  . . . . . . . . . . . .  	ALIAS	 FALSE		
ALT_EXPECTED_VERSION . . . . . .  	NUMBER	1A05	
ALT_MAJOR_VERSION  . . . . . . .  	NUMBER	0005	
ALT_MINOR_VERSION  . . . . . . .  	NUMBER	001A	
append . . . . . . . . . . . . .  	L BYTE	023F	DATA	Global
APPEND_OFF . . . . . . . . . . .  	NUMBER	0000	
APPEND_ON  . . . . . . . . . . .  	NUMBER	0001	
APPEND_X . . . . . . . . . . . .  	NUMBER	B706	
APPEND_X_SET . . . . . . . . . .  	NUMBER	0001	
AREAD  . . . . . . . . . . . . .  	NUMBER	0025	
ARENA_OWNER_SYSTEM . . . . . . .  	NUMBER	0000	
ARENA_SIGNATURE_END  . . . . . .  	NUMBER	005A	
ARENA_SIGNATURE_NORMAL . . . . .  	NUMBER	004D	
ASCIIZ_END . . . . . . . . . . .  	NUMBER	0000	
Askmsg . . . . . . . . . . . . .  	V BYTE	0000	DATA	External
ASSIGNOPER . . . . . . . . . . .  	NUMBER	005F	
ASSIGN_CHECK . . . . . . . . . .  	NUMBER	8000	
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	
AUTO_COMMIT_WRITE  . . . . . . .  	NUMBER	4000	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-7


AWRITE . . . . . . . . . . . . .  	NUMBER	0026	

Baddrv . . . . . . . . . . . . .  	V BYTE	0000	DATA	External
BAD_EXIT . . . . . . . . . . . .  	NUMBER	00FF	
Bad_File_Read  . . . . . . . . .  	N PROC	04C6	CODE	Global	Length = 0074
BDOS . . . . . . . . . . . . . .  	NUMBER	0021	
BELL . . . . . . . . . . . . . .  	NUMBER	0007	
BIG_FAT_THRESHOLD  . . . . . . .  	NUMBER	0FF6	
BIN_HEX_BYTE . . . . . . . . . .  	NUMBER	0013	
BIN_HEX_DWORD  . . . . . . . . .  	NUMBER	0033	
BIN_HEX_TYPE . . . . . . . . . .  	NUMBER	0003	
BIN_HEX_WORD . . . . . . . . . .  	NUMBER	0023	
BLANK  . . . . . . . . . . . . .  	NUMBER	0020	
BOOT . . . . . . . . . . . . . .  	NUMBER	0020	
bpb_buffer . . . . . . . . . . .  	L 	0187	DATA	Global
BUFFERFLAG . . . . . . . . . . .  	NUMBER	FFFF	
BUFINSIZ . . . . . . . . . . . .  	NUMBER	0014	
BUF_DIRTY  . . . . . . . . . . .  	NUMBER	0040	
BUF_DPB  . . . . . . . . . . . .  		000D	
BUF_FILL . . . . . . . . . . . .  		0011	
BUF_FLAGS  . . . . . . . . . . .  		0005	
BUF_FREE . . . . . . . . . . . .  	NUMBER	00FF	
BUF_ID . . . . . . . . . . . . .  		0004	
BUF_ISDATA . . . . . . . . . . .  	NUMBER	0008	
BUF_ISDIR  . . . . . . . . . . .  	NUMBER	0004	
BUF_ISFAT  . . . . . . . . . . .  	NUMBER	0002	
BUF_ISNET  . . . . . . . . . . .  	NUMBER	0080	
BUF_NETID  . . . . . . . . . . .  	ALIAS	 BUFINSIZ		
BUF_NEXT . . . . . . . . . . . .  		0000	
BUF_OFFSET . . . . . . . . . . .  	DWORD	0006	
BUF_PREV . . . . . . . . . . . .  		0002	
BUF_RESERVED . . . . . . . . . .  		0013	
BUF_SECTOR . . . . . . . . . . .  		0006	
BUF_SNBUF  . . . . . . . . . . .  	NUMBER	0010	
BUF_TYPE_0 . . . . . . . . . . .  	NUMBER	00F1	
BUF_VISIT  . . . . . . . . . . .  	NUMBER	0020	
BUF_WRTCNT . . . . . . . . . . .  		000A	
BUF_WRTCNTINC  . . . . . . . . .  		000B	
Build_String . . . . . . . . . .  	L NEAR	0000	CODE	External
bytes_per_sector . . . . . . . .  	L WORD	0294	DATA	Global

calc_fat_addr  . . . . . . . . .  	N PROC	0000	CODE	Global	Length = 001D
CARGS  . . . . . . . . . . . . .  	NUMBER	0000	
Change_Blanks  . . . . . . . . .  	L NEAR	0000	CODE	External
CHARMSG  . . . . . . . . . . . .  	NUMBER	0000	
CHAR_FIELD_ASCIIZ  . . . . . . .  	NUMBER	0010	
CHAR_FIELD_CHAR  . . . . . . . .  	NUMBER	0000	
CHAR_OPER  . . . . . . . . . . .  	NUMBER	0037	
CHAR_TYPE  . . . . . . . . . . .  	NUMBER	0000	
CHDIR  . . . . . . . . . . . . .  	NUMBER	003B	
check_kanji  . . . . . . . . . .  	N PROC	01C1	CODE	Global	Length = 0000
chk_fat  . . . . . . . . . . . .  	N PROC	05CD	CODE	Global	Length = 0048
CHMOD  . . . . . . . . . . . . .  	NUMBER	0043	
CLOSE  . . . . . . . . . . . . .  	NUMBER	003E	
COLON  . . . . . . . . . . . . .  	NUMBER	003A	
command_line . . . . . . . . . .  	L BYTE	023E	DATA	Global
command_line_buffer  . . . . . .  	L BYTE	01BD	DATA	Global	Length = 0080
command_line_length  . . . . . .  	NUMBER	0080		Global
COMMIT . . . . . . . . . . . . .  	NUMBER	0068	
COMR . . . . . . . . . . . . . .  	NUMBER	0000	
COMT . . . . . . . . . . . . . .  	NUMBER	0000	
copy_fname . . . . . . . . . . .  	N PROC	01C1	CODE	Global	Length = 003A
CR . . . . . . . . . . . . . . .  	NUMBER	000D	
CREAT  . . . . . . . . . . . . .  	NUMBER	003C	
CREATENEWFILE  . . . . . . . . .  	NUMBER	005B	
CREATETEMPFILE . . . . . . . . .  	NUMBER	005A	
CREATE_PROCESS_DATA_BLOCK  . . .  	NUMBER	0026	
CRITASSIGN . . . . . . . . . . .  	NUMBER	0008	
CRITDEVICE . . . . . . . . . . .  	NUMBER	0002	
CRITDISK . . . . . . . . . . . .  	NUMBER	0001	
CRITICAL_ERROR_FAIL  . . . . . .  	NUMBER	0003	
CRITIFS  . . . . . . . . . . . .  	NUMBER	0006	
CRITMEM  . . . . . . . . . . . .  	NUMBER	0001	
CRITNET  . . . . . . . . . . . .  	NUMBER	0005	
CRITSFT  . . . . . . . . . . . .  	NUMBER	0001	
CRITSHARE  . . . . . . . . . . .  	NUMBER	0001	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-8


CURDIRLEN  . . . . . . . . . . .  	NUMBER	0058	
CURDIR_INUSE . . . . . . . . . .  	NUMBER	4000	
CURDIR_ISIFS . . . . . . . . . .  	NUMBER	8000	
CURDIR_ISNET . . . . . . . . . .  	NUMBER	8000	
CURDIR_LOCAL . . . . . . . . . .  	NUMBER	1000	
CURDIR_NETID . . . . . . . . . .  	DWORD	0049	
CURDIR_SPLICE  . . . . . . . . .  	NUMBER	2000	
CURRENT_DIR  . . . . . . . . . .  	NUMBER	0047	
C_BS . . . . . . . . . . . . . .  	NUMBER	0008	
C_CR . . . . . . . . . . . . . .  	NUMBER	000D	
C_DEL  . . . . . . . . . . . . .  	NUMBER	007F	
C_ETB  . . . . . . . . . . . . .  	NUMBER	0017	
C_ETX  . . . . . . . . . . . . .  	NUMBER	0003	
C_HT . . . . . . . . . . . . . .  	NUMBER	0009	
C_LF . . . . . . . . . . . . . .  	NUMBER	000A	
C_NAK  . . . . . . . . . . . . .  	NUMBER	0015	

data_start_high  . . . . . . . .  	L WORD	01B3	DATA	Global
data_start_low . . . . . . . . .  	L WORD	01B1	DATA	Global
DATEMSG  . . . . . . . . . . . .  	NUMBER	0000	
DATE_MD  . . . . . . . . . . . .  	NUMBER	0014	
DATE_MDY_2 . . . . . . . . . . .  	NUMBER	0024	
DATE_MDY_4 . . . . . . . . . . .  	NUMBER	0034	
DATE_TYPE  . . . . . . . . . . .  	NUMBER	0004	
DBCS . . . . . . . . . . . . . .  	NUMBER	0000	
DBCS_BLANK . . . . . . . . . . .  	NUMBER	0040	
DBCS_LEAD  . . . . . . . . . . .  	NUMBER	0081	
DBCS_SW  . . . . . . . . . . . .  	L BYTE	02A4	DATA
dbcs_vector  . . . . . . . . . .  	L BYTE	02A5	DATA	Global
dbcs_vector_off  . . . . . . . .  	L WORD	02A6	DATA	Global
dbcs_vector_seg  . . . . . . . .  	L WORD	02A8	DATA	Global
DBCS_VECTOR_SIZE . . . . . . . .  	NUMBER	0002	
DEALLOC  . . . . . . . . . . . .  	NUMBER	0049	
DEBUG  . . . . . . . . . . . . .  	NUMBER	0000	
DEVID_BLOCK_DEV  . . . . . . . .  	NUMBER	001F	
DEVID_DEVICE . . . . . . . . . .  	NUMBER	0080	
DEVID_DEVICE_CLOCK . . . . . . .  	NUMBER	0008	
DEVID_DEVICE_CON_IN  . . . . . .  	NUMBER	0001	
DEVID_DEVICE_CON_OUT . . . . . .  	NUMBER	0002	
DEVID_DEVICE_EOF . . . . . . . .  	NUMBER	0040	
DEVID_DEVICE_NULL  . . . . . . .  	NUMBER	0004	
DEVID_DEVICE_RAW . . . . . . . .  	NUMBER	0020	
DEVID_DEVICE_SPECIAL . . . . . .  	NUMBER	0010	
DEVID_EOF  . . . . . . . . . . .  	NUMBER	0040	
DEVID_FILE_CLEAN . . . . . . . .  	NUMBER	0040	
DEVID_FILE_MASK_DRIVE  . . . . .  	NUMBER	003F	
DEVID_ISCIN  . . . . . . . . . .  	NUMBER	0001	
DEVID_ISCLK  . . . . . . . . . .  	NUMBER	0008	
DEVID_ISCOT  . . . . . . . . . .  	NUMBER	0002	
DEVID_ISDEV  . . . . . . . . . .  	NUMBER	0080	
DEVID_ISNUL  . . . . . . . . . .  	NUMBER	0004	
DEVID_RAW  . . . . . . . . . . .  	NUMBER	0020	
DEVID_SPECIAL  . . . . . . . . .  	NUMBER	0010	
dirchar  . . . . . . . . . . . .  	L BYTE	00BB	DATA	Global
dirent . . . . . . . . . . . . .  	L BYTE	0240	DATA	Global
direrr . . . . . . . . . . . . .  	L NEAR	0630	CODE	Global
Dirmsg . . . . . . . . . . . . .  	V BYTE	0000	DATA	External
DIRSTRLEN  . . . . . . . . . . .  	NUMBER	0043	
DIR_ATTRIBUTE  . . . . . . . . .  	NUMBER	0010	
DIR_ENTRIES_PER_SECTOR . . . . .  	NUMBER	0010	
DIR_SEARCH_FIRST . . . . . . . .  	NUMBER	0011	
DIR_SEARCH_NEXT  . . . . . . . .  	NUMBER	0012	
DISK_PROC  . . . . . . . . . . .  	NUMBER	0000	
DISK_RESET . . . . . . . . . . .  	NUMBER	000D	
DISPLAYMSG . . . . . . . . . . .  	NUMBER	0000	
Display_Interface  . . . . . . .  	L NEAR	0000		External
done . . . . . . . . . . . . . .  	L BYTE	0183	DATA	Global
DOS_BUF_KEYB_INP . . . . . . . .  	NUMBER	000A	
DOS_CLOSE_FILE . . . . . . . . .  	NUMBER	003E	
DOS_CLR_KEYB_BUF . . . . . . . .  	NUMBER	000C	
DOS_CLR_KEYB_BUF_MASK  . . . . .  	NUMBER	00C0	
DOS_CON_INP  . . . . . . . . . .  	NUMBER	0008	
DOS_DIR_CON_INP  . . . . . . . .  	NUMBER	0007	
DOS_DISP_CHAR  . . . . . . . . .  	NUMBER	0002	
DOS_DISP_STRING  . . . . . . . .  	NUMBER	0009	
DOS_EXTENDED_OPEN  . . . . . . .  	NUMBER	6C00	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-9


DOS_GET_ADDR . . . . . . . . . .  	NUMBER	0008	
DOS_GET_COUNTRY  . . . . . . . .  	NUMBER	0038	
DOS_GET_CRITICAL . . . . . . . .  	NUMBER	0004	
DOS_GET_DBCS_INFO  . . . . . . .  	NUMBER	6300	
DOS_GET_EXTENDED . . . . . . . .  	NUMBER	0000	
DOS_GET_EXT_ERROR  . . . . . . .  	NUMBER	0059	
DOS_GET_EXT_ERROR_BX . . . . . .  	NUMBER	0000	
DOS_GET_EXT_PARSE_ADD  . . . . .  	NUMBER	122E	
DOS_GET_FILE . . . . . . . . . .  	NUMBER	0006	
DOS_GET_PARSE  . . . . . . . . .  	NUMBER	0002	
DOS_GET_VERSION  . . . . . . . .  	NUMBER	0030	
DOS_IOCTL_GET_INFO . . . . . . .  	NUMBER	4400	
DOS_IOCTL_SET_INFO . . . . . . .  	NUMBER	4401	
DOS_KEYB_INP . . . . . . . . . .  	NUMBER	0001	
DOS_LSEEK_FILE . . . . . . . . .  	NUMBER	4200	
DOS_READ_BYTE  . . . . . . . . .  	NUMBER	003F	
DOS_SET_ADDR . . . . . . . . . .  	NUMBER	0009	
DOS_WRITE_HANDLE . . . . . . . .  	NUMBER	0040	
DO_INCLUDE . . . . . . . . . . .  	NUMBER	0001	
DPBSIZ . . . . . . . . . . . . .  	NUMBER	0021	
drive  . . . . . . . . . . . . .  	L BYTE	00BA	DATA	Global
driveletter  . . . . . . . . . .  	L BYTE	02B7	DATA	Global
drive_letter_msg . . . . . . . .  	L BYTE	02B4	DATA	Global
DRIVE_NOT_READY  . . . . . . . .  	NUMBER	0002	
drive_spec . . . . . . . . . . .  	N PROC	06FB	CODE	Global	Length = 004E
drvlet . . . . . . . . . . . . .  	L BYTE	0095	DATA	Global
drvlet1  . . . . . . . . . . . .  	L BYTE	00A7	DATA	Global
drvok  . . . . . . . . . . . . .  	L NEAR	034B	CODE	Global
DSKSIZ . . . . . . . . . . . . .  	NUMBER	000D	
DUP_PDB  . . . . . . . . . . . .  	NUMBER	0055	

ECS_CALL . . . . . . . . . . . .  	NUMBER	0063	
EMS_MAP_BUFF_SIZE  . . . . . . .  	NUMBER	000C	
endl . . . . . . . . . . . . . .  	L NEAR	01DE	CODE	Global
ENDLOP1  . . . . . . . . . . . .  	L NEAR	0654	CODE
ENDLOP2  . . . . . . . . . . . .  	L NEAR	060C	CODE
END_OF_VECTOR  . . . . . . . . .  	NUMBER	0000	
ENTRYPOINT . . . . . . . . . . .  	NUMBER	00C0	
EOFok  . . . . . . . . . . . . .  	L NEAR	0135	CODE	Global
ERRACT_ABORT . . . . . . . . . .  	NUMBER	0004	
ERRACT_DLYRET  . . . . . . . . .  	NUMBER	0002	
ERRACT_IGNORE  . . . . . . . . .  	NUMBER	0006	
ERRACT_INTRET  . . . . . . . . .  	NUMBER	0007	
ERRACT_PANIC . . . . . . . . . .  	NUMBER	0005	
ERRACT_RETRY . . . . . . . . . .  	NUMBER	0001	
ERRACT_USER  . . . . . . . . . .  	NUMBER	0003	
ERRCLASS_ALREADY . . . . . . . .  	NUMBER	000C	
ERRCLASS_APPERR  . . . . . . . .  	NUMBER	0007	
ERRCLASS_AUTH  . . . . . . . . .  	NUMBER	0003	
ERRCLASS_BADFMT  . . . . . . . .  	NUMBER	0009	
ERRCLASS_HRDFAIL . . . . . . . .  	NUMBER	0005	
ERRCLASS_INTRN . . . . . . . . .  	NUMBER	0004	
ERRCLASS_LOCKED  . . . . . . . .  	NUMBER	000A	
ERRCLASS_MEDIA . . . . . . . . .  	NUMBER	000B	
ERRCLASS_NOTFND  . . . . . . . .  	NUMBER	0008	
ERRCLASS_OUTRES  . . . . . . . .  	NUMBER	0001	
ERRCLASS_SYSFAIL . . . . . . . .  	NUMBER	0006	
ERRCLASS_TEMPSIT . . . . . . . .  	NUMBER	0002	
ERRCLASS_UNK . . . . . . . . . .  	NUMBER	000D	
ERRLOC_DISK  . . . . . . . . . .  	NUMBER	0002	
ERRLOC_MEM . . . . . . . . . . .  	NUMBER	0005	
ERRLOC_NET . . . . . . . . . . .  	NUMBER	0003	
ERRLOC_SERDEV  . . . . . . . . .  	NUMBER	0004	
ERRLOC_UNK . . . . . . . . . . .  	NUMBER	0001	
ERROR_ACCESS_DENIED  . . . . . .  	NUMBER	0005	
ERROR_ALREADY_ASSIGNED . . . . .  	NUMBER	0055	
ERROR_ARENA_TRASHED  . . . . . .  	NUMBER	0007	
ERROR_BAD_COMMAND  . . . . . . .  	NUMBER	0016	
ERROR_BAD_ENVIRONMENT  . . . . .  	NUMBER	000A	
ERROR_BAD_FORMAT . . . . . . . .  	NUMBER	000B	
ERROR_BAD_LENGTH . . . . . . . .  	NUMBER	0018	
ERROR_BAD_UNIT . . . . . . . . .  	NUMBER	0014	
ERROR_CANNOT_MAKE  . . . . . . .  	NUMBER	0052	
ERROR_CLASS_39 . . . . . . . . .  	NUMBER	0001	
ERROR_CODE_PAGE_MISMATCHED . . .  	NUMBER	0025	
ERROR_CRC  . . . . . . . . . . .  	NUMBER	0017	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-10


ERROR_CURRENT_DIRECTORY  . . . .  	NUMBER	0010	
ERROR_DUP_FCB  . . . . . . . . .  	NUMBER	0051	
ERROR_FAIL_I24 . . . . . . . . .  	NUMBER	0053	
ERROR_FCB_UNAVAILABLE  . . . . .  	NUMBER	0023	
ERROR_FILE_EXISTS  . . . . . . .  	NUMBER	0050	
ERROR_FILE_NOT_FOUND . . . . . .  	NUMBER	0002	
ERROR_GEN_FAILURE  . . . . . . .  	NUMBER	001F	
ERROR_HANDLE_DISK_FULL . . . . .  	NUMBER	0027	
ERROR_HANDLE_EOF . . . . . . . .  	NUMBER	0026	
ERROR_I24_BAD_COMMAND  . . . . .  	NUMBER	0003	
ERROR_I24_BAD_LENGTH . . . . . .  	NUMBER	0005	
ERROR_I24_BAD_UNIT . . . . . . .  	NUMBER	0001	
ERROR_I24_CRC  . . . . . . . . .  	NUMBER	0004	
ERROR_I24_GEN_FAILURE  . . . . .  	NUMBER	000C	
ERROR_I24_NOT_DOS_DISK . . . . .  	NUMBER	0007	
ERROR_I24_NOT_READY  . . . . . .  	NUMBER	0002	
ERROR_I24_OUT_OF_PAPER . . . . .  	NUMBER	0009	
ERROR_I24_READ_FAULT . . . . . .  	NUMBER	000B	
ERROR_I24_SECTOR_NOT_FOUND . . .  	NUMBER	0008	
ERROR_I24_SEEK . . . . . . . . .  	NUMBER	0006	
ERROR_I24_WRITE_FAULT  . . . . .  	NUMBER	000A	
ERROR_I24_WRITE_PROTECT  . . . .  	NUMBER	0000	
ERROR_I24_WRONG_DISK . . . . . .  	NUMBER	000F	
ERROR_INVALID_ACCESS . . . . . .  	NUMBER	000C	
ERROR_INVALID_BLOCK  . . . . . .  	NUMBER	0009	
ERROR_INVALID_DATA . . . . . . .  	NUMBER	000D	
ERROR_INVALID_DRIVE  . . . . . .  	NUMBER	000F	
ERROR_INVALID_FUNCTION . . . . .  	NUMBER	0001	
ERROR_INVALID_HANDLE . . . . . .  	NUMBER	0006	
ERROR_INVALID_PARAMETER  . . . .  	NUMBER	0057	
ERROR_INVALID_PASSWORD . . . . .  	NUMBER	0056	
ERROR_LOCK_VIOLATION . . . . . .  	NUMBER	0021	
ERROR_NET_WRITE_FAULT  . . . . .  	NUMBER	0058	
ERROR_NOT_DOS_DISK . . . . . . .  	NUMBER	001A	
ERROR_NOT_ENOUGH_MEMORY  . . . .  	NUMBER	0008	
ERROR_NOT_READY  . . . . . . . .  	NUMBER	0015	
ERROR_NOT_SAME_DEVICE  . . . . .  	NUMBER	0011	
ERROR_NOT_SUPPORTED  . . . . . .  	NUMBER	0032	
ERROR_NO_MORE_FILES  . . . . . .  	NUMBER	0012	
ERROR_OUT_OF_PAPER . . . . . . .  	NUMBER	001C	
ERROR_OUT_OF_STRUCTURES  . . . .  	NUMBER	0054	
ERROR_PATH_NOT_FOUND . . . . . .  	NUMBER	0003	
ERROR_READ_FAULT . . . . . . . .  	NUMBER	001E	
ERROR_SECTOR_NOT_FOUND . . . . .  	NUMBER	001B	
ERROR_SEEK . . . . . . . . . . .  	NUMBER	0019	
ERROR_SHARING_BUFFER_EXCEEDED  .  	NUMBER	0024	
ERROR_SHARING_VIOLATION  . . . .  	NUMBER	0020	
ERROR_SYS_COMP_NOT_LOADED  . . .  	NUMBER	005A	
ERROR_TOO_MANY_OPEN_FILES  . . .  	NUMBER	0004	
ERROR_WRITE_FAULT  . . . . . . .  	NUMBER	001D	
ERROR_WRITE_PROTECT  . . . . . .  	NUMBER	0013	
ERROR_WRONG_DISK . . . . . . . .  	NUMBER	0022	
EXEC . . . . . . . . . . . . . .  	NUMBER	004B	
EXEC_FUNC_NO_EXECUTE . . . . . .  	NUMBER	0001	
EXEC_FUNC_OVERLAY  . . . . . . .  	NUMBER	0002	
EXE_VALID_OLD_SIGNATURE  . . . .  	NUMBER	4D5A	
EXE_VALID_SIGNATURE  . . . . . .  	NUMBER	5A4D	
EXISTS_MASK  . . . . . . . . . .  	NUMBER	000F	
EXIT . . . . . . . . . . . . . .  	NUMBER	004C	
exitpgm  . . . . . . . . . . . .  	L NEAR	0000	CODE	External
exitstatus . . . . . . . . . . .  	L BYTE	0186	DATA	Global
EXIT_ABORT . . . . . . . . . . .  	NUMBER	0000	
EXIT_CTRL_C  . . . . . . . . . .  	NUMBER	0001	
EXIT_HARD_ERROR  . . . . . . . .  	NUMBER	0002	
EXIT_KEEP_PROCESS  . . . . . . .  	NUMBER	0003	
exit_sw  . . . . . . . . . . . .  	L WORD	0090	DATA	Global
exit_sw2 . . . . . . . . . . . .  	L WORD	0092	DATA	Global
EXIT_TERMINATE . . . . . . . . .  	NUMBER	0000	
EXPECTED_VERSION . . . . . . . .  	NUMBER	0004	
EXTHANDLE  . . . . . . . . . . .  	NUMBER	0067	
EXTOPEN  . . . . . . . . . . . .  	NUMBER	006C	
EXT_ERR_39 . . . . . . . . . . .  	NUMBER	0027	
EXT_ERR_CLASS  . . . . . . . . .  	NUMBER	0001	
EXT_EXISTS_FAIL  . . . . . . . .  	NUMBER	0000	
EXT_EXISTS_OPEN  . . . . . . . .  	NUMBER	0001	
EXT_FILE_NOT_EXISTS  . . . . . .  	NUMBER	0004	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-11


EXT_NEXISTS_CREATE . . . . . . .  	NUMBER	0010	
EXT_OPEN_I24_OFF . . . . . . . .  	NUMBER	0002	
EXT_OPEN_ON  . . . . . . . . . .  	NUMBER	0001	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FARMSG . . . . . . . . . . . . .  	NUMBER	0000	
FAT12_FILE_SYSTEM  . . . . . . .  	NUMBER	0001	
FAT16_FILE_SYSTEM  . . . . . . .  	NUMBER	0004	
fatal_error  . . . . . . . . . .  	L BYTE	023D	DATA	Global
fatcnt . . . . . . . . . . . . .  	L BYTE	0282	DATA	Global
FatErrRead . . . . . . . . . . .  	V BYTE	0000	DATA	External
FATErrWrite  . . . . . . . . . .  	V BYTE	0000	DATA	External
fatnum . . . . . . . . . . . . .  	L BYTE	0283	DATA	Global
fatptr . . . . . . . . . . . . .  	L WORD	0288	DATA	Global
fatsiz . . . . . . . . . . . . .  	L WORD	0284	DATA	Global
fattbl . . . . . . . . . . . . .  	L BYTE	0000	LASTSEG	Global
FCB  . . . . . . . . . . . . . .  	NUMBER	005C	
FCB1 . . . . . . . . . . . . . .  	NUMBER	005C	
FCB2 . . . . . . . . . . . . . .  	NUMBER	006C	
FCBDEVICE  . . . . . . . . . . .  	NUMBER	0040	
FCBMASK  . . . . . . . . . . . .  	NUMBER	00C0	
FCBNETWORK . . . . . . . . . . .  	NUMBER	0080	
FCBSHARE . . . . . . . . . . . .  	NUMBER	00C0	
FCBSPECIAL . . . . . . . . . . .  	NUMBER	0080	
FCB_CLOSE  . . . . . . . . . . .  	NUMBER	0010	
fcb_copy . . . . . . . . . . . .  	L BYTE	0260	DATA	Global	Length = 0020
FCB_CREATE . . . . . . . . . . .  	NUMBER	0016	
FCB_DELETE . . . . . . . . . . .  	NUMBER	0013	
FCB_FILENAME_LENGTH  . . . . . .  	NUMBER	000B	
FCB_L_ATTR . . . . . . . . . . .  	BYTE	001E	
FCB_L_DRIVE  . . . . . . . . . .  	BYTE	0019	
FCB_L_FIRCLUS  . . . . . . . . .  	WORD	001A	
FCB_L_MFS  . . . . . . . . . . .  	WORD	001C	
FCB_NETID  . . . . . . . . . . .  	DWORD	001C	
FCB_NET_DRIVE  . . . . . . . . .  	BYTE	0019	
FCB_NET_HANDLE . . . . . . . . .  	WORD	001A	
FCB_NSLD_DRIVE . . . . . . . . .  	BYTE	0019	
FCB_NSLD_DRVPTR  . . . . . . . .  	DWORD	001A	
FCB_NSL_BITS . . . . . . . . . .  	BYTE	001A	
FCB_NSL_DIRPOS . . . . . . . . .  	BYTE	001F	
FCB_NSL_DIRSEC . . . . . . . . .  	WORD	001D	
FCB_NSL_DRIVE  . . . . . . . . .  	BYTE	0019	
FCB_NSL_FIRCLUS  . . . . . . . .  	WORD	001B	
FCB_OPEN . . . . . . . . . . . .  	NUMBER	000F	
FCB_RANDOM_READ  . . . . . . . .  	NUMBER	0021	
FCB_RANDOM_READ_BLOCK  . . . . .  	NUMBER	0027	
FCB_RANDOM_WRITE . . . . . . . .  	NUMBER	0022	
FCB_RANDOM_WRITE_BLOCK . . . . .  	NUMBER	0028	
FCB_RENAME . . . . . . . . . . .  	NUMBER	0017	
FCB_SEQ_READ . . . . . . . . . .  	NUMBER	0014	
FCB_SEQ_WRITE  . . . . . . . . .  	NUMBER	0015	
FCB_SFN  . . . . . . . . . . . .  	BYTE	0018	
FCHK . . . . . . . . . . . . . .  	NUMBER	0001	
FDELIM . . . . . . . . . . . . .  	NUMBER	0002	
fEOF . . . . . . . . . . . . . .  	N PROC	0128	CODE	Global	Length = 000F
FFCB . . . . . . . . . . . . . .  	NUMBER	0008	
filcnt . . . . . . . . . . . . .  	L WORD	0280	DATA	Global
FILDIRENT  . . . . . . . . . . .  	NUMBER	0010	
file_spec  . . . . . . . . . . .  	N PROC	03AC	CODE	Global	Length = 003F
FILE_TIMES . . . . . . . . . . .  	NUMBER	0057	
fill_dir . . . . . . . . . . . .  	N PROC	068C	CODE	Global	Length = 006F
fill_fat . . . . . . . . . . . .  	N PROC	053A	CODE	Global	Length = 0081
FILPERPROC . . . . . . . . . . .  	NUMBER	0014	
filsiz . . . . . . . . . . . . .  	L WORD	029C	DATA	Global
FIND_FIRST . . . . . . . . . . .  	NUMBER	004E	
FIND_NEXT  . . . . . . . . . . .  	NUMBER	004F	
firdir . . . . . . . . . . . . .  	L WORD	0292	DATA	Global
firfat . . . . . . . . . . . . .  	L WORD	0286	DATA	Global
firrec . . . . . . . . . . . . .  	L WORD	0290	DATA	Global
fname_buffer . . . . . . . . . .  	L BYTE	0102	DATA	Global	Length = 0080
FNDBACK  . . . . . . . . . . . .  	L WORD	0004	DATA
FORMFD . . . . . . . . . . . . .  	NUMBER	000C	
found  . . . . . . . . . . . . .  	L BYTE	0182	DATA	Global
FOUND_NO . . . . . . . . . . . .  	NUMBER	0000	
FOUND_YES  . . . . . . . . . . .  	NUMBER	0001	
FSPCHK . . . . . . . . . . . . .  	NUMBER	0004	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-12


fudge  . . . . . . . . . . . . .  	L BYTE	00B8	DATA	Global
F_AUX  . . . . . . . . . . . . .  	NUMBER	0010	
F_CARRY  . . . . . . . . . . . .  	NUMBER	0001	
F_DIRECTION  . . . . . . . . . .  	NUMBER	0400	
f_exists . . . . . . . . . . . .  	L NEAR	03D2	CODE	Global
F_INTERRUPT  . . . . . . . . . .  	NUMBER	0200	
F_OVERFLOW . . . . . . . . . . .  	NUMBER	0800	
F_PARITY . . . . . . . . . . . .  	NUMBER	0004	
F_SIGN . . . . . . . . . . . . .  	NUMBER	0080	
F_TRACE  . . . . . . . . . . . .  	NUMBER	0100	
F_ZERO . . . . . . . . . . . . .  	NUMBER	0040	

GETCURRENTPSP  . . . . . . . . .  	NUMBER	0062	
GETEXTCNTRY  . . . . . . . . . .  	NUMBER	0065	
GETEXTENDEDERROR . . . . . . . .  	NUMBER	0059	
GetFat . . . . . . . . . . . . .  	N PROC	001D	CODE	Global	Length = 0037
getfat1  . . . . . . . . . . . .  	L NEAR	004B	CODE	Global
GetKeystroke . . . . . . . . . .  	N PROC	0092	CODE	Global	Length = 000B
GETMSG . . . . . . . . . . . . .  	NUMBER	0000	
getret . . . . . . . . . . . . .  	L NEAR	004F	CODE	Global
GETSETCDPG . . . . . . . . . . .  	NUMBER	0066	
GETSETMEDIAID  . . . . . . . . .  	NUMBER	0069	
getSmall . . . . . . . . . . . .  	L NEAR	003A	CODE	Global
GET_CURRENT_PDB  . . . . . . . .  	NUMBER	0051	
GET_DATE . . . . . . . . . . . .  	NUMBER	002A	
GET_DEFAULT_DPB  . . . . . . . .  	NUMBER	001F	
GET_DEFAULT_DRIVE  . . . . . . .  	NUMBER	0019	
GET_DMA  . . . . . . . . . . . .  	NUMBER	002F	
GET_DPB  . . . . . . . . . . . .  	NUMBER	0032	
get_dpb_info . . . . . . . . . .  	N PROC	0156	CODE	Global	Length = 006B
GET_DRIVE_FREESPACE  . . . . . .  	NUMBER	0036	
get_fcb  . . . . . . . . . . . .  	N PROC	01FB	CODE	Global	Length = 005A
GET_FCB_FILE_LENGTH  . . . . . .  	NUMBER	0023	
GET_FCB_POSITION . . . . . . . .  	NUMBER	0024	
GET_INDOS_FLAG . . . . . . . . .  	NUMBER	0034	
GET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0035	
GET_IN_VARS  . . . . . . . . . .  	NUMBER	0052	
GET_TIME . . . . . . . . . . . .  	NUMBER	002C	
GET_VERIFY_ON_WRITE  . . . . . .  	NUMBER	0054	
GET_VERSION  . . . . . . . . . .  	NUMBER	0030	

HANDLE_FAIL_I24  . . . . . . . .  	NUMBER	0100	
hardch . . . . . . . . . . . . .  	L DWORD	00B3	DATA	Global
header . . . . . . . . . . . . .  	L BYTE	00A9	DATA	Global
HOME . . . . . . . . . . . . . .  	NUMBER	000B	
HONGEUL  . . . . . . . . . . . .  	NUMBER	0063	

I24_AREA . . . . . . . . . . . .  	NUMBER	0006	
I24_CLASS  . . . . . . . . . . .  	NUMBER	0080	
I24_OPERATION  . . . . . . . . .  	NUMBER	0001	
IBM  . . . . . . . . . . . . . .  	ALIAS	 IBMVER		
IBMCOPYRIGHT . . . . . . . . . .  	ALIAS	 FALSE		
IBMJAPAN . . . . . . . . . . . .  	ALIAS	 FALSE		
IBMJAPVER  . . . . . . . . . . .  	ALIAS	 FALSE		
IBMVER . . . . . . . . . . . . .  	ALIAS	 TRUE		
IFSFUNC_INSTALLED  . . . . . . .  	NUMBER	00FF	
IFSFUNC_INSTALL_CHECK  . . . . .  	NUMBER	0500	
IFS_GET_ERR_TEXT . . . . . . . .  	NUMBER	0502	
IFS_IOCTL  . . . . . . . . . . .  	NUMBER	006B	
INPUTMSG . . . . . . . . . . . .  	NUMBER	0000	
INSTALLED  . . . . . . . . . . .  	NUMBER	FFFF	
INSTALLEDDATA  . . . . . . . . .  	NUMBER	0000	
INTBASE  . . . . . . . . . . . .  	NUMBER	0080	
INTERNAT . . . . . . . . . . . .  	ALIAS	 FALSE		
INTERNATIONAL  . . . . . . . . .  	NUMBER	0038	
INTERNAT_BLOCK_MAX . . . . . . .  	NUMBER	0020	
INTTAB . . . . . . . . . . . . .  	NUMBER	0020	
int_23 . . . . . . . . . . . . .  	L NEAR	0386	CODE	Global
int_23_old_off . . . . . . . . .  	L WORD	01B5	DATA	Global
int_23_old_seg . . . . . . . . .  	L WORD	01B7	DATA	Global
int_24 . . . . . . . . . . . . .  	F PROC	0480	CODE	Global	Length = 0012
int_24_back  . . . . . . . . . .  	L NEAR	0492	CODE	Global
INT_24_ERROR . . . . . . . . . .  	NUMBER	2000	
int_24_old_off . . . . . . . . .  	L WORD	01B9	DATA	Global
int_24_old_seg . . . . . . . . .  	L WORD	01BB	DATA	Global
INT_24_RETADDR . . . . . . . . .  	L 0002	047E	CODE
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-13


INT_ABORT  . . . . . . . . . . .  	ALIAS	 INTTAB		
INT_COMMAND  . . . . . . . . . .  	NUMBER	0021	
INT_CTRL_C . . . . . . . . . . .  	NUMBER	0023	
INT_DISK_READ  . . . . . . . . .  	NUMBER	0025	
INT_DISK_WRITE . . . . . . . . .  	NUMBER	0026	
INT_FASTCON  . . . . . . . . . .  	NUMBER	0029	
INT_FATAL_ABORT  . . . . . . . .  	NUMBER	0024	
INT_IBM  . . . . . . . . . . . .  	NUMBER	002A	
INT_KEEP_PROCESS . . . . . . . .  	NUMBER	0027	
INT_SPOOLER  . . . . . . . . . .  	NUMBER	0028	
INT_TERMINATE  . . . . . . . . .  	NUMBER	0022	
IOCTL  . . . . . . . . . . . . .  	NUMBER	0044	
IO_MODE_ID . . . . . . . . . . .  	NUMBER	0002	
ireti  . . . . . . . . . . . . .  	L NEAR	049C	CODE	Global

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

KANJI  . . . . . . . . . . . . .  	ALIAS	 FALSE		
KEEP_PROCESS . . . . . . . . . .  	NUMBER	0031	
kill_bl  . . . . . . . . . . . .  	L NEAR	01D3	CODE	Global
KOREA  . . . . . . . . . . . . .  	ALIAS	 FALSE		

LASTBS . . . . . . . . . . . . .  	L WORD	0002	DATA
LASTCHAR . . . . . . . . . . . .  	L WORD	0000	DATA
lastfat  . . . . . . . . . . . .  	L WORD	02A2	DATA	Global
LBL_RECOVER  . . . . . . . . . .  	NUMBER	0001	
LEFT_ALIGN . . . . . . . . . . .  	NUMBER	0000	
LEN_FS_ID_STRING . . . . . . . .  	NUMBER	0008	
LEN_FS_STRING_BUFFER . . . . . .  	NUMBER	000D	
LEN_FS_STRING_END  . . . . . . .  	NUMBER	0008	
LF . . . . . . . . . . . . . . .  	NUMBER	000A	
Load . . . . . . . . . . . . . .  	N PROC	00CA	CODE	Global	Length = 001F
LOADMSG  . . . . . . . . . . . .  	NUMBER	0000	
LOCKOPER . . . . . . . . . . . .  	NUMBER	005C	
LOCUS_39 . . . . . . . . . . . .  	NUMBER	0001	
LOWEST_4CH_VERSION . . . . . . .  	NUMBER	0002	
LOW_NIB_MASK . . . . . . . . . .  	NUMBER	000F	
LSEEK  . . . . . . . . . . . . .  	NUMBER	0042	

Main_Init  . . . . . . . . . . .  	L NEAR	0000	CODE	External
main_loop1 . . . . . . . . . . .  	N PROC	0616	CODE	Global	Length = 0041
Main_Routine . . . . . . . . . .  	L NEAR	0255	CODE	Global
MAJOR_VERSION  . . . . . . . . .  	NUMBER	0004	
MAXBUCKETINPAGE  . . . . . . . .  	NUMBER	0002	
MAXBUFFINBUCKET  . . . . . . . .  	NUMBER	000F	
maxclus  . . . . . . . . . . . .  	L WORD	02A0	DATA	Global
maxent . . . . . . . . . . . . .  	L WORD	028E	DATA	Global
MEMS . . . . . . . . . . . . . .  	NUMBER	0001	
MINOR_VERSION  . . . . . . . . .  	NUMBER	0000	
MI_INT . . . . . . . . . . . . .  	NUMBER	00CD	
MI_LONG_CALL . . . . . . . . . .  	NUMBER	009A	
MI_LONG_JMP  . . . . . . . . . .  	NUMBER	00EA	
MI_LONG_RET  . . . . . . . . . .  	NUMBER	00CB	
MI_NEAR_RET  . . . . . . . . . .  	NUMBER	00C3	
MKDIR  . . . . . . . . . . . . .  	NUMBER	0039	
MSGDATA  . . . . . . . . . . . .  	NUMBER	0000	
MSG_SER_CLASS  . . . . . . . . .  	NUMBER	0000	
MSVER  . . . . . . . . . . . . .  	NUMBER	0000	
MULTDOS  . . . . . . . . . . . .  	NUMBER	0012	
MULTIFS  . . . . . . . . . . . .  	NUMBER	0011	
MULTIPLEX  . . . . . . . . . . .  	NUMBER	002F	
MULTNET  . . . . . . . . . . . .  	NUMBER	0011	
MULTSHARE  . . . . . . . . . . .  	NUMBER	0010	

NAM0 . . . . . . . . . . . . . .  	L NEAR	0690	CODE
NAM1 . . . . . . . . . . . . . .  	L NEAR	069D	CODE
name_copied  . . . . . . . . . .  	L NEAR	01F4	CODE	Global
NEARMSG  . . . . . . . . . . . .  	NUMBER	FFFF	
NET_CHECK  . . . . . . . . . . .  	NUMBER	1200	
NEW_FILE_SYSTEM  . . . . . . . .  	NUMBER	0006	
NEW_SUBDIR . . . . . . . . . . .  	L BYTE	0046	DATA	Length = 0040
next_char  . . . . . . . . . . .  	L NEAR	01E5	CODE	Global
NLSFUNC  . . . . . . . . . . . .  	NUMBER	0014	
NO . . . . . . . . . . . . . . .  	NUMBER	0000	
NOCHECKSTDIN . . . . . . . . . .  	NUMBER	0000	
NOCHECKSTDOUT  . . . . . . . . .  	NUMBER	0000	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-14


NODIRERR . . . . . . . . . . . .  	L NEAR	0641	CODE
nofspec  . . . . . . . . . . . .  	L NEAR	01CA	CODE	Global
noname . . . . . . . . . . . . .  	L NEAR	033D	CODE	Global
NOSET  . . . . . . . . . . . . .  	L NEAR	00C9	CODE
NOT_EXISTS_MASK  . . . . . . . .  	NUMBER	00F0	
NOT_EX_FAIL_EX_OPEN  . . . . . .  	NUMBER	0101	
NOT_INCLUDE  . . . . . . . . . .  	NUMBER	0000	
not_root . . . . . . . . . . . .  	L NEAR	02C1	CODE	Global
NOVERCHECKMSG  . . . . . . . . .  	NUMBER	0000	
NO_CODE_PAGE_CHECK . . . . . . .  	NUMBER	0100	
NO_CRIT_OPEN . . . . . . . . . .  	NUMBER	2000	
NO_ENTRY . . . . . . . . . . . .  	NUMBER	0000	
NO_ERROR . . . . . . . . . . . .  	NUMBER	0000	
no_errors  . . . . . . . . . . .  	L NEAR	0319	CODE	Global
NO_EXT_ATTRIB  . . . . . . . . .  	NUMBER	0000	
no_fudge . . . . . . . . . . . .  	L NEAR	0475	CODE	Global
NO_HANDLE  . . . . . . . . . . .  	NUMBER	FFFF	
NO_INPUT . . . . . . . . . . . .  	NUMBER	0000	
no_mem_arg . . . . . . . . . . .  	V WORD	0000	DATA	External
NO_REPLACE . . . . . . . . . . .  	NUMBER	0000	
NULL . . . . . . . . . . . . . .  	NUMBER	0000	
NUMMSG . . . . . . . . . . . . .  	NUMBER	0000	

OEM_C1 . . . . . . . . . . . . .  	NUMBER	00F9	
OEM_C2 . . . . . . . . . . . . .  	NUMBER	00FA	
OEM_C3 . . . . . . . . . . . . .  	NUMBER	00FB	
OEM_C4 . . . . . . . . . . . . .  	NUMBER	00FC	
OEM_C5 . . . . . . . . . . . . .  	NUMBER	00FD	
OEM_C6 . . . . . . . . . . . . .  	NUMBER	00FE	
OEM_C7 . . . . . . . . . . . . .  	NUMBER	00FF	
OLD_DRIVE  . . . . . . . . . . .  	L BYTE	0094	DATA
OLD_SUBDIR . . . . . . . . . . .  	L BYTE	0006	DATA	Length = 0040
OPEN . . . . . . . . . . . . . .  	NUMBER	003D	
OPEN_FOR_BOTH  . . . . . . . . .  	NUMBER	0002	
OPEN_FOR_READ  . . . . . . . . .  	NUMBER	0000	
OPEN_FOR_WRITE . . . . . . . . .  	NUMBER	0001	
OpnErr . . . . . . . . . . . . .  	V BYTE	0000	DATA	External

paras_per_64k  . . . . . . . . .  	L WORD	0086	DATA	Global
paras_per_fat  . . . . . . . . .  	L WORD	0088	DATA	Global
PARSE_ERR_CLASS  . . . . . . . .  	NUMBER	0002	
PARSE_FILE_DESCRIPTOR  . . . . .  	NUMBER	0029	
PATHPARSE  . . . . . . . . . . .  	NUMBER	0061	
PDB_APPEND . . . . . . . . . . .  	BYTE	003D	
PDB_INTERCON . . . . . . . . . .  	BYTE	003C	
printerr . . . . . . . . . . . .  	N PROC	05BB	CODE	Global	Length = 0012
process_file . . . . . . . . . .  	N PROC	03EB	CODE	Global	Length = 006E
Prompt . . . . . . . . . . . . .  	N PROC	009D	CODE	Global	Length = 002D
prompted . . . . . . . . . . . .  	L BYTE	00B2	DATA	Global
psp_segment  . . . . . . . . . .  	L WORD	0184	DATA	Global

rabort . . . . . . . . . . . . .  	L NEAR	03AB	CODE	Global
RAW_CON_INPUT  . . . . . . . . .  	NUMBER	0007	
RAW_CON_IO . . . . . . . . . . .  	NUMBER	0006	
READ . . . . . . . . . . . . . .  	NUMBER	003F	
ReadFt . . . . . . . . . . . . .  	N PROC	00E9	CODE	Global	Length = 002E
Read_Disk  . . . . . . . . . . .  	L NEAR	0000	CODE	External
read_fats  . . . . . . . . . . .  	N PROC	0657	CODE	Global	Length = 0035
Read_File  . . . . . . . . . . .  	N PROC	049D	CODE	Global	Length = 0029
read_write_relative  . . . . . .  	L TBYTE	02AA	DATA	Global
RECDSK . . . . . . . . . . . . .  	L NEAR	06FB	CODE
RecFil . . . . . . . . . . . . .  	L NEAR	03AC	CODE	Global
recfil0  . . . . . . . . . . . .  	L NEAR	03D0	CODE	Global
RECFILE0 . . . . . . . . . . . .  	L NEAR	03EB	CODE
RecMsg . . . . . . . . . . . . .  	V BYTE	0000	DATA	External
REC_ERROR  . . . . . . . . . . .  	NUMBER	0001	
rec_num  . . . . . . . . . . . .  	L WORD	009D	DATA	Global
REDIRECTOR . . . . . . . . . . .  	NUMBER	0000	
RENAME . . . . . . . . . . . . .  	NUMBER	0056	
report . . . . . . . . . . . . .  	L NEAR	0000	CODE	External
RESERVED . . . . . . . . . . . .  	NUMBER	0000	
RESERVED_BITS_MASK . . . . . . .  	NUMBER	FE00	
rest_dir . . . . . . . . . . . .  	N PROC	0459	CODE	Global	Length = 0025
RET_L  . . . . . . . . . . . . .  	NEAR	05BA	CODE
RET_NZ . . . . . . . . . . . . .  	NEAR	00A2	CODE
rexit1 . . . . . . . . . . . . .  	L NEAR	03D5	CODE	Global
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-15


rexit2 . . . . . . . . . . . . .  	L NEAR	0738	CODE	Global
RIGHT_ALIGN  . . . . . . . . . .  	NUMBER	0080	
RMDIR  . . . . . . . . . . . . .  	NUMBER	003A	

same_dir . . . . . . . . . . . .  	L NEAR	0327	CODE	Global
SAME_DIRJ  . . . . . . . . . . .  	L NEAR	027F	CODE
same_drive . . . . . . . . . . .  	L NEAR	02D9	CODE	Global
secall . . . . . . . . . . . . .  	L WORD	028A	DATA	Global
secsiz . . . . . . . . . . . . .  	L WORD	0296	DATA	Global
secs_per_64k . . . . . . . . . .  	L WORD	008A	DATA	Global
sec_count  . . . . . . . . . . .  	L WORD	008C	DATA	Global
See_If_File  . . . . . . . . . .  	L NEAR	036F	CODE	Global
seg_adj  . . . . . . . . . . . .  	L NEAR	0000	CODE	External
SERVERCALL . . . . . . . . . . .  	NUMBER	005D	
SETBLOCK . . . . . . . . . . . .  	NUMBER	004A	
SETDPB . . . . . . . . . . . . .  	NUMBER	0053	
SetFat . . . . . . . . . . . . .  	N PROC	0054	CODE	Global	Length = 003E
setfat1  . . . . . . . . . . . .  	L NEAR	008B	CODE	Global
setfat2  . . . . . . . . . . . .  	L NEAR	0088	CODE	Global
setRet . . . . . . . . . . . . .  	L NEAR	0091	CODE	Global
setsmall . . . . . . . . . . . .  	L NEAR	0071	CODE	Global
SETSTDIO . . . . . . . . . . . .  	NUMBER	0000	
SET_APPEND_X . . . . . . . . . .  	NUMBER	B707	
SET_CTRL_C_TRAPPING  . . . . . .  	NUMBER	0033	
SET_CURRENT_PDB  . . . . . . . .  	NUMBER	0050	
SET_DATE . . . . . . . . . . . .  	NUMBER	002B	
SET_DEFAULT_DRIVE  . . . . . . .  	NUMBER	000E	
SET_DMA  . . . . . . . . . . . .  	NUMBER	001A	
SET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0025	
SET_OEM_HANDLER  . . . . . . . .  	NUMBER	00F8	
SET_PRINTER_FLAG . . . . . . . .  	NUMBER	0064	
SET_TIME . . . . . . . . . . . .  	NUMBER	002D	
SET_VERIFY_ON_WRITE  . . . . . .  	NUMBER	002E	
SFFromFCB  . . . . . . . . . . .  	N PROC	0137	CODE	Global	Length = 001F
sfsize . . . . . . . . . . . . .  	L NEAR	0511	CODE	Global
SF_BUSY  . . . . . . . . . . . .  	NUMBER	-0001	
SF_CLOSE_NODATE  . . . . . . . .  	NUMBER	4000	
SF_DEFAULT_NUMBER  . . . . . . .  	NUMBER	0005	
SF_FSDA  . . . . . . . . . . . .  	BYTE	0019	
SF_ISFCB . . . . . . . . . . . .  	NUMBER	8000	
SF_ISNET . . . . . . . . . . . .  	NUMBER	8000	
SF_LRU . . . . . . . . . . . . .  	WORD	0015	
SF_NETID . . . . . . . . . . . .  	BYTE	0019	
SF_NET_SPOOL . . . . . . . . . .  	NUMBER	0800	
SF_NO_INHERIT  . . . . . . . . .  	NUMBER	1000	
SF_OPENAGE . . . . . . . . . . .  	WORD	0017	
SF_PIPE  . . . . . . . . . . . .  	NUMBER	2000	
SF_SERIAL_ID . . . . . . . . . .  	WORD	000B	
SGN_BIN_BYTE . . . . . . . . . .  	NUMBER	0012	
SGN_BIN_DWORD  . . . . . . . . .  	NUMBER	0032	
SGN_BIN_TYPE . . . . . . . . . .  	NUMBER	0002	
SGN_BIN_WORD . . . . . . . . . .  	NUMBER	0022	
SHAREF . . . . . . . . . . . . .  	NUMBER	0000	
SHARING_COMPAT . . . . . . . . .  	NUMBER	0000	
SHARING_DENY_BOTH  . . . . . . .  	NUMBER	0010	
SHARING_DENY_NONE  . . . . . . .  	NUMBER	0040	
SHARING_DENY_READ  . . . . . . .  	NUMBER	0030	
SHARING_DENY_WRITE . . . . . . .  	NUMBER	0020	
SHARING_MASK . . . . . . . . . .  	NUMBER	00F0	
SHARING_NET_FCB  . . . . . . . .  	NUMBER	0070	
SHARING_NO_INHERIT . . . . . . .  	NUMBER	0080	
SIXTEEN  . . . . . . . . . . . .  	L WORD	008E	DATA
siztmp . . . . . . . . . . . . .  	L WORD	0298	DATA	Global
sj1  . . . . . . . . . . . . . .  	L NEAR	02F5	CODE	Global
sja  . . . . . . . . . . . . . .  	L NEAR	02AE	CODE	Global
sjb  . . . . . . . . . . . . . .  	L NEAR	02BC	CODE	Global
slashok  . . . . . . . . . . . .  	L NEAR	01C1	CODE	Global
STDAUX . . . . . . . . . . . . .  	NUMBER	0003	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDIN  . . . . . . . . . . . . .  	NUMBER	0000	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STDPRN . . . . . . . . . . . . .  	NUMBER	0004	
STD_AUX_INPUT  . . . . . . . . .  	NUMBER	0003	
STD_AUX_OUTPUT . . . . . . . . .  	NUMBER	0004	
STD_CON_INPUT  . . . . . . . . .  	NUMBER	0001	
STD_CON_INPUT_FLUSH  . . . . . .  	NUMBER	000C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-16


STD_CON_INPUT_NO_ECHO  . . . . .  	NUMBER	0008	
STD_CON_INPUT_STATUS . . . . . .  	NUMBER	000B	
STD_CON_OUTPUT . . . . . . . . .  	NUMBER	0002	
STD_CON_STRING_INPUT . . . . . .  	NUMBER	000A	
STD_CON_STRING_OUTPUT  . . . . .  	NUMBER	0009	
STD_PRINTER_OUTPUT . . . . . . .  	NUMBER	0005	
STEP1  . . . . . . . . . . . . .  	L NEAR	0660	CODE
STEP1A . . . . . . . . . . . . .  	L NEAR	05CE	CODE
step2  . . . . . . . . . . . . .  	L NEAR	05E6	CODE	Global
step3  . . . . . . . . . . . . .  	L NEAR	05F1	CODE	Global
step4  . . . . . . . . . . . . .  	L NEAR	05FA	CODE	Global
STEP4A . . . . . . . . . . . . .  	L NEAR	0623	CODE
STEP6  . . . . . . . . . . . . .  	L NEAR	0670	CODE
STEP7  . . . . . . . . . . . . .  	L NEAR	0711	CODE
stop_read  . . . . . . . . . . .  	L NEAR	0422	CODE	Global
STRING_DONE  . . . . . . . . . .  	NUMBER	0000	
SUBLIST_LENGTH . . . . . . . . .  	NUMBER	000B	

TAB  . . . . . . . . . . . . . .  	NUMBER	0009	
table  . . . . . . . . . . . . .  	L WORD	02BA	DATA	Global
target . . . . . . . . . . . . .  	L WORD	028C	DATA	Global
TEMPLEN  . . . . . . . . . . . .  	NUMBER	0086	
the_root . . . . . . . . . . . .  	L BYTE	00B7	DATA	Global
TIMEMSG  . . . . . . . . . . . .  	NUMBER	0000	
TIME_24_TYPE . . . . . . . . . .  	NUMBER	0006	
TIME_CTY_TYPE  . . . . . . . . .  	NUMBER	0005	
TIME_HHMMSSHH_24 . . . . . . . .  	NUMBER	0026	
TIME_HHMMSSHH_CTY  . . . . . . .  	NUMBER	0025	
TIME_HHMMSS_24 . . . . . . . . .  	NUMBER	0016	
TIME_HHMMSS_CTY  . . . . . . . .  	NUMBER	0015	
TIME_HHMM_24 . . . . . . . . . .  	NUMBER	0006	
TIME_HHMM_CTY  . . . . . . . . .  	NUMBER	0005	
transrc  . . . . . . . . . . . .  	L BYTE	01AD	DATA	Global
TRUE . . . . . . . . . . . . . .  	NUMBER	FFFF	
TRUEBYTE . . . . . . . . . . . .  	NUMBER	00FF	

UNLINK . . . . . . . . . . . . .  	NUMBER	0041	
UNSGN_BIN_BYTE . . . . . . . . .  	NUMBER	0011	
UNSGN_BIN_DWORD  . . . . . . . .  	NUMBER	0031	
UNSGN_BIN_TYPE . . . . . . . . .  	NUMBER	0001	
UNSGN_BIN_WORD . . . . . . . . .  	NUMBER	0021	
userdir  . . . . . . . . . . . .  	L BYTE	00BD	DATA	Global
USEROPER . . . . . . . . . . . .  	NUMBER	005E	
user_drive . . . . . . . . . . .  	L BYTE	00B9	DATA	Global
UTILITY_MSG_CLASS  . . . . . . .  	NUMBER	00FF	

VOL_ATTRIBUTE  . . . . . . . . .  	NUMBER	0008	

WAITPROCESS  . . . . . . . . . .  	NUMBER	004D	
WRITE  . . . . . . . . . . . . .  	NUMBER	0040	
Write_Disk . . . . . . . . . . .  	L NEAR	0000	CODE	External
WRITE_PROTECT  . . . . . . . . .  	NUMBER	0000	
WrtFat . . . . . . . . . . . . .  	N PROC	0117	CODE	Global	Length = 0011
wrtit  . . . . . . . . . . . . .  	L NEAR	011A	CODE	Global
wrtok  . . . . . . . . . . . . .  	L NEAR	011F	CODE	Global

XDUP . . . . . . . . . . . . . .  	NUMBER	0045	
XDUP2  . . . . . . . . . . . . .  	NUMBER	0046	
XNAMETRANS . . . . . . . . . . .  	NUMBER	0060	
x_value_hi . . . . . . . . . . .  	L WORD	00A1	DATA	Global
x_value_lo . . . . . . . . . . .  	L WORD	009F	DATA	Global

YES  . . . . . . . . . . . . . .  	NUMBER	FFFF	
y_value_hi . . . . . . . . . . .  	L WORD	00A5	DATA	Global
y_value_lo . . . . . . . . . . .  	L WORD	00A3	DATA	Global

$$A_START_recover  . . . . . . .  	L NEAR	0000	CODE	Global
$$A_STOP_recover . . . . . . . .  	L NEAR	0749	CODE	Global
$$DO101  . . . . . . . . . . . .  	L NEAR	0660	CODE
$$DO106  . . . . . . . . . . . .  	L NEAR	0690	CODE
$$DO14 . . . . . . . . . . . . .  	L NEAR	011A	CODE
$$DO20 . . . . . . . . . . . . .  	L NEAR	01D3	CODE
$$DO23 . . . . . . . . . . . . .  	L NEAR	0217	CODE
$$DO33 . . . . . . . . . . . . .  	L NEAR	023F	CODE
$$DO41 . . . . . . . . . . . . .  	L NEAR	0285	CODE
$$DO62 . . . . . . . . . . . . .  	L NEAR	0419	CODE
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-17


$$DO81 . . . . . . . . . . . . .  	L NEAR	05A5	CODE
$$DO86 . . . . . . . . . . . . .  	L NEAR	05E3	CODE
$$DO88 . . . . . . . . . . . . .  	L NEAR	05F1	CODE
$$DO94 . . . . . . . . . . . . .  	L NEAR	0616	CODE
$$EN1  . . . . . . . . . . . . .  	L NEAR	004F	CODE
$$EN101  . . . . . . . . . . . .  	L NEAR	068A	CODE
$$EN106  . . . . . . . . . . . .  	L NEAR	069D	CODE
$$EN14 . . . . . . . . . . . . .  	L NEAR	0127	CODE
$$EN17 . . . . . . . . . . . . .  	L NEAR	01C0	CODE
$$EN20 . . . . . . . . . . . . .  	L NEAR	01DE	CODE
$$EN23 . . . . . . . . . . . . .  	L NEAR	023A	CODE
$$EN25 . . . . . . . . . . . . .  	L NEAR	022A	CODE
$$EN33 . . . . . . . . . . . . .  	L NEAR	0254	CODE
$$EN35 . . . . . . . . . . . . .  	L NEAR	0252	CODE
$$EN41 . . . . . . . . . . . . .  	L NEAR	02A4	CODE
$$EN52 . . . . . . . . . . . . .  	L NEAR	0386	CODE
$$EN55 . . . . . . . . . . . . .  	L NEAR	03EA	CODE
$$EN57 . . . . . . . . . . . . .  	L NEAR	03EA	CODE
$$EN6  . . . . . . . . . . . . .  	L NEAR	0091	CODE
$$EN62 . . . . . . . . . . . . .  	L NEAR	0450	CODE
$$EN64 . . . . . . . . . . . . .  	L NEAR	0447	CODE
$$EN73 . . . . . . . . . . . . .  	L NEAR	04F1	CODE
$$EN8  . . . . . . . . . . . . .  	L NEAR	008B	CODE
$$EN80 . . . . . . . . . . . . .  	L NEAR	05BA	CODE
$$EN81 . . . . . . . . . . . . .  	L NEAR	05B6	CODE
$$EN88 . . . . . . . . . . . . .  	L NEAR	060C	CODE
$$EN94 . . . . . . . . . . . . .  	L NEAR	0656	CODE
$$IF1  . . . . . . . . . . . . .  	L NEAR	003A	CODE
$$IF103  . . . . . . . . . . . .  	L NEAR	0683	CODE
$$IF109  . . . . . . . . . . . .  	L NEAR	0738	CODE
$$IF111  . . . . . . . . . . . .  	L NEAR	0748	CODE
$$IF12 . . . . . . . . . . . . .  	L NEAR	0116	CODE
$$IF17 . . . . . . . . . . . . .  	L NEAR	01BC	CODE
$$IF24 . . . . . . . . . . . . .  	L NEAR	022A	CODE
$$IF25 . . . . . . . . . . . . .  	L NEAR	0229	CODE
$$IF3  . . . . . . . . . . . . .  	L NEAR	004B	CODE
$$IF30 . . . . . . . . . . . . .  	L NEAR	0237	CODE
$$IF35 . . . . . . . . . . . . .  	L NEAR	0251	CODE
$$IF39 . . . . . . . . . . . . .  	L NEAR	026D	CODE
$$IF43 . . . . . . . . . . . . .  	L NEAR	02A1	CODE
$$IF44 . . . . . . . . . . . . .  	L NEAR	02A1	CODE
$$IF48 . . . . . . . . . . . . .  	L NEAR	0360	CODE
$$IF50 . . . . . . . . . . . . .  	L NEAR	036F	CODE
$$IF52 . . . . . . . . . . . . .  	L NEAR	0383	CODE
$$IF55 . . . . . . . . . . . . .  	L NEAR	03D2	CODE
$$IF57 . . . . . . . . . . . . .  	L NEAR	03E7	CODE
$$IF6  . . . . . . . . . . . . .  	L NEAR	0071	CODE
$$IF61 . . . . . . . . . . . . .  	L NEAR	0450	CODE
$$IF64 . . . . . . . . . . . . .  	L NEAR	042C	CODE
$$IF66 . . . . . . . . . . . . .  	L NEAR	0441	CODE
$$IF71 . . . . . . . . . . . . .  	L NEAR	0475	CODE
$$IF73 . . . . . . . . . . . . .  	L NEAR	04E9	CODE
$$IF74 . . . . . . . . . . . . .  	L NEAR	04DA	CODE
$$IF78 . . . . . . . . . . . . .  	L NEAR	050C	CODE
$$IF8  . . . . . . . . . . . . .  	L NEAR	0088	CODE
$$IF80 . . . . . . . . . . . . .  	L NEAR	05B8	CODE
$$IF90 . . . . . . . . . . . . .  	L NEAR	0605	CODE
$$IF96 . . . . . . . . . . . . .  	L NEAR	0641	CODE
$$LL21 . . . . . . . . . . . . .  	L NEAR	01DC	CODE
$$SD86 . . . . . . . . . . . . .  	L NEAR	05E6	CODE
$M_ADDR_SZ_FAR . . . . . . . . .  	NUMBER	0004	
$M_ADDR_SZ_NEAR  . . . . . . . .  	NUMBER	0002	
$M_ALIGN_MASK  . . . . . . . . .  	NUMBER	0080	
$M_AM  . . . . . . . . . . . . .  	NUMBER	0061	
$M_BASE10  . . . . . . . . . . .  	NUMBER	000A	
$M_BASE16  . . . . . . . . . . .  	NUMBER	0010	
$M_BYTE  . . . . . . . . . . . .  	NUMBER	0010	
$M_CHAR_ONLY . . . . . . . . . .  	NUMBER	FFFF	
$M_CLASS_ID_SZ . . . . . . . . .  	NUMBER	0004	
$M_CLASS_NOT_EXIST . . . . . . .  	NUMBER	0000	
$M_CLS_1 . . . . . . . . . . . .  	L NEAR	0000	CODE	External
$M_COMMA . . . . . . . . . . . .  	NUMBER	002C	
$M_CON_INP . . . . . . . . . . .  	NUMBER	-0001	
$M_CRIT_ERR_MASK . . . . . . . .  	NUMBER	0001	
$M_CRIT_HI . . . . . . . . . . .  	NUMBER	0027	
$M_CRIT_LO . . . . . . . . . . .  	NUMBER	0013	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33
RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-18


$M_CRLF_SIZE . . . . . . . . . .  	NUMBER	0002	
$M_CR_LF . . . . . . . . . . . .  	NUMBER	0A0D	
$M_DATE_MASK . . . . . . . . . .  	NUMBER	0010	
$M_DBCS_TERM . . . . . . . . . .  	NUMBER	0000	
$M_DCOUNT  . . . . . . . . . . .  	NUMBER	0001	
$M_DEF_DATE_FORM . . . . . . . .  	NUMBER	0000	
$M_DEF_DATE_SEP  . . . . . . . .  	NUMBER	002D	
$M_DEF_DECI_SEP  . . . . . . . .  	NUMBER	002E	
$M_DEF_TIME_FORM . . . . . . . .  	NUMBER	0001	
$M_DEF_TIME_SEP  . . . . . . . .  	NUMBER	003A	
$M_DWORD . . . . . . . . . . . .  	NUMBER	0030	
$M_END . . . . . . . . . . . . .  	NUMBER	0000	
$M_EXTPAR_TYPE . . . . . . . . .  	NUMBER	0008	
$M_EXT_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_EXT_ERR_FLAG  . . . . . . . .  	NUMBER	FFFF	
$M_FIRST_THOU  . . . . . . . . .  	NUMBER	0003	
$M_GET_MSG_ADDRESS . . . . . . .  	L NEAR	0000	CODE	External
$M_ID_SZ . . . . . . . . . . . .  	NUMBER	0004	
$M_LOAD  . . . . . . . . . . . .  	NUMBER	FFFF	
$M_MAX_2_YEAR  . . . . . . . . .  	NUMBER	0063	
$M_MSGDATA_ONLY  . . . . . . . .  	NUMBER	FFFF	
$M_MSGSERV_1 . . . . . . . . . .  	L NEAR	0000	CODE	External
$M_MSGSERV_2 . . . . . . . . . .  	L NEAR	0000	CODE	External
$M_NEG_SIGN  . . . . . . . . . .  	NUMBER	002D	
$M_NEXT_DBCS_VECTOR  . . . . . .  	NUMBER	0002	
$M_NO_CRLF_MASK  . . . . . . . .  	NUMBER	0080	
$M_NO_HANDLE . . . . . . . . . .  	NUMBER	-0001	
$M_NULL  . . . . . . . . . . . .  	NUMBER	0000	
$M_NUM_CLS . . . . . . . . . . .  	NUMBER	0001	
$M_ONE_REPLACE . . . . . . . . .  	NUMBER	0001	
$M_PARSE_FLAG  . . . . . . . . .  	NUMBER	FFFF	
$M_PAR_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_PM  . . . . . . . . . . . . .  	NUMBER	0070	
$M_REPLACE . . . . . . . . . . .  	NUMBER	FFFF	
$M_REPL_DONE . . . . . . . . . .  	NUMBER	0000	
$M_RES_ADDRS_SZ  . . . . . . . .  	NUMBER	0085	
$M_RT  . . . . . . . . . . . . .  	V BYTE	0000	CODE	External
$M_SECOND_THOU . . . . . . . . .  	NUMBER	0006	
$M_SINGLE_CHAR . . . . . . . . .  	NUMBER	0001	
$M_SIZE_MASK . . . . . . . . . .  	NUMBER	0030	
$M_SL  . . . . . . . . . . . . .  	TEXT  DS:[SI]		
$M_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$M_SPACE_HYP . . . . . . . . . .  	NUMBER	2D20	
$M_SPECIAL_CASE  . . . . . . . .  	NUMBER	0030	
$M_SPECIAL_MSG_NUM . . . . . . .  	NUMBER	FFFF	
$M_STRUC . . . . . . . . . . . .  	NUMBER	0000	
$M_SUBS  . . . . . . . . . . . .  	NUMBER	FFFF	
$M_TEMP_BUF_SZ . . . . . . . . .  	NUMBER	0040	
$M_TERMINATING_FLAG  . . . . . .  	NUMBER	-0001	
$M_THIRD_THOU  . . . . . . . . .  	NUMBER	0009	
$M_TIMEDATE_PAD  . . . . . . . .  	NUMBER	0030	
$M_TIME_MASK . . . . . . . . . .  	NUMBER	0001	
$M_TYPE_MASK . . . . . . . . . .  	NUMBER	000F	
$M_UNLIM_W . . . . . . . . . . .  	NUMBER	0000	
$M_WORD  . . . . . . . . . . . .  	NUMBER	0020	
??0000 . . . . . . . . . . . . .  	L NEAR	001C	CODE
??0001 . . . . . . . . . . . . .  	L NEAR	0053	CODE
??0002 . . . . . . . . . . . . .  	L NEAR	0091	CODE
??0003 . . . . . . . . . . . . .  	L NEAR	009C	CODE
??0005 . . . . . . . . . . . . .  	L NEAR	00C9	CODE
??0006 . . . . . . . . . . . . .  	L NEAR	00E8	CODE
??0007 . . . . . . . . . . . . .  	L NEAR	0127	CODE
??0008 . . . . . . . . . . . . .  	L NEAR	0134	CODE
??0009 . . . . . . . . . . . . .  	L NEAR	0136	CODE
??000A . . . . . . . . . . . . .  	L NEAR	0155	CODE
??000B . . . . . . . . . . . . .  	L NEAR	0458	CODE
??000C . . . . . . . . . . . . .  	L NEAR	05BA	CODE
?PLM . . . . . . . . . . . . . .  	NUMBER	0000	
?WIN . . . . . . . . . . . . . .  	NUMBER	0000	
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  recover		
@VERSION . . . . . . . . . . . .  	TEXT  510		

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:33

RECOVER.SAL - MS-DOS File/Disk Recovery Utility             Symbols-19






   8397 Source  Lines
   9098 Total   Lines
   1351 Symbols

  40580 + 106834 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
