Concrètement, je cherche a faire un PCB qui contiendra un Z80, un GAL22V10 et une SRAM de 64 Ko. Tout accès hors RAM sera bien redirigé vers la carte-mère. Par contre, tout accès à la RAM se fera directement entre le Z80 et la SRAM grâce à ce GAL qui déposera également un /MREQ en état haut sur le bus. Je ne sais pas si c'est correct de faire ainsi - n'hésitez pas à m'expliquer comment mieux faire.
Je me suis basé sur ce lien pour commencer à écrire le source du GAL. Après je me suis basé sur le fichier sm700.pdf, page 11 pour retrouver les entrées sorties nécessaires. Je tente également d'intégrer le décodage d'adresse de la RAM pour obtenir un /SRAMCS et quelques autres CHIP enables qui pourraient être utiles à d'autres modules dans l'avenir.
Voici donc ce que j'ai écris pour le moment :
Code : Tout sélectionner
Name MZ700_MMAP ;
PartNo 0 ;
Date 07/21/2019 ;
Revision 01 ;
Designer Christophe Avoinne ;
Company ;
Assembly ;
Location ;
Device g22v10 ;
/*
BANK-SWITCHING Module:
/IORQ | /WR | A7-A4 | A3-A0 | /INH1 | /INH2 | /INH3 |
L | L | E | 0 | L | - | - |
L | L | E | 1 | - | L | - |
L | L | E | 2 | H | - | - |
L | L | E | 3 | - | H | - |
L | L | E | 4 | H | H | H |
L | L | E | 5 | - | - | L |
L | L | E | 6 | - | - | H |
L | L | E | 7 | - | - | - |
L | H | ~E | * | - | - | - |
H | * | * | * | - | - | - |
When /RESET is asserted, /INH1, /INH2 and /INH3 shall be high.
Legend:
. *: any value, not used
. -: unchanged value
. ~E: different from $E
. /INH1: L to access RAM in range $0000-0FFF else H
. /INH2: L to access RAM in range $D000-FFFF else H
. /INH3: L to access external mapping in range $D000-FFFF else H
Notes:
. /INH1 means inhibit access to MONITOR ROM
. /INH2 means inhibit access to I/O MEMORY and EXTERNAL ROM
. /INH3 means inhibit access to I/O MEMORY and MONITOR/EXTERNAL ROM
RAM access module:
/MREQ | A15-A12 | INH1 | INH2 | INH3 | /RAMCS
L | 0 | L | * | * | L
L | 1-C | * | * | * | L
L | D | * | L | H | L
L | E | * | L | H | L
L | F | * | L | H | L
H | * | * | * | * | H
EXT access module (extended area, usually QD and FD ROMs):
/MREQ | A15-A12 | INH2 | INH3 | /EXT1CS | /EXT2CS
L | E | * | L | H | L
L | E | H | H | L | H
L | F | * | L | H | L
L | F | H | H | L | H
H | * | * | * | H | H
____________
/IORQ --- I [ 1] [24] Vcc
/MREQ --- I [ 2] [23] O --- /XMREQ (goes to CPU socket)
A0 --- I [ 3] [22] O --- /SRAMCS
A1 --- I [ 4] [21] O --- /EXT1CS ($E000-FFFF when /INH3 = H)
A2 --- I [ 5] [20] O --- /EXT2CS ($E000-FFFF when /INH3 = L)
A3 --- I [ 6] [19] Q --- /INH1
A4 --- I [ 7] GAL20V10 [18] Q --- /INH2
A5 --- I [ 8] [17] Q --- /INH3
A6 --- I [ 9] [16] I --- A12
A7 --- I [10] [15] I --- A13
/WR --- I [11] [14] I --- A14
GND [12]____________[13] I --- A15
*/
/* ***************** INPUT PINS **********************************************/
PIN 1 = IORQ ; /* Z80 /IORQ */
PIN 2 = MREQ ; /* Z80 /MREQ */
PIN 3 = A0 ; /* Z80 A0 */
PIN 4 = A1 ; /* Z80 A1 */
PIN 5 = A2 ; /* Z80 A2 */
PIN 6 = A3 ; /* Z80 A3 */
PIN 7 = A4 ; /* Z80 A4 */
PIN 8 = A5 ; /* Z80 A5 */
PIN 9 = A6 ; /* Z80 A6 */
PIN 10 = A7 ; /* Z80 A7 */
PIN 11 = WR ; /* Z80 /WR */
PIN 13 = A15 ; /* Z80 A15 */
PIN 14 = A14 ; /* Z80 A14 */
PIN 15 = A13 ; /* Z80 A13 */
PIN 16 = A12 ; /* Z80 A12 */
/* ***************** OUTPUT PINS *********************************************/
PIN 17 = INH3 ; /* /INH3 lock/unlock access to $D000-FFFF */
PIN 18 = INH2 ; /* /INH2 access range $D000-FFFF as SRAM if low */
PIN 19 = INH1 ; /* /INH1 access range $0000-0FFF as SRAM if low */
PIN 20 = !EXT1CS ; /* External extension area /CS when /INH3 is high */
PIN 21 = !EXT2CS ; /* Internal extension area /CS when /INH3 is low */
PIN 22 = !SRAMCS ; /* 64k static RAM /CS */
PIN 23 = !XMREQ ; /* socket /MREQ asserted if SRAM access is inhibited */
/* Je veux que INH3 ne soit mis à H que si A7..0 = $E4 ou $E6,
ne soit mis à L que si A7..0 = $E5
sinon il reste inchangé. J'ai mis le clock du latch sur /IORQ mais je ne sais
sur quel front il s'active ce latch. */
INH3 = (!IORQ&!WR& ??? )#INH3;
INH2 = (!IORQ&!WR& ??? )#INH2;
INH1 = (!IORQ&!WR& ??? )#INH1;
EXT1CS = !MREQ&INH2&INH3;
EXT2CS = !MREQ&INH2&!INH3;
SRAMCS = !MREQ&((!A15&!A14&!A13&!A12&!INH1)#( ??? )#( ??? )); /* casse-tête... */
XMREQ = SRAMCS&EXT2CS;