; MS-DOS 6.22 [5.0 to 6.22]
; FAT12 File Sytem BOOT SECTOR/RECORD Assembly File

; [ 3.5" - 1.44 MB Floppy Disk, MS-DOS 6.22 System Disk Boot Sector ]

; Disassembled & Edited by Erdogan Tan [ ISTANBUL/TURKEY, June 2003 ]
; via following programs:
; DEBUG.EXE 1999
; DASM.EXE 1993
; and
; Microsoft FAT FS Specification v1.02 1999

; Assembly/Source Code is compatible with
; Microsoft Macro Assembler v5.10 [ MASM.EXE v6.11 1993 ]
; (Use: 'masm.exe <thisfile.asm>' then 'link /t <thisfile.obj>')
; (Note: Except BPB/BS parameters, all boot sector code will be original!)

; http://www.singlix.org/trdos/index.html

; This file is a part of 'Turkish Rational DOS' development project
; Specially for "How DOS Starts Up" Article
		

PAGE    60,132

; 7C00h = Boot Sector Beginning Address Offset at memory
; Word Ptr [7C0Bh] = BPB_BytesPerSec (Offset 7C00h + 11)
; Byte Ptr [7C24h] = BPB_DrvNum (Offset 7C00h + 36)
; etc.

data_7c0b	=	7C0Bh
data_7c0d	=	7C0Dh
data_7c0e	=	7C0Eh
data_7c10	=	7C10h
data_7c11	=	7C11h
data_7c13	=	7C13h
data_7c15	=	7C15h
data_7c16	=	7C16h
data_7c18	=	7C18h
data_7c1a	=	7C1Ah
data_7c1c	=	7C1Ch
data_7c1e	=	7C1Eh
data_7c20	=	7C20h
data_7c24	=	7C24h
data_7c25	=	7C25h
data_7c49	=	7C49h
data_7c4b	=	7C4Bh
data_7c4d	=	7C4Dh
data_7c4f	=	7C4Fh
data_7c50	=	7C50h
data_7c52	=	7C52h


;ÄÄÄÄÄÄÄÄÄÄ 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:		; N-Ref=0

BS_jmpBoot:
		jmp	short loc_2	  ; Start Address= 0:7C00h + [0]

		db	90h               ; [2] NOP instruction
BS_OEMName:                               ; OEM Name 
var1_003	db	'+&*RDIHC'        ; [3] 8 bytes, Originally 'MSDOS5.0'
BPB_BytesPerSec:
                dw      200h              ; [11] Bytes Per Sector, 512 		
BPB_SecPerClus: db      1                 ; [13] Sector Per Cluster, 1
BPB_RsvdSecCnt: dw      1                 ; [14] Number of Reserved Sectors, 1
BPB_NumFATS:    db      2                 ; [16] Count of FAT Data Structures, 2
BPB_RootEntCnt: dw      0E0h              ; [17] Count of Root Dir Entries, 224
BPB_TotalSec16:	dw      0B40h             ; [19] Total Sectors, 2880 (1.44 MB)
BPB_Media:      db      0F0h              ; [21] Removable Media Indicator, F0h
BPB_FATSz16:    dw      9                 ; [22] Count of FAT Sectors, 9
BPB_SecPerTrk:  dw      12h               ; [24] Sector Per Track, 18
BPB_NumHeads:   dw      2                 ; [26] Number of Heads, 2
BPB_HiddSec:    dd      0                 ; [28] Hidden Sectors, 0
BPB_TotSec32:   dd      0B40h             ; [32] Total Count of Sectors (32 bit)
BPB_DrvNum:     db      0                 ; [36] Drive Number, 0
BS_Reserved1:	db      0                 ; [37] Reserved (for Windows NT), 0
BS_BootSig:     db      29h		  ; [38] Extended Boot Signature, 41
BS_VolID:       dd      324D1BFdh         ; [39] Volume Serial Number, 4 bytes
var1_02B	db      'MSDOS_6_22 '     ; [43] Volume Label, 11 bytes
BS_FilSysType:  db      'FAT12   '        ; [54] File System Type, 8 bytes
 
; 0:7C00h + [62]

loc_2:		; N-Ref=2
		cli				; Disable interrupts
		xor	AX,AX			
		mov	SS,AX			

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  SS:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

		mov	SP,7C00h		
		push	SS			
		pop	ES			

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  ES:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

		mov	BX,78h			
		lds	SI,Dword Ptr SS:[BX]	; Load FAR ptr

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
		assume  DS:nothing
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

		push	DS			
		push	SI			
		push	SS			
		push	BX			
		mov	DI,7C3Eh		
		mov	CX,0Bh			
		cld				; Clear direction flag
		repz	movsb			; Repeat if ZF = 1, CX > 0
						; Move byte from DS:SI to ES:DI
		push	ES			
		pop	DS			
		mov	Byte Ptr [DI-2],0Fh	
		mov	CX,Word Ptr DS:data_7c18
		mov	Byte Ptr [DI-7],CL	
		mov	Word Ptr [BX+2],AX	
		mov	Word Ptr [BX],7C3Eh	
		sti				; Enable interrupts
		int	13h			; BIOS Service func ( ah ) = 0
						; Reset disk system
		jb	loc_4			; Jump if below ( < )
		xor	AX,AX			
		cmp	Word Ptr DS:data_7c13,AX
		je	loc_3			; Jump if equal ( = )
		mov	CX,Word Ptr DS:data_7c13
		mov	Word Ptr DS:data_7c20,CX
loc_3:		; N-Ref=1
		mov	AL,Byte Ptr DS:data_7c10
		mul	Word Ptr DS:data_7c16	; DX_AX = AX * data
		add	AX,Word Ptr DS:data_7c1c
		adc	DX,Word Ptr DS:data_7c1e; ADD with carry
		add	AX,Word Ptr DS:data_7c0e
		adc	DX,+0			; ADD with carry
		mov	Word Ptr DS:data_7c50,AX
		mov	Word Ptr DS:data_7c52,DX
		mov	Word Ptr DS:data_7c49,AX
		mov	Word Ptr DS:data_7c4b,DX
		mov	AX,20h			
		mul	Word Ptr DS:data_7c11	; DX_AX = AX * data
		mov	BX,Word Ptr DS:data_7c0b
		add	AX,BX			
		dec	AX			
		div	BX			; AX=AX_DX/data DX=AX_DX%data
		add	Word Ptr DS:data_7c49,AX
		adc	Word Ptr DS:data_7c4b,+0; ADD with carry
		mov	BX,500h			
		mov	DX,Word Ptr DS:data_7c52
		mov	AX,Word Ptr DS:data_7c50
		call	near ptr proc_2		
		jb	loc_4			; Jump if below ( < )
		mov	AL,1			
		call	near ptr proc_3		
		jb	loc_4			; Jump if below ( < )
		mov	DI,BX			
		mov	CX,0Bh			
		mov	SI,7DE6h		
		repz	cmpsb			; Repeat if ZF = 1, CX > 0
						; Cmp byte at DS:SI to ES:DI
		jne	loc_4			; Jump if not equal ( != )
		lea	DI,Word Ptr [BX+20h]	; Load effective address
		mov	CX,0Bh			
		repz	cmpsb			; Repeat if ZF = 1, CX > 0
						; Cmp byte at DS:SI to ES:DI
		je	loc_6			; Jump if equal ( = )
loc_4:		; N-Ref=6
		mov	SI,7D9Eh		
		call	near ptr proc_1		
		xor	AX,AX			
		int	16h			; BIOS Service func ( ah ) = 0
						; Read next kbd char
						;AH-scan code AL-char code
		pop	SI			
		pop	DS			
		pop	Word Ptr [SI]		
		pop	Word Ptr [SI+2]		
		int	19h			; Reboot
loc_5:		; N-Ref=1
		pop	AX			
		pop	AX			
		pop	AX			
		jmp	short loc_4		
loc_6:		; N-Ref=1
		mov	AX,Word Ptr [BX+1Ah]	
		dec	AX			
		dec	AX			
		mov	BL,Byte Ptr DS:data_7c0d
		xor	BH,BH			
		mul	BX			; DX_AX = AX * data
		add	AX,Word Ptr DS:data_7c49
		adc	DX,Word Ptr DS:data_7c4b; ADD with carry
		mov	BX,700h			
		mov	CX,3			
loop_loc_7:		; N-Ref=1
		push	AX			
		push	DX			
		push	CX			
		call	near ptr proc_2		
		jb	loc_5			; Jump if below ( < )
		mov	AL,1			
		call	near ptr proc_3		
		pop	CX			
		pop	DX			
		pop	AX			
		jb	loc_4			; Jump if below ( < )
		add	AX,1			
		adc	DX,+0			; ADD with carry
		add	BX,Word Ptr DS:data_7c0b
		loop	loop_loc_7		; Loop if CX > 0
		mov	CH,Byte Ptr DS:data_7c15
		mov	DL,Byte Ptr DS:data_7c24
		mov	BX,Word Ptr DS:data_7c49
		mov	AX,Word Ptr DS:data_7c4b
		jmp	far ptr loc_1		
proc_start	endp



;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		PROCEDURE proc_1
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

proc_1		proc	near
loc_8:		; N-Ref=1
		lodsb				; Load byte at DS:SI to AL
		or	AL,AL			
		je	loc_10			; Jump if equal ( = )
		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 loc_8		

;ÍÍÍÍÍÍÍÍÍÍ External Entry into current procedure  ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

proc_2:
		cmp	DX,Word Ptr DS:data_7c18
		jnb	loc_9			; Jump if not below ( >= )
		div	Word Ptr DS:data_7c18	; AX=AX_DX/data DX=AX_DX%data
		inc	DL			
		mov	Byte Ptr DS:data_7c4f,DL
		xor	DX,DX			
		div	Word Ptr DS:data_7c1a	; AX=AX_DX/data DX=AX_DX%data
		mov	Byte Ptr DS:data_7c25,DL
		mov	Word Ptr DS:data_7c4d,AX
		clc				; Clear carry flag
		retn				
loc_9:		; N-Ref=1
		stc				; Set carry flag
loc_10:		; N-Ref=1
		retn				
proc_1		endp



;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
;±
;±		PROCEDURE proc_3
;±
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

proc_3		proc	near
		mov	AH,2			
		mov	DX,Word Ptr DS:data_7c4d
		mov	CL,6			
		shl	DH,CL			; Shift left
		or	DH,Byte Ptr DS:data_7c4f
		mov	CX,DX			
		xchg	CH,CL			
		mov	DL,Byte Ptr DS:data_7c24
		mov	DH,Byte Ptr DS:data_7c25
		int	13h			; BIOS Service func ( ah ) = 2
						; Read disk sectors
						;AL-sec num CH-track CL-sec
						; DH-head DL-drive ES:BX-buffer
						;CF-flag AH-stat AL-sec read
		retn				
proc_3		endp



var1_19e	db	0Dh, 0Ah
		db	'Non-System disk or disk error'
		db	0Dh, 0Ah
		db	'Replace and press any key when ready'
		db	0Dh, 0Ah, 0
var1_1e6	db	'IO      SYS'
                db      'MSDOS   SYS'
		dw      0
                dw      0AA55h                  ; Boot Sector Indicator	

CODE_SEG_1	ends



		end	start

