Advertisement
Guest User

hd.asm

a guest
Oct 1st, 2013
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;********************************************
  2. ;   Hard Disk
  3. ;
  4. ;   Detects hard disk and provides interface for ATA/PATA or SATA(AHCI) disks
  5. ;********************************************
  6.  
  7. ; SATA vs ATA (or PATA):
  8. ;   SATA has two modes: PATA (legacy) and AHCI. If SATA drive doesn't support PATA(i.e. ATA) then AHCI need to be used
  9. ;   Currently this file contains ATA only.
  10.  
  11.  
  12. %ifndef __HD__
  13. %define __HD__
  14.  
  15.  
  16. %include "ata.asm"
  17.  
  18. %define HD_PRIMARY_PORT         0x1F0
  19. %define HD_SECONDARY_PORT       0x170
  20. %define HD_PRIMARY_CTRL_PORT    0x3F6
  21. %define HD_SECONDARY_CTRL_PORT  0x376
  22.  
  23. ;%define HD_THIRD_PORT          0x1E8
  24. ;%define HD_FOURTH_PORT         0x168
  25. ;%define HD_THIRD_CTRL_PORT     0x3E6
  26. ;%define HD_FOURTH_CTRL_PORT        0x366
  27.  
  28. %define HD_DCR_NIEN 0x02
  29.  
  30. ; Device-types
  31. %define HD_ATADEV_UNKNOWN   0
  32. %define HD_ATADEV_PATA      1
  33. %define HD_ATADEV_SATA      2
  34. %define HD_ATADEV_PATAPI    3
  35. %define HD_ATADEV_SATAPI    4
  36.  
  37. hd_ahci db  0       ; ATA hard disk if 0, otherwise SATA(AHCI)
  38.  
  39. hd_detected db 0
  40.  
  41. hd_val_arr      dw HD_PRIMARY_PORT, HD_PRIMARY_CTRL_PORT, 0
  42.                 dw HD_PRIMARY_PORT, HD_PRIMARY_CTRL_PORT, 1
  43.                 dw HD_SECONDARY_PORT, HD_SECONDARY_CTRL_PORT, 0
  44.                 dw HD_SECONDARY_PORT, HD_SECONDARY_CTRL_PORT, 1
  45.  
  46.  
  47. ; _hd_info
  48. hd_info:
  49.             cmp BYTE [hd_detected], 0
  50.             jz  .Back
  51.             ; here we should check hd_ahci and call ahci_info if set (TODO)
  52.             call ata_info
  53. .Back       ret
  54.  
  55.  
  56. ; hd_read
  57. ; IN:
  58. ;   ECX: lbaLo, EBP: lbaHi, EBX: sectorcnt, EAX: memaddr
  59. ; OUT: AL (0 indicates success)
  60. hd_read:
  61.             cmp BYTE [hd_detected], 0
  62.             jz  .Err
  63.             ; here we should check hd_ahci and call ahci_rw if set (TODO)
  64.             mov dl, 0
  65.             call ata_rw
  66.             jmp .Back
  67. .Err        mov al, 1                   ; NO_DRIVE
  68. .Back       ret
  69.  
  70.  
  71. ; hd_write
  72. ; IN:
  73. ;   ECX: lbaLo, EBP: lbaHi, EBX: sectorcnt, EAX: memaddr
  74. ; OUT: AL (0 indicates success)
  75. hd_write:
  76.             cmp BYTE [hd_detected], 0
  77.             jz  .Err
  78.             ; here we should check hd_ahci and call ahci_rw if set (TODO)
  79.             mov dl, 1
  80.             call ata_rw
  81.             jmp .Back
  82. .Err        mov al, 1                   ; NO_DRIVE
  83. .Back       ret
  84.  
  85.  
  86. ; The main harddisk-detection function
  87. ; Detects first available harddisk on primary and secondary bus (master or slave)
  88. ;   by calling hd_detect_type
  89. ; Sets variables (portbase, slavebit) accordingly
  90. ; Executes IDENTIFY cmd
  91. hd_detect:
  92.             pushad
  93.             ; disable IRQ sending
  94.             mov al, HD_DCR_NIEN
  95.             mov dx, HD_PRIMARY_CTRL_PORT
  96.             out dx, al
  97.             mov al, HD_DCR_NIEN
  98.             mov dx, HD_SECONDARY_CTRL_PORT
  99.             out dx, al
  100.  
  101.             mov BYTE [hd_detected], 0
  102.             mov ecx, 0
  103. .Next       mov bx, WORD [hd_val_arr+ecx]
  104.             mov bp, WORD [hd_val_arr+ecx+2]
  105.             mov dx, WORD [hd_val_arr+ecx+4]
  106.             push ecx
  107.             mov cx, dx
  108.             call hd_detect_devtype
  109.             pop ecx
  110.             cmp al, HD_ATADEV_PATA
  111.             jz  .Identify
  112.             add cx, 3*2
  113.             cmp cx, 24
  114.             jnz .Next
  115.             jmp .End
  116. .Identify   mov dx, WORD [hd_val_arr+ecx]
  117.             mov [ata_port_base], dx
  118.             mov dx, WORD [hd_val_arr+ecx+2]
  119.             mov [ata_port_ctrl], dx
  120.             mov dx, WORD [hd_val_arr+ecx+4]
  121.             mov [ata_slave_bit], dl
  122.             call ata_identify
  123.             cmp al, ATA_OK
  124.             jz  .Found
  125.             add cx, 3*2
  126.             cmp cx, 24
  127.             jnz .Next
  128.             jmp .End
  129. .Found      mov BYTE [hd_detected], 1
  130. .End        popad
  131.             ret
  132.  
  133.  
  134. ; Detects SATA drives in AHCI mode only or SATA drives in ATA/PATA legacy mode too?
  135. ; this shouldn't be in hd.asm, because it can detect ATAPI/SATAPI (e.g. CD-ROM) too
  136. ; IN:   BX (portbase), CX (slavebit), BP (portctrl)
  137. ; OUT:  AL (devtype)
  138. hd_detect_devtype:
  139. ;           call ata_reset          ; uses EAX, EDX
  140.             mov al, ATA_CHS_MASTER
  141.             shl cl, 4
  142.             or  al, cl
  143.             mov dx, bx
  144.             add dx, ATA_PORT_DRV_HEAD
  145.             out dx, al
  146.             mov dx, bp
  147.             in al, dx
  148.             in al, dx
  149.             in al, dx
  150.             in al, dx
  151.             ; get the signature bytes
  152.             mov dx, bx
  153.             add dx, ATA_PORT_CYL_LOW
  154.             in al, dx
  155.             mov cl, al
  156.             mov dx, bx
  157.             add dx, ATA_PORT_CYL_HIGH
  158.             in al, dx
  159.             mov ch, al
  160.             xor eax, eax
  161.             cmp cl, 0x14
  162.             jz  .ChkHi14
  163.             cmp cl, 0x69
  164.             jz  .ChkHi69
  165.             cmp cl, 0x0
  166.             jz  .ChkHi0
  167.             cmp cl, 0x3C
  168.             jz  .ChkHi3C
  169.             jmp .Unknown
  170. .ChkHi3C    cmp ch, 0xC3
  171.             jnz .Unknown
  172.             mov al, HD_ATADEV_SATA
  173.             jmp .Back
  174. .ChkHi0     cmp ch, 0x0
  175.             jnz .Unknown
  176.             mov al, HD_ATADEV_PATA
  177.             jmp .Back
  178. .ChkHi69    cmp ch, 0x96
  179.             jnz .Unknown
  180.             mov al, HD_ATADEV_SATAPI
  181.             jmp .Back
  182. .ChkHi14    cmp ch, 0xEB
  183.             jnz .Unknown
  184.             mov al, HD_ATADEV_PATAPI
  185.             jmp .Back
  186. .Unknown    mov al, HD_ATADEV_UNKNOWN
  187. .Back       ret
  188.  
  189.  
  190.  
  191.  
  192.  
  193. %endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement