Przerwanie do obsługi dysków

0

Próbuję, przy użyciu następującego kodu uruchamianego z dyskietki, wczytać pierwsze kilkadziesiąt kilobajtów tego flopa do pamięci. Naskrobałem więc następujący kod:

PUSH  ES
MOV   AH,2
MOV   DL,DRIVENUM
MOV   DH,0
MOV   CH,0
MOV   CL,2
MOV   AL,SYSTEMSIZE; czyli 64
MOV   ESI,07E0h ;segment BOOT + 200h bajtów
MOV   ES,ESI
MOV   BX,0
INT   13H
POP   ES

niestety - na VmWare działa to dobrze, ale po uruchomieniu z "normalnego" kompa do pamięci leci tylko pierwsze kilka kilobajtów (jakieś 9) i przerwanie zwraca błąd - co może być źle?

0

http://www.ctyme.com/intr/rb-0607.htm:

Notes: Errors on a floppy may be due to the motor failing to spin up quickly enough; the read should be retried at least three times, resetting the disk with AH=00h between attempts.

Moze pomoze.

0

niestety - nawet po 16 kolejnych próbach wczytania są problemy

0

Hmm, to sie w ogole skompilowalo?

MOV   ES,ESI

esi jest 32 bitowy, segmenty 16.

Swojego czasu kod w http://4programmers.net/Z_pogranicza/Artykuły/Pisanie_systemów_operacyjnych_-_tryb_rzeczywisty dzialal dobrze, moze skorzystasz :)

0

tak - ale skompilowane jako mov ES, SI. Tak naprawdę, rejestry segmentowe są 32-bitowe, ale maskowane do 16 bitów.

Poza tym: na x86-64 (specyfikacja na www.amd.com) są one nawet 64-bitowe :)

0

A w AH nic ci ciekawego nie zwraca? (http://www.ctyme.com/intr/rb-0606.htm#Table234)

BTW, swoje posty mozesz usuwac sam ;]

0

AH=0, CF=NC

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