; *****************************************************************************
;
; DRV_INIT2.ASM  [ TRDOS Kernel Drive Initialization Procedures ]
; Copyright (C) 2009 Erdogan TAN  [ 08/03/2009 ]
;
; DRV_INIT.ASM  [ TRDOS Kernel Drive Initialization Procedures ]
; Copyright (C) 2005 Erdogan TAN  [ 29/01/2005 ]
;
; TRDOS.ASM (include drv_init.asm)
;
; *****************************************************************************

proc_drv_init   proc    near

                xor dl,dl
                mov si, offset DiskParams
dparam_read:
                call proc_dparam
                mov dl, byte ptr [SI][DPDisks]
                add si, 40h
                cmp dl, 2
                jne short pass_floppy1
                dec dl
                call proc_dparam
pass_floppy1:
                mov dl, 80h
                add si, 40h
                call proc_dparam
                jnc short pass_hd_15h_error
                mov word ptr [si][DPNumOfSecs], 0
                mov word ptr [si][DPNumOfSecs]+2,0
pass_hd_15h_error:
                mov ah, byte ptr [SI][DPDisks]
                mov byte ptr [HDCounter], ah
next_hard_disk:
                dec byte ptr [HDCounter]
                cmp byte ptr [HDCounter], 0
                jna short load_hd_partition_tables
                inc dl
                add si, 40h
                call proc_dparam
                jnc short next_hard_disk
                mov word ptr [si][DPNumOfSecs], 0
                mov word ptr [si][DPNumOfSecs]+2,0
                jmp short next_hard_disk
load_hd_partition_tables:
                mov si, offset Disk_hd0
                mov di, offset PTable_hd0
                push ds
                pop es
                mov dl, 80h
                mov cx, 4
load_next_hd_partition_table:
                push cx
                push dx
                push si
                push di
                cmp byte ptr [SI]+1, 03h
                jne short pass_pt_this_hard_disk
                call proc_load_masterboot
                jc short pass_pt_this_hard_disk
                pop di
                push di
                mov si, offset PartitionTable
                mov cx, 32
                rep movsw
pass_pt_this_hard_disk:
                pop di
                pop si
                pop dx
                pop cx
                inc dl
                add si, 40h
                add di, 40h
                loop load_next_hd_partition_table
logical_drv_init:
                mov byte ptr [Hard_Disk], 80h
                mov cx, 4
                xor al, al
                mov si, offset PTable_Buffer
                mov di, offset Logical_FS_Disks + 400h
                mov byte ptr [Last_Logical_DiskNo], 1
ldrv_init_next_hdp:
                push si
                push cx
                push ax
                push di
                cmp byte ptr [SI][ptFileSystemName], 0A1h
                jne pass_this_is_FS_disk
                mov byte ptr [DI][LD_DiskType], 1
                mov dl, byte ptr [Hard_Disk]
                mov byte ptr [DI][LD_PhyDrvNo], dl
                mov bl, dl
                sub bl, 80h
                xor bh, bh
                mov ah, byte ptr [HD_LBAYes][BX]
                mov byte ptr [DI][LD_LBAYes], ah
                mov byte ptr [DI][LD_PartitionEntry],al
                mov al, dl
                sub al, 7Eh
                add al, '0' 
                mov byte ptr [DI][LD_DrvNumber], al
                cmp byte ptr al, '0'
                ja short loc_FS_disk_LBA_read
                mov dh, byte ptr [SI][ptBeginHead]
                mov cx, word ptr [SI][ptBeginSector]
                mov ax, 0201h    ; Read 1 sector
                mov bx, offset FS_BootSectorBuff
                int 13h
                jc short pass_this_is_FS_disk
                jmp hdp_boot_validation
loc_FS_disk_LBA_read:
                mov byte ptr [DI][LD_DiskType], 1
                mov dl, byte ptr [Hard_Disk]
                mov byte ptr [DI][LD_PhyDrvNo], dl
                mov byte ptr [DI][LD_LBAYes], 1
                mov byte ptr [DI][LD_PartitionEntry],al
                mov ah, dl
                sub ah, 7Eh
                mov byte ptr [DI][LD_DrvNumber], ah
                mov al, 40h
                mul ah
                add ax, offset Disk_fd0
                mov di, ax
                cmp byte ptr [DI][DAP_PacketSize], 10h
                jne short pass_this_is_FS_disk
                mov word ptr [DI][DAP_Destination], offset FS_BootSectorBuff
                push ds
                pop word ptr [DI][DAP_Destination]+2
                mov byte ptr [DI][DAP_NumOfBlocks],1
                push di
                add si, ptStartSector
                add di, DAP_LBA_Address
                movsw
                movsw
                pop si
                push si   
                add si, DAP_PacketSize ; DS:SI= DAP Location
                mov ah, 42h  ; Extended Disk Read - LBA Read
                mov dl, byte ptr [Hard_Disk]
                int 13h
                pop di 
                jc short pass_this_is_FS_disk
