Esa Lyttinen | esa.lyttinen@wlanmail.com
Amiga 2000 -ROM-adapteri 32-bit -> 16-bit

Lojuuko nurkissa Amiga 1200:n 3.0-ROM-piirit, muttet ole keksinyt niille mitään käyttöä? Aivan sama ongelma oli minullakin vuosikymmen sitten, kunnes ratkaisin sen. Amiga 2000 -BBS-kone tarvitsi uuden ROM-piirin ja mielellään 3.1:n. Syy taisi olla Delfina-äänikortin, jonka softat eivät tainneet toimia edes 2.04-versiolla. Mutta asiassa on yksi erittäin paha ongelma. Moni arvaa jo varmasti mikä.

Juuri niin, A1200:n 3.0-ROM-piirejä on kaksi, ja A500/600/2000:ssa niitä on vain yksi. Tähän ongelmaan piti keksiä ratkaisu, eikä se valjennut aivan heti. Lisäongelmia aiheutti mahdollisuus, että ROM-piirit olisivat vielä kaiken lisäksi 32-bittiselle prosessorille tehtyjä. Se taas tarkoittaisi suomeksi sitä, että 68000-prosessori kaatuisi ensimmäiseen 32-bittiseen käskyyn, koska prosessorissahan on vain 16-bittinen rakenne. Tämän kauhukuvan pääsin kiertämään asentamalla koneeseen aidon 32-bittisen prosessorin, eli haaviin tarttui GVP:n 030-turbokortti, ja näin tämä ongelma oli sivuutettu.

Suunnitteleminen saattoi jatkua. Tutkin pitkään ja hartaasti niin A2000:n kuin A1200:nkin kytkentäkaavioita, joita oli silloin jaossa todella vähän. Samoin tutkin kaiken maailman itsetehtyjä turboviritelmiä Aminetissä löytämättä ratkaisua. En todellakaan halunnut tuhota hienoa uutta turbokorttia vain kokeillakseni, saisinko siihen jotenkin harakanpesämäisesti rakennettua ROM-adapterin, en todellakaan.

Eräänä päivänä kuitenkin välähti! Tutkailtuani A1200:n kytkentäkaaviota oivalsin, miten kone lukee kyseisiä piirejä: ei suinkaan yhtä piiriä kerrallaan, vaan piirit ovat itse asiassa 16-bittisiä. Jos haluamme säilyttää 32-bittisen väylän hyödyt emmekä hidastaa konetta kaventamalla väylää mistä ROM luetaan, laitamme niitä kaksi vierekkäin ja näin saamme täyden 32-bittisen dataväylän. Ensimmäinen tavu (16-bit) luetaan ROM-piiristä yksi, loput 16 bittiä ROM-piiristä kaksi. Ongelman ratkaisu oli juurikin siinä miten yksinkertaista ja helppoa... Ei oikeastaan, mutta idea oli helppo.

Jutun juoni koostuu siis tästä: sinulla on kaksi ROM-piiriä, joita pitää lukea vuorotellen, 1-2-1-2-1-2... Voidaan siis kuvitella, että ensimmäisessä ROMissa ovat kaikki parilliset osoitteet ja toisessa parittomat. Address-signaali määrää tämän, mutta miten jaat address-signaalit niin etteivät osoitukset sekoa? Aluksi tämä tuntui todella hankalalta ratkaista, kunnes tajusin ottaa address-signaalin nolla kokonaan pois yhtälöstä ja ohjaamalla sillä, kumpaa piiriä itse asiassa luetaan. Signaali tosin pitää invertoida toiselle piirille, sillä kummassakin ROM-piirissä on on/off-signaalin sisäänmeno. Sillä saa piirin katoamaan muistiavaruudesta, jos on tarvetta, kuten C64:ssa, jossa ROM-piirien alle pystyi kirjoittamaan omat ohjelmat osoitelinjaa ronkkimalla.

Kun samalla muita address-signaaleja siirretään yhden pykälän pieleen, eli alemmas, onkin address-signaali kaksi nyt yksi ja kolme on kaksi... ja niin edespäin.

