; This source code is not completed yet
; But, already, it is "original WIN98 FAT32 boot sector" disassembled code
; Erdogan Tan - 4 October 2003
; Disassembler: DASM.EXE & DEBUG.EXE & PV.EXE


		PAGE    60,132


;ÄÄÄÄÄÄÄÄÄÄ CODE_SEG_1  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

CODE_SEG_1	segment para public
		assume  CS:CODE_SEG_1, DS:CODE_SEG_1, SS:CODE_SEG_1, ES:CODE_SEG_1


                org     7C00h


;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		ENTRY POINT
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±


;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		PROCEDURE proc_start
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

proc_start	proc	far
start:          
		jmp	short loc_1		

		db	90h
var1_103	db	'MSWIN4.1'
		db	0, 2, 8, 20h, 0, 2
		db	4 dup (0)
		db	0F8h, 0, 0, 3Fh, 0, 0FFh
		db	0, 0C5h, 0FAh, 3Fh, 0, 0B9h
		db	8Bh, 0BAh, 0, 8Ch, 2Eh
		db	6 dup (0)
		db	2, 0, 0, 0, 1, 0
		db	6
		db	13 dup (0)
		db	80h, 0, 29h, 0EEh, 12h
var1_145	db	9
		db	'9XP         FAT32   '
loc_1:          
		cli				; Disable interrupts
		xor	CX,CX			
		mov	SS,CX			

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  SS:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

                mov     SP,7BF8h  ; 7C00h - 8       
		mov	ES,CX			

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  ES:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

		mov	BP,78h			

                ; SS:BP -> INT 1Eh vector - Floppy Disk Parameters structure

                lds     SI,Dword Ptr [BP+0]     ; Load FAR ptr

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  DS:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

		push	DS			
		push	SI			
		push	SS			
		push	BP			
		mov	DI,522h			
                mov     Word Ptr [BP+0],DI      ; The new INT 1Eh adresss
		mov	Word Ptr [BP+2],CX	
                mov     CL,0Bh                  ; Transfer Count
		cld				; Clear direction flag
		repz	movsb			; Repeat if ZF = 1, CX > 0
						; Move byte from DS:SI to ES:DI

                ; 11 bytes FDPT has been copied to ES:DI (0:522h)

                mov	DS,CX
                mov     BP,7C00h                ; Beginning of Boot Record
                mov     Byte Ptr [DI-2],0Fh     ; Modify Head Settle Time
                mov     AX,Word Ptr [BP+18h]    ; Sectors Per Track
                mov     Byte Ptr [DI-7],AL      ; Sectors Per Track Field
                cmp     Byte Ptr [BP+40h],CL    ; Compare Drive Num with 0
                jnl     MBR_Read_Error          ; Jump if not less ( >= )
                                                ; NOTE: > 7Fh (80h) is less! 
                mov	AX,CX
		cwd				; Convert word to dword
                mov     BX,700h                 ; Sector Read Buffer
                call    near ptr Read_Sector    ; Load MasterBoot Record 
                jb      MBR_Read_Error          ; Jump if below ( < )
                sub     BX,3Ah                  ; 900h-3Ah
                                                ; Result: BX= 08C6h
                                                ; Points MasterBoot PT
                                                ; Partition Starting Sector
                                                ; Field = 1C6h of MBR
                mov     EAX, DS:[7C1Ch]         ; Load Hidden Sectors
xxx:
                cmp     EAX,[BX]                ; Is It This Partition?
                mov     DL,[BX-4]               ; Put File System ID in DL

                jnz     NotOurs                 ; Jump if not our entry

              ; If File System ID is 0Ch or 0Eh
              ; INT13h, Function 42h, Extended (LBA) Read will be used.

                or      DL,2                    ; 0Ch or 0Eh -> 0Eh

                mov     Byte Ptr [BP+2],DL      ; Save 0Eh into 'nop' field
NotOurs:
                add     BL,10h                  ; Skip to next entry...
                jnb     CheckMBR                ; More entries?
