Press "Enter" to skip to content

Úprava QL na 640k

Pohľad na moju zatiaľ nerealizovanú koncepciu.

Dnes to bude opäť veľmi dlhý článok, v ktorom by som rád vysvetlil moju teóriu okolo úpravy Sinclaira QL na 640k RAM. Problém je v tom, že ani v ZX kompatibilnom hardvéri sa necítim veľmi doma, nieto ešte v QL. Je to pre mňa čosi úplne nové. Preto som sa rozhodol o úprave napísať ešte pred jej realizáciou a dúfam, že sa tu nájde nejaká dobrá duša, ktorá tomu rozumie viac ako ja a odhalí prípadné medzery v mojej teórii. Budem sa snažiť ju podať čo najpopulárnejším spôsobom, aby si z článku niečo odniesli aj úplní laici.

Ako prvý krok k vyrobeniu úpravy je potrebné aspoň čiastočné zorientovanie sa v architektúre QLka. Nezaujíma nás všetko do bodky, stačí nám porozumieť ako funguje mechanizmus okolo pamäte. Ako prvé k tomu potrebujeme pochopiť ako funguje procesor, aspoň na základnej úrovni a v oblasti ktorá nás zaujíma. Vďaka procesoru Motorola je filozofia čriev QLka trocha odlišná od toho, na čo som bol zvyknutý zo strojov založených na Z80CPU. Pri pohľade na pinout CPU68008 síce nájdete klasické adresné a dátové piny, tu sa ale podobnosť so Z80 končí. CPU68008 je proste rozdielna architektúra a konkrétne tento typ je navyše podivný lowcostový hybrid – dátová zbernica je 8-bit, adresne sa navonok tvári ako 16-bit, vnútorne je to 32bit. Nezostávalo nič iné, ako prečítať si datasheet, pretože bez toho by som sa s úpravou nepohol.

CPU68008 ovláda zbernice trocha inak ako Z80 a od toho sa to celé odvíja. Signály zodpovedné za správu zberníc 68008 sú /AS, /DS, R_W, /DTACK, /BR a /BG. Nás budú zaujímať len prvé štyri a hneď ich aj vysvetlím:

AS – addres strobe je v podstate indikátor platnosti adresy. Procesor tým oznamuje, že adresa nastavená na zbernici je platná a môže sa použiť.

R_W – podľa stavu nastavuje smer toku dát. Keď je tento signál v stave H, nasleduje čítací cyklus. Keď je v stave L, nasleduje zapisovací cyklus.

DS – data strobe spustí cyklus nastavený signálom R_W. Kým je v stave H, data na zbernici sa považujú za neplatné (ale adresa platí). Keď je v stave L, procesor podľa stavu R_W buď prečíta, alebo zapíše data na zbernicu.

No a posledný pre nás zaujímavý signál je /DTACK. Je to vstupný signál a procesor na ňom očakáva “potvrdenku”, že dáta na zbernici ním ponúkané, alebo požadované, boli spracované a následne ukončí platnosť aktuálneho cyklu, či už bol čítací, alebo zapisovací.

Najväčsí rozdiel oproti ZXS je teda v asynchrónnom spôsobe narábania so zbernicami. Ako druhý krok sa pozrieme na organizáciu pamäte. Nemám po ruke nejaký rozumný obrázok, tak vám musí stačiť popis. Celých spodných 64k je vyhradených pre ROM, z toho 48k zaberá interná časť a 16k je vyhradených pre prípadnú externú ROM. Ďalších 64k je vyhradených pre porty, z toho 16k pre interné a 48k pre externé. Nasleduje 128k RAM, kde spodná polovica sú VRAM, horná polovica je klasická operačná pamäť. Potom nasleduje 512k priestor, vyhradený pre externú RAM, ktorý zaujíma nás. Nakonci je ešte priestor vyhradený pre ROM periférií. Mapa pamäte je týmto jasná a môžeme sa zamerať na tú našu časť, teda oblasť 40000h – BFFFFh.

Do tejto časti potrebujeme posadiť našich 512k RAM. Dynamické RAM som zavrhol hneď na začiatku z dôvodu, že zbytočne komplikujú návrh a navyšujú počet IO. Jednoznačne použijem 512k SRAM v jednom čipe, takže potrebujeme vyrobiť logiku úpravy, ktorá nám obslúži kontrolné signály SRAM – /CE, /OE a /WR. Technický manuál QLka ešte tvrdí, že ak cheme správne obslúžiť túto oblasť, potrebujeme ešte vnútiť H na signál DSMC, ale ešte pred tým, ako sa nám aktivuje DS. To nám odpojí vnútornú logiku starajúcu sa o spodok pamäťového priestoru, inak by sa nám zrkadlila jeho časť do našej oblasti. Bežná logika sa najlepšie implementuje GALom, takže potrebujeme navrhnúť rovnice. Keďže je to SRAM, môžeme ju kompletne priznať, čo by nám malo zjednodušiť situáciu. Poďme teda skúsiť navrhnúť rovnice. Potrebujeme ošetriť tieto stavy:

čítanie: SRAMCE=L, SRAMOE=L, SRAMWR=H

zápis: SRAMCE=L, SRAMOE=X, SRAMWR=L

potvrdenie pre CPU, že sme spracovali adresu: DTACK=L

odpojenie obsluhy vnútornej pamäte: DSMC=H 

V prvom rade si musíme vyrobiť enablovací signál /CE pre SRAM – nazvime ho SRAMCE. Je to signál, ktorý nám v správnej chvíli prizná na zbernici náš 512k čip a je jedno, či ide o zápis alebo čítanie. Správna chvíľa je vtedy, keď je adresa nastavená na niektorú z nášho rozsahu. Z binárneho zápisu adries tohto rozsahu zistíme, že nás zaujímajú bity A18 a A19, respektíve ich príslušné kombinácie, keď sa jedná o adresy z nášho rozsahu. Preto skúsime napísať prvú rovnicu, ktorá sa bude skladať z obsluhy platnej adresy v tomto rozsahu:

SRAMCE = AS + A18*A19 + /A18*/A19
SRAMCE.oe = VCC

Táto rovnica by nám mala zabezpečiť, že náš čip sa “zapne” vždy, keď je na adresnej zbernici platná hociktorá z adries z nášho rozsahu 40000h-BFFFFh.

V ďalšom kroku si musíme pripraviť rovnice, ktoré určia, čo bude čip robiť, keď sa “zapne” – teda či sa bude doňho zapisovať, alebo z neho čítať.

Pozrime sa najprv na zápis. Na čipe potrebujeme aktivovať spolu so SRAMCE aj signál /WR (nazvime ho SRAMWR), aby sa doňho nasypali data, ktoré sú práve na dátovej zbernici. Podľa datasheetu v dobe aktivácie AS už máme nastavený R_W na L, v zápatí nasleduje DS, ktoré spôsobí  nasypanie dát do nášho čipu. Z toho usudzujem, že nepotrebujeme žiadnu rovnicu do GALu, jednoducho prepojíme SRAMWR s R_W.

Ďalej potrebujeme ošetriť čítanie z nášho čipu. Tentokrát potrebujeme na našom čipe  spolu s SRAMCE aktivovať signál /OE – nazvime ho SRAMOE, aby čip vystavil na zbernicu dáta, ktoré sú v ňom zapísané. Potrebujeme zareagovať na R_W keď je H, spolu s aktívnym DS. SRAMWR ošetrovať nemusíme, lebo je ošetrené automaticky tým, že R_W je v tomto cykle H. Rovnice by mohli vyzerať nejak takto:

SRAMOE = SRAMCE + DS + /R_W
SRAMOE.oe = VCC

Nasleduje ešte DTACK pre potvtrdenie CPU, že sme pochopili, že na zbernici je to, čo sa nás týka. Potrebujeme zahrnúť AS a DS, ale len keď sa nás to týka. Najjednoduchšie to urobíme použitím SRAMCE ako feedbacku a pridaním DS. Z toho potom vyplýva, že rovnica by mohla byť takáto:

DTACK = GND
DTACK.oe = /SRAMCE * /DS

No a zostává ešte DSMC, ktorým dáme pohov vnútornej logike. Ako som spomínal, mal by nasledovať ešte pred aktiváciou DS, čo je v podstate v dobe, keď ožije naše SRAMCE. Z toho potom vyplýva nasledujúca rovnica:

DSMC=VCC
DSMC.oe= /SRAMCE

A tým by sme mali logiku hotovú. EDIT: pri prenose článku mi nejak vypadla ešte celková podoba GALu, takže tu je:

CHIP QL640k GAL16V8

NC A18 A19 R_W DS AS NC NC NC GND
NC DTACK SRAMOE DSMC SRAMCE NC NC NC NC VCC

EQUATIONS

SRAMCE = AS + A18 * A19 + /A18 * /A19
SRAMCE.oe = VCC


SRAMOE = SRAMCE + DS + /R_W
SRAMOE.oe = VCC


DTACK = GND
DTACK.oe = /SRAMCE * /DS


DSMC = VCC
DSMC.oe = /SRAMCE

Na záver ešte popíšem, ako si predstavujem mechanickú realizáciu. Všetko závisí od voľného miesta v QLku, ale rád by som tú úpravu realizoval ako dosku, ktorá sa osadí do pätice CPU a CPU sa strčí do dosky úpravy.Zostal by mi voľný rozširujúci slot, kam možno niekedy neskôr budem strkať periférie. Ak to pôjde, dosku úpravy potiahnem až po ROM sloty, aby som na nej realizoval aj moju EPROM úpravu, ale jej logiku by som tiež nasťahoval do GALu, takže celá úprava by obnášala len 3 IO – GAL, SRAM a EPROM. Som zvedavý, či to vôbec bude fungovať. Najradšej by som sa ešte pozrel na schému nejakej inej úpravy, alebo aspoň nejakej periférie, ktorá má aj prídavnú pamäť, či vôbec idem správnym smerom, ale čo už. Bohužiaľ je dokumentácia nulová, tak to musím risknúť tak, ako to je.

Neviem či som správne popísal moje myšlienkové pochody, ale neviem to rozpísať nejako lepšie. Ak sa vám tam niečo nevidí, ozvite sa, môžme to prediskutovať a prípadné bludy opraviť.

No a to je pre dnešok všetko.

One Comment

  1. Roman Roman

    Rovnice
    Rovnice sú myslím v poriadku. Ale… :-)Je to síce možno nepodstatný detail, ale ja by som rovnice písal v pozitívnej logike. Teda, definícia pinov by mala byť podľa ich aktívnej logickej úrovni a následne rovnice môžu byť v DNF (disjunktná normálna forma), teda ako logický súčet navzájom rôznych logických súčinov. Myslím, že takto sú potom rovnice aj viac zrozumiteľné.CHIP QL640k GAL16V8NC A18 A19 R_W /DS /AS NC NC NC GNDNC /DTACK /SRAMOE DSMC /SRAMCE NC NC NC NC VCC EQUATIONSSRAMCE = AS * /A18 * A19 + AS * A18 * /A19SRAMCE.oe = VCCSRAMOE = SRAMCE * DS * R_WSRAMOE.oe = VCCDTACK = VCCDTACK.oe = SRAMCE * DSDSMC = VCCDSMC.oe = SRAMCE

Leave a Reply

Your email address will not be published. Required fields are marked *