PMD 85 Memory Card
Z PMD 85 Infoserver
Verzia zo dňa a času 20:46, 21. november 2022
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ý programový 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) a IC5 (FLASH/SRAM). 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 tejto LED 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 ;------------------------------------------------------------------------------