Obecný programátorský popis IDE16 chystám
v HTML, s obrázky a komentářem. U datového
portu 78H se využívá skutečnosti, že u
instrukcí s nepřímou adresou
(IN A,(C); OUT (C),A; INI; INIR; OUTI; OTIR)
se posílá obsah B registru na AD8-AD15.
Tento při např. OUTI automaticky dekrementuje
a je oním rozhodovacím elementem při směrování
dat na IDE. Vždycky je třeba přenést SUDÝ počet
bajtů např. při odesílání čtyř bajtů se tyto
přenesou jako dva "dvoubajty":
ld bc,0478H ; počet bajtů, adresa datového portu
ld hl,"odkud" ; adresa bloku dat
outi ; B bylo 04 tj. sudé ... data se zachytí
v registru pro DD0-DD7 IDE
outi ; B bylo 03 tj. liché ... data projdou
registrem pro DD8-DD15 HDD na IDE piny
DD8-DD15, data zachycená v registru pro
DD0-DD7 se ukáží na IDE pinech DD0-DD7
aktivuje se /IOW signál, HDD přijme data-
dva bajty najednou, aniž by tušil, že
první z nich byl připraven předem
outi ; B bylo 02 tj. sudé ... stejné jako B=04h
outi ; B bylo 01 tj. liché ... stejné jako při B=03H
přenos je ukončen
V praxi je blok dat vždy dlouhý 512 bajtů, takže má
smysl transakci zahajovat s nulou v B:
ld hl,"odkud"
ld bc,0078H
vyber aktivní IDE jednotku
iniciuj příslušné registry stopy, sektoru atd.
in 7fH,a ; čti IDE status (event. čekej)
ld a,31H ; příkaz zapsání sektoru
out (7fH),a ; odešli
in (7fH),a ; čti IDE status (event. čekej)
; čeká se na 58H (device ready, data request)
OTIR ; odešle 256 bajtů dat počínaje adresou "odkud"
OTIR ; odešle zbylých 256 bajtů dat, B se před touto
; instrukcí přetočilo znovu k nule a HL je
; o 256 bajtů vyšší (není třeba přenastavovat)
přenos je ukončen
in 7fH,a ; čti status (měl by být 50H=device ready, bez chyb)
Ono se to bez těch obrázků těžko vysvětluje, ale všechno vyplývá
ze schemat a pravdivostních tabulek...
Petr de Zviqov