PMD 85 Memory Card

Z PMD 85 Infoserver

(Rozdiel medzi revíziami)
Djb (Diskusia | príspevky)
D (PMD 85 Memory Card premiestnená na Blog:PMD 85 Memory Card: presun do blogu)
Djb (Diskusia | príspevky)
D (Blog:PMD 85 Memory Card premiestnená na PMD 85 Memory Card výmenou presmerovania: a spat)

Verzia zo dňa a času 15:37, 16. august 2023

PMD 85 Memory Card
PMD 85 Memory Card
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ý zápisový algoritmus.

Zapojenie PMD 85 Memory Card

Schéma PMD 85 Memory Card
Schéma 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 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 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