Surová data tak, jak byla v roce 2013 stažena z Pandory (HTML zdroj bez úprav, osobní e-mailové adresy jsou maskované).
<!-------------------------------------------------------------->
<!-------------------------------------------------------------->
<table width="100%"><tr><td align="left" valign="middle"><B>Podrobnosti o funkčním FDC s DP8473:</B></td><td align=right valign="middle"></td></tr></table><BR><p><br/>Co jsem měl k dispozici pro testy</p> <p><br/>Celkem 12 řadičů na bázi 8272, z toho:</p> <p>1x s DP8473V (National, PLCC52)<br/>2x s DP8473N (National, DIP48)</p> <p>2x s uPD765A (NEC, přímý ekvivalent 8272)<br/>2x s UM8388 (UMC, zaměřen jen na PC, DIP48)<br/>1x s UM8397 (UMC, do PC XT, DIP48)<br/>3x s GM82C765A (Goldstar, totéž co WD37C65B)<br/>1x s WD37C65B (Western, totéž co Goldstar)</p> <p>Pak mám nějaké vypájené UMC a 37C65<br/>(od WD a SMC, PLCC44).</p> <p><br/>Jak jsem testoval</p> <p>Mechaniku 3.5" jsem napájel z externího<br/>zdroje z PC, standardní "PC kšandou"<br/>jsem ji připojil do příslušného řadiče<br/>a ten připojil do Sharpa mým udělátkem<br/>"Sharp to ISA" (kritizovaným MUDr. Punťou).<br/>Připravil jsem si v monitoru pár primitivních<br/>podprogramů:</p> <p>1000h:<br/>LD,14h<br/>OUT (F2h),A<br/>RET</p> <p>1008h:<br/>LD,00h<br/>OUT (F2h),A<br/>RET</p> <p>1010h:<br/>IN A,(F4h)<br/>CAll 03C3h<br/>RET</p> <p>1018h:<br/>IN A,(F5h)<br/>CAll 03C3h<br/>RET</p> <p>1020h:<br/>LD,03h<br/>OUT (F5h),A<br/>RET</p> <p>1028h:<br/>LD,A0h<br/>OUT (F5h),A<br/>RET</p> <p><br/>1030h:<br/>LD,01h<br/>OUT (F5h),A<br/>RET</p> <p>1040h:<br/>LD,46h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1048h:<br/>LD,00h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1050h:<br/>LD,00h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1058h:<br/>LD,00h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1060h:<br/>LD,01h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1068h:<br/>LD,02h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1070h:<br/>LD,01h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1078h:<br/>LD,01h<br/>OUT (F5h),A<br/>RET<br/>CAll 03C3h</p> <p>1080h:<br/>LD HL,2000h<br/>LD BC,0F5h<br/>LD A,FFh<br/>OUT (F5h),A<br/>108Ah:<br/>IN A,(F4h)<br/>CP F0h<br/>JP NZ,108Ah<br/>INI<br/>JP NZ,108Ah<br/>1096h:<br/>IN A,(F4h)<br/>CP F0h<br/>JP NZ,108Ah<br/>INI<br/>JP NZ,108Ah<br/>RET</p> <p>1000h: vybere mechaniku A:, zapne motor,<br/>deaktivuje softwarový reset řadiče,<br/>zakazuje DMA piny<br/>1008: provede deselekt mechaniky, vypne<br/>motor, drží řadič v softwarovém resetu<br/>1010: přečte hodnotu z portu F4h<br/>(main status register)<br/>1018: přečte hodnotu z portu F5h<br/>(data register, má význam při výsledkové<br/>fázi příkazu čtení dat)<br/>1020h-1030h: pošle řadiči příkaz specify:<br/>03h: kód příkazu<br/>A0h: krokování 6ms, prodleva - motor off 0ms<br/>01h: prodleva - motor on 0ms, non DMA mode!!!<br/>(Tady je v manuálu GM82C765 chyba, v přehledu<br/>příkazu na str. 27 je v tabulce určené pro<br/>bit non DMA nějaký morseovkový paskvil a<br/>v podrobném popisu příkazu na str. 35-36<br/>není ani zmínka)<br/>Vhodnou změnou v instrukcích LD A, xxh<br/>zde lze vykonat příkazy seek a recalibrate<br/>(a tím ověřit vykonání specify), recalibrate<br/>se ovšem posílá jen dvěma bajty, je-li hlava<br/>na 80. stopě, musí se opakovat (pozůstatek<br/>z jednotek 8" se 77 stopami)<br/>U DP8473 drží hodnoty nastavené příkazem<br/>specify i po Hw/Sw resetu<br/>1040h-1078h: pošle řadiči příkaz read data:<br/>46h: multitrack, skip sektor=no; MFM=yes<br/>00h: implied seek=no; head, drive=0<br/>00h: track=0<br/>00h: drive head number=0<br/>01h: sector number=1<br/>02h: number of bytes per sector=2 ---> 512B<br/>(pro Sharp má význam ještě 1 ---> 256B)<br/>01h: end of track sector number=1<br/>(pro čtení jediného sektoru musí mít hodnotu<br/>jako parametr sector number - při čtení v non<br/>DMA režimu)<br/>1Bh: intersector gap length=1Bh<br/>(pro Sharp má význam ještě 20h, stopa 16x256B)<br/>Jednotlivé bajty jsem zprvu posílal sólo<br/>(měření sondou, čtení statusu po každém bajtu),<br/>když se RETy nahradí NOPy, proběhne celá<br/>sekvence najednou s výpisem odesílaných bajtů<br/>(výpis akumulátoru zajistí potřebné prodlevy)</p> <p>1080h: pošle řadiči poslední bajt příkazu<br/>read data<br/>ffh: data length (doporučená hodnota pro<br/>velikost sektoru 256 a 512B)<br/>a vykoná čtení 512ti bajtů 1. sektoru 0. stopy<br/>Čeká na hodnotu statusu F0h:<br/>request for master bit 7=1<br/>data direction bit 6=1<br/>non DMA execution bit 5=1<br/>command in progress bit 4=1</p> <p>Není-li disketa v mechanice nebo čtení<br/>nezapočne, rutina se sekne - ošetření mezních<br/>stavů patří do O.S., při testech mě to<br/>nezajímá.</p> <p>Jak se choval úspěšný DP8473V, jak jsem postupoval</p> <p>1) vložení diskety do mechaniky - zděšení: točí<br/>se motor bez selektu (po Hw resetu!!!)<br/>2)*G1008 (vypne motor, deselekt, Sw reset),<br/>pauza na čaj<br/>3)*G1000 (rozjede mechaniku)<br/>4)*G1010 (vypíše 80h: čeká na příkaz)<br/>5)*G1040 .. G1078 (odešle bajty příkazu řadiče,<br/>průběžné čtení statusu oznamuje 90h: příkaz probíhá)<br/>6)*G1080 (vrátil se na prompt monitoru, malá prodleva;<br/>zjistil jsem, že výchozí nastavení určená příkazem<br/>specify jsou ta nejpomalejší: seek, motor on/off)<br/>7)*G1010 (status hlásí D0h, bit non DMA v nule<br/>oznamuje přechod na výsledkovou fázi)<br/>8)*G1018 (čtení výsledkových bajtů, s i bez<br/>prokládání čtením statusu: D0h):<br/>40h: abnormal termination of command<br/>80h: end of track bit=1<br/>00h: OK<br/>00h: track=0<br/>00h: head=0<br/>01h: sector=1<br/>02h: bytes/sector=2 tj. 512B<br/>9)*G1010 (vypíše 80h: čeká na příkaz)<br/>10)*G1008 (vypne motor, deselekt, Sw reset)</p> <p>Od adresy 2000h je v paměti správně načtený sektor<br/>(z čistého formátu 720ky v PC, ověřeno diskeditem).<br/>Střídal jsem dvě diskety pořád dokola, bez chyby,<br/>ta druhá měla tentýž sektor popsaný vyjmenovanými<br/>slovy jazyka českého (velká ASCII písmena se dají<br/>ověřit v monitoru i v diskeditu v PC). Po 50ti<br/>cyklech jsem toho nechal.</p> <p>Poznatky<br/>je-li po "*G1000" odeslán příkaz specify, prodleva<br/>při čtení sektoru je minimální<br/>hodnota 40h ve výsledkové fázi je OK, nativní<br/>režim řadiče je DMA, konec čtení dat je signalizován<br/>pinem TC=HIGH, tento je zde neaktivní a přenos<br/>je zakončen tím, že je vhodně nastaven bajt<br/>"end of track sector number" v příkazu read data</p> <p>manuál DP8473 str. 16 odst. 2:<br/>"In DMA mode the Read Data command continues to read<br/>until the TC pin is set. This means that the DMA controller<br/>should be programmed to transfer the correct number of<br/>bytes. TC could be controlled by the mP and be asserted<br/>when enough bytes are received. An alternative to these<br/>methods of stopping the Read Data command is to program<br/>the End of Track Sector Number to be the last sector number<br/>that needs to be read. The controller will stop reading<br/>the disk with an error indicating that it tried to access a<br/>sector number beyond the end of the track."</p> <p>manuál k DP8473 taky jediný zmiňuje metodu dotazování<br/>status registru (a ne spolupráci přes IRQ v non DMA režimu,<br/>tak non DMA režim chápou všichni ostatní brouci)<br/>str. 13 ostavec Software polling:<br/>"If the non-DMA mode is selected and interrupts are not<br/>suitable, the mP can poll the Main Status Register during the<br/>Execution Phase to determine when a byte is ready to be<br/>transferred. In the non-DMA mode, bit 7 of the Main Status<br/>Register reflects the state of the interrupt pin. Otherwise,<br/>the data transfer is similar to the Interrupt Mode described<br/>above."</p> <p><br/>Odlišnosti u DP8473N DIP48</p> <p>Výše uvedený postup nezabral, proto jsem si dočasně upravil<br/>podprogram čtení sektoru:<br/>108A:<br/>CALL 03C3h<br/>DJNZ 108A<br/>RET<br/>Poté, co se odešle poslední bajt příkazu read data<br/>se 256x přečte status a skončí.</p> <p>Co načetl: samé 10h tj. příkaz probíhá, non DMA=no<br/>Dodatečný status vypsal D0h tj. zahájení čtení výsledků<br/>a bajty z portu F5 určily:<br/>nedokončený příkaz<br/>"data utekla".</p> <p>Po rozjetí mechaniky proto MUSÍ následovat příkaz specify,<br/>status po zahájení příkazu read data ohlásí:<br/>10h (jedinkrát) příkaz probíhá<br/>30h (mockrát) příkaz probíhá, non DMA execution<br/>F0h (cca 20x) příkaz probíhá, non DMA, čti bajt<br/>D0h (ve fázi result neustále do doby načtení výsledků<br/>z portu F5).</p> <p>Tuto rutinu uplatňuju i u všech ostatních brouků,<br/>zatím se nedaří přečíst stav F0h po zadání read data.</p> <p>Po Hw resetu nebo při pokusu načíst 1.44MB disketu<br/>se čtecí rutina seká, takže komplexní řešení pro (nejen)<br/>DP8473 je:<br/>po rozjetí mechaniky aplikovat příkaz specify,<br/>poslat na port F7h hodnotu 02h (data rate 250kbit/s),<br/>zadat příkaz read data. Pak chodily všechny tři<br/>DP8473x.<br/>Myslím, že se Zilogem >6MHz by prošlo sw čtení<br/>sektoru i na 1.44MB disketě :-))))</p> <p>PDF manuál DP8473 je na:<br/><a href="http://www.mz-800.xf.cz/files/tech/dp8473.pdf">http://www.mz-800.xf.cz/files/tech/dp8473.pdf</a></p> <p>Co jsem nestihl, příště.</p> <p>Petr de Zviqov<br/></p>