Atualização para 1MB e o novo design da placa 

Índice:

  1. Introdução
  2. A necessidade de expansão
  3. O processo de desenvolvimento
  4. Os benefícios da atualização
  5. Post Anterior (Paginação/Carragemento/SoftReset)
    1. Paginação
    2. Carregamento
    3. Soft Reset
  6. Conclusão

1 - Introdução

Se você é um fã nostálgico do Master System, provavelmente já ouviu falar dos cartuchos multi jogos que permitiam desfrutar de uma biblioteca diversificada de títulos em um único cartucho. Essas preciosidades nos proporcionavam horas de diversão sem precisar trocar de cartucho a todo momento. No entanto, o mundo da tecnologia não para de evoluir, e é por isso que estou entusiasmado em compartilhar com vocês a atualização do meu projeto de cartucho multi jogo para Master System. Agora, com capacidade expandida para 1MB e uma nova placa desenvolvida e testada. Continue lendo para descobrir mais sobre essa emocionante evolução!

2 - A necessidade de expansão

O design anterior, possuía 512kB de armazenamento, o que impossibilitava rodar jogos como o SSF e outros hacks. Percebendo essa restrição, decidi investir na expansão da capacidade do cartucho para 1MB. Essa atualização permitirá desfrutar de uma seleção ainda maior de jogos clássicos, ampliando as opções disponíveis em um único cartucho.

3 - O processo de desenvolvimento

Desenvolver uma nova placa para suportar 1MB de capacidade exigiu pesquisa, planejamento e muita dedicação. A nova placa atende aos padrões de qualidade e funciona perfeitamente com os jogos existentes. O mapper também foi atualizado, permitindo rodar jogos com o Korean mapper.

4 - Os benefícios da atualização

Com a expansão para 1MB, agora é possível desfrutar de uma seleção ainda maior de jogos clássicos em um único cartucho. Acesso a títulos que antes não eram possíveis de serem incluídos devido às limitações de tamanho. Imagine poder jogar aquele jogo lendário que você sempre quis experimentar, mas nunca teve a oportunidade. Essa atualização expande as possibilidades e a diversão que o Master System pode oferecer.

5 - Post Anterior (Paginação/Carragemento/SoftReset)

No post anterior, comecei a falar sobre o desenvolvimento do software deste cartucho multi jogo, mas acabei não abordando o funcionamento da paginação, carregamento do jogo e soft reset. Neste post, gostaria de corrigir essa lacuna e fornecer uma explicação detalhada sobre como esses recursos operam.

5.1 - Paginação

Enfrentei grandes desafios ao implementar a paginação, mas nenhum deles se comparou à dificuldade de criar um algoritmo de organização eficiente para o Master System. Infelizmente, a organização não foi bem-sucedida, então é necessário executar um programa prévio no SDCard para ordenar os arquivos em ordem alfabética. Por outro lado, a paginação tornou-se instantânea. 

Foi necessário percorrer todos os arquivos no SDCard e armazenar um array de estruturas para esse fim, essa estrutura armazena somente os index do sistema Fat sempre no inicio da pagina, assim não foi necessário armazenar nomes de arquivos.

Sempre que necessário carregar uma pagina, apenas é preciso informar o número da pagina, e a estrutura passa o endereço no FAT onde a pagina começa, depois disso preciso apenas ler a quantidade de arquivos necessários para exibição. Isso acontece tão rápido que é imperceptível, tornando a paginação instantânea mesmo com o SPI operando a 400kHz ^^.

typedef struct Record_t{
	u16 ptrBufferPos;
	u16 dirEntryPos;
	u32 dirCluster;
	u16 numSector;
} Record_t;

Com a presença de uma memória SRAM de 1MB no cartucho, espaço não foi uma preocupação. No entanto, é importante lembrar que o acesso a essa memória ocorre em blocos de 16 kilobytes.

#define STARTADDR   ((u8 *)0x8000)
...
records = (struct Record_t*)STARTADDR;

Fazendo um cálculo rápido: A estrutura que guarda o inicio de cada pagina no sistema FAT tem tamanho de 10 bytes, essa estrutura é armazenada na SRAM do cartucho, essa memoria possui 1megabytes e esta dividida em blocos de 16kilobytes. 16.384 bytes dividido por 10 bytes da um total de 1.638 paginas, pouca coisa. Devido a esse fator, optei por não implementar a mudança de página para a paginação.