MBRReadError:
                mov     DI,2

                ; FAT32 - Is Sector per FAT zero?

                cmp     Word Ptr [BP+16h],0
                jne     ShowErrMsg1

                ; Put number of hidden sectors in DX:AX

                mov     AX,Word Ptr [BP+1Ch]
                mov     DX,Word Ptr [BP+1Eh]

                mov     CX,3                    ; Boot Record is 3 sectors

                ; Start loading remainder of Boot Record
loc_2:          
		dec	CX			
                inc     AX                      
		jne	loc_3			; Jump if not equal ( != )
                inc     DX                      
loc_3:          
                mov     BX,7E00h                
                call    near ptr Read_Sector_X 
                jnb     Read_OK                 ; Jump if not below ( >= )
                mov     AL,0F8h                 ; ?
		dec	DI			
                je      loc_4                   ; Jump if no more sectors
                mov     AX,Word Ptr [BP+32h]    ; Get Backup Boot Sector
		xor	DX,DX			
		mov	CX,3			
                cmp     CX,AX                   ; Compare backup BS number
		jnbe	loc_6			; Jump if above ( > )
                                                ; If Backup Sec Num < 3
                                                ; then Jump to
                                                ; Show_Err_Msg1
                mov     SI,Word Ptr [BP+0Eh]    ; Number of Reserved Sectors
		cmp	CX,SI			
		jnb	loc_6			; Jump if not below ( >= )

                sub     SI,CX                   ; Backup Sector Number - 3
                                                ; 3 is Number of Boot Sectors

                ; Add number of hidden sectors to DX:AX

                add     AX,Word Ptr [BP+1Ch]
		adc	DX,Word Ptr [BP+1Eh]	; ADD with carry
		jmp	short loc_2		
loc_4:          
		jnb	loc_6			; Jump if not below ( >= )
		jmp	short loc_10		
loc_5:          
                cmp     Word Ptr [BP+2Ah],+0    ; FAT32 version must be 0 !
		jnbe	loc_6			; Jump if above ( > )
		jmp	loc_16			
Display_Err_Msg:                               
                mov     SI, offset SC_Msg1      ; Skip_Counter_1 at 7D7Eh
Display_Message:                                ; Display/Show String
		lodsb				; Load byte at DS:SI to AL
		cbw				; Convert byte to word
		add	SI,AX			
loc_8:          
		lodsb				; Load byte at DS:SI to AL
		test	AL,AL			
                je      loc_11                  ; Jump if equal/zero
		cmp	AL,0FFh			
                je      loc_9                   ; Jump if equal/zero
		mov	AH,0Eh			
		mov	BX,7			
		int	10h			; BIOS Service func ( ah ) = 0Eh
						; Write char as TTY
						;AL-char BH-page BL-color
                jmp     short loop_display_chr      
loc_9:		; N-Ref=1
		mov	SI,7D81h		
		jmp	short loc_7		
loc_10:		; N-Ref=1
		mov	SI,7D7Fh		
		jmp	short loc_7		
loc_11:		; N-Ref=1
		cbw				; Convert byte to word
		int	16h			; BIOS Service func ( ah ) = 0
						; Read next kbd char
						;AH-scan code AL-char code
		pop	SI			
		pop	DS			

		dw	8F66h, 0CD04h
		db	19h
		db	'AVfj'
		dw	5200h, 650h, 6A53h, 6A01h
		dw	8B10h, 60F4h, 7E80h, 0E02h
		dw	475h, 42B4h, 1DEBh, 9291h
		dw	0D233h, 76F7h, 9118h, 76F7h
		dw	4218h, 0CA87h, 76F7h, 8A1Ah
		dw	8AF2h, 0C0E8h, 2CCh, 0CC0Ah
		db	0B8h, 1, 2
loc_12:		; N-Ref=0
		mov	DL,Byte Ptr [BP+40h]	
		int	13h			; BIOS Service func ( ah ) = 0
						; Reset disk system

		dw	8D61h, 1064h
var1_270	db	5Eh, 72h, 0Ah, 40h, 75h, 1
		db	42h, 3, 5Eh, 0Bh, 49h, 75h
                db      0B4h, 0C3h
SC_Msg1:        db      3
SC_Msg2:        db      18h
SC_Msg3:        db      1                       ; Will be used by IO.SYS !?
SC_Msg4:        db      27h

