     1                                  ; ****************************************************************************
     2                                  ; FS1_MBR.ASM (FS1_MBR.BIN) - SINGLIX FS1 MASTERBOOT SECTOR for TRDOS 386 OS
     3                                  ; ****************************************************************************
     4                                  ; Last Update: 22/12/2017 (2nd version) -TRDOS 386 FAT & SINGLIX FS-
     5                                  ; ----------------------------------------------------------------------------
     6                                  ; Beginning: 26/04/2009 (1st version) -WINDOWS XP MBR & TRDOS 8086 SINGLIX FS-
     7                                  ; ----------------------------------------------------------------------------
     8                                  ; Assembler: NASM version 2.11
     9                                  ; ----------------------------------------------------------------------------
    10                                  ; Turkish Rational DOS
    11                                  ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                                  ; ****************************************************************************
    13                                  ; nasm fs1_mbr.s -l fs1_mbr.lst -o FS1_MBR.BIN
    14                                  ; ----------------------------------------------------------------------------
    15                                  ;
    16                                  ;#############################################################################
    17                                  ;
    18                                  ; SINGLIX FS1 MASTER BOOT RECORD  (c) Erdogan Tan [26/04/2009]
    19                                  ;
    20                                  ; Derived from WINDOWS XP MASTER BOOT RECORD
    21                                  ;
    22                                  ; Modified for SINGLIX Operating System v1.0b and SINGLIX FS1 File System v1.0
    23                                  ; ! WINDOWS XP compatible MBR code !
    24                                  ;
    25                                  ; Original code by (c) Microsoft Corporation 2000 [ Windows XP SP2 2004 ]
    26                                  ; DMADMIN.EXE (4 August 2004) offset 216616 (512 byte) (XP_MASTERBOOT.BIN)
    27                                  ; WINDOWS XP/SP2 Turkish OS Master Boot code (masterboot.bin)
    28                                  ; Singlix Code Grabber v2.0 [binfilehex.exe] XP_MASTERBOOT.BIN, masterboot.bin
    29                                  
    30                                  ; Microsoft Macro Assembler 
    31                                  ; compatible assembly source code 
    32                                  ; for SINGLIX FS1 MASTER BOOT CODE (c) Erdogan Tan 2009
    33                                  ;
    34                                  ; Disassembled by Erdogan Tan [26/04/2009] as Microsoft MASM compatible code
    35                                  ; by using DASM.EXE [24/3/1993] and PV.EXE [22/1/1993]
    36                                  ;
    37                                  ; Some explanations from 
    38                                  ;"Win2k Master Boot Record (MBR) Revealed!" html page by (c) Daniel B. Sedory
    39                                  ; http://www.geocities.com/thestarman3/asm/mbr/Win2kmbr.htm 
    40                                  ; http://mirror.href.com/thestarman/asm/mbr/Win2kmbr.htm
    41                                  
    42                                  ;#############################################################################
    43                                  
    44                                  [BITS 16]	; 16 bit (x86, real mode) code
    45                                  
    46                                  ;#############################################################################
    47                                  ;#
    48                                  ;#		ENTRY POINT
    49                                  ;#
    50                                  ;#############################################################################
    51                                  
    52                                  		[ORG 600h]                     ; Final memory location 0:600h
    53                                  
    54                                  ;#############################################################################
    55                                  ;#
    56                                  ;#		PROCEDURE proc_start
    57                                  ;#
    58                                  ;#############################################################################
    59                                  
    60                                  start:		
    61 00000000 31C0                    		xor	ax, ax			; db 33h, 0C0h
    62 00000002 8ED0                    		mov	ss, ax			
    63 00000004 BC007C                  		mov	sp, 7C00h		
    64 00000007 FB                      		sti				; Enable interrupts
    65 00000008 50                      		push	ax			
    66 00000009 07                      		pop	es			
    67 0000000A 50                      		push	ax			
    68 0000000B 1F                      		pop	ds			
    69 0000000C FC                      		cld				; Clear direction flag
    70 0000000D BE1B7C                  		mov	si, 7C1Bh		; offset 01Bh (label loc_01Bh)
    71 00000010 BF1B06                  		mov	di, 61Bh			
    72 00000013 50                      		push	ax			
    73 00000014 57                      		push	di			
    74 00000015 B9E501                  		mov	cx, 1E5h			
    75 00000018 F3A4                    		repz	movsb			; Repeat if ZF = 1, CX > 0
    76                                  						; Move byte from DS:SI to ES:DI
    77 0000001A CB                      		retf				; Return FAR
    78                                  
    79                                  loc_01Bh:
    80 0000001B BDBE07                  		mov	bp, 7BEh                 ; db 0BDh, 0BEh, 07h 
    81 0000001E B104                    		mov	cl, 4                    ; db 0B1h, 04h
    82                                  loc_020h:	
    83 00000020 386E00                  		cmp	[bp+0], ch ; 0	
    84 00000023 7C2C                    		jl	short loc_02Eh		; Jump if less ( < )
    85 00000025 7536                    		jne	short loc_03Ah		; Jump if not equal ( != )
    86 00000027 83C510                  		add	bp, 10h			
    87 0000002A E2F4                    		loop	loc_020h		; Loop if CX > 0
    88                                  
    89                                                  ; Beginning of SINGLIX MBR code extension
    90                                  		; SINGLIX MBR feature : Check Sector 1 for a valid boot record
    91 0000002C BB007C                                  mov	bx, 7C00h
    92 0000002F B90200                                  mov	cx, 2
    93 00000032 BA8000                                  mov	dx, 80h
    94                                  loc_read_bootsector_location:
    95 00000035 B80102                                  mov	ax, 201h			
    96                                  		
    97 00000038 CD13                    		int	13h			; BIOS Service func ( ah ) = 2
    98                                  						; Read disk sectors
    99                                  						;IN: AL-sec num CH-track CL-sec
   100                                  						; DH-head DL-drive ES:BX-buffer
   101                                  						;OUT: CF-flag AH-stat AL-sec read
   102 0000003A 7208                    		jc	short loc_check_bootsector_number
   103                                                  
   104                                  loc_check_bootsector_sign:
   105                                                  ;cmp	word [7DFEh], 0AA55h	; Check for the Magic Word/Number
   106 0000003C 813E[FE77]55AA                          cmp	word [data_7FEh+7600h], 0AA55h
   107 00000042 746A                                    je	short loc_094h
   108                                  loc_check_bootsector_number:		
   109 00000044 83F902                                  cmp	cx, 2
   110 00000047 7506                                    jne	short loc_int18h
   111                                                  ; SINGLIX MBR feature : Check Sector 63 for a valid boot record
   112 00000049 FEC6                                    inc	dh      ; mov dh, 1  ; Head 1 	                
   113 0000004B 88F1                                    mov     cl, dh  ; mov cl, 1
   114 0000004D EBE6                                    jmp     short loc_read_bootsector_location
   115                                  		; End of SINGLIX MBR code extension
   116                                  
   117                                  loc_int18h:                
   118 0000004F CD18                    		int	18h			; Switch to BASIC (if there is!?)
   119                                  loc_02Eh:		
   120 00000051 89EE                    		mov	si, bp			
   121                                  loc_030h:		
   122 00000053 83C610                  		add	si, 10h			
   123 00000056 49                      		dec	cx			
   124 00000057 7415                    		jz	short loc_04Fh		; Jump if zero (Jump if equal)
   125 00000059 382C                    		cmp	[si], ch ; 0	
   126 0000005B 74F6                    		je	short loc_030h		
   127                                  loc_03Ah:		
   128                                  ; SINGLIX MBR MODIFICATION
   129 0000005D BE[4901]                                mov     si, msg_ipt		; Invalid partition table!
   130                                  
   131                                  print_msg:	; Print Error Message 
   132                                  ; SINGLIX MBR MODIFICATION
   133                                  loc_041h:		
   134 00000060 AC                      		lodsb				; Load byte at DS:SI to AL
   135                                  loc_042h:		
   136 00000061 3C00                    		cmp	al, 0			
   137 00000063 74FC                    		je	short loc_042h		
   138 00000065 BB0700                  		mov	bx, 7			
   139 00000068 B40E                    		mov	ah, 0Eh			
   140 0000006A CD10                    		int	10h			; BIOS Service func ( ah ) = 0Eh
   141                                  						; Write char as TTY
   142                                  						;IN: AL-char BH-page BL-color
   143 0000006C EBF2                    		jmp	short loc_041h		
   144                                  loc_04Fh:		
   145 0000006E 884E10                  		mov	[bp+10h], cl ; 0	
   146 00000071 E84400                  		call	load_bootsector		; offset 09Bh		
   147 00000074 7325                    		jnc	short loc_081h		
   148                                  loc_057h:		
   149 00000076 FE4610                  		inc	byte [bp+10h]  ; 1	
   150 00000079 807E040B                		cmp	byte [bp+4], 0Bh	; FAT 32 CHS partition	
   151 0000007D 740B                    		je	short loc_06Bh		
   152 0000007F 807E040C                		cmp	byte [bp+4], 0Ch	; FAT 32 LBA partition	
   153 00000083 7405                    		je	short loc_06Bh		
   154                                  loc_066h:
   155                                  ; SINGLIX MBR MODIFICATION
   156 00000085 BE[6301]                                mov	si, msg_elos		; Error loading operating system!
   157 00000088 EBD6                                    jmp	short print_msg		; Jump if not equal ( != )
   158                                  loc_06Bh:
   159 0000008A 80460206                		add	byte [bp+2], 6		; Beginning sector (in track)
   160 0000008E 83460806                		add	word [bp+8], 6		; Start sector (LBA, low word)
   161 00000092 83560A00                		adc	word [bp+0Ah], 0	; ADD with carry (LBA, high word)
   162 00000096 E81F00                  		call	load_bootsector		; Load FAT 32 backup boot record 		
   163 00000099 72EA                    		jc	short loc_066h			
   164                                  loc_081h:		
   165                                  		;cmp	word [7DFEh], 0AA55h	; Check for the Magic Word/Number
   166 0000009B 813E[FE77]55AA                          cmp	word [data_7FEh+7600h], 0AA55h
   167 000000A1 740B                                    je	short loc_094h		
   168 000000A3 807E1000                		cmp	byte [bp+10h], 0
   169 000000A7 74CD                    		je	short loc_057h
   170                                  
   171                                  ; SINGLIX MBR MODIFICATION		
   172 000000A9 BE[8401]                		mov	si, msg_mos		; Missing operating system!
   173 000000AC EBB2                                    jmp	short print_msg      
   174                                  loc_094h:		
   175                                                  ; Beginning of SINGLIX MBR code extension
   176                                                  ; SINGLIX MBR Feature/Sign 
   177 000000AE A1[A101]                                mov	ax, [singlix_mbr_sign]	; 417 
   178                                  		; End of SINGLIX MBR code extension
   179 000000B1 89E7                                    mov	di, sp			
   180 000000B3 1E                      		push	ds			
   181 000000B4 57                      		push	di			
   182 000000B5 89EE                    		mov	si, bp			
   183 000000B7 CB                      		retf				; Return FAR
   184                                                                                  ; jump to the Boot Sector code
   185                                  
   186                                  ;#############################################################################
   187                                  ;#
   188                                  ;#		PROCEDURE proc_load_bootsector
   189                                  ;#
   190                                  ;#############################################################################
   191                                  
   192                                  ; Original WINDOWS XP MBR Boot Sector Reading/Loading PROCEDURE
   193                                  ; by Microsoft Corporation
   194                                  
   195                                  load_bootsector:
   196                                  
   197                                  loc_09Bh:
   198 000000B8 BF0500                  		mov	di, 5  			; Retry count			
   199 000000BB 8A5600                  		mov	dl, [bp+0] ; 80h	
   200 000000BE B408                    		mov	ah, 8			
   201 000000C0 CD13                    		int	13h			; BIOS Service func ( ah ) = 8
   202                                  						; Get current drive parameters
   203                                  						; OUT: DL-drvs DH-heads CL-sects
   204                                  						; CH-tracks CF-flag AH-status
   205 000000C2 7223                    		jc	short loc_0CAh		
   206 000000C4 88C8                    		mov	al, cl
   207 000000C6 243F                    		and	al, 3Fh			; Number of sectors		
   208 000000C8 98                      		cbw				; Convert byte to word
   209 000000C9 88F3                    		mov	bl, dh			; Number of heads - 1	
   210 000000CB 88E7                    		mov	bh, ah ; 0			
   211 000000CD 43                      		inc	bx			; Number of heads			
   212 000000CE F7E3                    		mul	bx			; AX = sectors*heads
   213 000000D0 89CA                    		mov	dx, cx			
   214 000000D2 86D6                    		xchg	dl, dh			
   215 000000D4 B106                    		mov	cl, 6			
   216 000000D6 D2EE                    		shr	dh, cl			; Shift cyl bits 8&9 to bit 0&1
   217 000000D8 42                      		inc	dx			; Number of cylinders			
   218 000000D9 F7E2                    		mul	dx			; DX_AX = cylinders*(sectors*heads)
   219 000000DB 39560A                  		cmp	[bp+0Ah], dx		; Start sector < CHS total sects?	
   220 000000DE 7723                    		jnbe	short loc_0E6h		; no, let's use int 13h extensions		
   221 000000E0 7205                    		jb	short loc_0CAh		; yes, lets use CHS parameters 	
   222 000000E2 394608                  		cmp	[bp+8], ax		; Start sector < CHS total sects?	
   223 000000E5 731C                    		jnb	short loc_0E6h		; no, let's use int 13h extensions			
   224                                  loc_0CAh:		
   225 000000E7 B80102                  		mov	ax, 0201h			
   226 000000EA BB007C                  		mov	bx, 7C00h				
   227 000000ED 8B4E02                  		mov	cx, [bp+2]	
   228 000000F0 8B5600                  		mov	dx, [bp+0]	
   229 000000F3 CD13                    		int	13h			; BIOS Service func ( ah ) = 2
   230                                  						; Read disk sectors
   231                                  						;IN: AL-sec num CH-track CL-sec
   232                                  						; DH-head DL-drive ES:BX-buffer
   233                                  						;OUT: CF-flag AH-stat AL-sec read
   234 000000F5 7351                    		jnc	short loc_12Bh		
   235 000000F7 4F                      		dec	di			
   236 000000F8 744E                    		jz	short loc_12Bh		
   237                                  		
   238 000000FA 30E4                                    xor	ah, ah			
   239 000000FC 8A5600                  		mov	dl, [bp+0]	
   240 000000FF CD13                    		int	13h			; BIOS Service func ( ah ) = 0
   241                                  						; Reset disk system
   242 00000101 EBE4                    		jmp	short loc_0CAh
   243                                  		
   244                                  loc_check_int13h_extensions:
   245                                  loc_0E6h:		
   246 00000103 8A5600                  		mov	dl, [bp+0]
   247 00000106 60                      		pusha				; db 60h
   248 00000107 BBAA55                  		mov	bx, 55AAh               ; db 0BBh, 0AAh, 55h
   249 0000010A B441                    		mov	ah, 41h                 ; db 0B4h, 41h
   250 0000010C CD13                    		int	13h                     ; db 0CDh, 13h  
   251 0000010E 7236                                    jc	short loc_129h   
   252                                  		
   253 00000110 81FB55AA                                cmp	bx, 0AA55h		; Extensions present
   254 00000114 7530                                    jne	short loc_129h
   255 00000116 F6C101                                  test	cl, 1			; Fixed disk access subset check
   256 00000119 742B                                    jz	short loc_129h                   
   257                                  		
   258 0000011B 61                                     	popa				; db 61h
   259                                  loc_0FFh:
   260 0000011C 60                      		pusha                           ; db 60h
   261                                  
   262 0000011D 6A00                    		push	0			; db 6Ah, 00h
   263 0000011F 6A00                    		push	0			; db 6Ah, 00h
   264 00000121 FF760A                                  push	word [bp+0Ah]		; db 0FFh, 76h, 0Ah
   265 00000124 FF7608                                  push	word [BP+08h]		; db 0FFh, 76h, 08h
   266 00000127 6A00                    		push    0			; db 6Ah, 00h 
   267 00000129 68007C                  		push    7C00h			; db 68h, 00h, 7Ch
   268 0000012C 6A01                    		push    1			; db 6Ah, 01h
   269 0000012E 6A10                    		push    10h			; db 6Ah, 10h
   270                                  
   271 00000130 B442                    		mov	ah, 42h
   272 00000132 89E6                    		mov	si, sp
   273 00000134 CD13                                    int	13h
   274                                  
   275 00000136 61                      		popa				; db 61h
   276 00000137 61                      		popa				; db 61h
   277                                  
   278 00000138 730E                                    jnc	short loc_12Bh
   279                                                  
   280 0000013A 4F                      		dec	di 
   281                                  
   282 0000013B 740B                    		jz	short loc_12Bh
   283                                                  
   284 0000013D 30E4                                    xor	ah, ah
   285 0000013F 8A5600                                  mov	dl, [bp+0]
   286 00000142 CD13                                    int	13h
   287                                                  
   288 00000144 EBD6                    		jmp	short loc_0FFh                  
   289                                   
   290                                  loc_129h:
   291 00000146 61                      		popa				; db 61h
   292                                  
   293 00000147 F9                      		stc				; db 0F9h
   294                                  loc_12Bh:
   295 00000148 C3                      		retn				; db 0C3h
   296                                  			
   297                                                
   298                                  ; SINGLIX MBR MODIFICATION
   299                                  
   300                                  ; Error messages
   301                                  msg_ipt: 
   302 00000149 496E76616C69642070-     		db 	'Invalid partition table !'
   302 00000152 6172746974696F6E20-
   302 0000015B 7461626C652021     
   303 00000162 00                      		db	0
   304                                  msg_elos:
   305 00000163 4572726F72206C6F61-                     db	'Error loading operating system !'
   305 0000016C 64696E67206F706572-
   305 00000175 6174696E6720737973-
   305 0000017E 74656D2021         
   306 00000183 00                      	        db	0
   307                                  msg_mos:
   308 00000184 4D697373696E67206F-     	        db 	'Missing operating system !' 
   308 0000018D 7065726174696E6720-
   308 00000196 73797374656D2021   
   309 0000019E 00                                	db	0
   310                                  
   311 0000019F E107                    		dw	2017  ; SINGLIX FS1 MBR version
   312                                  
   313                                  		times	1A1h-($-$$) db 0
   314                                  
   315                                  singlix_mbr_sign:		; MBR offset 417
   316 000001A1 A101                                    dw     01A1h	; SINGLIX MBR sign (=417)
   317                                  
   318 000001A3 00                      		db 	0
   319                                  
   320                                  ; SINGLIX MBR MODIFICATION 
   321                                  ; (for disk images, TRDOS 386, 2nd version)
   322                                  ; CHS parameters
   323                                  
   324                                  pt_cylinders:			; C	
   325 000001A4 0000                      		dw	0
   326                                  pt_heads:			; H	
   327 000001A6 0000                    		dw	0
   328                                  pt_sectors:			; S	
   329 000001A8 0000                    		dw	0	
   330                                  
   331                                  		;org	7BEh
   332                                  		;times	1BEh-($-$$) db 0
   333 000001AA 00<rept>                		times	1BCh-($-$$) db 0
   334 000001BC BE07                    		dw	7BEh
   335                                  partition_table:
   336 000001BE 00<rept>                		times	64 db 0
   337                                  
   338                                  		;org	7FEh
   339                                  		;org 	7DFEh
   340                                  		; 22/12/2017
   341                                  		;times	1FEh-($-$$) db 0
   342                                  bs_sign:
   343 000001FE 55                      data_7FEh:	db	55h
   344 000001FF AA                                      db	0AAh
