Witam.
Muszę zrobić program który bedzie odczytywał dane z dysku twardego za pomocą przerwania 13h.
Naczytałem się sporo o tych ścieżkach, cylindrach i sektorach ale coś mi to nic nie mówi... Jedno co mi się udało to skasować bootsektor na dysku twardym i też wgrać miniprogramik który coś wyświetlał :-) (Lecz to nie jest moim celem). Nie wiem jak pokolei jechać bo tych sektorach na dysku(te cylindry sektory... na co tyle tego), bo bym sobie już poradził z systemem plików fat.
tutaj masz mały opis rozszerzonego 13h, zwykłym raczej nie odczytasz całego dywsku - z prostej przyczyny - ograniczenie rejestrów :P
http://www.ctyme.com/intr/rb-0708.htm
NumHeads, SelectedHead odczytasz z botsektora</url>
ADuch napisał(a)
tutaj masz mały opis rozszerzonego 13h, zwykłym raczej nie odczytasz całego dywsku - z prostej przyczyny - ograniczenie rejestrów :P
http://www.ctyme.com/intr/rb-0708.htm
NumHeads, SelectedHead odczytasz z botsektora</url>
To jak np. systemy operacyjne(dos) "bawią" się całym dyskiem?
Za pomocą portów oraz DMA.
Robie to typu boot+kernel.
Zrobiłem najpierw za pomocą zwyklego 13h tak aby policzyl cylindry na dyskach-żeby mniejwiecej zrozumieć to wszystko.
W wypadku dyskietki przechodziłem pokolei po cylindrach(od 0), gdy napotkałem błąd wychodziłem z pętelki. Tym sposobem odczytałem ile cylindrów jest na dyskietce(80).
Problem właśnie się pojawił z dyskiem bo cylindry adresuje się w 8-bitach. I właśnie o ile dobrze wiem to trzeba to "rozbudowane" [???] .
Z tej stronki zabardzo nie umiałem takiego czegoś napisać.
Znalazłem plik http://my.execpc.com/~geezer/temp/lba.asm z tym że on jest "na" dosa(i nawet działa), wiec przerobiłem go w stylu boot+kernel* i nie działa :/
Zatrzymuje mi się przy "Error for INT 13h AH=42h (LBA disk read)":
lba_ok:
mov di,mbr_msg
call cputs
mov ah,42h
int 13h
mov di,err_msg ;ten komunikat
jc msg
cmp ah,0
jne msg
mov bx,mbr + 446 ; dump the partition table
mov cx,64
call dump
*boot+kernel - znaczy znapisałem wyświetlanie tekstu i coś tam jeszcze a reszta taka sama
Coś sie gdzieś pomyliłem?
Czy to w ten sposób działać nie bedzie?
A jak nie to jak muszę zrobić?
Mam nadzieje że w dobrym kierunku idę :-)
ADuch napisał(a)
Za pomocą portów oraz DMA.
Mógłbym prosić o jakiś przykład?
Szukam na necie no i coś ciężko znaleŹć a co dopiero napisać poprawny kod ;-( ;-(
Np. odczytanie 512B z jakiegos fragmendu tysku.
Oczywiście korzystając z funkcji bios'a bo tylko takie tu pozostają.
Chyba jestem coraz bliżej celu :d
; Reading the harddisk using ports!
; +-------------------------------+ by qark
;
;
; This took me months to get working but I finally managed it.
;
; This code only works for the 286+ so you must detect for 8088's somewhere
; in your code.
;
; Technical Information on the ports:
; Port Read/Write Misc
; ------ ------------ -------------------------------------------------
; 1f0 r/w data register, the bytes are written/read here
; 1f1 r error register (look these values up yourself)
; 1f2 r/w sector count, how many sectors to read/write
; 1f3 r/w sector number, the actual sector wanted
; 1f4 r/w cylinder low, cylinders is 0-1024
; 1f5 r/w cylinder high, this makes up the rest of the 1024
; 1f6 r/w drive/head
; bit 7 = 1
; bit 6 = 0
; bit 5 = 1
; bit 4 = 0 drive 0 select
; = 1 drive 1 select
; bit 3-0 head select bits
; 1f7 r status register
; bit 7 = 1 controller is executing a command
; bit 6 = 1 drive is ready
; bit 5 = 1 write fault
; bit 4 = 1 seek complete
; bit 3 = 1 sector buffer requires servicing
; bit 2 = 1 disk data read corrected
; bit 1 = 1 index - set to 1 each revolution
; bit 0 = 1 previous command ended in an error
; 1f7 w command register
; commands:
; 50h format track
; 20h read sectors with retry
; 21h read sectors without retry
; 22h read long with retry
; 23h read long without retry
; 30h write sectors with retry
; 31h write sectors without retry
; 32h write long with retry
; 33h write long without retry
;
; Most of these should work on even non-IDE hard disks.
; This code is for reading, the code for writing is the next article.
mov dx,1f6h ;Drive and head port
mov al,0a0h ;Drive 0, head 0
out dx,al
mov dx,1f2h ;Sector count port
mov al,1 ;Read one sector
out dx,al
mov dx,1f3h ;Sector number port
mov al,1 ;Read sector one
out dx,al
mov dx,1f4h ;Cylinder low port
mov al,0 ;Cylinder 0
out dx,al
mov dx,1f5h ;Cylinder high port
mov al,0 ;The rest of the cylinder 0
out dx,al
mov dx,1f7h ;Command port
mov al,20h ;Read with retry.
out dx,al
still_going:
in al,dx
test al,8 ;This means the sector buffer requires
;servicing.
jz still_going ;Don't continue until the sector buffer
;is ready.
mov cx,512/2 ;One sector /2
mov di,offset buffer
mov dx,1f0h ;Data port - data comes in and out of here.
rep insw
;.....
;.....
buffer db 512 dup ('A')
(Ze strony http://www.osdev.org/phpBB2/viewtopic.php?t=12268)
Jest tu operacja na portach(i dobrze bo bedzie działać w trybie pmode), lecz adresowanie nadal jest ograniczone(np. cylindry 0-1024) Wiec dyski muszą być nadal malutkie :-[
Bardzo prosze o pomoc ;-( ;-( ;-(
A może mógłbym się dowiedzieć jaka technika odczytu jest dobra na dzisiejsze czasy?
(Tak żebym mógł obsłużyć nawet dyski 512GB).
Proszę o jakiekolwiek namiary... Szukam tego dzień w dzień ;-( ;-( ;-(
doSZEDŁem do tego że dyski steruje się za pomocą LBA.
Powstał nowszy tryb LBA taki jak:
LBA 28-bitowy(dysk do 127GB)
LBA 48-bitowy(chyba do 255TB).
Jak na razie wystarczy mi LBA 28-bitowe :-)
Już przeszukuje źródła linux'a i cieżko mi idzie bo w pizdu kodu jest :-(
Ludzie pomóżcie mi [browar]
http://www.bitzenbytes.com/Content-Arcanum-18-1-53.html
Czyżby o to chodziło ;>
robilem cos takiego ale prymitywnymi sposobami - pod pascalem ;p i to raczej pomagalem sobie w druga strone - latwiej znalezc jakis kod w asm i go przetlumaczyc na pascala. jesli Tobie w druga strone nie sprawi problemu to daj znac na [email protected] przesle zrodla.