Err_Msg1:       db      0Dh, 0Ah
		db	'Invalid system disk'
		db	0FFh
Err_Msg2:
                db      0Dh, 0Ah
		db	'Disk I/O error'
		db	0FFh

Replace_Msg:    db      0Dh, 0Ah
		db	'Replace the disk, and then press any key'
		db	0Dh, 0Ah, 0, 0, 0
                DB      0,0                     ; Padding?

                ; Startup file names

IO_SYS:         db      'IO      SYS'
MSDOS_SYS:      db      'MSDOS   SYS'

                db      7Eh,1,0                 ; MS-DOS v7.1 FAT32

WINBOOT_SYS:    db      'WINBOOT SYS'           ; What for?

                dw      0                       

                dw      0AA55h                  ; 1st Boot Signature

;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
; BOOT RECORD - Sector 2 - FSINFO Sector
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

FSI_LeadSig:    db      41615252h               ; FSINFO validation
                                                ; 'RRaA'

FSI_Reserved:   db      480 dup(0)              ; Reserved, not in use
                                                ; must be ZERO
; FSINFO information

FSI_StrucSig:   db      61417272h               ; FAT32 FSINFO Signature
                                                ; 'rrAa'                  

FSI_Free_Count: dd      0FFFFFFFFh              ; Free Cluster Count
                                                ; FFFFFFFFh =
                                                ; unknown, calculate

FSI_Nxt_Free:   dd      0FFFFFFFFh              ; Looking for free clusters
                                                ; will be started
                                                ; at this cluster
                                                ; if not FFFFFFFFh


FSI_Reserved2:  db      12 dup(0)               ; Reserved, not in use
                                                ; must be ZERO

FSI_TrailSig:   dd      0AA5500h                ; FSINFO/BOOTSECTOR
                                                ; Validation
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
;
; BOOT RECORD - Sector 3 - FAT32 Startup File Loading
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

FAT32_SF_Loader:

                cli                             ; Disable interrupts

                ; calculate total size of FAT area

                movzx   EAX, Byte Ptr [BP+10h]  ; number of FATs
                mov     ECX, Dword Ptr [BP+24h] ; sectors per FAT
                mul     ECX                             

                ; add hidden sectors

                add     EAX, Dword Ptr [BP+1Ch]

                ; add reserved sectors

                movzx   EDX,Word Ptr [BP+0Eh]
                add     EAX,EDX

                xor     CX,CX           

                mov     Dword Ptr [BP-4],EAX    ; EAX= Data Area (Cluster 2)
                                                ; Start Addres in 7BFCh

                mov     Dword ptr [BP-8],0FFFFFFFFh  ; Will be Checked by
                                                     ; GetFAT32Sector

                cli                                  ; Two times CLI
                                                     ; before STI!?

               ; load Root Directory Start Cluster in EAX

                mov     EAX, Dword Ptr [BP+2Ch]

                cmp     EAX,2                   ; Is it Cluster 2?
                jb      ShowErrMsg1             ; error if less than 2

               ; Is it End Of Cluster Chain marker or something above?
               ; (If Cluster Number > 0FFFFFF7h, it is not a file data)

                cmp     EAX,0FFFFFF8h
                jae     ShowErrMsg1             ; error if it is

               ; Put upper 16 bits of cluster number into DX 

                shld    EDX,EAX,10h

                sti                             ; Enable interrupts
GetRootCluster:
                push	DX
		push	AX			

                cli                             ; Disable interrupts

               ; clear upper 16 bits of cluster number,
               ; and of course move up the lower bits

                shl     EAX,10h

               ; shift lower 16 bits of cluster number back down,
               ; and at the same time shift in the high 16-bits
               ; in top of EAX?

                shrd    EAX,EDX,10h

               ; make cluster number 0 based

                sub     EAX,2

               ; put Sectors Per Cluster in EBX

                movzx   EBX,Byte Ptr [BP+0Dh]

               ; save it in SI, too!

                mov     SI,BX

               ; calculate relative sector of first part of root

                mul     EBX

               ; add the "start of data area" value at 7BFCh

                add     EAX, Dword Ptr [BP-4]

              ; Shift upper 16 bits of EAX into DX and AX is lower bits

                shld    EDX,EAX,10h

                sti                             ; Enable interrupts

