OSDev

для всех
Текущее время: 14 май 2024, 11:11

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Floppy
СообщениеДобавлено: 08 мар 2010, 15:07 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Написал драйвер флоппи-дисковода. На VM (Qemu) всё работает, а когда гружусь на реальной машине, то ничего не работает. Вот код:
Код:
; Инициализация DMA для дисковода
proc InitDMA stdcall,mode
        xor al, al
        out 0x0C, al
        mov al, 6
        out 0x0A, al
        mov al, byte[.mode] ; 0x46 для чтения, 0x4A для записи
        out 0x0B, al
        xor al, al
        out 0x0C, al
        mov rax, FLOPPY_BUFFER
        out 0x04, al
        shr rax, 8
        out 0x04, al
        shr rax, 8
        out 0x81, al
        xor al, al
        out 0x0C, al
        mov al, -1
        out 0x05, al
        mov al, 1
        out 0x05, al
        mov al, 2
        out 0x0A, al
        ret
endp
; Запись байта в порт данных дисковода
proc FDC_Out stdcall uses rcx rdx,value
        mov rdx, 0x3F4
        mov rcx, 0x10000
@@:
        in al, dx
        and al, 0xC0
        cmp al, 0x80
        je @f
        loop @b
        mov [floppy_status], FLOPPY_STATUS_TIMEOUT
        ret
@@:
        inc rdx
        mov rax, [.value]
        out dx, al
        mov [floppy_status], FLOPPY_STATUS_OK
        ret
endp
; Чтение байта из порта данных дисковода
proc FDC_In stdcall
        mov rdx, 0x3F4
        mov rcx, 0x10000
@@:
        in al, dx
        and al, 0xC0
        cmp al, 0xC0
        je @f
        loop @b
        mov [floppy_status], FLOPPY_STATUS_TIMEOUT
        ret
@@:
        inc rdx
        in al, dx
        movzx rax, al
        mov [floppy_status], FLOPPY_STATUS_OK
        ret
endp
; Включить мотор дисковода
proc FDC_On stdcall uses rdx
        mov [floppy_motor], TRUE
        mov dx, 0x3F2
        out dx, al
        mov rax, 0x1C
        out dx, al
        invoke GetTimer
        mov rbx, rax
        add rbx, 500 / 10
@@:
        invoke GetTimer
        cmp rax, rbx
        jb @b
        add rax, 2000 / 10
        mov [floppy_timeout], rax
        ret
endp
; Отключение мотора дисковода
proc FDC_Off stdcall uses rdx
        mov [floppy_motor], FALSE
        mov rdx, 0x3F2
        mov al, 0x0C
        out dx, al
        ret
endp
; Сброс дисковода
proc FDC_Reset stdcall uses rdx
        mov [floppy_timeout], 0
        mov [floppy_motor], FALSE
        xor rax, rax
        mov rdx, 0x3F2
        out dx, al
        ret
endp
proc FDC_WaitInt stdcall uses rcx
        mov [floppy_status], FLOPPY_STATUS_OK
        mov rcx, 0x100000
@@:
        cmp [fdc_int_flag], FALSE
        jne @f
        loop @b
        mov [floppy_status], FLOPPY_STATUS_TIMEOUT
        ret
@@:
        mov [fdc_int_flag], FALSE
        ret
endp
proc FDC_Recalibrate stdcall
        mov [fdc_int_flag], FALSE
        stdcall FDC_Out,7
        stdcall FDC_Out,0
        stdcall FDC_WaitInt
        ret
endp
proc FDC_IntHandler interrupt uses rax
        mov [fdc_int_flag], TRUE
        mov al, 0x20
        out 0x20, al
        ret
endp
proc FDC_SeekTrack stdcall uses rcx rdx r12 r13 r14 r15,sector
        mov rax, [.sector]
        mov cl, 18
        div cl
        xor r13, r13
        shr al, 1
        adc r13, r13
        mov al, ah
        movzx r12, al
        stdcall FDC_Out,15
        mov rax, r13
        shl rax, 2
        stdcall FDC_Out,rax
        stdcall FDC_Out,r12
        stdcall FDC_WaitInt
        cmp [floppy_status], FLOPPY_STATUS_OK
        jne .exit
        stdcall FDC_Out,8
        stdcall FDC_In
        mov r14, rax
        stdcall FDC_In
        mov r15, rax
        test r14, 100000b
        jz .error
        cmp r15, r12
        jne .error
        shr r14, 2
        and r14, 1
        cmp r14, r13
        jne .error
        mov [floppy_status], FLOPPY_STATUS_OK
.exit:
        ret
.error:
        mov [floppy_status], FLOPPY_STATUS_TRACK_NOT_FOUND
        ret
endp
proc FDC_GetStatus stdcall
        stdcall FDC_In
        mov [fdc_st0], al
        stdcall FDC_In
        mov [fdc_st1], al
        stdcall FDC_In
        mov [fdc_st2], al
        stdcall FDC_In
        mov [fdc_c], al
        stdcall FDC_In
        mov [fdc_h], al
        stdcall FDC_In
        mov [fdc_r], al
        stdcall FDC_In
        mov [fdc_n], al
        ret
endp
proc _FloppyRead stdcall uses rbx rcx rdx rsi rdi r8 r9 r10,sector,buffer
@@:
        cmp [fdc_mutex], FALSE
        jne @b
        mov [fdc_mutex], TRUE
        mov rax, [.sector]
        cmp rax, 2880
        jae .error
        mov cl, 18
        div cl
        xor r9, r9
        shr al, 1
        adc r9, r9
        movzx r10, al
        mov al, ah
        movzx r8, al
        inc r8
        cmp [floppy_motor], FALSE
        jne @f
        stdcall FDC_On
@@:
        stdcall InitDMA,0x46
        stdcall FDC_Out,0xE6
        cmp [floppy_status], FLOPPY_STATUS_OK
        jne .error
        mov rdx, r9
        shl rdx, 2
        stdcall FDC_Out,rdx
        stdcall FDC_Out,r10
        stdcall FDC_Out,r9
        stdcall FDC_Out,r8
        stdcall FDC_Out,2
        stdcall FDC_Out,18
        stdcall FDC_Out,0x1B
        stdcall FDC_Out,0xFF
        stdcall FDC_WaitInt
        cmp [floppy_status], FLOPPY_STATUS_OK
        jne .error
        stdcall FDC_GetStatus
        test [fdc_st0], 11011000b
        jnz .error
        invoke TempMountPage,FLOPPY_BUFFER
        mov rsi, temp_page
        mov rdi, [.buffer]
        mov rcx, 512 / 8
        rep movsq
        mov [floppy_status], FLOPPY_STATUS_OK
        mov [fdc_mutex], FALSE
        mov rax, TRUE
        ret
.error:
        mov [floppy_status], FLOPPY_STATUS_SECTOR_NOT_FOUND
        mov [fdc_mutex], FALSE
        xor rax, rax
        ret
endp
proc FloppyRead stdcall uses rcx,sector,buffer
        mov rcx, 3
@@:
        stdcall _FloppyRead,[.sector],[.buffer]
        test rax, rax
        jnz @f
        stdcall FDC_Recalibrate
        stdcall FDC_SeekTrack,[.sector]
        loop @b
        xor rax, rax
        ret
@@:
        ret
endp
proc _FloppyWrite stdcall uses rbx rcx rdx rsi rdi r8 r9 r10 r11,sector,buffer
@@:
        cmp [fdc_mutex], FALSE
        jne @b
        mov [fdc_mutex], TRUE
        cmp [.sector], 2880
        jae .error
        invoke TempMountPage,FLOPPY_BUFFER
        mov rdi, temp_page
        mov rsi, [.buffer]
        mov rcx, 512 / 8
        rep movsq
        mov rax, [.sector]
        mov cl, 18
        div cl
        xor r9, r9
        shr al, 1
        adc r9, r9
        movzx r10, al
        mov al, ah
        movzx r8, al
        inc r8
        cmp [floppy_motor], FALSE
        jne @f
        stdcall FDC_On
@@:
        stdcall InitDMA,0x4A
        stdcall FDC_Out,0x45
        cmp [floppy_status], FLOPPY_STATUS_OK
        jne .error
        mov rdx, r9
        shl rdx, 2
        stdcall FDC_Out,rdx
        stdcall FDC_Out,r10
        stdcall FDC_Out,r9
        stdcall FDC_Out,r8
        stdcall FDC_Out,2
        stdcall FDC_Out,18
        stdcall FDC_Out,0x1B
        stdcall FDC_Out,0xFF
        stdcall FDC_WaitInt
        cmp [floppy_status], FLOPPY_STATUS_OK
        jne .error
        stdcall FDC_GetStatus
        test [fdc_st0], 11011000b
        jnz .error
        mov [floppy_status], FLOPPY_STATUS_OK
        mov [fdc_mutex], FALSE
        mov rax, TRUE
        ret
.error:
        mov [floppy_status], FLOPPY_STATUS_SECTOR_NOT_FOUND
        mov [fdc_mutex], FALSE
        xor rax, rax
        ret
endp
proc FloppyWrite stdcall uses rcx,sector,buffer
        mov rcx, 3
@@:
        stdcall _FloppyWrite,[.sector],[.buffer]
        test rax, rax
        jnz @f
        stdcall FDC_Recalibrate
        stdcall FDC_SeekTrack,[.sector]
        loop @b
        xor rax, rax
        ret
@@:
        ret
endp                                 

В чём может быть дело? Может я не учёл какие-нибудь особенности реальных флопи-дисководов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 08 мар 2010, 16:08 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Я знаю только, что мотор медленно раскручивается. Попробуй увеличить задержку в 10 раз, это кажется в команде
add rbx, 500 / 10


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 08 мар 2010, 22:17 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Увеличил таймауты. Не помогло. А какие они в существующих системах? Может кто знает из вас?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 08 мар 2010, 23:26 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Вообще, раскрутка мотора может занять пару секунд, отсюда можно определить нужный таймаут. Кроме того, не помню, как в ПКшном контроллере, но вообще флопы могли работать в двух кодировках (FM и MFM -- частотная и модифицированная частотная модуляция, если склероз меня ещё не окончательно победил), и надо указывать правильную в каком-то регистре (на ПК используется только MFM). Рекомендую также на пробу погонять туда-сюда головки, чтобы ухом услышать, а проходит ли выполнение команды вообще. Вот что делать в точности, не скажу: я с флопом напрямую работал ннадцать лет назад, так что уж и не вспомню сходу, что там к чему, а не с ходу -- и лениво, и со временем туго :(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 09 мар 2010, 15:45 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Лампочка дисковода загорается - команды до дисковода доходят. А вот остальных признаков (звуков) работы нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 09 мар 2010, 15:55 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Т.е. FDC_Recalibrate и FDC_SeekTrack пытались вызывать, а они -- ноль внимания, жужжать шаговым двигателем не желают?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 09 мар 2010, 16:32 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Да. Только светодиод на дисководе и всё.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 09 мар 2010, 16:55 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Может, попробуете для начала поработать с флопом в реальном режиме из-под ДОСа, но без БИОС? Там хоть отладчик использовать можно, чтобы смотреть, что к чему, какие значения читаются из регистров, что записывается и т.п. Эмулятор здесь ничем не поможет, поскольку ни один из них не эмулирует полностью корректно периферию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 09 мар 2010, 22:00 

Зарегистрирован: 16 фев 2010, 22:03
Сообщения: 101
Мда... Всё ещё хуже: при обращении к флоппи моя система рушится, хотя у меня есть обработчик GP (уже несколько раз убеждался, что он работает). Qemu, Bochs (на других не пробовал так делать) перезагружаются при некоторых ошибках работы с Floppy. А такого случайно с настоящим ПК не происходит? А то моя ОС даже сообщение не успевает вывести об ошибке...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Floppy
СообщениеДобавлено: 10 мар 2010, 00:18 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Гы :) Это лихо :) В общем, думаю, надо Вам переписать-таки программу работы с флопом под реальный режим, в нём убедиться, что всё работает как должно, и лишь затем возвращаться к 64-разрядному. Кстати говоря, сначала сделать чисто программный обмен данными, без DMA -- последний костыльно сделан, что тоже может служить источником дополнительных ошибок. В общем, наращивать функционал постепенно, убедившись, что ранее сделанное уже работает.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 76


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB