PMD 85 Memory Card
Z PMD 85 Infoserver
PMD 85 Memory Card je jedna z aplikácií konceptu ROM MEGAmodulu. Memory Card navrhol Martin Kaniansky (Martin1). Zapojenie dodržuje základnú definíciu ROM MEGAmodulu, ale zároveň ponúka možnosť mať voliteľne nezálohovanú externú RAM prístupnú cez porty ROM Modulu. Jumpermi na doske je možné teda zvoliť dve konfigurácie:
- 2x 512 kB FLASH
- 512 kB FLASH a 512 kB SRAM
Vďaka obvodom pre zápis do SRAM je tu prakticky možnosť zápisu aj do FLASH, kde je ale potrebný špecifický zápisový algoritmus.
Zapojenie PMD 85 Memory Card
Základom zapojenia je samozrejme IC1 PIO 8255, ktorý je na zbernicu pripojený obvyklým spôsobom, ako v klasickom ROM Module. Port PA 8255 predstavuje dátovú zbernicu pre pamäte IC4 (FLASH (SST39SF040AP)) a IC5 (FLASH (SST39SF040AP) alebo SRAM (AS6C4008P)). Porty PB a PC (okrem bitu PC7) sú pripojené na adresové vstupy pamätí a tvoria základnú 15 bitovú adresu 32 kB stránky. Bit PC7 štandardne povoľuje samotný "prístup" do pamäte, ak je nulový.
Register (port) stránkovania IC2 74LS174 má 6 bitov. 4 resp. 5 bitov určuje číslo stránky, 1 bit slúži pre voľbu FLASH alebo SRAM. Signály PD0 až PD3 predstavujú adresné bity A15 až A18 pre pamäte. Signály PD4 a PD7 podľa zvolenej konfigurácie vyberajú čip IC4 alebo IC5 (viď popis stránkovacieho portu).
Hradlové pole IC3 GAL16V8D (alebo ATF16V8B) plní niekoľko funkcií:
- dekóduje adresu portu stránkovania 6Fh a vytvára strobovací impulz /STB pre register stránkovania IC2
- vytvára výberové signály /ROMCS a /RAMCS pre pamäte IC4 a IC5
- vytvára zápisový signál /MEMWR
- vytvára signál /RES pre register stránkovania IC2
V zapojení sú tiež dve LED. Prvá LED1 indikuje aktiváciu Memory Card. Druhá LED2 indikuje zápis do FLASH/SRAM. Pri druhej LED2 je treba poznamenať, že vzhľadom na to, že je pripojená na signál /MEMWR, ktorý trvá iba 1 takt CPU, tak svit tejto LED je veľmi nízky a vhodná LED musí byť 2 mA a hodnota odporu R3 musí byť k danému typu LED pomerne nízka, napr. 330R. V každom prípade, obe LED nie sú pre funkčnosť Memory Card nutné.
Stránkovací register (port)
Stránkovací register je na štandardnej adrese 6Fh. Do registra sa dá iba zapisovať. Jeho funkcia sa líši podľa zvolenej konfigurácie.
Konfigurácia 2x 512 kB FLASH
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
— | — | — | PG4 | PG3 | PG2 | PG1 | PG0 |
Bity PG<x> určujú číslo stránky v intervale <0,31> v rámci oboch FLASH pamätí, teda celého 1 MB.
Konfigurácia 512 kB FLASH (IC4) a 512 kB SRAM (IC5)
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|
SRAM | — | — | — | PG3 | PG2 | PG1 | PG0 |
Bity PG<x> určujú číslo stránky v intervale <0,15> v rámci FLASH alebo SRAM pamätí podľa voľby bitu SRAM.
Čítanie a zápis z/do Memory Card
Spôsob čítania z Memory Card je rovnaký, ako bol popísaný v článku o ROM MEGAmodule. Takže funguje aj príkaz JOB, aj rutina Transfer z Monitora. Pred čítaním je potrebné iba zvoliť príslušnú stránku.
V nasledujúcom ukážkovom výpise je pre čítanie z Memory Card uvedená rutina ReadFromRmm, resp. ReadFromRmmPg, ktorá je podobná rutine Transfer z Monitora, avšak parametre vstupujú v registroch a čo je ale podstatné, čítanie je možné aj cez hranicu stránky, keďže rutina automaticky inkrementuje číslo stránky, ak sa dosiahne koniec stránky.
Zápis do SRAM (alebo FLASH) (viď rutiy WriteToRmm resp. WriteToRmmPg) je "opozdený" o jeden zápisový impulz /IOW. To znamená, že prvý out RmmData vyšle dáta na port PA - na dátovú zbernicu pamäte a nasledujúci out RmmData zapíše predošlé dáta z PA do pamäte zápisovým signálom /MEMWR a zároveň sa tým pripravia nové dáta na porte PA. Na konci zápisu bloku dát je teda nutný jeden "prázdny" out RmmData, aby sa zapísal do pamäte posledný byte bloku.
;------------------------------------------------------------------------------ ; porty Rom MEGA Modulu RmmBank port 6Fh ; stránkovací port RmmData port 0F8h ; dáta RmmLow port 0F9h ; adresa L RmmHigh port 0FAh ; adresa H RmmCwr port 0FBh ; ctrl ;------------------------------------------------------------------------------ ; Prečítanie dát z ROM Modulu. ; Rutina automaticky prejde na nasledujúcu stránku pri dosiahnutí adresy 8000h. ; I: A=číslo stránky ; HL=adresa začiatku v ROM module (adr_rmm) ; DE=adresa uloženia v RAM (adr_ram) ; BC=počet čítaných bytov (length) ; O: A=255, BC=0, DE=adr_ram+length, HL=adr_rmm+length ; M: všetky ReadFromRmmPg: call SetRmmPage ; nastav stránku ReadFromRmm: mvi a,90h ; inicializácia 8255 v ROM module out RmmCwr ; pre čítanie z FLASH/SRAM ReadFromRmmL: mov a,l ; nižší byte adresy RMM out RmmLow ; nastav mov a,h ; vyšší byte adresy RMM out RmmHigh ; nastav in RmmData ; prečítaj byte z RMM stax d ; ulož na cieľovú adresu inx d ; posuň sa na ďalšiu cieľovú adresu inr l ; inkrementuj nižší byte adresy RMM jnz ReadFromRmmN ; ak nie je nulový, skoč ďalej inr h ; inkrementuj vyšší byte adresy RMM jp ReadFromRmmN ; skoč, ak sme neopustili stránku call IncRmmPage ; inak inkrementuj stránku mov h,l ; a začneme opäť od adresy 0 v RMM ReadFromRmmN: dcx b ; zníž počítadlo prenášaných bytov mov a,b ; preniesol sa už celý blok? ora c jnz ReadFromRmmL ; ak nie, opakuj pre ďalší byte dcr a ; A=255 out RmmHigh ; "odpoj" RMM ret ; a vráť sa z rutiny ;------------------------------------------------------------------------------ ; Zápis do ExtRAM. ; Rutina automaticky prejde na nasledujúcu stránku pri dosiahnutí adresy 8000h. ; I: A=číslo stránky ; DE=zdrojová adresa v RAM ; HL=cieľová adresa v ExtRAM ; BC=dĺžka zapisovaných dát ; O: A=255, BC=0, DE=adr_ram+length, HL=adr_rmm+length ; M: všetky WriteToRmmPg: call SetRmmPage ; nastav stránku WriteToRmm: mvi a,80h ; inicializácia 8255 v ROM module out RmmCwr ; pre zápis do FLASH/SRAM mov a,l ; nižší byte adresy RMM out RmmLow ; nastav mov a,h ; vyšší byte adresy RMM out RmmHigh ; nastav ldax d ; predčítaj prvý byte z RAM out RmmData ; a zapíš na port PA WriteToRmmL: inx h ; posun na ďalší byte mov a,h ; opustila sa stránka? ora a ; jp WriteToRmmH ; nie, skoč call IncRmmPage ; inak inkrementuj stránku mov h,l ; a vynuluj vyšší byte WriteToRmmH: inx d ; posuň adresu zdrojových dát dcx b ; zníž počítadlo zapisovaných bytov mov a,b ora c jz WriteToRmmE ; skoč, ak sú prenesené všetky byty ldax d ; prečítaj byte z RAM out RmmData ; zapíš byte na port PA ; predošlý byte bude zapísaný do RMM mov a,l ; zmena nižšieho bytu adresy v RMM out RmmLow ora a ; došlo ku zmene aj vyššieho bytu? jnz WriteToRmmL ; nie, pokračuj v prenose mov a,h ; zmena vyššieho bytu adresy out RmmHigh jmp WriteToRmmL ; pokračuj v prenose WriteToRmmE: out RmmData ; zapíš posledný byte do RMM dcr a ; odpoj "RMM" out RmmHigh ret ;------------------------------------------------------------------------------ ; Inkrementovanie a nastavenie stránky RMM. ; I: [RmmPage+1]=číslo RMM stránky ; O: A=[RmmPage+1]=inkrementované číslo RMM stránky ; M: AF IncRmmPage: RmmPage: mvi a,0 inr a ;------------------------------------------------------------------------------ ; Nastavenie stránky ROM Modulu. ; I: A=číslo RMM stránky ; O: - ; M: - SetRmmPage: out RmmBank sta RmmPage+1 ret ;------------------------------------------------------------------------------
Zápis do FLASH
Pre zápis do FLASH je potrebný špecifický zápisový algoritmus. Nasledujúce rutiny sú určené pre FLASH SST39SF010A / SST39SF020A / SST39SF040 (Microchip). Pri iných typoch FLASH (napr. od iných výrobcov) môže byť zápisový algoritmus odlišný.
Spomenuté FLASH poskytujú niekoľko "zápisových" operácií, ktoré sú implementované v rutinách WriteByte, SectorErase, ChipErase a ReadChipID.
;------------------------------------------------------------------------------ ; porty Rom MEGA Modulu RmmBank port 6Fh ; stránkovací port RmmData port 0F8h ; dáta RmmLow port 0F9h ; adresa L RmmHigh port 0FAh ; adresa H RmmCwr port 0FBh ; ctrl ;------------------------------------------------------------------------------ ; Rutiny pre zápis do FLASH SST39SF010A / SST39SF020A / SST39SF040. ;------------------------------------------------------------------------------ ; Zápis jedného bytu. ; I: A=číslo stránky <0, 31>, HL=adresa <0,32767>, B=zapisovaný byte ; O: - ; M: AF WriteByte: push b ; odpamätaj BC, HL push h ; ulož do sekvencie sta SeqByteProgX+3 ; stránku ani 10h ; adresa 0 v konkrétnej FLASH out RmmBank ; nastav MRM stránku mov a,b sta SeqByteProgX ; zapisovaný byte mov a,h ori 80h mov h,a shld SeqByteProgX+1 ; adresu lxi h,SeqByteProg ; operácia: Byte-Program call WriteSeq pop h ; obnov HL, BC pop b ret ;------------------------------------------------------------------------------ ; Vymazanie jedného sektora FLASH o veľkosti 4 kB ; I: A=číslo stránky <0, 31>, ; HL=adresa <0,32767> - berú sa do úvahy iba bity 14:12 ; O: - ; M: AF, BC, HL SectorErase: sta SeqSecEraseX+2 ; ulož stránku ani 10h ; adresa 0 v konkrétnej FLASH out RmmBank ; nastav MRM stránku mov a,h ori 80h mov h,a shld SeqSecEraseX ; ulož adresu mazaného sektora lxi h,SeqSecErase ; operácia: Sector-Erase jmp WriteSeq ;------------------------------------------------------------------------------ ; Vymazanie celej pamäte FLASH ; I: A=číslo stránky - kvôli výberu čipu ; O: - ; M: AF, BC, HL ChipErase: ani 10h ; Adresa 0 v konkrétnej FLASH out RmmBank ; nastav MRM stránku lxi h,SeqChipErase ; operácia: Chip-Erase jmp WriteSeq ;------------------------------------------------------------------------------ ; Precitanie ID chipu ; I: A=číslo stránky - kvôli výberu čipu ; O: E=kód výrobcu (0BFh), D=kód čipu (0B5h, 0B6h, 0B7h) ; M: vsetky ReadChipID: ani 10h ; adresa 0 v konkrétnej FLASH out RmmBank ; nastav MRM stránku lxi h,SeqReadId ; operácia: Software ID Entry call WriteSeq mvi a,90h ; inicializácia 8255 v ROM module out RmmCwr ; pre čítanie z FLASH xra a ; adresa 0 vo FLASH out RmmLow out RmmHigh in RmmData ; prečítaj ID výrobcu mov e,a ; a ulož do E mvi a,1 ; adresa 1 vo FLASH out RmmLow in RmmData ; prečítaj kód čipu mov d,a ; a ulož do D lxi h,SeqReadIdEnd ; operácia: Software ID Exit ; ukonči režim čítania ID čipu ;------------------------------------------------------------------------------ ; Zápisová sekvencia do FLASH. ; I: HL=adresa zapisovej sekvencie ; O: - ; M: AF, BC, HL WriteSeq: mvi a,80h ; inicializácia 8255 v ROM module out RmmCwr ; pre zápis do FLASH mov b,m ; počet položiek inx h WriteSeqL: mov a,m ; dáta inx h out RmmData mov a,m ; adresa L inx h out RmmLow mov a,m ; adresa H inx h rlc ; ak má vyšší byte nastavený 7. bit ora a rar ; presuň ho do CY a vynuluj out RmmHigh jnc WriteSeqN ; nastavený najvyšší bit adresy určuje, mov a,m ; že nasleduje ešte stránka inx h out RmmBank ; nastav MRM stránku WriteSeqN: dcr b jnz WriteSeqL xra a ; záverečný "dummy" byte, ktorý zapíše out RmmData ; predošlý byte a spustí operáciu mov c,m ; zdržanie po spustení operácie inx h mov b,m WriteSeqD: dcx b ; čakaj ... mov a,b ora c jnz WriteSeqD ret ;------------------------------------------------------------------------------ ; sekvencia pre zápis bytu: "Byte-Program" SeqByteProg: db 4 db 0AAh dw 5555h db 55h dw 2AAAh db 0A0h dw 5555h SeqByteProgX: db 0 ; byte dw 0 ; adresa db 0 ; stránka dw 5 ; ~67 us ; sekvencia pre zmazanie sektora: "Sector-Erase" SeqSecErase: db 6 db 0AAh dw 5555h db 55h dw 2AAAh db 80h dw 5555h db 0AAh dw 5555h db 55h dw 2AAAh db 30h SeqSecEraseX: dw 0 ; adresa db 0 ; stránka dw 2500 ; ~29 ms ; sekvencia pre zmazanie čipu: "Chip-Erase" SeqChipErase: db 6 db 0AAh dw 5555h db 55h dw 2AAAh db 80h dw 5555h db 0AAh dw 5555h db 55h dw 2AAAh db 10h dw 5555h dw 10000 ; ~117 ms ; sekvencia pre zapnutie režimu čítania ID čipu: "Software ID Entry" SeqReadId: db 3 db 0AAh dw 5555h db 55h dw 2AAAh db 90h dw 5555h dw 5 ; ~67 us ; sekvencia pre vypnutie režimu čítania ID čipu: "Software ID Exit" SeqReadIdEnd: db 3 db 0AAh dw 5555h db 55h dw 2AAAh db 0F0h dw 5555h dw 5 ; ~67 us ;------------------------------------------------------------------------------
Na stiahnutie
- Schéma, Gerbery, osadzovací plán, GAL - V ZIP archíve je mnou trochu "učesaná" schéma PMD85MemCard4a-RB (názvy signálov, umiestnenie popiskov, atď.). Tá je použitá aj v náhľadovom obrázku. Archív obsahuje aj pôvodné Gerber súbory a rovnice pre GAL.
- Zdrojové súbory tu uvedených vzorových rutín