GetRootSector:                                  
                mov     BX,700h                 ; Directory Buffer = 0:700h
                mov     DI,BX                   ; ES:BX= Directory Buffer

                ; Read 1 sector

                mov	CX,1
                call    near ptr ReadSectorX
                jc      ShowErrMsg2

CheckEntry:  
		cmp	Byte Ptr [DI],CH	
                je      EndOfRootDir            ; Jump if equal/zero
                mov     CL,0Bh                  ; 11 bytes, Transfer Count
		push	SI			
                mov     SI, offset IO_SYS       ; 7DD8h (for FAT16 & FAT32)
		repz	cmpsb			; Repeat if ZF = 1, CX > 0
						; Cmp byte at DS:SI to ES:DI
		pop	SI			
                je      StartupFileFound        ; Jump if equal ( = )
		add	DI,CX			
                add     DI,15h                  ; Now, DI points Next Entry

                cmp     DI,BX                   ; INT13h increments BX
                                                ; with 512 on the sector read
                                                ; So, it points next sector

                jb      CheckEntry              ; Jump if below ( < )
                                                ;     
                dec     SI                      ; Are there any more sectors
                                                ; in this cluster ?

                jnz     GetRootDirSector        ; Jump if not zero/equal

                pop	AX
		pop	DX

        ; Get FAT value. "GetFAT32Value" will compare the value with
        ; -8, and the JB below continues if below. That is, non-EOCC/BAD
        ; the "previous cluster" value is taken from DX:AX (as restored
        ; above with POP).


                call    near ptr GetFAT32Value
                jb      GetRootDirCluster       ; Jump if below ( < )
                     
               ; If not end of root directory
               ; go to GetRootDirCluster.

EndOfRootDir:                                   ; End Of Cluster Chain
                add     SP,4                    ; Clean up stack
                jmp     ShowErrMsg1             ; Display Error Message

StartupFileFound:
                add     SP,4                    ; Clean up

              ; DI points IO.SYS name
              ; SI will be set to DirEntry[14h] = starting cluster (HI)
              ; DI will be set to DirEntry[1Ah] = starting cluster (LO)

                mov     SI,Word Ptr [DI+9]      ; DI= DirEntry[0Bh]
		mov	DI,Word Ptr [DI+0Fh]	
		mov	AX,SI			
		cli				; Disable interrupts


        ; shift cluster high into upper half of EAX and store lower half
        ; from DI into AX

                shl  EAX,10h
                mov  AX,DI

        ; cluster out of range??

                cmp     EAX,2                   ; clusters start with 2
                jb      InvalidCluster

                cmp     EAX,0FFFFFF8h           ; 0FFFFFF8h is EOCC
                jnb     InvalidCluster

                dec     EAX                     ; make it 0-based...
                dec     EAX

        ; Multiply cluster number with "sectors per cluster"

                movzx   ECX,Byte Ptr [BP+0Dh]
                mul     ECX

        ; Add the "start of data area" value that was saved back there.

                add     EAX, Dword Ptr [BP-4]

        ; And for the N'th time, make DX:AX same as EAX - sector number.

                shld    EDX,EAX,10h

                sti                             

                mov     BX,0700h               ; IO.SYS loads here!

                push    BX
                mov     CX,4                   ; load 4 IO.SYS sectors
                call    ReadSectorX            ; 2K is minimum FAT32 cluster
                pop     BX                     ; size anyway...

                jc      ShowErrMsg2            ; error...


     
        ; to read the entire IO.SYS
        ; file into memory. 

        ; Mark Zibikowski sign.

                cmp     Word Ptr [BX],'ZM'             ; EXE signature...
                jne     InvalidCluster

        ; JB sign.

                cmp     Word Ptr DS:[0200h][BX],'JB'   ; IO.SYS signature?
                je      ExecutIOSYS

        ;   INC DX, DEC DX = JB
        
InvalidCluster:
                Mov     SI,Offset ErrMsg3 + 7C00h
                jmp     PrintMessage
ExecutIOSYS:
                db      0EAh            ; Jump to IO.SYS at 0070h:0200h
                dw      0200h, 0070h

