     1                                  ; ****************************************************************************
     2                                  ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - trfdboot.s
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Last Update: 29/01/2016
     5                                  ; ----------------------------------------------------------------------------
     6                                  ; Beginning: 25/01/2016
     7                                  ; ----------------------------------------------------------------------------
     8                                  ; Assembler: NASM version 2.11 (trfdboot.s)
     9                                  ; ----------------------------------------------------------------------------
    10                                  ; Turkish Rational DOS
    11                                  ; Operating System Project v2.0 by ERDOGAN TAN (Beginning: 04/01/2016)
    12                                  ;
    13                                  ; Derived from TRDOS Operating System v1.0 (8086) source code by Erdogan Tan
    14                                  ; TRFDBOOT.ASM (31/07/2011)
    15                                  ; ****************************************************************************
    16                                  
    17                                  ; TRFDBOOT.ASM
    18                                  ; Turkish Rational DOS
    19                                  ; Disk Operation System v1.0 Project
    20                                  ; 1.44 MB Floppy Disk Boot Code
    21                                  ;
    22                                  ; Copyright (C) 1998-2011  Erdogan TAN  [ Last Modification: 31/07/2011 ]
    23                                  ; 12/06/2011 -> Boot sector bugfix (dl = bsDriveNumber <-> DS=CS)
    24                                  ; 27/09/2009 -> 'Operation System' has been changed to 'Operating System'
    25                                  ; 2005 -> trfdboot utility
    26                                  ; 1998 -> beginning year of trdos project
    27                                  ;
    28                                  ; ****************************************************************************
    29                                  
    30                                  bsDriveNumber	equ TRDOS_FAT12_fd_bs + 24h
    31                                  bsVolumeID	equ TRDOS_FAT12_fd_bs + 27h
    32                                  
    33                                  [BITS 16]
    34                                  [ORG 100h]
    35                                  
    36 00000000 FA                      	cli
    37 00000001 FC                      	cld
    38 00000002 0E                      	push	cs
    39 00000003 17                      	pop	ss
    40 00000004 BCFEFF                  	mov	sp, 0FFFEh
    41 00000007 FB                      	sti
    42                                  
    43                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    44                                  ; see if drive specified
    45                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    46                                  
    47 00000008 BE8000                  	mov	si, 80h			; PSP command tail
    48 0000000B 8A0C                    	mov	cl, [si]
    49 0000000D 08C9                    	or	cl, cl                               
    50 0000000F 7430                    	jz	short T_05		; jump if zero
    51                                  
    52                                  T_01:
    53 00000011 46                      	inc	si
    54                                  
    55 00000012 8A04                    	mov	al, [si]
    56 00000014 3C20                    	cmp	al, ' '			; is it SPACE ?
    57 00000016 7506                    	jne	short T_02
    58                                  
    59 00000018 FEC9                    	dec	cl                                  
    60 0000001A 75F5                    	jnz	short T_01                  
    61 0000001C EB23                    	jmp	short T_05
    62                                  
    63                                  T_02:
    64 0000001E 3C30                    	cmp	al, '0'			; 0 - 9
    65 00000020 721F                    	jb	short T_05
    66 00000022 3C39                    	cmp	al, '9'			; allow number for drive
    67 00000024 7617                    	jna	short T_04                    
    68 00000026 3C41                    	cmp	al, 'A'
    69 00000028 7217                    	jb	short T_05
    70 0000002A 3C5A                    	cmp	al, 'Z'			; A - Z
    71 0000002C 760A                    	jna	short T_03                    
    72 0000002E 3C61                    	cmp	al, 'a'			; a - z 
    73 00000030 720F                    	jb	short T_05                  
    74 00000032 3C7A                    	cmp	al, 'z'                           
    75 00000034 770B                    	ja	short T_05                 
    76                                  
    77 00000036 2C20                    	sub	al, 'a'-'A'		; to upper case
    78                                  
    79                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    80                                  ; get drive code
    81                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    82                                  
    83                                  T_03:
    84 00000038 A2[AA01]                	mov	[TrDOS_Drive], al
    85 0000003B EB2D                    	jmp	short T_09
    86                                  
    87                                  T_04:
    88 0000003D 0411                    	add	al, 'A'-'0'		; 0 based -> A based
    89 0000003F EBF7                    	jmp	short T_03 
    90                                  
    91                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    92                                  ; Write message
    93                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    94                                  
    95                                  T_05:
    96 00000041 BE[1601]                	mov	si, TrDOS_Welcome
    97 00000044 E8C000                  	call	print_msg
    98 00000047 80F900                  	cmp	cl, 0
    99 0000004A 777B                            ja      short T_12
   100                                  
   101                                  T_06:
   102 0000004C BE[7D01]                	mov	si, TrDOS_PressKeyWhenReady
   103 0000004F E8B500                  	call	print_msg
   104                                  
   105                                  T_07:
   106 00000052 31C0                    	xor	ax, ax
   107 00000054 CD16                    	int	16h			; wait for keyboard command
   108 00000056 3C0D                    	cmp	al, 'M'-40h		; Enter (OK) key
   109 00000058 740A                    	je	short T_08		; write
   110 0000005A 3C03                    	cmp	al, 'C'-40h
   111 0000005C 7469                    	je	short T_12		; no write (exit)
   112 0000005E 3C1B                    	cmp	al, 27
   113 00000060 7465                    	je	short T_12
   114 00000062 EBEE                    	jmp	short T_07            
   115                                  
   116                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   117                                  ; get drive parameters
   118                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   119                                  
   120                                  T_08:
   121 00000064 BE[DB01]                	mov	si, TrDOS_CRLF
   122 00000067 E89D00                  	call	print_msg
   123                                  
   124                                  T_09:
   125 0000006A B408                    	mov	ah, 08h
   126 0000006C 8A16[AA01]              	mov	dl, [TrDOS_Drive]	; drive
   127 00000070 80EA41                  	sub	dl, 'A'			; make it zero based 
   128 00000073 CD13                    	int	13h			; return disk parameters
   129                                  
   130 00000075 0E                      	push	cs
   131 00000076 07                      	pop	es			; restore es
   132                                  
   133 00000077 80FB04                  	cmp	bl, 4			; Drive Type
   134 0000007A 7574                    	jne	short T_14
   135                                  	
   136                                  T_10:
   137 0000007C C606[1404]04            	mov	byte [RetryCount], 4
   138                                  
   139                                  T_11:
   140 00000081 31C0                    	xor	ax, ax
   141 00000083 CD1A                    	int	1Ah			; get time of day
   142                                  
   143 00000085 BE[3B02]                	mov	si, bsVolumeID 
   144                                  
   145 00000088 8914                    	mov	[si], dx
   146 0000008A 894C02                  	mov	[si+2], cx		; set unique volume ID
   147                                  	
   148 0000008D B402                    	mov	ah, 02h			; Return Current Time
   149 0000008F CD1A                    	int	1Ah
   150 00000091 86E9                    	xchg	ch, cl
   151 00000093 86F2                    	xchg	dh, dl
   152                                  
   153 00000095 01D1                    	add	cx, dx  
   154 00000097 014C02                  	add	[si+2], cx
   155                                  		
   156 0000009A B404                    	mov	ah, 04h			; Return Current Date
   157 0000009C CD1A                    	int	1Ah
   158 0000009E 86E9                    	xchg	ch, cl
   159 000000A0 86F2                    	xchg	dh, dl
   160                                  	
   161 000000A2 01D1                    	add	cx, dx  
   162 000000A4 014C02                  	add	[si+2], cx
   163                                                
   164 000000A7 B80103                  	mov	ax, 0301h		; write to disk
   165 000000AA BB[1402]                	mov	bx, TRDOS_FAT12_fd_bs	; location of boot code
   166                                  
   167 000000AD B90100                  	mov	cx, 1			; cylinder = 0
   168                                  					; sector = 1
   169 000000B0 B600                    	mov	dh, 0			; head = 0
   170 000000B2 8A16[AA01]              	mov	dl, [TrDOS_Drive]	; drive 
   171 000000B6 80EA41                  	sub	dl, 'A'			; make it zero based
   172 000000B9 8816[3802]              	mov	[bsDriveNumber], dl
   173 000000BD CD13                    	int	13h
   174 000000BF 722F                    	jc	short T_14		; if everything is ok -->
   175                                  
   176                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   177                                  ; success. try again ?
   178                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   179                                  
   180 000000C1 BE[AE01]                	mov	si, TrDOS_disk_WrittenSuccesfully
   181 000000C4 E84000                  	call	print_msg
   182                                  
   183                                  T_12:
   184 000000C7 BE[DB01]                	mov	si, TrDOS_CRLF
   185 000000CA E83A00                  	call	print_msg
   186 000000CD B8004C                  	mov	ax, 4C00h		; terminate
   187 000000D0 CD21                    	int	21h
   188                                  
   189                                  T_13:
   190 000000D2 31C0                    	xor	ax, ax
   191 000000D4 CD16                    	int	16h			; wait for keyboard command
   192 000000D6 3C79                    	cmp	al, 'y'
   193 000000D8 7424                    	je	short T_15		; retry
   194 000000DA 3C59                    	cmp	al, 'Y'
   195 000000DC 7420                    	je	short T_15
   196 000000DE 3C6E                    	cmp	al, 'n'
   197 000000E0 74E5                    	je	short T_12 		; exit
   198 000000E2 3C4E                    	cmp	al, 'N'
   199 000000E4 74E1                    	je	short T_12
   200 000000E6 3C03                    	cmp	al, 'C'-40h
   201 000000E8 74DD                    	je	short T_12                   
   202 000000EA 3C1B                    	cmp	al, 27
   203 000000EC 74D9                    	je	short T_12
   204 000000EE EBE2                    	jmp	short T_13
   205                                  
   206                                  T_14:
   207 000000F0 FE0E[1404]              	dec	byte [RetryCount]
   208 000000F4 758B                    	jnz	short T_11
   209                                  
   210 000000F6 BE[DE01]                	mov	si, TrDOS_disk_NotReadyOrError
   211 000000F9 E80B00                  	call	print_msg
   212 000000FC EBD4                    	jmp	short T_13
   213                                  
   214                                  T_15:
   215 000000FE BE[DB01]                	mov	si, TrDOS_CRLF
   216 00000101 E80300                  	call	print_msg
   217 00000104 E975FF                  	jmp	T_10
   218                                  
   219                                  print_msg:
   220                                  T_16:
   221 00000107 AC                      	lodsb				; Load byte at DS:SI to AL
   222 00000108 20C0                    	and	al, al            
   223 0000010A 7409                    	jz	short T_17       
   224 0000010C B40E                    	mov	ah, 0Eh			
   225 0000010E BB0700                  	mov	bx, 07h             
   226 00000111 CD10                    	int	10h			; BIOS Service func ( ah ) = 0Eh
   227                                  					; Write char as TTY
   228                                  					; AL-char BH-page BL-color
   229 00000113 EBF2                    	jmp     short T_16          
   230                                  
   231                                  T_17:
   232 00000115 C3                      	retn
   233                                  
   234                                  
   235                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   236                                  ;  messages
   237                                  ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   238                                  
   239                                  TrDOS_Welcome:
   240 00000116 0D0A                    	db 0Dh, 0Ah
   241 00000118 54522D444F5320466C-     	db 'TR-DOS Floppy Disk Boot Sector Rebuilder v4.0'
   242 00000121 6F707079204469736B-
   243 0000012A 20426F6F7420536563-
   244 00000133 746F72205265627569-
   245 0000013C 6C6465722076342E30 
   246 00000145 0D0A                    	db 0Dh, 0Ah
   247 00000147 286329204572646F67-     	db '(c) Erdogan TAN 1998-2016'
   248 00000150 616E2054414E203139-
   249 00000159 39382D32303136     
   250 00000160 0D0A                    	db 0Dh,0Ah
   251 00000162 0D0A                    	db 0Dh,0Ah
   252 00000164 55736167653A207472-     	db 'Usage: trfdboot [drive] '
   253 0000016D 6664626F6F74205B64-
   254 00000176 726976655D20       
   255 0000017C 00                      	db 0
   256                                  
   257                                  TrDOS_PressKeyWhenReady:
   258 0000017D 0D0A                    	db 0Dh, 0Ah
   259 0000017F 0D0A                    	db 0Dh, 0Ah
   260 00000181 507265737320456E74-     	db 'Press Enter to write boot sector on disk '
   261 0000018A 657220746F20777269-
   262 00000193 746520626F6F742073-
   263 0000019C 6563746F72206F6E20-
   264 000001A5 6469736B20         
   265                                  TrDOS_Drive:
   266 000001AA 413A2000                	db 'A: ', 0
   267                                  
   268                                  TrDOS_disk_WrittenSuccesfully:
   269 000001AE 0D0A                    	db 0Dh, 0Ah
   270 000001B0 426F6F742073656374-     	db 'Boot sector updated to TRDOS v2.0 format...'
   271 000001B9 6F7220757064617465-
   272 000001C2 6420746F205452444F-
   273 000001CB 532076322E3020666F-
   274 000001D4 726D61742E2E2E     
   275                                  TrDOS_CRLF:
   276 000001DB 0D0A00                  	db 0Dh, 0Ah, 0
   277                                  
   278                                  TrDOS_disk_NotReadyOrError:
   279 000001DE 0D0A                    	db 0Dh, 0Ah
   280 000001E0 4469736B206572726F-     	db 'Disk error or drive not ready. Try again? (Y/N) '
   281 000001E9 72206F722064726976-
   282 000001F2 65206E6F7420726561-
   283 000001FB 64792E205472792061-
   284 00000204 6761696E3F2028592F-
   285 0000020D 4E2920             
   286 00000210 00                      	db 0
   287 00000211 90                      align 2
   288 00000212 A101                    	dw 417
   289                                  
   290                                  TRDOS_FAT12_fd_bs:	; Boot Sector code
   291                                  
   292                                  ; 29/01/2016
   293 00000214 <incbin>                incbin	"TRFDBS.BIN"	; Kernel file: 'TRDOS386.SYS'
   294                                  
   295                                  RetryCount:
   296 00000414 00                      	db 0
