Conhecendo cartucho de nintendinho UNROM (NES)

Assim como aconteceu com o Master System, o Nintendinho (NES) também enfrentou desafios com sua limitação de endereçamento de memória, que rapidamente se tornou um obstáculo para os desenvolvedores de jogos. A solução encontrada para contornar essa limitação foi a utilização dos famosos chips mappers.

Diferentemente do Master System, no NES, dois dispositivos acessam diretamente o cartucho: a CPU e a GPU, tornando a tarefa do mapper dentro do cartucho um pouco mais complexa e, ao mesmo tempo, capaz de oferecer mais recursos, como é o caso do MMC5.

Dentre os diversos mappers existentes, um dos mais interessantes e que nos proporcionou grandes clássicos é o conhecido como UNROM. Responsável por rodar jogos memoráveis, como Mega Man, Castlevania e Contra, este mapper suporta 256KB de programa e 8KB de gráficos. É importante destacar que o UNROM possui algumas variações, e para representar todas elas, é comum utilizarmos a nomenclatura UxROM.

Uma das características distintas entre o Master System e o NES é que, no NES, a janela de acesso aos dados pode variar de mapper para mapper. Enquanto no SMS temos janelas fixas de 16KB, no UxROM também encontramos essa fixação, mas em outros mappers do NES, o tamanho das janelas pode variar de forma mais flexível.

Falando especificamente do mapper UxROM, ele é composto por dois bancos gerenciados pela CPU. O primeiro registro, localizado em $8000-$BFFF, é responsável pelos bancos de 16KB intercambiáveis, enquanto o segundo, localizado em $C000-$FFFF, é fixo no último banco de 16KB da ROM.

				
					architecture Behavioral of UNROM is
	signal cpu_addr_r	: std_logic_vector(2 downto 0) := "000";
begin
	-- Upper bank é hard coded, sempre visivel, 
	-- por este motivo quando A14 = 1, 
	-- A14, A15 e A16 da memoria vai em 1,
	-- mapeando o ultimo banco.
	prg_addr_o(16 downto 14)    <= "111" when cpu_addr_A14 = '1' -- $C000-$FFFF último banco
	                                else  cpu_addr_r;            -- $8000-$BFFF Bancos intercambiáveis.
	
	-- memoria output select e memoria chip select                                   
	prg_rd_o    <= not cpu_rw;
	prg_ce_o    <= romsel;
	
	-- PPU sinais
	-- chr sram no cart
	ppu_sram_ce			<= ppu_addr_A13;
	-- chr nes internal sram mirror controle
	ppu_ciram_a10		<= ppu_addr_A10 when MIRRORING_VERTICAL = '0' else 
	                       ppu_addr_A11;
    -- chr nes internal ram enable	                       
	ppu_ciram_ce		<= not ppu_addr_A13;
	
	-- CPU infer registros
	process(romsel, cpu_rw)
	begin
		if rising_edge(romsel) then
			if(cpu_rw = '0') then
				cpu_addr_r(2 downto 0)	<= cpu_data(2 downto 0);
			end if;
		end if;	
	end process;
end Behavioral;
				
			

É incrível como os chips mappers do Nintendinho nos proporcionaram uma diversidade de jogos e experiências únicas. Graças à criatividade e habilidade dos desenvolvedores, eles conseguiram superar as limitações de hardware e entregar títulos memoráveis que marcaram a infância de muitos jogadores.

Se você também é apaixonado por consoles antigos e curte a nostalgia do NES, não deixe de acompanhar nosso blog, pois vamos continuar explorando curiosidades e informações fascinantes sobre essa incrível era dos videogames.

Trazemos hoje um olhar atento a um mapper relativamente simples, que pode ser construído usando apenas alguns circuitos integrados discretos, eliminando a necessidade de um CPLD ou FPGA complexo. Para aprofundar seus conhecimentos sobre esse mapper, visite o site nesdev.org e fique atento ao blog, logo postareis outros mapper do NES.