hdp_boot_validation:
                cmp word ptr [BS_Validation], 0AA55h
                jne short pass_this_is_FS_disk
                cmp word ptr [bsMagicWord], 01A1h
                jne short pass_this_is_FS_disk
loc_move_hd_BPB:
                mov si, offset FS_BootSectorBuff_BPB
                pop di
                push di
                push di
                add di, LD_BPB
                mov cx, 38
                rep movsw 
                pop si
                pop di
                add di, 200h
                push di
                inc byte ptr [Last_Logical_DiskNo]
               ;LD_MediaChanged= 1 is "New Boot, File System is not read"
                mov byte ptr [SI][LD_MediaChanged],1
pass_this_is_FS_disk:
                pop di
                pop ax
                pop cx
                pop si
                add si, 10h
                inc al
                dec cx
                cmp cx, 0
                ja  ldrv_init_next_hdp
                cmp byte ptr [Hard_Disk], 83h
                jnb short loc_drv_init_retn
                mov cx, 4
                inc byte ptr [Hard_Disk]
                jmp ldrv_init_next_hdp
loc_drv_init_retn:
                retn

proc_drv_init   endp

proc_dparam   proc near
              ; input
              ; dl = Disk Drive Number
              ; ds:si = Parameters Table Buffer
              ; output
              ; ah = error number (0 = No Error if C flag is ZERO)
              mov byte ptr [si][DPDiskNumber], dl
              mov byte ptr [si][DPDType], 0
              push dx
              mov ah, 08h
              int 13h
              mov byte ptr [si][DPReturn], ah
              jnc short dparam_no_error
              pop dx
              retn
dparam_no_error:
              mov byte ptr [si][DPDType], bl
              mov byte ptr [si][DPDisks], dl
              inc dh
              mov byte ptr [si][DPHeads], dh
              push cx
              and cl, 3Fh
              mov byte ptr [si][DPSecPerTrack], cl
              pop cx
              shr cl,1
              shr cl,1
              shr cl,1
              shr cl,1
              shr cl,1
              shr cl,1
              xchg ch,cl
              inc cx
              mov word ptr [si][DPCylinders], cx
              mov word ptr [si][DPTableOff], di
              push es
              pop word ptr [si][DPTableSeg]

              cmp byte ptr [si][DPDiskNumber], 80h
              jb short dparam_15h_return

              mov dl, byte ptr [si][DPDiskNumber]
              mov byte ptr [Hard_Disk], dl
              mov byte ptr [si][DPDType], 0
              mov ah, 15h
              int 13h
              jc short dparam_15h_return
              mov byte ptr [si][DPDType], ah
              mov word ptr [si][DPNumOfSecs], cx
              mov word ptr [si][DPNumOfSecs]+2, dx
dparam_15h_return:
              pop dx ; dl = Drive Number
              mov byte ptr [SI][DAP_PacketSize], 0 ; Reset (No DAP)
              mov ah, 41h ; Check Extensions Present
              mov bx, 55AAh
              int 13h
              jc short dparam_48h_return
              cmp bx, 0AA55h
              jne short dparam_48h_return
              test cx, 01h ; Fixed Disk Access Subset - is LBA ready ? 
              jz short dparam_48h_return
              xor bh,bh
              mov bl, byte ptr [Hard_Disk]
              sub bl, 80h
              mov byte ptr [HD_LBAYes][BX],1
              mov byte ptr [SI][DAP_PacketSize], 10h
dparam_41h_return:
              push si
              add si, GetDParams_48h
              mov word ptr [SI], 0026 ; GDP Data Lenght - Set
            ; DS:SI= Address of Result Buffer
            ; DL (Drive Number) must be not changed before here...
              mov ah, 48h  ; Get Enhanced Disk Drive Parameters
              int 13h
              pop si
              jc short dparam_48h_return
              mov word ptr [SI][GetDParams_48h], 0 ; GDP Data Lenght - Reset
dparam_48h_return:
              xor ah,ah
              retn
proc_dparam   endp

proc_load_masterboot proc near
                ; input -> dl = drive number
                xor ah,ah
                int 13h
                jnc short pass_reset_error
harddisk_error:
                retn
pass_reset_error:
                mov bx, offset MasterBootBuff
                mov ax,0201h
                mov cx,1
                xor dh,dh
                push ds
                pop es
                int 13h
                jc short harddisk_error

                cmp word ptr [MBIDCode],0AA55h
                jnz short loc_not_masterboot
                retn
loc_not_masterboot:
                stc
                retn

