Konference: Počítač SHARP MZ-800 a emulátory
Od: | Petr Žydek |
Datum: | 25.4.2004 12:09 |
Předmět: | Detailní popis RD Müller 256KB |
Detailní popis RD Müller 256KB: |
Ramdisk Müller 256KB
Tato varianta ramdisku umí prakticky
vše: režim SRAM (porty F8h..FAh), režim
RD pro basic (porty EAh..EBh), v obou
případech se aktuální adresa inkrementuje
po každém čtení/zapsání bajtu. Vždy jen
jedna 64KB stránka je aktivní, je určena
zápisem hodnoty na port E9h (úspěšně
tak funguje v systému LAMAČ CP/M).
Standardní podprogramy pro obsluhu SRAMu
s více jak 64KB paměti nepočítají (taktéž
v basiku), proto není žádoucí, aby při
přetečení adresního ukazatele z FFFFh na
0000h došlo k přenosu do registru stránek.
Obslužný program v basiku či v ROM (pro
práci se SRAM), by pak byl zmaten, protože by
postrádal data naposledy v ramdisku uložená.
Navíc se význam jednotlivých bitů ve stránkovém
registru (port E9h) liší podle jednotlivých
mutací ramdisku, zda se jedná o verzi 256KB,
512KB, 1MB a výše se statickými paměťmi nebo
zda se jedná o můj univerzální koncept se
čtyřmi paticemi pro SIMM 30 pinů (bude
vysvětleno později). Naopak je žádoucí, aby
při resetu adresy ramdisku došlo i k resetu
stránkového registru, funkčnost 64KB podmnožiny
z kapacity ramdisku je tím zajištěna, toto
je u Müllera ošetřeno (týká se Basicu a ROM SRAM
přístupu - nadále nebudu zmiňovat).
Ramdisk má celkem 22 obvodů s čísly U1..U22
(schéma dodám). Obvod U1 74LS245 je obousměrný
třístavový zesilovač, výstupy má trvale otevřené
(pin 19=LOW), směr dat ovládá pin 1 (DIR),
kromě operací čtení z ramdisku je orientován
směrem z MZ800 do periferie (tj. pro operace
zápisu a doby, kdy je ramdisk pasivní).
Hodnoceno dnes bychom řekli, že není nezbytně
nutný, napájí dva čítače pro dolní část adresy
ramdisku a stránkový registr, paměti mají datové
piny třístavové, zátěž není tak hrozná. Navíc
tento obvod v Sharpu existuje, je určen právě
pro posílení datové sběrnice, jejíž vodiče
vystupují na MZ sloty.
Obvody U2..U5 74LS193 jsou binární čítače,
které udržují 16ti bitovou adresu do paměti
ramdisku, po každé operaci čtení/zápisu nejníže
postavený U2 inkrementuje. Při přetečení hodnoty
z 1111 binárně se přičítá jednotka na čítači,
který tvoří vyšší půlbajt v rámci 16ti bitové
adresy ramdisku (pin CO\' z U2 je připojen na
UP z U3, pin CO\' z U3 je připojen na UP z U4 atd.,
toto neplatí pro nejvýše postavený U5). V režimu
SRAM se provádí nulování adresy ramdisku hodnotou
HIGH na všech vstupech 14 (CLR). Předvolba adresy
ramdisku proběhne při "šestnáctibitovém" zápisu
na port EBh, aktivují (hodnota LOW) se při tom
piny 11 (LOAD\'). Piny 4 (DN) se pull up rezistorem
povýší na hodnotu HIGH, aby nedošlo k náhodnému
podnětu k čítání o jedničku dolů (rušivé vlivy).
Na výstupy čítačů lze pohlížet jako na čtyři
čtyřbitové registry, data na nich trvají, dokud
nejsou přepsána. Výstupy z U2 a U3 vedou na osm
vstupů obvodu U8 74LS257, výstupy z U4 a U5
vedou na osm vstupů obvodu U9. Tyto dva
multiplexory zajišťují, aby se 16 bitů adresy
ramdisku objevilo na všech adresních vstupech
pamětí jako dvě osmice po sobě, přepínání se děje
signály A non/B (piny 1 obou 74LS257).
Čítače 74LS193 jsou nezbytné a nenahraditelné
ve všech mutacích ramdisku. Existují sice
osmibitové verze čítačů, mají ovšem společné
vstupy a výstupy a jejich oddělení by znamenalo
další IC na desce ramdisku (=žádná úspora).
Můj favorizovaný 74F269 má sice oddělené vstupy
a výstupy, postrádá ale asynchonní reset, což
ho bohužel diskvalifikuje. Obvody 74LS257 mohou
absentovat v mutacích s paměťmi SRAM, tyto mají
samostatně vyvedené všechny adresní vodiče.
Obvod U6 74LS138 provádí selekci jednotlivých
funkcí ramdisku. Na výstupu Y7 non dává úroveň
LOW, pokud se na adresové sběrnici vyskytne
hodnota v intevalech xxE8h..xxEBh a xxF8..xxFBh.
Je proto doplněn druhým 74LS138 (U7) v kaskádě.
Jeho výstupy se provádějí jednotlivé operace
s ramdiskem (aktivní v nule):
-Y1\' ... zápis bajtu v režimu RD i SRAM,
inkrement adresy (vykonává U16)
-Y2\' ... zápis na port E9h
(výběr stránky ramdisku)
-Y3\' ... zápis na port EB
(předvolba adresy ramdisku)
-Y4\' ... po instrukci in F8h proveden reset
adresy ramdisku (čítače se resetují
hodnotou HIGH, proto výstup Y4\' vede
nejprve na invertor tvořený tranzistorem
Q1 a dvěma rezistory, původní typ
KSY71 dnes zastoupí např. BC238)
-Y5\' ... čtení bajtu v režimu RD, inkrement
adresy (vykonává U16)
-Y6\' ... čtení bajtu v režimu SRAM, inkrement
adresy (vykonává U16)
Poznámka: diody D1,2 fungují jako logický člen
AND, provádění instrukce in EAh totiž
aktivuje výstup Y5\', zatímco provádění
instrukce in F9h aktivuje výstup Y6\';
důsledkem obojího má být čtení bajtu
z ramdisku a provedení inkrementu
adresy (pokud by byly vývody Y5\' a Y6\'
spojeny přímo, hrozil by zkrat mezi
nimi při přechodu jednoho z nich
do hodnoty LOW)
Tyto obvody by bylo možné nahradit jedinou vhodně
naprogramovanou pamětí PROM/EPROM (odpadají
teoreticky všechny pomocné diskrétní prvky).
Paměť ramdisku má 256KB přístupných jako čtyři
jednotlivé stránky po 64KB (osm obvodů 4464:
U10..U15, U18, U19).
Na každé "dvojče" lze pohlížet jako na
"onboard" modul 64KB: do obou pamětí vedou
multiplexní adresové vodiče A0..A7, dvě
čtveřice datových vodičů tvoří dohromady osm
bitů dat, spojeny jsou i vývody OE\' (hodnota
LOW otvírá výstupy pamětí pro čtení) a WE\'
(hodnota LOW se uplatňuje při zápisu).
Nová koncepce se SIMMy 30 pinů počítá se čtyřmi
paticemi osaditelnými vždy shodnými moduly
256KB, 1MB, 4MB; počet osazených patic se může
lišit, lze tak snadno docílit nejrůznějších
kapacit ramdisku: 256, 512, 768KB, 1MB, 2MB,
3MB, 4MB, 8MB, 12MB, 16MB (bude předmětem
vývoje).
Obvod U17 74LS193 slouží jako registr stránky
ramdisku, nevyužívá se jeho schopnost čítání.
Při zápisu na port E9h jsou významné jen
nejnižší dva bity: out E9h=00h, out E9h=04h,
out E9h=FCh, ve všech těchto příkladech je
vybrána nultá stránka ramdisku.
Dva výstupy QA,B obvodu U17 jsou přivedeny
na dva vstupní vývody jedné poloviny
obvodu U20 74LS139. Dvoubitová vstupní
informace (jedna ze čtyř možností: 00b, 01b,
10b, 11b) se objeví jako hodnota LOW na jediném
ze čtyř výstupů Y0\'..Y3\'. Je to jakýsi
"chip select" příslušné stránky ramdisku.
Dynamické paměti ovšem žádný vstup CS\' nemají,
čtení/zápis se ovládá signály OE\' a WE\'. Proto
na obvod U20A navazuje struktura se dvěma
obvody U21 a U22 (osm logických členů OR
ve dvou IC 74LS32). Je-li např. vybrána nultá
stránka ramdisku, pak se hodnota LOW objeví
na jednom ze vstupů dvou hradel OR (piny 1,5
obvodu U21). Následný požadavek na čtení nebo
zápis vystoupí jako hodnota LOW jen piny 3 resp.
6 obvodu U21A. Ostatní paměti (stránky ramdisku)
mají v té době vstupy OE\' i WE\' na hodnotě HIGH.
Tato část ramdisku se liší podle povahy pamětí
(statické/dynamické) a podle celkové kapacity,
na odlišnosti bude poukázáno při popisu
jednotlivých variant.
Obvod U16 74188 je bipolární paměť PROM
s organizací 32x8. Na základě informace
na adresních vodičích A0..A4 vykonává celou
řadu operací s ramdiskem uvedením příslušných
výstupních vývodů (D0..D7) na hodnotu LOW.
Význam vstupů paměti (vše aktivní v nule):
-A0: požadavek na zápis do ramdisku
-A1: požadavek na čtení z ramdisku
-A2: signál procesoru M1\'
-A3: signál procesoru MREQ\'
-A4: zavádí zpětnou vazbu z výstupu paměti D2\'
(vedeno přes druhou polovinu obvodu U20
74LS139, uplatní se při čtení/zápisu)
Význam výstupů paměti:
-D0: signál UP\' pro autoinkrement adresy
-D1: neobsazeno
-D2: signál MUX\' pro multiplexory 74LS257, také
mění hodnotu na vstupu A4
-D3: signál OE\' pro čtení z paměti ramdisku,
filtrován obvody 74LS32
-D4: neobsazeno
-D5: signál RAS\' pro refresh a zavádění adresy
ramdisku
-D6: signál CAS\' pro refresh a zavádění adresy
ramdisku
-D7: signál WE\' pro zápis do paměti ramdisku,
filtrován obvody 74LS32
Obvod 74188 + polovina 74LS139 není zapotřebí
v ramdisku s paměťmi SRAM (nevyžadují
občerstvování - refresh, ani multiplexovanou
adresu). Ve variantě se SIMMy 30 pinů se uplatní
v podstatě shodně jako v popisu výše.
Za výchozí lze považovat stav, kdy je na všech
vstupech PROMky hodnota HIGH (11111 binárně).
Tehdy je na všech výstupech hodnota 11111111b.
Celá paměť obsahuje hodnoty 11111111b kromě
následujících (adresa: data):
01101: 10010010
01110: 00011010
10011: 10011111
10111: 10111111
11011: 10111111
11101: 11010010
11110: 01011010
Funkce PROMky podrobně
Nejprve pár slov o občerstvování dynamických
pamětí (dále jen refresh). Klasický princip
refreshe vypadá takto:
1) CPU nebo jiný pověřený obvod vyšle hodnotu
na A0..A7
2) Krátce je aktivován signál RAS\'
3) Na A0..A7 se objeví hodnota o jedničku větší
než v předchozím případě
4) Krátce je aktivován signál RAS\'
5) Znovu k bodu 2, atd., pořád dokola
Tento (RAS only refresh) princip není možné
uplatnit, protože hodnota na výstupech
z multiplexorů 74LS257 (A0..A7) je statická
(není-li prováděna I/O operace s ramdiskem).
Lze ale výhodně použít princip "CAS before
RAS refresh":
1) CAS\' přejde do LOW
2) CAS\' zůstává LOW, RAS\' přejde do LOW
3) RAS\' i CAS\' přejdou do HIGH
4) Znovu k bodu 1, další refresh cyklus
Celé refreshování spočívá ve správné
manipulaci s oběma signály, "CAS before
RAS refresh" využívá autoinkrement vnitřního
čítače, v tomto případě není nutné
správnou hodnotu na A0..A7 udržovat.
Zvolený způsob funguje bezchybně v originálním
zapojení ramdisku, teoreticky by měl být
bezchybný i v ramdisku se SIMMy.
Příklad:
-mějme modul SIMM 4MB se dvěma paměťmi HYB5117400
(paměti mají organizaci 4Mx4)
-v katalogových údajích součástky stojí:
refresh 2K, 32ms
-jde o to, aby proběhlo 2048 refresh cyklů
do 32 milisekund
-předpokládejme procesor, který vykonává stále
dokola jedinou "dlouhou" instrukci
-instrukce call xxxx by měla trvat 17 taktů,
což při frekvenci CPU 3.5469MHz činí 4.79us
-signál M1\' (který iniciuje refresh cyklus)
tak přejde do LOW každých 4.79us, 2048
cyklů by tedy mělo proběhnout za 9.82ms
-na refreshování by měly reagovat všechny
paměti ve všech modulech SIMM současně,
RAS\' i CAS\' vede z PROM do všech čipů
-je-li tato domněnka správná, je vyhráno,
pokud se jedná o dosažení teoreticky
maximální kapacity ramdisku
Praktická realizace refreshe PROMkou:
-je-li signál M1\' na vstupu A2 LOW,
je adresa PROM 11011b ---> CAS\' přejde
do LOW (data na výstupu PROM jsou 10111111b)
-je-li signál MREQ\' na vstupu A3 LOW,
je adresa PROM 10111b ---> CAS\' přejde
do LOW (data na výstupu PROM jsou 10111111b)
-jsou-li oba signály M1\' a MREQ\' LOW,
je adresa PROM 10011b ---> CAS\' i RAS\' je
LOW (data na výstupu PROM jsou 10011111b)
-signály M1\' a MREQ\' samozřejmě generuje
procesor, PROM je jen vhodně transformuje
Čtení z paměti ramdisku
-vývod A1 PROMky přejde do LOW, adresa
PROM je 11101b
-na výstupech PROMky je 11010010
-sestupnou hranou RAS\' paměť převezme první
část adresy (osm bitů adresy připravených
na výstupech multiplexorů 74LS257), RAS\'
zůstává LOW
-signály UP\', MUX\', OE\' přejdou do LOW
-hodnota LOW se objeví na A4 PROMky
s určitým zpožděním způsobeným průchodem
obvodem U20B 74LS139 (je-li pin 15 G\'
LOW, pak je Y0\' LOW, jelikož oba vstupy
A, B jsou trvale LOW; obvod má jen
funkci "zpožďovače" signálu MUX\')
-přechod signálu MUX\' do LOW způsobí přepnutí
multiplexorů 74LS257, adresa PROMky se změní
na 01101b
-na výstupech PROMky je 10010010
-sestupnou hranou CAS\' paměť převezme druhou
část adresy (druhých osm bitů adresy
připravených na výstupech multiplexorů
74LS257 je-li MUX\' LOW), RAS\' i CAS\'
zůstávají LOW
-na datových vodičích pamětí (aktivní stránky
ramdisku) se objeví platná data
-v poslední fázi vykonávání instrukce procesoru
in F9h (EAh) přejde A1 PROMky do HIGH
-všechny výstupy PROMky přejdou do HIGH,
vzestupnou hranou OE\' (odpovídá RD\' z CPU)
procesor převezme bajt z pamětí ramdisku,
vzestupná hrana UP\' zajistí inkrement adresy
ramdisku, multiplexory 74LS257 přepnou na
prvních osm bitů adresy (A non/B je v HIGH)
-čtení bajtu je ukončeno, ramdisk je pasivní,
na popud M1\' a MREQ\' probíhá jen refresh
Zápis do paměti ramdisku
-postup odpovídá popisu čtení z ramdisku
z předchozího odstavce, je zřejmé, že hodnoty
na vstupech a výstupech PROMky se liší a
aktivní je signál WE\' a nikoliv OE\'
další příspěvky:
-realizace ramdisku s paměťmi SRAM 61512
64KB (64, 256, 512KB, 1MB)
-realizace ramdisku s paměťmi SRAM 512KB
-realizace ramdisku s moduly SIMM až
do celkové kapacity 16MB
Všechny následné návrhy předpokládají
znalost referenčního Müllera 256KB,
ze kterého vychází.
Petr de Zviqov
Ostatní příspěvky vlákna:
[2004/1 (1)] [2004/2 (1)] [2004/4 (33)] [2004/5 (34)] [2004/6 (12)] [2004/7 (1)] [2004/8 (12)] [2004/9 (31)] [2004/10 (52)] [2004/11 (43)] [2004/12 (4)]