128 lines
2.1 KiB
PHP
128 lines
2.1 KiB
PHP
;; File: ata.inc
|
|
;;
|
|
;; <ATA PIO Mode at https://wiki.osdev.org/ATA_PIO_Mode>
|
|
;; <IDE spec at https://www.cpcwiki.eu/imgs/a/a2/IDE_SPEC.PDF>
|
|
|
|
ATA_PRIMARY_IO = 0x1F0
|
|
ATA_PRIMARY_IO_CTRL = 0x3F6
|
|
ATA_SECONDARY_IO = 0x170
|
|
ATA_SECONDARY_IO_CTRL = 0x376
|
|
|
|
ATA_DATA = 0x0
|
|
;; Constant: ATA_ERROR
|
|
;;
|
|
ATA_ERROR = 0x1
|
|
ATA_ERROR_AMNF = 0x01
|
|
ATA_ERROR_TKZNF = 0x02
|
|
ATA_ERROR_ABRT = 0x04
|
|
ATA_ERROR_MCR = 0x08
|
|
ATA_ERROR_IDNF = 0x10
|
|
ATA_ERROR_MC = 0x20
|
|
ATA_ERROR_UNC = 0x40
|
|
ATA_ERROR_BBK = 0x80
|
|
|
|
ATA_FEATURES = 0x1
|
|
ATA_SECCOUNT = 0x2
|
|
ATA_SECNUM = 0x3
|
|
ATA_CYLLO = 0x4
|
|
ATA_CYLHI = 0x5
|
|
;; Constant: ATA_DRVHEAD
|
|
;; Drive/Head register
|
|
;;
|
|
ATA_DRVHEAD = 0x6
|
|
ATA_DRVHEAD_DRV = 0x10
|
|
ATA_DRVHEAD_LBA = 0x40
|
|
|
|
ATA_COMMAND = 0x7
|
|
|
|
;; Constant: ATA_STATUS
|
|
;;
|
|
ATA_STATUS = 0x7
|
|
ATA_STATUS_ERR = 0x01
|
|
ATA_STATUS_IDX = 0x02
|
|
ATA_STATUS_CORR = 0x04
|
|
ATA_STATUS_DRQ = 0x08
|
|
ATA_STATUS_SRV = 0x10
|
|
ATA_STATUS_DF = 0x20
|
|
ATA_STATUS_RDY = 0x40
|
|
ATA_STATUS_BSY = 0x80
|
|
|
|
;; Constant: ATA_CTRL
|
|
;; Device control register (Control base + 0)
|
|
ATA_CTRL = 0x0
|
|
ATA_CTRL_nIEN = 0x02
|
|
ATA_CTRL_SRST = 0x04
|
|
ATA_CTRL_HOB = 0x80
|
|
|
|
ATA_DRVADDR = 0x1
|
|
ATA_DRVADDR_DS0 = 0x01
|
|
ATA_DRVADDR_DS1 = 0x02
|
|
ATA_DRVADDR_WTG = 0x40
|
|
|
|
ATA_CMD_RESTORE = 0x10
|
|
ATA_CMD_DIAGNOSTIC = 0x90
|
|
ATA_CMD_IDENTIFY = 0xA0
|
|
|
|
;; Function: ata_wait
|
|
ata_wait:
|
|
mov dx, ATA_PRIMARY_IO + ATA_STATUS
|
|
in al, dx
|
|
and al, ATA_STATUS_BSY
|
|
jnz ata_wait
|
|
ret
|
|
|
|
;; Function: ata_probe
|
|
ata_probe:
|
|
xor ecx, ecx
|
|
.loop:
|
|
call ata_wait
|
|
mov dx, ATA_DRVHEAD
|
|
mov al, cl
|
|
|
|
shl al, 4
|
|
or al, 0xa0
|
|
call ata_wait
|
|
mov dx, ATA_COMMAND
|
|
mov al, ATA_CMD_DIAGNOSTIC
|
|
out dx, al
|
|
call ata_wait
|
|
mov dx, ATA_STATUS
|
|
in al, dx
|
|
and al, ATA_STATUS_ERR or ATA_STATUS_DRQ
|
|
jnz @f
|
|
call ata_wait
|
|
mov dx, ATA_COMMAND
|
|
mov al, ATA_CMD_RESTORE
|
|
out dx, al
|
|
call ata_wait
|
|
mov dx, ATA_STATUS
|
|
in al, dx
|
|
and al, ATA_STATUS_ERR or ATA_STATUS_DRQ
|
|
jnz @f
|
|
push ecx
|
|
push ecx
|
|
mov esi, szMsgAtaFound
|
|
call klog
|
|
pop ecx
|
|
@@:
|
|
inc cl
|
|
cmp cl, 2
|
|
jb .loop
|
|
ret
|
|
|
|
;; Function: ata_init
|
|
ata_init:
|
|
call ata_probe
|
|
ret
|
|
|
|
ata_primary_irq:
|
|
iret
|
|
|
|
ata_secondary_irq:
|
|
iret
|
|
|
|
ata_device:
|
|
db "ata", 0, 0, 0, 0, 0
|
|
dd ata_init
|
|
|
|
szMsgAtaFound db "ATA: hd%u found", 0
|