5.2 - Carregamento

De forma resumida, o processo de carregamento que implementei consiste em utilizar o índice da lista e a página atual para localizar o cluster do arquivo de jogo que desejamos carregar. Em seguida, realizo o carregamento dos gráficos na tela para tornar o processo de carregamento mais atraente visualmente. Em seguida, utilizando o número de clusters do arquivo, faço um loop para transferir os dados do SD para a SRAM, utilizando o sistema de bancos do mapper existente para gerenciar essa transferência.

Um fato interessante sobre o SD e o Master System é o uso do SD Card no modo SPI. Inicialmente, configurei a frequência em 400kHz. No entanto, decidi aumentar a frequência do SPI para o máximo suportado pelo SD Card, que é de 25MHz. Surpreendentemente, essa alteração não resultou em uma melhora no tempo de carregamento do jogo. Considerando isso, talvez seja mais adequado retornar à frequência de 400kHz no código atual, o que permitiria mais espaço no CPLD para outras funcionalidades, como o som FM.

while(numero_de_clusters){
        // Grava um cluster de 4096 no banco atual
        cluster = fatReadCluster(currentBankAddress, cluster);
        // decrementa numero de clusters pendentes
        --numero_de_clusters;

        // incrementa index da memoria no banco atual
        currentBankAddress += cluster_len;
        
        // com cluster de 4k, a cada 4 cluster, muda de banco(16k)
        if(currentBankAddress == (BANK_START + BANK_SIZE)){
            current_bank++;
            progress = (current_bank * 28) / numberOfBanks;
            for( ;lastPos < progress+2; lastPos++)
                draw_text("*", x++, 17);                
            SMS_mapROMBank(current_bank); // proximo banco
            currentBankAddress = BANK_START;            
            SMS_waitForVBlank();
        }        
    }

5.3 - Soft Reset

Uma das partes mais fascinantes para mim foi a oportunidade de aprender como funciona um soft reset, algo que eu tinha curiosidade há algum tempo. Durante esse processo, foi necessário aprofundar meus conhecimentos sobre o Master System, sua BIOS e o processador Z80. Além disso, contei com a valiosa ajuda da comunidade SMS Soft reset – SMSPOWER, que compartilhou informações e recursos relacionados ao soft reset no Master System. Essa colaboração e apoio foram essenciais para o meu aprendizado e progresso nessa área. Estou grato por fazer parte de uma comunidade tão dedicada e disposta a compartilhar conhecimentos.

5 - Conclusão

Como o desenvolvedor pessoal deste projeto empolgante, gostaria de expressar minha gratidão por ter tido a oportunidade de embarcar nessa jornada de aprimoramento do cartucho multi jogo para Master System. Meu principal objetivo ao iniciar esse projeto foi adquirir conhecimento e explorar os limites do console clássico que tanto amamos.

Ao longo desse processo, aprendi muito sobre o funcionamento interno do Master System. Cada obstáculo enfrentado se tornou uma oportunidade de crescimento pessoal e profissional. Foi uma experiência enriquecedora que me permitiu expandir meus horizontes e me aprofundar em uma das minhas paixões.

Considerando o espírito de compartilhamento e colaboração, estou seriamente pensando em abrir o código-fonte deste projeto para a comunidade estou disponibilizando no final desta pagina os arquivos para download. Dessa forma, outros entusiastas do Master System poderão se beneficiar do conhecimento adquirido e contribuir para o avanço dessa tecnologia. Acredito que juntos podemos criar algo ainda mais extraordinário e promover o espírito de aprendizado e inovação na comunidade.

Resumindo, esta jornada de atualização do cartucho multi jogo para Master System foi uma oportunidade incrível para mim como desenvolvedor. O intuito inicial de adquirir conhecimento foi amplamente alcançado acredito que todos nós, apaixonados por jogos clássicos, temos um papel a desempenhar na preservação e no aprimoramento dessas preciosidades.

Agradeço a todos pelo apoio e entusiasmo ao longo dessa jornada. Espero que esta conclusão inspire outros desenvolvedores e entusiastas a explorarem seus projetos e compartilharem seus conhecimentos. SD2SMS on Github

“(Right and wrong are not what separate us and our enemies. It’s different standpoints, our perspectives that separate us.
Both sides blame one another. There’s no good or bad side. Just two sides holding different views.)” —Squall