proc_load_masterboot endp

floppy_drv_init proc near
                ; INPUT -> dl = Drive Number (0,1)
                ; OUTPUT -> al = drive name,
                ;           ah = drive number
                mov si, offset Disk_fd0
                mov di, offset Logical_FS_Disks
                xor dh, dh
                cmp dl, 0
                jna short pass_drv_init_fd1
                add si, 40h
                add di, 200h
pass_drv_init_fd1:
                mov byte ptr [DI][LD_MediaChanged],0
             ;  cmp byte ptr [SI][DPDType], 0
             ;  jna short pass_fd_read_boot_sector0
read_fd_boot_sector:
                push ds
                pop es
                push dx
                mov cx, 4 ; Retry Count
read_fd_boot_sector_again:
                push cx
                mov cx, 1
                mov ax, 0201h    ; Read 1 sector
                mov bx, offset FS_BootSectorBuff
                int 13h
                pop cx
                jnc short use_fd_boot_sector_params
                loop read_fd_boot_sector_again
pass_fd_read_boot_sector0:
                stc
pass_fd_read_boot_sector1:
                pop dx
                retn
use_fd_boot_sector_params:
                cmp word ptr [BS_Validation], 0AA55h
                jne short pass_fd_read_boot_sector0
                cmp word ptr [bsMagicWord], 01A1h
                jne short pass_fd_read_boot_sector1
                mov si, offset FS_BootSectorBuff_BPB
                push di
                add di, LD_BPB
                mov cx, 32
                rep movsw 
                pop si
                pop dx
                mov byte ptr [SI][LD_PhyDrvNo], dl
                mov byte ptr [SI][LD_DiskType], 1
                mov byte ptr [SI][LD_LBAYes], 0
                mov byte ptr [SI][LD_PartitionEntry],0
                mov byte ptr [SI][LD_DrvNumber], dl
                mov byte ptr [SI][LD_MediaChanged], 1
                retn

floppy_drv_init endp

HDCounter:     db 1

MasterBootBuff:
MasterBootCode: db 1BEh dup (?)
PartitionTable: db 64 dup (?)
MBIDCode: dw ?

PTable_Buffer:
PTable_hd0: db 64 dup (0)
PTable_hd1: db 64 dup (0)
PTable_hd2: db 64 dup (0)
PTable_hd3: db 64 dup (0)

DiskParams:
Disk_fd0: db 16 dup (0)
DAP_fd0: db 16 dup(0)
GDP_fd0: db 26 dup(0)
TRDP_fd0: db 6 dup(0)
Disk_fd1: db 16 dup (0)
DAP_fd1: db 16 dup(0)
GDP_fd1: db 26 dup(0)
TRDP_fd1: db 6 dup(0)
Disk_hd0: db 16 dup (0)
DAP_hd0: db 16 dup(0)
GDP_hd0: db 26 dup(0)
TRDP_hd0: db 6 dup(0)
Disk_hd1: db 16 dup (0)
DAP_hd1: db 16 dup(0)
GDP_hd1: db 26 dup(0)
TRDP_hd1: db 6 dup(0)
Disk_hd2: db 16 dup (0)
DAP_hd2: db 16 dup(0)
GDP_hd2: db 26 dup(0)
TRDP_hd2: db 6 dup(0)
Disk_hd3: db 16 dup (0)
DAP_hd3: db 16 dup(0)
GDP_hd3: db 26 dup(0)
TRDP_hd3: db 6 dup(0)
end_of_dparams_buff:

FS_BootSectorBuff:
BS_JmpBoot: db 3 dup (0)
BS_FSystem_ID: dw 0
BS_FSystem_NO: db 0
                ; Offset 6  
FS_BootSectorBuff_BPB:
bsBytesPerSec:  dw 0
                ; Offset 8
bsMediaAttrib:  db 0
bsPartitionID:  db 0
bsFSVersionMaj: db 0
bsFSVersionMin: db 0
                ; Offset 12    
bsStartSector:  dd 0 
bsVolumeSize:   dd 0
                ; Offset 20
;bsStartupFD:   dd 0
bsStartupFD:    dd 0
bsMATLocation:  dd 0
bsRootDirD:     dd 0
bsSystemConfFD: dd 0
bsSwapFD:       dd 0
bsUndeleteDirD: dd 0
                ; Offset 44
bsOperationSys: db 16 dup(0)
                db 0
bsOSBuildNo:    dw 0
                ; Offset 63  
bsDriveNumber:  db 0
                ; Offset 64
bsMagicWord:    dw 0
BS_FS_BootCode: db 444 dup (0)
BS_Validation:  dw 0

Hard_Disk:      db 80h
Last_Logical_DiskNo: db 0
HD_LBAYes:      dd 0

