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:
- Inicialização do SDCard
- Reconhecimento do Fatfs
- Paginação
- Carregamento do jogo
- Soft reset.
Até o próximo post.