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