DivIDE programming model ------------------------ DivIDE komunikuje se ZX Spectrem pres I/O pristupy nebo automaticky, zamenou originalni ZX-ROMky jeho vlastni pameti, kdyz je detekovan CPU fetch (nahrani operacniho kodu instrukce) ze vstupniho bodu (a je-li takove chovani urcitym zpusobem povoleno). DivIDE obsahuje 8kB ROM (muze byt nepritomna, EPROM nebo EEPROM, v tretim pripade je preprogramovatelna primo v systemu (netreba vyndavat a davat do programatoru)) a 32-512 kb RAM. DivIDE muze pouzivat system z treti 8k banky jeho RAMky, to je vhodne hlavne pro bezpecny system developement (vyvoj systemu). Neumyslne poskozeni obsahy EEPROM (diky nestastnemu vyzkoceni ze "spadnuteho" kodu) je jisteno jumperem na desce. Vsechny porty jsou dekodovany pouze pouzitim adresovych signalu A0..A7, takze muzete pristupovat ke vsem osmi IDE registrum z takzvanych command bloku (rrr=0..7) na adresach xxxx xxxx 101r rr11. Dalsi DivIDE vlastnosti jsou rizeny pouzivanim urceneho portu na adrese xxxx xxxx 1110 0011, ktere nalezi DivIDE CONTROL REGISTRU. IDE command block registry -------------------------- [ DATA REGISTER (R/W) ] xxxx xxxx 1010 0011, 0a3h, 163 Tento register slouzi pro cteni nebo zapisovani sektoru. Je 16-bitu siroky, takze DivIDE spojuje zapisovane pary do slov a rozdeluje prectena slova do bajtu. Kdyz se cte z registru, kazdy LICHY pristup vrati nizsi bajt precteneho slova (zatimco vyzsi bajt je ulozen do latche zachytneho registru (hladinovy D-klopny obvod) a ukazatel bufferu je posunut na dalsi slovo). Kazdy SUDY pristup vrati vyzsi bajt, ulozeny v predchozim ctecim pristupu do DATA REGISTERU. Pri zapisovani do DATA REGISTERU, kazdy LICHY pristup ulozi bajt do latche. Kazdy SUDY pristup spoji predtim ulozenou nizsi cast s aktualnim bajtem (povazuje ji za vyzsi cast), a toto slovo je zapsano na harddisk (a je nalezeno (nebo oznaceno) dalsi slovo v bufferu harddisku). Po jakemkoliv pristupu do nedatovych command block registru (rrr=1..7) nebo do DivIDE ridiciho registru, je nasledujici pristup do DATA REGISTRu povazovan za LICHY. Pristup na jakekoliv jine porty (nez divIDEacke) nemohou zmenit SUDY/LICHY stav. Po resetu nebo zapnuti je stav neznamy. [ ERROR REGISTR (R) / REGISTR VLASTNOSTI (W) ] xxxx xxxx 1010 0111, 0a7h, 167 [ REGISTR POCTU SEKTORU (R/W) ] xxxx xxxx 1010 1011, 0abh, 171 [ REGISTR CISLA SEKTORU (R/W) (take LBA bity 0..7) ] xxxx xxxx 1010 1111, 0afh, 175 [ REGISTR NIZSIHO CYLINDERU (R/W) (take LBA bity 8..15) ] xxxx xxxx 1011 0011, 0b3h, 179 [ REGISTR VYZSIHO CYLINDERU (R/W) (take LBA bity 16..23) ] xxxx xxxx 1011 0111, 0b7h, 183 [ REGISTR JEDNOTKA/HLAV (R/W) (take LBA bity 24..28) ] xxxx xxxx 1011 1011, 0bbh, 187 [ STATUS REGISTER (R) / COMMAND REGISTER (W) ] xxxx xxxx 1011 1111, 0bfh, 191 Pro detailni popis zminovanych registru se koukni na http://www.t13.org . DivIDE control register ----------------------- [ CONTROL REGISTER (jen zapis) ] xxxx xxxx 1110 0011, 0e3h, 227 Tento registr je jen pro zapis (prectena data budou neurcita (nahodna)). Vsechny bity jsou resetovany na '0' po kazdem zapnuti. 7 6 5 4 3 2 1 0 [ CONMEM , MAPRAM, X, X, X, X, BANK1, BANK0 ] Bity BANK1 a BANK0 vyberou 8k banku, ktera je se normalne objevuje na 2000-3fffh, kdyz je DivIDE pamet namapovana. Bit MAPRAM muzete nastavit pouze na '1' (kdyz je '1', da se vratit na '0' pouze vypnutim a zapnutim). Tento bit umoznuje 8k bance c.3 chovat se jako EPROM/EEPROM a chrani ji proti zapisu. Nastavte ho, kdyz je image systemu nahran do banky c.3, a kdyz ho chcete testovat, pohrat si s nim az do dalsiho zapnuti... Nastavte ho take kdyz nemate EPROM/EEPROM a chcete-li pouzivat system. (Protoze ho mozna budete re-installovat z MAPRAM modu, budete potrebovat CONMEM pro prevazeni write-protectu. Protoze po navratu do BASICu jste zavisli na originalni ROM, musite resetovat automapper, ktery by mohl zustat v nezadoucim stavu po predchozich sbernicovych cyklech. Jelikoz to muzete udelat pouze vyvolanim instrukce z odpojovaci oblasti, musite nastavit DI, pak call 1ffbh ('RET'), pak CONMEM, nahrat image, uvolnit CONMEM a nastavit MAPRAM, pak EI. Jedine tak je navrat bezpecny.) Bit CONMEM vnuti EPROM/EEPROM na 0000-1fffh a BANKou 1..0 primapuje vybranou banku na 2000-3fffh, navzdory aktualnimu divIDE stavu nebo fyzicke pritomnosti EPROMky/EEPROMky. Do banky umistene v 2000-3fffh muzes vzdy zapisovat a 0000-1fffh vzdy nalezi EEPROMce/EPROMce, do ktere muzes zapisovat pouze, je-li EPROM jumper otevren. Pouzivej to pro nahravani systemu nebo modulu v third-party utilitach, nebo pro systemovy auto-upgrade. Mapovani pameti --------------- Mapovani pameti muze byt uplatnovano manualne (nastavenim CONMEM) nebo automaticky (CPU vyzvedl opcode ze vstupniho bodu). Automaticke mapovani je aktivni pouze je-li EPROM/EEPROM pritomna (jumper EPROM je zavren) nebo je-li bit MAPRAM nastaven. Automaticke mapovani se uskutecni na zacatku refresh cyklu po vyzvednuti opcodu (M1 cyklus) z 0000h, 0008h, 0038h, 0066h, 04c6h a 0562h. Take je okamzite namapovano (100ns po sestupne hrane /MREQ nalezici tomuto FETCHi) po spusteni opcodu z oblasti 3d00..3dffh. Pamet je automaticky odmapovana pri refresh cyklu vyzvednuti instrukce z takzvane off-oblasti, ktera je na 1ff8-1fffh. Jedno-instrukcni prodleni se muze vyuzit k rozeznani mezi vnorenymi volanimi na totez misto (z nemapovaneho nebo mapovaneho stavu). Pro takovyto trik vloz rozdilne instrukce na adresy vstupniho bodu, nez jsou v originalni ZX ROM. Takze prvni call bude spoustet puvodni instrukci, ale nasledujici skoci na jiny kod, protoze DivIDE pamet je uz namapovana i se svym zmenenym opkodem (ktery zpusobi skoceni jinam). Skvele pro 100% odstineni zakmitu na NMI, ktere nemuze byt implementovano pouzitim obycejne kombinatoricke hardwarove 'ochcavacky'. Umoznuje to DivIDE uzivat INT pro casovani. Kdyz je DivIDE kod provaden (externi volani namapuje pozdeji DivIDE na off a pokracuje na #38h puvodni sluzby, ale skupinove vnorene (vnitrni) interrupty skoci jinam, a nezadouci odmapovani se proto neprovadi). Pri automatickem mapovani, kdyz je nastaven MAPRAM, se v oblasti 0000h-1ffffh objevi write-protectovana banka c.3, namisto EEPROM/EPROM. Smysl priority je (od nejnizsiho k nejvyzsimu) EPROM jumper -> MAPRAM -> CONMEM. Protoze tento jumper uz neni dulezity kdyz je MAPRAM nebo i dokonce CONMEM nastaven, je pouzit pro rozeznani mezi zajistenym, zamknutym a chranenym stavem EEPROM pri CONMEM modu. Takze, kdyz je nastaven CONMEM: 0000-1fffh - EEPROM/EPROM/NIC(prazdna patice), a tato oblast je flash-writable jestlize EPROM jumper je otevren. 2000-3fffh - 8k banka, vybrana bity BANK 0..1, vzdy zapisovatelna. Kdyz je nastaven MAPRAM, ale CONMEM je nula, a vstupni bod byl dosazen: 0000-1fffh - Banka c.3, pouze cteni 2000-3fffh - 8k banka, vybrana bity BANK 0..1. Jestli je odlisna od banky c.3, je zapisovatelna. Kdyz MAPRAM je nula, CONMEM je nula, EPROM jumper je zavren a vstupni bod byl dosazen: 0000-1fffh - EEPROM/EPROM/NIC (jestlize je prazdna patice, v tomto pripade otevri jumper, protoze jinak bude vykonavan kod z prazdne patice, coz nechceme), pouze cteni. 2000-3fffh - 8k banka, vybrana bity BANK 0..1, vzdy zapisovatelna. Jinak je tu normalni spektracke usporadani pameti. Zadna modifikovana ROM, zadny sracky... A to je vse, pratele! Myslite, ze je to moc slozite ? Precte te si to znovu. Stale si myslite, ze je to pomatene ? Nebojte se me (Zilog) zeptat. Muj e-mail je xcimbal@quick.cz. Doufam, ze si uzijete tenhle kus hardwaru. Vynalozil mesice casu na optimalizaci tohoto uzasneho kusu hovna... ;) (A ja jsem u toho malem pri prekladu zesedivel, protoze moje chaba znalost anglictiny neni zamerena na technickou anglictinu... :) Nemejte ale strach, ze je tu neco spatne... Bylo to zkontrolovano samotnym Zilogem, takze je to OK ! :) Wixet)