[asm] Poruszanie się po dysku.

0

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.

0

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>

0
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?

0

Za pomocą portów oraz DMA.

0

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ę :-)

0
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ą.

0

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 ;-( ;-( ;-(

0

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ń ;-( ;-( ;-(

0

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]

0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1