Я пишу ОСь. Пока, что 16-битная. Седня такая проблема возникла. Я ж офигел... Проблема со 2-ой функцие 13-того прерывания биоса, которая читает сектор. Чо-то у нее не получается... На вход я подал: DL = 0 (номер диска) DH =1 (номер головки) CH =0 (номер дорожки) CL =13(номер сектора) AL =03(число секторов) ES:BX=500(адрес буфера вызывающей программы) ES =0 Проблема в том, что эти 3 сектора не читаются! При чем, проблема не в кривой дискете( я читал и с нее, и с файла на винте). Вмварь, боршь и мой комп не может выплнить нормально эту функцию. Кери флаг устанавливается. Пытаюсь прочитать три раза - безуспешно. Если кто-то знает, какие параметры я передал не правильно, подскажите, плиз
AL - число секторов больше 0. AH = 02h CH - номер цилиндра CL - номер начального сектора DL - номер дисковода (00h-7fh гибкий диск, 80h-0ffh жесткий диск) Остальное верно, только es на сегмент данных должен указывать.. Примечание: При использовании жестких дисков, старшие 2 бита 10-разрядного номера цилиндра помещаются в старшие два бита регистра CL (инф. из книги Кулакова)
Ну это понятно, я вообще-то все тоже самое написал. es узказывает на сегмент данных. С этим проблем нет.
3n3m1 в таких случаях обычно берутся параметры, при которых функция работает, и по-очереди заменяются на те, с которыми она работает отказывается. таким образом локализуется параметр, из-за которого возникают проблемы. это раз. во-вторых, функции кроме признака возвращают еще и код ошибки. можно поглядеть, что в нем вернулось. ну и наконец можно самому придумать какой-нибудь способ, позволяющий выяснить в чем дело. не обязательно так сразу лезть на форум и спрашивать всякую чушь.. по теме: 1. CL=13 в hex или в dec'е? на стандартной 3.5" дискете всего 12h секторов 2. ES=0, BX=500 - если 500h, то подозрительно близко к BDA, ты наверняка что-нибудь затираешь, если просто 500 - затираешь таблицу векторов 3. дискета элементарно не битая? ps: 20h - попробуй перенести буфер в нормальную область
Я понимаю, что форум предназначен не для этого поэтому по всякой фигне не обращаюсь - это первый раз, и то, потому, что, как мне казалось, слишком это бредово, что функция биоса не пашет. Сори, я очень не внимательный, в хексе, только что тоже об этом подумал, большое спасибо . Я точно ничего не затираю 0x500-0x9FFFF - свободная область памяти. Я ж сказал, что тестил в основном образ дискеты, когда ни борщ ни вмварь меня не удавлетворили, я решил загрузить свою тачку с дискеты. Кстати, у меня была проблема: борщь воспринимает этот параметр, как синоним к 1, незнаю почему, но разработчики борща ничо до сих пор с этим не сделали...
Если с дискеты читаются несколько секторов за раз, все они должны быть на одной дорожке. А у тебя один сектор лежит в конце первой дорожки, а два других - в начале следующей.
Похожая тема была http://www.wasm.ru/forum/viewtopic.php?id=19660 Также на некоторых BIOS и дисководах бывает, что при первом чтении/записи на дискету не успевает раскрутиться мотор. Поэтому при ошибке можно попробовать ещё раз.
3n3m1 привет! я тоже пишу ОС, начал по приколу, когда нефиг делать %) скинь мне в аську 331445922 или на електронку lega@allforums.org.ua я эту тему тебе в принципе расскажу, поделимся опытом и идеями, кодами инфой и т.д ! буду рад !