     1                                  ; ****************************************************************************
     2                                  ; TRDOS386.ASM (TRDOS 386 Kernel) - v2.0.0 - trfdboot.s - FAT12 FD BOOT SECTOR
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Last Update: 12/02/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                                  ; TRDOS FAT12 Floppy Disk Boot Sector code (as a part of 'trfdboot.s')
    18                                  ; Copyright (C) 1998-2016  Erdogan TAN  [ Last Modification: 25/01/2016 ]
    19                                  
    20                                  ; incbin "TRFDBS.BIN" (in 'trfdboot.s')
    21                                  
    22                                  notvalidfmask   equ	0018h
    23                                  
    24                                  root_dir_buff   equ	0700h
    25                                  rts_segment     equ	1000h
    26                                  FAT_Buffer      equ	0700h
    27                                  
    28                                  [BITS 16]
    29                                  [ORG 7C00h]
    30                                  
    31 00000000 EB3E                                    jmp     short BS_01
    32 00000002 90                                      nop
    33                                  
    34                                  ; BootSector Identification (Data) Block
    35                                  
    36 00000003 5452444F53322E30        bsOemName:      db 'TRDOS2.0'          
    37 0000000B 0002                    bsBytesPerSec:  dw 512
    38 0000000D 01                      bsSecPerClust:  db 1
    39 0000000E 0100                    bsResSectors:   dw 1
    40 00000010 02                      bsFATs:         db 2
    41 00000011 E000                    bsRootDirEnts:  dw 224
    42 00000013 400B                    bsSectors:      dw 2880
    43 00000015 F0                      bsMedia:        db 0F0h
    44 00000016 0900                    bsFATsecs:      dw 9
    45 00000018 1200                    bsSecPerTrack:  dw 18
    46 0000001A 0200                    bsHeads:        dw 2
    47 0000001C 0000                    bsHidden1:      dw 0
    48 0000001E 0000                    bsHidden2:      dw 0
    49 00000020 400B0000                bsHugeSectors:  dd 2880
    50 00000024 00                      bsDriveNumber:  db 0
    51 00000025 00                      bsReserved1:    db 0
    52 00000026 29                      bsBpbSignature: db 29h                 
    53 00000027 00000000                bsVolumeID:     dd 0
    54 0000002B 5452444F5320202020-     bsVolumeLabel:  db 'TRDOS      '
    55 00000034 2020               
    56 00000036 4641543132202020        bsFileSysType:  db 'FAT12   '          
    57 0000003E 5254                    bsReserved2:    dw 'RT'
    58                                  
    59                                  BS_01:          
    60 00000040 8CC8                                    mov	ax, cs
    61 00000042 8ED8                    		mov	ds, ax
    62 00000044 8EC0                    		mov	es, ax
    63                                  
    64 00000046 FA                      		cli
    65 00000047 8ED0                    		mov	ss, ax
    66 00000049 BCFEFF                  		mov     sp, 0FFFEh
    67 0000004C FB                      		sti
    68                                  
    69                                  		; overwrite fd drive number !
    70 0000004D 8816[2400]                              mov	[bsDriveNumber], dl 	; drive number from INT 19h
    71                                  
    72 00000051 31C0                    		xor	ax, ax
    73                                  BS_02:
    74                                                  ;mov	dl, [bsDriveNumber]
    75 00000053 CD13                    		int     13h                     ; BIOS Service func ( ah ) = 0
    76                                                                                  ; Reset disk system
    77 00000055 7231                                    jc      short BS_07         	; To print i/o error message
    78                                                                                  ; AX = 0 no error
    79                                  BS_03:                                 
    80 00000057 B81300                                  mov     ax, 19                  ; Root Dir Location
    81 0000005A B90E00                                  mov     cx, 14                  ; Root Directory Sectors
    82 0000005D BB0007                                  mov     bx, root_dir_buff       ; Destination offset = 700h
    83 00000060 89DE                                    mov     si, bx
    84 00000062 E88800                                  call    fd_read
    85 00000065 7221                    BS_04:          jc      short BS_07		; Disk read error message
    86                                  
    87 00000067 BBE000                                  mov     bx, 224                 ; Number of root dir entries
    88                                  
    89 0000006A 803C00                  BS_05:          cmp     byte [si], 0		; Is it null entry?
    90 0000006D 7414                                    je      short BS_06		; Jump if zero ( = )
    91 0000006F B90B00                                  mov     cx, 0Bh                 ; Size of file/directory name
    92 00000072 56                                      push    si
    93 00000073 BF[7901]                                mov     di, rtsfilename   
    94 00000076 F3A6                                    repe    cmpsb                   ; Repeat if ZF = 1, CX > 0
    95                                  						; Cmp byte DS:SI with ES:DI
    96 00000078 5E                                      pop	si
    97 00000079 7419                                    je      short BS_09		; If the file name found
    98 0000007B 4B                                      dec     bx                    
    99 0000007C 7405                                    jz      short BS_06		; Jump if no next entry
   100 0000007E 83C620                                  add     si, 32                  ; To next directory entry
   101 00000081 EBE7                                    jmp     short BS_05             ; Jump for next sector
   102                                  BS_06:
   103 00000083 BE[9B01]                                mov     si, Replace_Msg
   104 00000086 EB03                                    jmp     short BS_08
   105                                  BS_07:      
   106 00000088 BE[8501]                                mov     si, Error_Msg
   107                                  BS_08:          
   108 0000008B E85000                                  call    print_msg
   109                                  
   110 0000008E 31C0                                    xor	ax, ax
   111 00000090 CD16                    		int	16h			; BIOS Service func ( ah ) = 0
   112                                  						; Read next kbd char
   113                                  						; AH-scan code AL-char code
   114 00000092 CD19                    		int	19h			; Reboot
   115                                  
   116                                  BS_09:
   117 00000094 8A440B                                  mov     al, [si+0Bh]		; Move attributes byte to BL
   118 00000097 2418                                    and     al, notvalidfmask       ; Is it a file, really?
   119 00000099 77E8                                    ja      short BS_06		; Jump if above ( > )
   120 0000009B 8B441A                                  mov     ax, [si+1Ah]		; First cluster of the file
   121 0000009E 83F802                                  cmp     ax, 2                   ; Start cluster
   122 000000A1 72E5                                    jb      short BS_07
   123                                  
   124 000000A3 A3[3E00]                                mov	[bsReserved2], ax	; Save the first cluster
   125                                      
   126                                  		; Load FAT
   127 000000A6 B80100                                  mov     ax, 1                   ; FAT Location
   128 000000A9 B90900                                  mov     cx, 9                   ; FAT Sectors
   129 000000AC BB0007                                  mov     bx, FAT_Buffer    
   130 000000AF E83B00                                  call    fd_read
   131 000000B2 72D4                                    jc      short BS_07
   132                                  
   133                                  		; Load  RTS (Kernel) file
   134 000000B4 BE[CD01]                                mov     si, Loading_Msg
   135 000000B7 E82400                                  call    print_msg
   136 000000BA A1[3E00]                                mov     ax, [bsReserved2]	; The First cluster
   137 000000BD BB0010                                  mov     bx, rts_segment
   138 000000C0 8EC3                                    mov     es, bx
   139 000000C2 31DB                                    xor     bx, bx
   140 000000C4 E86200                                  call    load_file
   141 000000C7 72BF                                    jc      short BS_07
   142                                  
   143                                  		; Launch RTS (Kernel)
   144 000000C9 8A16[2400]                              mov     dl, [bsDriveNumber]	; 12/06/2011
   145 000000CD B80010                                  mov     ax, rts_segment ; 1000h
   146 000000D0 8ED8                                    mov     ds, ax
   147                                                  ;mov     es, ax
   148 000000D2 FA                                      cli
   149 000000D3 8ED0                                    mov     ss, ax
   150                                                  ;mov	sp, 0FFFEh
   151 000000D5 FB                                      sti
   152                                  
   153 000000D6 B8A101                                  mov     ax, 417 ; TRDOS boot sector sign for TRDOS386.SYS
   154                                  
   155                                               	;jmp	1000h:0000h
   156                                               	;(OP Code: EA00000010)
   157 000000D9 EA                                      db      0EAh
   158 000000DA 0000                                    dw      0
   159 000000DC 0010                                    dw      rts_segment	; 1000h
   160                                  
   161                                  print_msg:
   162                                  BS_10:
   163 000000DE AC                      		lodsb				; Load byte at DS:SI to AL
   164 000000DF 20C0                                    and     al, al            
   165 000000E1 7409                                    jz	short BS_11		; If AL = 00h then stop
   166                                  
   167 000000E3 B40E                                    mov     ah, 0Eh
   168 000000E5 BB0700                                  mov     bx, 07h             
   169 000000E8 CD10                    		int	10h			; BIOS Service func ( ah ) = 0Eh
   170                                  						; Write char as TTY
   171                                  						; AL-char BH-page BL-color
   172 000000EA EBF2                                    jmp     short BS_10
   173                                  BS_11:
   174 000000EC C3                      		retn
   175                                  
   176                                  fd_read:
   177                                                  ; Only for FAT12 Floppy Disks (18 sector/track)
   178                                                  
   179 000000ED C606[F101]04                            mov     byte [RetryCount], 4
   180                                  BS_12:
   181 000000F2 51                                      push    cx
   182 000000F3 50                                      push    ax                      ; PHYSICAL ADRESS CALCULATION
   183 000000F4 B112                                    mov     cl, 18                  ; Sectors per track
   184 000000F6 F6F1                                    div     cl                      
   185 000000F8 88E1                                    mov     cl, ah                  ; Sector (zero based)
   186 000000FA FEC1                                    inc     cl                      ; To make it 1 based
   187                                                  ;xor     ah, ah
   188                                                  ;mov     dl, 2			; Heads 
   189                                                  ;div     dl
   190                                                                                  ; AL=cyl, AH=head, CL=sector
   191                                                  ;mov	dh, ah
   192 000000FC 28F6                    		sub	dh, dh
   193 000000FE D0E8                    		shr	al, 1
   194 00000100 80D600                  		adc	dh, 0
   195 00000103 8A16[2400]                              mov     dl, [bsDriveNumber] 
   196 00000107 88C5                                    mov     ch, al            
   197                                  
   198 00000109 B80102                                  mov     ax, 0201h
   199 0000010C CD13                    		int	13h			; BIOS Service func ( ah ) = 2
   200                                  						; Read disk sectors
   201                                  						; AL-sec num CH-track CL-sec
   202                                  						; DH-head DL-drive ES:BX-buffer
   203                                  						; CF-flag AH-stat AL-sec read
   204 0000010E 58                      		pop	ax			
   205 0000010F 59                                      pop     cx
   206 00000110 720F                                    jc      short BS_13
   207 00000112 40                                      inc     ax
   208                                  	                
   209 00000113 49                                      dec     cx
   210 00000114 7412                                    jz      short BS_14
   211 00000116 81C30002                                add     bx, 512
   212 0000011A C606[F101]04                            mov     byte [RetryCount], 4
   213 0000011F EBD1                                    jmp     short BS_12
   214                                  BS_13:         
   215 00000121 FE0E[F101]                              dec     byte [RetryCount]
   216 00000125 75CB                                    jnz     short BS_12
   217 00000127 F9                                      stc
   218                                  BS_14:
   219 00000128 C3                                      retn
   220                                  
   221                                  load_file:
   222                                                ; ES:BX = File Buffer
   223                                                ; AX = First Cluster Number
   224                                                ; Only for FAT12 Floppy Disks (1 sector per cluster)
   225                                  BS_15:
   226 00000129 A3[7501]                                mov     [File_Cluster], ax
   227 0000012C 891E[7701]                              mov     [File_BufferOff], bx
   228 00000130 48                                      dec     ax                      ; First cluster is cluster 2
   229 00000131 48                                      dec     ax               
   230 00000132 B90100                                  mov     cx, 1                   ; Sector count
   231 00000135 83C021                                  add     ax, 33                  ; Beginning sector of Data
   232 00000138 E8B2FF                                  call    fd_read
   233 0000013B 720C                                    jc      short BS_17
   234                                  BS_16:
   235 0000013D A1[7501]                                mov     ax, [File_Cluster]
   236 00000140 E81100                                  call    get_next_cluster
   237 00000143 7305                                    jnc     short BS_18
   238 00000145 83F801                                  cmp     ax, 1
   239 00000148 F5                                      cmc
   240                                  BS_17:
   241 00000149 C3                                      retn
   242                                  BS_18:
   243 0000014A 8B1E[7701]                              mov     bx, [File_BufferOff]
   244 0000014E 81C30002                                add     bx, 512
   245 00000152 EBD5                                    jmp     short BS_15
   246                                  
   247                                  get_next_cluster:
   248                                                  ; INPUT -> AX = Cluster Number
   249                                                  ; OUTPUT -> clc -> No Error, AX = Next Cluster
   250                                                  ; OUTPUT -> cf = 1 & AX = 0 -> End Of Cluster Chain
   251                                                  ; OUTPUT -> cf = 1 & AX > 0 -> Error
   252                                  BS_19:
   253 00000154 89C3                                    mov     bx, ax
   254 00000156 BA0300                                  mov     dx, 3
   255 00000159 F7E2                                    mul     dx
   256 0000015B D1E8                                    shr     ax, 1 ; Divide by 2
   257 0000015D 93                                      xchg    bx, ax
   258                                                  ; BX = Buffer Byte Offset
   259                                                  ; AX = Current Cluster
   260 0000015E 8B870007                                mov     ax, [FAT_Buffer+bx]
   261 00000162 730C                                    jnc     short BS_22
   262 00000164 C1E804                                  shr     ax, 4
   263                                  BS_20:
   264 00000167 3DF70F                                  cmp     ax, 0FF7h
   265 0000016A 7202                                    jc      short BS_21
   266 0000016C 31C0                                    xor     ax, ax
   267                                  BS_21:
   268 0000016E F5                                      cmc
   269 0000016F C3                                      retn
   270                                  BS_22:
   271 00000170 80E40F                                  and     ah, 0Fh
   272 00000173 EBF2                                    jmp     short BS_20
   273                                  
   274 00000175 0000                    File_Cluster:   dw 0
   275 00000177 0000                    File_BufferOff: dw 0
   276                                  
   277                                  rtsfilename:
   278 00000179 5452444F5333383653-                     db      'TRDOS386SYS'
   279 00000182 5953               
   280 00000184 00                                      db      0
   281                                  Error_Msg:
   282 00000185 0D0A                                    db      0Dh, 0Ah
   283 00000187 5452444F53204C6F61-                     db      'TRDOS Loading Error!'
   284 00000190 64696E67204572726F-
   285 00000199 7221               
   286 0000019B 0D0A                    Replace_Msg:    db      0Dh, 0Ah
   287 0000019D 5265706C6163652074-                     db      'Replace the disk and press any key to reboot.'
   288 000001A6 6865206469736B2061-
   289 000001AF 6E6420707265737320-
   290 000001B8 616E79206B65792074-
   291 000001C1 6F207265626F6F742E 
   292 000001CA 0D0A00                                  db      0Dh, 0Ah,0
   293 000001CD 0D0A                    Loading_Msg:    db      0Dh, 0Ah
   294 000001CF 4C6F6164696E67204B-                     db      "Loading Kernel TRDOS386.SYS ..."
   295 000001D8 65726E656C20545244-
   296 000001E1 4F533338362E535953-
   297 000001EA 202E2E2E           
   298 000001EE 0D0A00                                  db      0Dh, 0Ah, 0
   299                                  
   300 000001F1 00                      RetryCount:     db      0
   301                                  		
   302 000001F2 00<rept>                		times	510 - ($ - $$) db 0
   303                                  
   304 000001FE 55AA                    bootsignature:  db      55h, 0AAh
