„No system“ programováníRadim Ballner
V této již čtvrté části našeho seriálu si řekneme základní věci o přerušeních a
jak je lze využívat, dále o audio kanálech a DMA disku. Mnozí z vás jistě ví, že přerušení (interupts) patří mezi výjimky -
EXCECTIONs. Výjimky jsou vlastně programy, které se mají vykonat při nějaké
neobvyklé činnosti mikroprocesoru např. použití privilegované instrukce v USER
módu procesoru, dělení nulou, chyba adresace, chybná instrukce, trasování,
přerušení atd. Každá výjimka má své číslo. Toto číslo určuje vlastně pozici v
tabulce vektorů výjimek. Na této pozici se nachází adresa programu (nebo
chcete-li podprogramu), který se má vykonat pro danou výjimku. Vektorů je celkem
255 a zabírají celkem jeden kilobyte (255*4=1020+4=1024, přičtení čtyřky je z
důvodu výjimky čilo nula - viz dále).
Výjimka s číslem nula odpovídá speciální akci a to je inicializace
mikroprocesorn (např. po zapnutí počítače). Tento vektor je zvláštní tím, že
obsahuje dvě dlouhá slova (LONGy) – ostatní vektory obsahují pouze jeden LONG.
Tyto dva longy obsahují adresu zásobníku a adresu inicializačního programu. U
vyšších mikroprocesorů 680x0 (a to od 68010) existuje registr VBR - Vector Base
Register. Což je třicetidvou bitový registr, který obsahuje adresu začátku
vektorů výjimek. Pokud mikroprocesor nemá VBR, tak se pole vektorů výjimek
nachází na začátku paměti (od adresy 0 ) - na PDéčku je program. který vám
ukáže, jak lze zjisti přítomnost VBR a jak ho přečíst či pozměnit. V dalším
textu budu předpokládat, že VBR=0. Co se stane při vyvolání výjimky
Závisí to samozřejmě na výjimce, která byla vyvolána, ale vždy se provede
toto: Nejprve se uloží stavový registr SR do interního registru, který je jinak
nepřístupný, mikroprocesor se přepne do režimu SUPERVISOR a vynuluje se pole
TRACE (t.j. bity T0 a T1, používá se při trasování -ladění- programů). Potom
mikroprocesor zjistí číslo výjimky. V dalším kroku se uloží momentální stav
mikroprocesoru (při vyjíme nula se neukládá nic, ostatní výjimky ukládají
minimálně stavový registr, čítač instrukcí a offset vektoru na zásobník). Jako
poslední krok se provede předání řízení na adresu, kterou získal mikroprocesor z
tabulky vektoru. Různé typy výjimek navíc ukládají další informace. Teď již
přibližně víme, jak pracuje systém výjimek a můžeme se podívat na vlastní
přerušení. Přerušení je zvláštní typ výjimky a je to vlastně žádost VNĚJŠÍHO
obvodu o pozornost.
Mikroprocesory Motorola 680x0 jsou schopny zpracovávat sedm úrovní přerušení
(jedna až sedm, nula znamená žádné přerušení). Nejvyšší prioritu má přerušení s
číslem sedm. Jednotlivé přerušení lze maskovat t.j. zakázat mikroprocesoru
jejich provedení. Maskování se uskutečňuje pomocí tří bitového pole ve stavovém
registru SR (toto pole je samozřejmě přístupné pouze v režimu supervisor). Pokud
je toto pole nastaveno na nulu, tak se akceptují všechna přerušení, pokud je
nastaveno např. na trojku, tak se akceptují přerušení s prioritou čtyři a výše.
Výsadní postavení má přerušení s prioritou sedm, protože se nedá maskovat (pokud
nastavíte pole Interrupt na sedmičku, tak se mikroprocesor chová stejně, jako by
bylo pole nastaveno na šestku). Toto přerušení se nazývá také NMI - No Mask
Interrupt. Pokud přijde požadavek na přerušení a jeho úroveň je vyšší než
hodnota v Interrupt v SR, tak mikroprocesor počká na dokončení právě probíhající
instrukce a přejde k zpracování přerušení. Nejprve uloží do pole Interrupt v SR
číslo právě přijatého přerušení (čímž zakáže přerušení stejné nebo nižší úrovně)
a postupuje jako při výjimce (uloží SR do pomocného interního registru, nastaví
bit S a vynuluje bity T0 a T1).
Dalším krokem je zjištění vektoru, který obsahuje adresu přerušení. My se zde
budeme zabývat pouze tzv. autovektory přerušení. To znamená, že vektor přerušení
získá mikroprocesor přičtením úrovně přerušení k výjimce 24 (to znamená, že
adresu programu přerušení vybere z adresy (24+úroveň)*4. z toho vyplývá adresu
začátku vektorů pro přerušení na adrese $60. Adresa $60 odpovídá tzv. falešnému
přerušení, které nejde normálně vyvolat, protože se jedná vlastně o úroveň nula.
Toto přerušení se vyvolá dojde-li k chybě na sběrnici během zpracování
přerušení). Pak mikroprocesor uloží m zásobník původní SR, PC (program counter -
který ukazuje na instrukci, která by se provedla, kdyby nedošlo k přerušení) a
offset použitého vektoru. Po zpracování výjimky se musí obnovit běh původního
programu. K tomuto účelu slouží instrukce RTE (ReTurn from Exception). Při
návratu z přerušení se provede toto: ze zásobníku se vyzvedne SR a PC a k
ukazateli na zásobník se přičte osm (což zruší záznam v zásobníku, protože SR má
délku dva byty, PC má délku čtyři byty a offset na vektor přerušení má délku dva
byty = celkem osm bitů).
Doposud jsme se zabývali tím, co dělá mikroprocesor při požadavku na přerušení.
Nyní se podíváme na to, jak dáme mikroprocesoru vědět, že chceme vyvolat
přerušení. Jak již bylo řečeno, přerušení je žádost vnějších obvodů o pozornost.
Nejprve, aby mohlo k přerušení dojít, musíme vnějším obvodům (vnějšími obvody
zde myslíme obvody mimo mikroprocesor např. časovače, DMA řadič atd.) přerušení
povolit. K tomuto účelu slouží registr INTENA (zápis $DFF09A, pro čtení INTENAR
$DFF01C).
Pokud má dojít k přerušení, tak vnější obvod nastaví daný bit v registru pro
požadavek přerušení (t.j. INTREQ $DFF09C zápis a INTREQ $DFF01E čtení) a pokud
je toto přerušení povoleno a není maskováno (pomocí SR mikroprocesoru), tak
dojde k jeho vyvolání. Do registru pro požadavek přerušení INTREQ může zapisovat
i mikroprocesor a tím vyvolat přerušení. Před ukončením přerušení instrukcí RTE
je nutné ještě vynulovat příslušný bit v registru INTREQ, abychom jsme se mohli
vůbec z přerušení vrátit. Pojďme se nyní podívat podrobněji na přerušení VERTB a
SOFT. Přerušení VERTB je generováno při začátku vertical blanku, což je přechod
elektronového paprsku z pravého dolního rohu do levého horního rohu (snímkové
zatemnění). Toto se dá dobře využít, protože změníte-li data, která se mají
zobrazit, právě v této době, tak vše bude probíhat plynule a nebude docházet k
problikávání. Samozřejmě si musíte dávat pozor, aby vaše změny nebyly natolik
časově náročné, aby přesahovaly snímkové zatemnění (pak by docházelo k
problikávání apod.). Zvláštní postavení zaujímá mezi přerušeními SOFT přerušení.
Toto přerušení vyvolá pouze program. Možná se vám to zdá zbytečné, ale zamysleme
se nad použitím tohoto přerušení v copper listu. Zde nám vzniká skvělá možnost,
jak spouštět přerušení na jakémkoliv řádku pomocí copperu. Příklady použití obou
přerušení naleznete na PDéčku. Ještě poznámka k návratu z přerušení.
Používáte-li několik přerušení stejné priority, tak byste si měli zjistit z
registru INTREQR od čeho toto přerušení je a po té vynulovat příslušné bity před
RTE. Neuděláte-li toto, pak se může stát, že se z přerušení nevrátíte. Uveďme
příklad: máme povoleno přerušení SOFT a DSKBLK (obě přerušení priority 1). Pokud
dojde k vyvolání přerušení od DSKBLK a my budeme na konci přerušení nulovat
pouze bit SOFT, tak po instrukci RTE dojde opět k vyvolání přerušení od DSKBLK
(protože stále trvá požadavek) a my se zde zacyklíme. AUDIO kanály
Amiga má čtyři audio kanály. Každý z nich lze ovládat samostatně a každý má
vlastní DMA kanál. Přenos dat z paměti lze zase dělat buď mikroprocesorem, nebo
pomocí DMA kanálu. My si zde ukážeme, jak se dá přehrát jednoduchý sampl pomocí
DMA. Jako u každého DMA přenosu i zde musíme určit odkud se mají data přenášet.
K tomuto účelu slouží těchto osm registrů (jeden kanál má dva registry - podobně
tomu bylo u bitplanů):
AUD0LCH a AUD0LCL ($DFF0A0 a $DFF0A2) - adresa umístnění kanálu 0
AUD1LCH a AUD1LCL ($DFF0B0 a $DFF0B2) - adresa umístnění kanálu 1
AUD2LCH a AUD2LCL ($DFF0C0 a $DFF0C2) - adresa umístnění kanálu 2
AUD3LCH u AUD3LCL ($DFF0D0 a $DFF0D2) - adresa umístnění kanálu 3
Dále je potřeba určit délku přenášených dat. Tato délka se určuje ve wordech (to
znamená počet wordů, 1 word = 2 byty). Tuto délku zapíšeme do příslušného
registru pro daný kanál. Jsou to tyto registry:
AUD0LEN ($DFF0A4) - délka samplu pro kanál 0 (ve wordech)
AUD1LEN ($DFF0B4) - délka samplu pro kanál 1 (ve wordech)
AUD2LEN ($DFF0C4) - délka samplu pro kanál 2 (ve wordech)
AUD3LEN ($DFF0D4) - délka samplu pro kanál 3 (ve wordech)
Jako další musíme určit, jak rychle se mají data z paměti přenášet. To je musíme
určit periodu (což je převrácená hodnota frekvence). Minimální číslo, které
můžeme do registru zapsat je 124 (omezení je dáno rychlostí hardwaru a
rozdělením cyklů přístupu do paměti). Periodu zapisujeme do těchto registrů:
AUD0PER ($DFF0A6) - perioda pro kanál 0
AUD1PER ($DFF0B6) - perioda pro kanál 1
AUD2PER ($DFF0C6) - perioda pro kanál 2
AUD3PER ($DFF0D6) - perioda pro kanál 3
Poté zbývá určit jen hlasitost. Což provedeme zápisem do registrů pro hlasitost.
Jsou to:
AUD0VOL ($DFF0A8) - hlasitost pro kanál 0
AUD1VOL ($DFF0B8) - hlasitost pro kanál 1
AUD2VOL ($DFF0C8) - hlasitost pro kanál 2
AUD3VOL ($DFF0D8) - hlasitost pro kanál 3
Maximální číslo, které určuje maximální hlasitost je 64. To znamená, že bity
15-7 jsou nevyužity. Nyní už jen stačí povolit DMA příslušného AUDIO kanálu a
sampl se začne přehrávat. Pokud je celý sampl přehrán (AUDxLEN se stále snižuje
až do nuly), pak se záložních registrů obnoví AUDxLEN a AUDxLC a sampl se začne
přehrávat znovu od začátku. Zajímavým registrem je registr ADKCON. Tento registr
slouží k ovládání zvukového hardware a diskového hardwaru: ADKCON $DFF09E zápis, ADKCONR $dff010 čtení
bit |
jméno |
funkce |
15 |
SET/CLR |
bity s hodnotou jedna nastavit/nulovat |
14 |
PRECOMP0 |
vyšší bit předkompenzace pro MFM 00 |
13 |
PRECOMP1 |
nižší bit předkompenzace pro MFM 00 |
12 |
MFMPREC |
0=GCR/1=MFM kódovaní dat |
11 |
UARTBRK |
UART BREAK - TXD =0; signál pro RS-232 |
10 |
WORDSYNC |
povolení synchronizace a spuštění DMA |
9 |
MSBSYNC |
povolení synchronizace na nejvyšší bit (pro GCR) |
8 |
FAST |
1= 2 us na bit (MFM), 0= 4 us na bit (GCR) |
7 |
USE3PN |
použij 3. kanál k modulaci periody ničeho |
6 |
USE2P3 |
použij 2. kanál k modulaci periody 3. kanálu |
5 |
USE1P2 |
použij 1. kanál k modulaci periody 2. kanálu |
4 |
USE0P1 |
použij 0. kanál k modulaci periody 1. kanálu |
3 |
USE3VN |
použij 3. kanál k modulaci hlasitosti ničeho |
2 |
USE2V3 |
použij 2. kanál k modulaci hlasitosti 3. kanálu |
1 |
USE1V2 |
použij 1. kanál k modulaci hlasitosti 2. kanálu |
0 |
USE0V1 |
použij 0. kanál k modulaci hlasitosti 1. kanálu |
FLOPPY DISK
Než se pustíme do vlastního popisu hardwarových registrů Amigy, tak si
řekneme něco obecného o disketách. Disketa je rozdělena na soustředná mezikruží
- zvané stopy (angl. track). Tyto stopy se nacházejí na obou stranách diskety.
Vždy dvě stopy proti sobě (nahoře a dole) tvoří cylindr. V mechanice se disketa
otáčí a čtecí/zápisová hlava je nad stopou ze které chceme data číst/zapisovat.
A protože má disketa dvě strany (a aby nebylo nutné disketu otáčet) má mechanika
dvě čtecí/zápisové hlavy (pro každý povrch jednu). Hlavičky jsou poháněny jedním
krokovým motorkem a jsou tedy vždy nad stejnou stopou - jejich polohu lze tedy
určit cylindrem. Amiga DOS formátuje disketu na 80 cylindrů (0-79, nultá stopa
se nachází na vnějším okraji diskety) to je tedy 160 stop. Liché stopy jsou
umístněné na spodní straně diskety a sudé na horní. Každá stopa je rozdělena na
sektory (u Amiga DOS je to na jedenáct) a každý sektor obsahuje 512 bytů dat. Z
toho vyplývá kapacita diskety 160 stop * 11 sektorů * 512 bytů = 901 120 bytů =
880 kbytů. V praxi se častěji setkáváme s pojmem blok než sektor/stopa/strana.
Blokům můžeme také jinak říkat logické sektory. Jedná se v podstatě o to, že
každému místu určenému sektorem/stopou/stranou přiřadíme jedno číslo - tj. číslo
bloku. Tím získáme rozsah 0 až 1759. Ve skutečnosti nejsou na stopě umístněny
pouze sektory obsahující data. Každý sektor obsahuje kromě dat také informace o
sektoru (synchronizační značka, číslo stopy, číslo bloku, dav kontrolní součty -
uložených dat a informací o sektoru). Navíc je ještě na stopě umístněna
nevyužitá mezera. Je to z důvodů bezpečnosti dat (protože stopa je kruhová a
navíc na stopu nepadne přesně daný počet sektorů). Tato mezera bývá zhruba 696
bytů dlouhá.
Nyní se dostáváme k problému zápisu/čtení dat na/z diskety. Není možné data
umístnit na disketu přímo tak, jak jsou. Toto vyplývá z principu uložení dat na
magnetickém povrchu disku. Data se na médium zaznamenávají změnou magnetizace
tzv. magnetickou reversací. Změna magnetizace znamená jedničku, nezměněná
znamená nulu. Z toho plyne problém, protože v případě, kdy za sebou následuje
hodně nul, se nemění magnetizace a řadič diskety vypadne ze synchronizace
(vlivem fluktuací v otáčkách). Kromě tohoto problému je také nutné zajistit, aby
řadič poznal, kde data začínají. Proto se před data klade synchronizační značka
(je sestavena z takové posloupnosti 0 a 1, která se nemůže v zakódovaných datech
vyskytovat). Z předchozího vyplývá, že se data musí zakódovat. Amiga má možnost
volby mezi MFM kódováním a GCR kódováním. Amiga DOS používá MFM kódováni a proto
se na něj podíváme. MFM je zkratka pro Modified Frequency Modulation tj. záznam
pomocí modifikované frekvenční modulace. Podstata spočívá v tom, že se za každý
datový bit vloží jeden hodinový bit, což není z paměťového hlediska moc
efektivní (počet zapsaných bitů se zdvojnásobí). Hodnota hodinového bitu se určí
celkem jednoduše: následují-li dva nulové bity za sebou, pak vložený hodinový
bit bude jedničkový, jinak bude nulový. Uveďme si příklad:
data, která chceme vložit:
1 0 1 1 0 0 0 1 1 0 0 0 0 1 0 1
hodinové bity:
0 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0
výsledná posloupnost:
01000101001010010100101010010001
Toto kódováni zabraňuje výskytu větší skupiny nulových bitů za sebou a zároveň
výskytu dvou nebo více jedniček za sebou, což je důležité pro řadič (aby stihl
zaznamenat rychlé změny magnetizace). Pokud zakódujeme data pomocí MFM, tak
nikdy nedostaneme např. posloupnost $4489 (binárně 0100010010001001). Tuto
posloupnost používá DOS jako synchronizační značku. Nyní se již můžeme podívat
na to, jak vlastně obsluhovat mechaniku přímo.
Výběr jednotky, řízení a detekce - disketová jednotka má přiřazeny dva 8520
porty plus jeden bit portu na řízení přerušení. Brána CIA A (na adrese $BFE001)
je vstupní a brána CIA B (na adrese $BFE000) je výstupní. Pomocí těchto bran
vybereme jednotku, zjistíme, zda-li se nachází hlavičky nad stopou nula atd.
Význam jednotlivých bitů je zřejmý z tabulek. Jen poznámka ke krokování motorku.
Před každou operací byste si měli najet nad stopu nula a pak si udělat
počitadlo, kde si budete pamatovat nad kterou stopou se nacházíte.
Dalšími registry jsou registry pro řízení DMA. Opět musíme určit, kde v paměti
máme data (v případě zápisu na disk), nebo kam chceme data dát (v případě čtení
z disku). DSKPTH a DSKPTL ($DFF020, $DFF022) - určení odkud/kam má DMA
zapisovat/číst. Dalším registrem je registr DSKLEN ($DEF024), který obsahuje
informace o délce přenášených dat, směru přenosu a povolení DMA (DMA musí být
povoleno v DSKLEN i v DMACON!). DSKLEN $DFF024
bit |
jméno |
funkce |
15 |
DMAEN |
povolení DMA disku |
14 |
WRITE |
1 = z RAM na DISK |
13-0 |
LENGHT |
počet přesouvaných slov (to znamená ve wordech) |
Aby DMA disku pracovalo musíte nastavit bit DMAEN v DSKLEN dvakrát (toto je
kvůli bezpečnosti). Průběh zápisu do DMA registrů by mohl vypadat přibližně
takto:
1. zákaz DMA ($4000 do DSKLEN)
2. uložit požadovanou hodnotu do DSKLEN
3. uložit znovu požadovanou hodnotu do DSKLEN
4. po skončení přenosu nastavit DSKLEN opět na $4000
Při konstrukci hardwaru vznikla chyba, která způsobuje že při zápisu na disketu
se ztrácejí poslední tři přenášené bity a při čtení z diskety se poslední slovo
nepřenese (je tedy nutné přenášet o slovo navíc). Registr DSKBYTR ($DFF01A)
slouží jako vyrovnávací paměť pro přenos mikroprocesor-disk. Při čtení z diskety
jsou data z diskety posílána po bytech do tohoto registru. Po každém přenosu se
nastaví bit BYTEREADY (bit se vynuluje přečtením DSKBYTR). Tento registr se
používá obvykle pro synchronizaci, než se předá řízení DMA.
Elegantně se dá synchronizace vyřešit pomocí DMA a registru DSKSYNC ($DFF07E).
Pokud je nastaven bit WORDSYNC v registru ADKCON ($DFF09E), nenastane přenos až
do doby, kdy je nalezeno slovo shodné se slovem v registru DSKSYNC (navíc dojde
nezávisle na nastavení WORDSYNC k nastavení bitu DSKSYNC v registru INTREQ - což
může způsobit přerušení úrovně 6). Přehled výjimek
vektor |
adresa |
obsah |
0 |
$0000 |
ukazatel na zásobník po inicializaci |
(1) |
$0004 |
adresa na inicializační program |
2 |
$0008 |
chyba sběrnice |
3 |
$000C |
lichá adresa |
4 |
$0010 |
neexistující instrukce |
5 |
$0014 |
dělení nulou |
6 |
$0018 |
instrukce CHK s CHK2 (test mezí) |
7 |
$001C |
instrukce TRAPV,TRAPcc a cpTRAPcc |
8 |
$0020 |
privilegovaná instrukce |
9 |
$0024 |
trasování |
10 |
$0028 |
instrukce LineA |
11 |
$002C |
instrukce LineF |
12 |
$0030 |
rezervováno |
13 |
$0034 |
chybná komunikace s koprocesorem |
14 |
$0038 |
chybný formát pro RTE nebo cpRESTORE |
15 |
$003C |
neinicializovaný vektor |
16-23 |
$0040 |
rezervováno |
24 |
$0060 |
falešné přerušení |
25-31 |
$0064 |
autovektory přerušení 1-7 |
32-47 |
$0080 |
instrukce TRAP #0-15 |
48-55 |
$00C0 |
rezervováno (aritmetický koprocesor) |
56 |
$00E0 |
chybná konfigurace jednotky řízení paměti |
57-63 |
$00E4 |
rezervováno |
64-255 |
$0100 |
rezervováno pro uživatele |
Poznámka: tento přehled výjimek je pro mikroprocesor Motorola 68030, takže
pro nižší verze řady 680x0 některé vektory nemají význam, jinak je samozřejmě
tabulka kompatibilní. Povolení přerušení
INTENA $DFF09A zápis, INTENAR $DFF01C čteni
bit |
jméno |
úroveň |
popis |
15 |
SET/CLR |
|
bity s hodnotou jedna nastavit/nulovat |
14 |
INTEN |
|
povolení všech přerušení |
13 |
EXTER |
6 |
externí přerušení (CIAB) |
12 |
DSKSYN |
5 |
přečtena synchronizační data |
11 |
RBF |
5 |
přijímací buffer sériového portu plný |
10 |
AUD3 |
4 |
audio kanál 3 dokončil přenos bloku |
9 |
AUD2 |
4 |
audio kanál 2 dokončil přenos bloku |
8 |
AUD1 |
4 |
audio kanál 1 dokončil přenos bloku |
7 |
AUD0 |
4 |
audio kanál 0 dokončil přenos bloku |
6 |
BLIT |
3 |
blitter dokončil práci |
5 |
VERTB |
3 |
začal Vertical Blank (přechod el. paprsku) |
4 |
COPER |
3 |
přerušení od copperu |
3 |
PORTS |
2 |
přerušení od I/O portů a časovačů (CIAA) |
2 |
SOFT |
1 |
softwarově vyvolané přerušení |
1 |
DSKBLK |
1 |
přenos diskového bloku ukončen |
0 |
TBE |
1 |
přenosový buffer sériového portu je prázdný |
Žádost o přerušení
INTREQ $DFF09C zápis, INTREQR $DFF07E čteni
INTREQ $DFF09C zápis, INTREQR $DFF07E čteni |
bit |
jméno |
úroveň |
popis |
15 |
SET/CLR |
|
bity s hodnotou jedna nastavit/nulovat |
14 |
- |
|
|
13 |
EXTER |
8 |
externí přerušeni (CIAB) |
12 |
DSKSYN |
5 |
přečtena synchronizační data |
11 |
RBF |
5 |
přijímací buffer sériového portu plný |
10 |
AUD3 |
4 |
audio kanál 3 dokončil přenos bloku |
9 |
AUD2 |
4 |
audio kanál 2 dokončil přenos bloku |
8 |
AUD1 |
4 |
audio kanál 1 dokončil přenos bloku |
7 |
AUD0 |
4 |
audio kanál 0 dokončil přenos bloku |
6 |
BLIT |
3 |
blitter dokončil práci |
5 |
VERTB |
3 |
začal VERTical Blank (přechod el. paprsku) |
4 |
COPER |
3 |
přerušení od copperu |
3 |
PORTS |
2 |
přerušení od I/O portů a časovačů (CIAA) |
2 |
SOFT |
1 |
softwarově vyvolané přerušení |
1 |
DSKBLK |
1 |
přenos diskového bloku ukončen |
0 |
TBE |
1 |
přenosový buffer sériového portu je prázdný |
DSKBYTR $DFF01A
bit |
jméno |
funkce |
15 |
BYTEREADY |
registr obsahuje platná data |
14 |
DMAON DMA |
je povoleno (nastaveny bity v DMACON a DSKLEN) |
13 |
DISKWRITE |
povolen zápis (nastaven bit WRITE v DSKLEN) |
12 |
WORDEQUAL |
obsah DISKSYNC se rovná sekvenci bito čtených z diskety
(nastaveno pokud se sekvence rovná t.j. asi 2us) |
11-8 |
|
nevyužito |
7-0 |
|
jeden byte dat |
CIA A
bit |
jméno |
funkce |
_5 |
DSKRDY |
disketa připravena |
_4 |
DSKTRACK0 |
hlavičky jsou právě na stopou nula |
_3 |
GSKPROT |
disketa je chráněna proti zápisu |
_2 |
DSKCHANGE |
disketa vyjmuta z jednotky (aktivní až do posunu hlav) |
CIA B
bit |
jméno |
funkce |
_7 |
DSKMOTOR |
každá jednotka si zapamatuje stav tohoto signálu v okamžiku sestupné
hrany signálu DSKSELx a řídí se jím běh motoru až do další sestupné hrany
DSKSELx |
_6 |
DSKSEL3 |
vybere jednotku 3 |
_5 |
DSKSEL2 |
vybere jednotku 2 |
_4 |
DSKSEL1 |
vybere jednotku 1 |
_3 |
DSKSEL0 |
vybere jednotku 0 |
_2 |
DSKSIDE |
0 = horní hlava,1 = dolní hlava |
_1 |
DSKDIREC |
směr pohybu hlav, 0 = směr do středu |
_0 |
DSKSTEP |
krokování motorku; měl by se používat jako impuls; nastavit nejdříve do
0 a pak hned zpět do 1 |
CIA B ($BFDD00)
bit |
jméno |
funkce |
_4 |
FLAG |
impuls Indexu (generace přerušení úrovně šest) |
Poznámka: bity značené _ jsou aktivní v NULE. |
Vytlačiť článok
Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.
Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing
none
|