Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;********************************************
- ; Hard Disk
- ;
- ; Detects hard disk and provides interface for ATA/PATA or SATA(AHCI) disks
- ;********************************************
- ; SATA vs ATA (or PATA):
- ; SATA has two modes: PATA (legacy) and AHCI. If SATA drive doesn't support PATA(i.e. ATA) then AHCI need to be used
- ; Currently this file contains ATA only.
- %ifndef __HD__
- %define __HD__
- %include "ata.asm"
- %define HD_PRIMARY_PORT 0x1F0
- %define HD_SECONDARY_PORT 0x170
- %define HD_PRIMARY_CTRL_PORT 0x3F6
- %define HD_SECONDARY_CTRL_PORT 0x376
- ;%define HD_THIRD_PORT 0x1E8
- ;%define HD_FOURTH_PORT 0x168
- ;%define HD_THIRD_CTRL_PORT 0x3E6
- ;%define HD_FOURTH_CTRL_PORT 0x366
- %define HD_DCR_NIEN 0x02
- ; Device-types
- %define HD_ATADEV_UNKNOWN 0
- %define HD_ATADEV_PATA 1
- %define HD_ATADEV_SATA 2
- %define HD_ATADEV_PATAPI 3
- %define HD_ATADEV_SATAPI 4
- hd_ahci db 0 ; ATA hard disk if 0, otherwise SATA(AHCI)
- hd_detected db 0
- hd_val_arr dw HD_PRIMARY_PORT, HD_PRIMARY_CTRL_PORT, 0
- dw HD_PRIMARY_PORT, HD_PRIMARY_CTRL_PORT, 1
- dw HD_SECONDARY_PORT, HD_SECONDARY_CTRL_PORT, 0
- dw HD_SECONDARY_PORT, HD_SECONDARY_CTRL_PORT, 1
- ; _hd_info
- hd_info:
- cmp BYTE [hd_detected], 0
- jz .Back
- ; here we should check hd_ahci and call ahci_info if set (TODO)
- call ata_info
- .Back ret
- ; hd_read
- ; IN:
- ; ECX: lbaLo, EBP: lbaHi, EBX: sectorcnt, EAX: memaddr
- ; OUT: AL (0 indicates success)
- hd_read:
- cmp BYTE [hd_detected], 0
- jz .Err
- ; here we should check hd_ahci and call ahci_rw if set (TODO)
- mov dl, 0
- call ata_rw
- jmp .Back
- .Err mov al, 1 ; NO_DRIVE
- .Back ret
- ; hd_write
- ; IN:
- ; ECX: lbaLo, EBP: lbaHi, EBX: sectorcnt, EAX: memaddr
- ; OUT: AL (0 indicates success)
- hd_write:
- cmp BYTE [hd_detected], 0
- jz .Err
- ; here we should check hd_ahci and call ahci_rw if set (TODO)
- mov dl, 1
- call ata_rw
- jmp .Back
- .Err mov al, 1 ; NO_DRIVE
- .Back ret
- ; The main harddisk-detection function
- ; Detects first available harddisk on primary and secondary bus (master or slave)
- ; by calling hd_detect_type
- ; Sets variables (portbase, slavebit) accordingly
- ; Executes IDENTIFY cmd
- hd_detect:
- pushad
- ; disable IRQ sending
- mov al, HD_DCR_NIEN
- mov dx, HD_PRIMARY_CTRL_PORT
- out dx, al
- mov al, HD_DCR_NIEN
- mov dx, HD_SECONDARY_CTRL_PORT
- out dx, al
- mov BYTE [hd_detected], 0
- mov ecx, 0
- .Next mov bx, WORD [hd_val_arr+ecx]
- mov bp, WORD [hd_val_arr+ecx+2]
- mov dx, WORD [hd_val_arr+ecx+4]
- push ecx
- mov cx, dx
- call hd_detect_devtype
- pop ecx
- cmp al, HD_ATADEV_PATA
- jz .Identify
- add cx, 3*2
- cmp cx, 24
- jnz .Next
- jmp .End
- .Identify mov dx, WORD [hd_val_arr+ecx]
- mov [ata_port_base], dx
- mov dx, WORD [hd_val_arr+ecx+2]
- mov [ata_port_ctrl], dx
- mov dx, WORD [hd_val_arr+ecx+4]
- mov [ata_slave_bit], dl
- call ata_identify
- cmp al, ATA_OK
- jz .Found
- add cx, 3*2
- cmp cx, 24
- jnz .Next
- jmp .End
- .Found mov BYTE [hd_detected], 1
- .End popad
- ret
- ; Detects SATA drives in AHCI mode only or SATA drives in ATA/PATA legacy mode too?
- ; this shouldn't be in hd.asm, because it can detect ATAPI/SATAPI (e.g. CD-ROM) too
- ; IN: BX (portbase), CX (slavebit), BP (portctrl)
- ; OUT: AL (devtype)
- hd_detect_devtype:
- ; call ata_reset ; uses EAX, EDX
- mov al, ATA_CHS_MASTER
- shl cl, 4
- or al, cl
- mov dx, bx
- add dx, ATA_PORT_DRV_HEAD
- out dx, al
- mov dx, bp
- in al, dx
- in al, dx
- in al, dx
- in al, dx
- ; get the signature bytes
- mov dx, bx
- add dx, ATA_PORT_CYL_LOW
- in al, dx
- mov cl, al
- mov dx, bx
- add dx, ATA_PORT_CYL_HIGH
- in al, dx
- mov ch, al
- xor eax, eax
- cmp cl, 0x14
- jz .ChkHi14
- cmp cl, 0x69
- jz .ChkHi69
- cmp cl, 0x0
- jz .ChkHi0
- cmp cl, 0x3C
- jz .ChkHi3C
- jmp .Unknown
- .ChkHi3C cmp ch, 0xC3
- jnz .Unknown
- mov al, HD_ATADEV_SATA
- jmp .Back
- .ChkHi0 cmp ch, 0x0
- jnz .Unknown
- mov al, HD_ATADEV_PATA
- jmp .Back
- .ChkHi69 cmp ch, 0x96
- jnz .Unknown
- mov al, HD_ATADEV_SATAPI
- jmp .Back
- .ChkHi14 cmp ch, 0xEB
- jnz .Unknown
- mov al, HD_ATADEV_PATAPI
- jmp .Back
- .Unknown mov al, HD_ATADEV_UNKNOWN
- .Back ret
- %endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement