Programowanie kontrolera FDC

0

Pytanie jest do ludzi, którzy programowali kiedyś Floppy Disk Controller.

Napisałem kod przeprowadzający całą fazę rozkazu wczytania sektora. Pozycjonowanie głowicy itp.
Po przekazaniu rozkazu wczytania sektora otrzymuje w fazie końcowej następujące bajty:
0x40 0x80 0x00 0x00 0x00 0x1 0x2

Problem polega na tym iż wczytanie się powiodło i dane z pierwszego sektora są w pamięci, a pierwszy bajt wyniku 0x40 informuje o tym iż wykonywanie rozkazu nie powiodło się.

Następne odczyty też wykonują się poprawnie i zwracają ten sam błąd w fazie wynikowej. To, że wszystko działa jakoś mnie nie satysfakcjonuje bo przecież za każdym razem komenda czytania nie wykonuje się poprawnie jak to przedstawia status ST0=0x40.

Czy ma ktoś jakieś doświadczenia z FDC lub tez z tego typu błędem ?
Jeżeli tak to prosze o jakies rady.

0

He he nic bardziej mylnego komenda wykonuje sie porawnie :) - no prawie poprawnie

Oto jak wygladaja maski bitowe posczegolnych bajtow statusu:

St0
bity 7-6
00 - normalne zakonczenie rozkazu
01 - rozpoczeto wykonywanie rozkazu, ale go nie dokonczono
10 - nie podjeto wykonywania rozkazu
11 - przerwano wykonywanie rozkazu przez odpytywanie stanu napedu

bit 5
1 - poszukiwanie sciezki zakonczone prawidlowym pozycjonowaniem glowic
0 - poszukiwanie sciezki trwa

bit 4
jesli 1 to oznacza blad pozycjonowania lub rekalibracji

bit 3
jesli 1 to brak sysgnalu gotowosci napedu

bit 2
aktualnie pracujaca glowica
1 - glowica nr 1
0 - glowica nr 0
bity 1-0
aktualnie wybrany naped
00 - a:
01 - b:
10 - c:
11 - d:

St1
bit 7 Osiagnieto koniec sciezki
bit 6 x (niewykorzystany)
bit 5 Blad sumy kontrolnej Crc1 lub Crc2
bit 4 Przekroczenia limitu czasu oczekiwania na reakcje ze strony procesora, lub DMA
(Chodzi o to ze fdc nie posiada bufora sciezki, i dane musza byc odbierane dostatecznie czesto)
bit 3 x
bit 2 Nie odnaleziono sektora
bit 1 Dyskietka zabezpieczona przed zpaisem
bit 0 Nie odnaleziono metryki adresowej sektora

St2
bit 7 x
bit 6 Podczas odczytu napotkano sektor z metryka adresowa usunietych danych
bit 5 Blad sumy kontrolnej Crc2
bit 4 Niewlasciwy numer sciezki
bit 3 Zgodnosc danych przy porownywaniu
bit 2 Nie odnaleziono zgodnych danych, przy porownywaniu
bit 1 Niewlasciwy numer sciezki
bit 0 Nie znaleziono metryki adresowej sektora

St3
Tu bajty statusowe odzwierciedlajace stan przewodu laczacego FDC - raczej nie przydatne
przy programowniu kontrolera - Bajt ten nie wystepuje w fazie koncowej rozkazow, odczytu/zapisu sektora, a jedynie w fazie koncowej rozkazu SenseDriveStatus. Jesli bedziesz koniecznie chcial to zrobie opis posczegolnych bitow.


To tyle jesli chodzi o bajty statusowe:

Teraz wracajac do odpowiedzi na Twoje pytanie:

W twoim przypadku
ST0 = 0x40 = 00000100 = rozkaz zakonczony poprawnie, aktualna glowica to 1
ST1 = 0x80 = 10000000 = osiagneto koniec sciezki
ST2 = 0 tu nic szczegolnego
CYL = 0
HEAD = 0
SECT = 1
N = 2 = wielkosc sektora 512 bajtow

Nie zgadzaja sie glowice - sprawdz jeszcze raz bajty rozkazu ReadSector, zwlascza 1 i 3 (bajty liczylem poczynajac od 0) HDS powinien byc rowny H w rozkazie.
Wyglada to tak jakbys jako glowice odczytujaca wybral te z numerem 1 a po osiagneciu konca sciezki kontroler zmienil aktywna glowice (strone) na 0

Jesli chodzi o ten "blad" (to czy nalezy rozpatrywac to w kategoriach bledu zalezy od sposobu w jaki odbierasz dane PRZERWANIE/DMA) z osiaganiem konca sciezki, to powodow moze byc kilka:

Jeli odbierasz bajty poprzez przerwanie to pewnie ilosc bajtow ktore chcesz odczytac z FDC ograniczales wlasnie bajtem EOT (End of track - bajt 6 rozkazu liczac od 0) - w takim wypadku "blad" osiagniecia konca sciezki to normalna kolej rzeczy, bo niby jak inaczej mial byc ograniczyc ilosc wysylanych bajtow.

Jesli korzystasz z DMA to wtedy najlepiej ograniczac sobie ilosc wysylanych bajtow licznikiem transmisji kanalu DMA, a w miejsce bajtu EOT zawsze wpisywac 0x12=18 dec. Gdy korzystasz z DMA i dostajesz "blad" osiagnieto koniec sciezki, wtedy jest to informacja ze kanal DMA zostal zaprogramowany aby odczytac wiecej danych niz znajduje sie na sciezce.

To tyle.

A teraz korzystajac z okazji - jesli robisz obsluge FDC przez kanal DMA to wklej mi prosze caly kod dotyczoacy jego programowania. - U mnie nie wiedziec czemu transmisja zawsze zaczyna sie od strony DMA 0xb przesuniecie na stronie 0x0, i to niezaleznie od tego jakimi wartosciami zainicjuje rejestry strony i adresowy - od ponad 2 tygodni nie moge dojsc czemu tak sie dzieje, zreszta zaraz zaloze osobny topic, jesli mozesz to odpowiedz.

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