NEO-ZMC: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
mNo edit summary
Line 7: Line 7:


OpenOffice Draw file: [[File:neo-zmc.odg]]
OpenOffice Draw file: [[File:neo-zmc.odg]]
*SDA0,SDA1,SDA8~15: [[Z80]] address bus
*SDRD0: /Write signal from [[NEO-D0]]


=Operation=
=Operation=


SDA10,SDA9,SDA8 are bank selector and SDA1,SDA0 range size selector or rom size selector
SDA10,SDA9,SDA8 are bank selector and SDA1,SDA0 range size selector or rom size selector.


SDA1,SDA0 = 0,0 select bank ranges of 2Kbytes (64k M1)  
SDA1,SDA0 = 0,0 (Z80 port 8) select bank ranges for the Z80 $F000~$F7FF range (2Kbytes) (64k M1)  


SDA1,SDA0 = 0,1 select bank ranges of 4Kbytes (128k M1)  
SDA1,SDA0 = 0,1 (Z80 port 9) select bank ranges for the Z80 $E000~$EFFF range (4Kbytes) (128k M1)  


SDA1,SDA0 = 1,0 select bank ranges of 8Kbytes (256k M1)  
SDA1,SDA0 = 1,0 (Z80 port A) select bank ranges for the Z80 $C000~$DFFF range (8Kbytes) (256k M1)  


SDA1,SDA0 = 1,1 select bank ranges of 16Kbytes (512k M1)  
SDA1,SDA0 = 1,1 (Z80 port B) select bank ranges for the Z80 $8000~$BFFF range (16Kbytes) (512k M1)  


 
SDRD0 is the /write signal: the bank configuration is latched and the address output lines are changed on the rising edge.
SDRD0 is the memory operation selector WRITE (set bank and range size) / READ (access M1 based in previous configuration)




'''Details:'''
'''Details:'''


We must put SDRD0 is in high logic level before configure any bank;
SDRD0 must be high before configuring banks.
 
 
To configure a bank to be accessed (e.g. bank0):
 
Set SDRD0 from H to L (prepare for new bank configuration, let output in tri-state and accept inputs)
 
Set SDA[15..0] = '''$8003''' (select bank 0 and 16k range size)
 
Set SDRD0 from L to H (fix bank, and ready to convert inputs in proper outputs signals)
 
With SDRD0 in H, send inputs SDA[15..0] from '''$8000~BFFF''', ZMC will convert this range in M1 range from '''$00000~$03FFF''';
 
 
 
Set SDRD0 from H to L (prepare for new bank configuration, let output in tri-state and accept inputs)
 
Set SDA[15..0] = '''$8103''' (select bank 1 and 16k range size)
 
Set SDRD0 from L to H (fix bank, and ready to convert inputs in proper outputs signals)
 
With SDRD0 in H, send inputs SDA[15..0] from '''$8000~BFFF''', ZMC will convert this range in M1 range from '''$04000~$07FFF''';
 
 
 
Set SDRD0 from H to L (prepare for new bank configuration, let output in tri-state and accept inputs)
 
Set SDA[15..0] = '''$8203''' (select bank 2 and 16k range size)
 
Set SDRD0 from L to H (fix bank, and ready to convert inputs in proper outputs signals)
 
With SDRD0 in H, send inputs SDA[15..0] from '''$8000~BFFF''', ZMC will convert this range in M1 range from '''$08000~$0BFFF''';
 
 
 
Set SDRD0 from H to L (prepare for new bank configuration, let output in tri-state and accept inputs)
 
Set SDA[15..0] = '''$8303''' (select bank 3 and 16k range size)


Set SDRD0 from L to H (fix bank, and ready to convert inputs in proper outputs signals)
To configure a bank to be accessed (e.g. bank 0 in the $8000~$BFFF range):
*Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
*Set SDA0~15 = '''$8003''' (select bank 0 and 16k range size) Why $8003 and not just $0003 ?
*Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
*Now, when the Z80 accesses the '''$8000~BFFF''' range, NEO-ZMC will convert this the M1 ROM zone '''$00000~$03FFF''';


With SDRD0 in H, send inputs SDA[15..0] from '''$8000~BFFF''', ZMC will convert this range in M1 range from '''$0C000~$0FFFF''';
To configure a bank to be accessed (e.g. bank 1 in the $8000~$BFFF range):
*Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
*Set SDA0~15 = '''$8103''' (select bank 1 and 16k range size) Why $8103 and not just $0103 ?
*Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
*Now, when the Z80 accesses the '''$8000~BFFF''' range, NEO-ZMC will convert this the M1 ROM zone '''$04000~$07FFF''';


... and so on...
To configure a bank to be accessed (e.g. bank 3 in the $C000~$DFFF range):
*Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
*Set SDA0~15 = '''$8302''' (select bank 3 and 8k range size) Why $8302 and not just $0302 ?
*Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
*Now, when the Z80 accesses the '''$C000~DFFF''' range, NEO-ZMC will convert this the M1 ROM zone '''$06000~$07FFF''';


[[File:Neo-zmz operation.png|right|x400px]]
[[File:Neo-zmz operation.png|right|x400px]]
{|class="wikitable"
{|class="wikitable"
!DWORD
!Z80 address bus
(SDA[15..0])
(SDA0~15)
!BANK  
!BANK  
0-31
0-31
!INPUT RANGE
!Window...
(SDA[15..0])
!...mapped to
!OUTPUT RANGE
(M1 A0~18)
(A[18..0])
|-
|-
|$8003  
|$8003  

Revision as of 02:44, 26 December 2011

NEO-ZMC chip on a MVS cartridge. Picture courtesy of [MVS-Scans].

Z80 memory controller. Has a hardwired 32KiB bank and switchable 16/8/4/2KiB banks arranged as a register file. To save pins the high address lines (A15-A8) are used for data input. The chip's write strobe is (port) address decoded inside the console.

Pinout

File:Neo-zmc pinout.png

OpenOffice Draw file: File:Neo-zmc.odg

  • SDA0,SDA1,SDA8~15: Z80 address bus
  • SDRD0: /Write signal from NEO-D0

Operation

SDA10,SDA9,SDA8 are bank selector and SDA1,SDA0 range size selector or rom size selector.

SDA1,SDA0 = 0,0 (Z80 port 8) select bank ranges for the Z80 $F000~$F7FF range (2Kbytes) (64k M1)

SDA1,SDA0 = 0,1 (Z80 port 9) select bank ranges for the Z80 $E000~$EFFF range (4Kbytes) (128k M1)

SDA1,SDA0 = 1,0 (Z80 port A) select bank ranges for the Z80 $C000~$DFFF range (8Kbytes) (256k M1)

SDA1,SDA0 = 1,1 (Z80 port B) select bank ranges for the Z80 $8000~$BFFF range (16Kbytes) (512k M1)

SDRD0 is the /write signal: the bank configuration is latched and the address output lines are changed on the rising edge.


Details:

SDRD0 must be high before configuring banks.

To configure a bank to be accessed (e.g. bank 0 in the $8000~$BFFF range):

  • Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
  • Set SDA0~15 = $8003 (select bank 0 and 16k range size) Why $8003 and not just $0003 ?
  • Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
  • Now, when the Z80 accesses the $8000~BFFF range, NEO-ZMC will convert this the M1 ROM zone $00000~$03FFF;

To configure a bank to be accessed (e.g. bank 1 in the $8000~$BFFF range):

  • Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
  • Set SDA0~15 = $8103 (select bank 1 and 16k range size) Why $8103 and not just $0103 ?
  • Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
  • Now, when the Z80 accesses the $8000~BFFF range, NEO-ZMC will convert this the M1 ROM zone $04000~$07FFF;

To configure a bank to be accessed (e.g. bank 3 in the $C000~$DFFF range):

  • Set SDRD0 low (prepare for new bank configuration, outputs are tri-stated)
  • Set SDA0~15 = $8302 (select bank 3 and 8k range size) Why $8302 and not just $0302 ?
  • Set SDRD0 high (latch bank, ready to convert inputs to proper output signals)
  • Now, when the Z80 accesses the $C000~DFFF range, NEO-ZMC will convert this the M1 ROM zone $06000~$07FFF;
Z80 address bus

(SDA0~15)

BANK

0-31

Window... ...mapped to

(M1 A0~18)

$8003 bank 00 $8000~$BFFF $00000~$03FFF
$8103 bank 01 $8000~$BFFF $04000~$07FFF
$8203 bank 02 $8000~$BFFF $08000~$0BFFF
$8303 bank 03 $8000~$BFFF $0C000~$0FFFF
$8403 bank 04 $8000~$BFFF $10000~$13FFF
$8503 bank 05 $8000~$BFFF $14000~$17FFF
$8603 bank 06 $8000~$BFFF $18000~$1BFFF
$8703 bank 07 $8000~$BFFF $1C000~$1FFFF
$8803 bank 08 $8000~$BFFF $20000~$23FFF
$8903 bank 09 $8000~$BFFF $24000~$27FFF
$8A03 bank 10 $8000~$BFFF $28000~$2BFFF
$8B03 bank 11 $8000~$BFFF $2C000~$2FFFF
$8C03 bank 12 $8000~$BFFF $30000~$33FFF
$8D03 bank 13 $8000~$BFFF $34000~$37FFF
$8E03 bank 14 $8000~$BFFF $38000~$3BFFF
$8F03 bank 15 $8000~$BFFF $3C000~$3FFFF
$9003 bank 16 $8000~$BFFF $40000~$43FFF
$9103 bank 17 $8000~$BFFF $40000~$47FFF
$9203 bank 18 $8000~$BFFF $40000~$4BFFF
$9303 bank 19 $8000~$BFFF $40000~$4FFFF
$9403 bank 20 $8000~$BFFF $50000~$53FFF
$9503 bank 21 $8000~$BFFF $54000~$57FFF
$9603 bank 22 $8000~$BFFF $58000~$5BFFF
$9703 bank 23 $8000~$BFFF $5C000~$5FFFF
$9803 bank 24 $8000~$BFFF $60000~$63FFF
$9903 bank 25 $8000~$BFFF $64000~$67FFF
$9A03 bank 26 $8000~$BFFF $68000~$6BFFF
$9B03 bank 27 $8000~$BFFF $6C000~$6FFFF
$9C03 bank 28 $8000~$BFFF $70000~$73FFF
$9D03 bank 29 $8000~$BFFF $74000~$77FFF
$9E03 bank 30 $8000~$BFFF $78000~$7BFFF
$9F03 bank 31 $8000~$BFFF $7C000~$7FFFF

Others range sets may differ from the range access here.(e.g. $8000, $8001 or $8002)