Cart 512kB e sdcard para Master System

Embora tenha feito meu primeiro Multijogo com menu e SDCard no Megadrive, o desenvolvimento desse cartucho multi jogo para Master System foi bastante divertido, o processador da Zilog Z80 é muito amigável, diferente do Ricoh 5A22 utilizado no Super Nintendo

Optei por fazer esse cart para SMS, por causa do Z80 e seu hardware simples. De inicio definir o que seria preciso, bem como o que poderia ser feito. Slot0, 1 e 2, Memoria SRAM para carregamento dos jogos com máximo de 512 kilobytes, memória de salve com FRAM de 32 kilobytes. 

Não optei por memória flash, por dois motivos: Primeiro velocidade de gravação, de forma simples, a memória SRAM pode ser até 4x mas rápida durante a gravação, pelo simples fato de não precisar envio de comandos para efetuar uma gravação e segundo, memórias SRAM são feitas para regravação, a FLASH estraga mais rápido quando ficamos regravando constantemente, e regravações constantes é exatamente o que se espera de um Cartucho Multi Jogo. Porém, memórias SRAM são bem mais caras que memórias FLASHs.

Também pode ser visto na placa, um slot de bateria, mais caso a bateria acaba-se ou fosse removida, seria necessário regravar o boot, por fim uma FRAM entrega mais segurança.

Utilizei memória SRAM AS6C4008 DIP, memória de salve FM1808 e CPLD XC95144-100, essa escolha foi  motivada por componentes que já possuo.

O mapeamento de memoria ficou assim:

SLOT 0 ($0000-$3FFF) : Usado para mappear 16 kilobytes de boot rom.

SLOT 1 ($4000-$7FFF) : Acesso ao SDCard, sim, usei o slot todo, já explico.

SLOT 2 ($8000-$BFFF) : Usado para acessar SRAM 512kB em blocos de 16kB.

Ficou com duvida? clica aqui e veja o post anterior sobre o assunto, aproveita e deixa uma mensagem nos comentários.

Quando ligamos o console, uma rom de 16kB gravada na memoria de salve é mapeada no slot 0, e assim acontece o boot. Enquanto estivermos no menu, o cart irá se comportar como listado acima. Foi necessário um pequeno arranjo por causa da excentricidade da FM1808 ^^

-- adequar a FM1808
fm1808	<= sms_ce when sms_a(15 downto 14) = SLOT0 and Cfg(START) = '1' else mapram_ce; -- Slot 0
ram_ce	<= fm1808 or (sms_oe and sms_we);

Qualquer escrita ou leitura no SLOT 1 é direcionada ao modulo spi implementado no CPLD, da mesma forma que acesso no SLOT 2 é direcionada a memória SRAM destinada a carregar o jogo.

O motivo do sdcard está com mapeamento usando todo o slot1 é simples, a XC95144 esta no limite, foi necessário trocar pinos de lugar, para fazer caber todo o código, como pode ser visto na foto em destaque.

Fixei os endereços $4000 para leitura e escrita de data no SPI e $4004 para leitura e escrita da configuração do SPI. Como o protocolo SPI é um processo síncrono, foi necessário sincronizar alguns sinais do SMS com o relógio interno de 50MHz( outro componente que já possuía ). O acesso ao SPI funciona em duas velocidades, inicialmente em 400Khz para inicio do cartão SD, e depois da inicializado no modo SPI o speed do modulo é modificado para 25Mhz utilizando um registro interno no CPLD no endereço $4004. Vale dizer que embora seja bastante grande a diferença de velocidade do modulo spi, de 400Khz para 25Mhz, no Master System quase não senti ganho.

Abaixo está o processo de sincronização dos sinais que utilizei:

-- Sync sms sinais process				
	process(clk_in, sms_rst)
	begin
		if(sms_rst = '0') then
			state		<= S_IDLE;
			Cfg			<= "0101"; -- TURBO OFF, inMenu, KOREN_MAP disable, sd disable
			
			z80oe_sync	<= '1';
			z80_a_sync	<= (others=>'0');
			z80we_sync	<= '1';
			
		elsif(falling_edge(clk_in)) then	
			state		<= state_next;
			Cfg			<= Cfg_next;
			
			z80oe_sync	<= sms_oe;
			z80we_sync	<= sms_we;
			z80_a_sync	<= sms_a(15 downto 14) & sms_a(2);			
			
		end if;
	end process;
	

Segue as referencias que utilizei para inicializar o SDCard e detectar o sistema de arquivo:

  1. Inicialização do SDCard
  2. Reconhecimento do Fatfs
  3. Paginação
  4. Carregamento do jogo
  5. Soft reset.
 

Até o próximo post.