proc_start       endp


;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		PROCEDURE GetFAT32Value
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

GetFAT32value   proc	near
		add	AX,AX			; Multiply DX:AX by 4
		adc	DX,DX			
		add	AX,AX			
		adc	DX,DX			
		call	near ptr GetFAT32Sector
		cli				; Disable interrupts

	        mov    EAX,ES:[BX+DI]           ; EAX = cluster value

                and    EAX,0FFFFFFFh            ; 28 bits       

        ; Make DX:AX the cluster number too...

                shld   EDX,EAX,16               ; EAX[HW] into EDX[LW]

        ; Check for EOCC/BAD

                cmp     EAX,0FFFFFF8h           ; Is it the EOCC marker?

                sti                             ; return with ZF=1 if the
                                                ; last cluster was read??
                ret

GetFAT32Value   endp

;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		PROCEDURE GetFAT32Sector
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

; On entry DX:AX is the FAT offset in bytes.

GetFAT32Sector  Proc    Near

                mov     DI,7E00h

		cli			; Disable interrupts

        ; make EAX the sector number again... move DX into top of EAX...

                shl     EAX,16
                shrd    EAX,EDX,16

        ; move bytes per sector into ECX

                movzx   ECX,Word Ptr [BP+0Bh]

        ; divide EDX:EAX by BPS. EAX = sector, EDX = offset in sector.

                xor     EDX,EDX
                div     ECX

        ; Check FAT sector number against saved value on stack.
        ; This one is initially -1 (also known as 0FFFFFFFFh)

                cmp     EAX, Dword Ptr [BP-8]   
                je      Ret_From_GetFAT32Sector

        ; If sector is <> from -1, save this sector at 0000:7BF8h

                MOV     SS:[BP-8],EAX   

        ; add hidden sectors... 

                ADD     EAX,SS:[BP+1CH]

        ; add reserved sectors too... 

                MOVZX   ECX,WORD PTR SS:[BP+0EH]
                ADD     EAX,ECX

        ; get FAT32 flags into EBX

                MOVZX   EBX,WORD PTR SS:[BP+28H]

        ; keep "Active FAT" bits 0-3

                AND     BX,0FH

        ; If zero, we're at the correct FAT

                JZ      CorrectFAT

        ; compare active FAT with number of FATs...

                CMP     BL,SS:[BP+10H]
                JAE     ShowErrMsg1     ; oops... invalid active FAT
                
                PUSH    DX              ; save DX for a while...

        ; save FAT sector in ECX

                MOV     ECX,EAX

        ; Put sectors per fat in EAX

                MOV     EAX,SS:[BP+24H]

        ; Multiply active FAT number with sectors per FAT

                MUL     EBX

        ; Add to first FAT sector number we already had...

                ADD     EAX,ECX

        ; NOW, EAX contains the correct FAT sector number.

                POP     DX
CorrectFAT:
                PUSH    DX

        ; Make DX:AX same as EAX sector number.

                SHLD    EDX,EAX,16

		STI				; Enable interrupts

                MOV     BX,DI                   ; read FAT sector into
                                                ; 0000:7E00h

        ; XOR CX,CX could be used instead of MOV CX,1 and ReadSector
        ; could be called instead of ReadSectorX, 
        ; because there is an INC CX at ReadSector.

                mov     CX,1                    ; 1 sector
                call    ReadSectorX

                pop     DX

                jc      ShowErrMsg2

Ret_From_GetFAT32Sector:
		sti				; Enable interrupts
                mov     BX,DX
                ret

GetFAT32Sector  Endp

      ; Properly align the sector's boot signature at the end of
      ; the 3rd boot sector.

                org     512 * 3 - 2

                dw      0AA55h                  ; 3rd Boot Signature

; *******************************************************************
; 80386 asm source code (EAX, EBX, ECX, EDX related instructions) 
; copied from Mr. X's Windows 95 Boot Sector source code 
; [ 16 August 1998 ]
; 8086/8088 code disassembled by Erdogan Tan via DASM, DEBUG, PV
; [ June 2003 ]
; *******************************************************************

CODE_SEG_1	ends


		end	start

