PMD 85 Memory Card

Z PMD 85 Infoserver

(Rozdiel medzi revíziami)

Rombor (Diskusia | príspevky)
(Nový článok)
Ďalší rozdiel →

Verzia zo dňa a času 20:46, 21. november 2022

PMD 85 Memory Card

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 PD0PD3 predstavujú adresné bity A15A18 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

;------------------------------------------------------------------------------