Nyt kutsumme ensimmäistä osoitetta ROM-piireissä: address-pinni yksi on nolla, signaali invertoituu, ROM-piirin yksi on/off-pinni aktivoituu. ROM kaksi pysyy poissa tieltä, sen on/off-signaali on nolla eli off. Nyt prosessori lukee ensimmäiset 16 bittiä ROM-piiri ykkösestä kuten pitääkin. Koska A500/2000:n ROM-väylä ei ole tämän leveämpi, niin se tyytyy siihen. Käsiteltyään tämän se palaa lukemaan seuraavat 16 bittiä ja nostaa address-signaalin ykköseksi, ROM yksi sammuu, koska sen on/off-signaali oli invertoitu, eli nyt nolla. ROM 2 aktivoituu ja invertoitumattomana reagoi address-väylän ykköseen, ja CPU lukee seuraavan 16 bitin verran tietoa.

Seuraavaksi se hakee kolmannen kerran tietoa ja nostaa address-pinnin 2, jolloin 1 jää nollaksi. ROM yksi aktivoituu jälleen, koska address-pinni 1=1. ROM kaksi sammuu, sille 1=0, mutta koska address-pinni 2 on nyt 1, luetaankin ROM ykkösen seuraava tavu, ja näin edetään. ROM-piirit toimivat ahtaammassa väylässä kuin oli tarkoitettu. Sanomattakin on selvää, että invertoija on mallia F, eli Fast, ettei prosessori huomaa viivettä ja sekoita näitä kahta ROMia toisiinsa. Tämä tekniikka ei ole aivan oppikirjojen mukainen, mutta se on toiminut ja toimii edelleen.
Ja mitä tuli A1200:n ROM-piirien 32-bittisyyteen, sitä ei ole. Kaikki 3.0-ROM-piirit ovat 16-bittisesti ohjelmoituja, joten 68000-pohjaisenakin A2000 boottaa 3.0 ROMeilla.

Oli myös toinen pelko, joka hieman jännitti tässä projektissa ja josta en vielä kertonut. Kytkentäkaavioita tutkineet sen jo ehkä huomasivatkin. A2000:n address-pinni 20 jää ilmaan roikkumaan, mikä tarkoittaa sitä, ettei ROMeja lueta aivan loppuun asti - itse asiassa vain puoleen väliin, mutta onneksi ROMien address-linjat ovat ylimitoitetut varsinaiseen tarpeeseen nähden eli pinniä 20 ei koskaan tarvita. Jos ROM-piirit löytyisivätkin muistiavaruuden loppupäästä... Houston, meillä olisi ongelma.
Pienenä ohjeena rakentelijoille: Tarkistakaa piirilevyn kytkennät. Kerroin tässä teorian, miten homma tehdään, mutta piirilevypohja on piirretty kymmenen vuotta sitten. Muistikuvia siitä, onko se täydellinen vai ei, on mahdoton sanoa. Samoin A500-asennuksesta en tiedä. Sopiiko se mitoituksensa puolesta paikalleen kuten A2000:ssa? Omani tein verolevylle, mikä on julman näköinen häkästys, ja ROM-pohjaan menevinä pinneinä käytin rivipinnikiskoa, joka tuhoaa ROM-pohjan, koska se suurentaa kiinnikkeitä niin paljon, etteivät tavalliset ROM-piirit pysy siinä enää kiinni. Eletroniikkakaupoista saa tähän tarkoitukseen tarkoitettuja jalkoja, joita suosittelen ehdottomasti. Ne pysyvät paremmin kiinni eivätkä vaadi niin kovaa runnomista kuin omani.

Valmiit tiedostot, jotka aukeavat Aminet-jakelussa olevilla ohjelmilla AmiPCB tai AmiCAD:

> A2000_rom_adapteri_2.CAD
> A2000_rom_adapteri_valmis.PCB
> A2000_rom_adapteri_valmis_v1.PCB

Rakentelun iloa. Projektista voi lähetellä kirjoittaneelle postia, jos haluaa lisätietoja.


Sivun alkuun