Discussion about software development for the old-school Gameboys, ranging from the "Gray brick" to Gameboy Color
(Launched in 2008)
You are not logged in.
Hi guys
I'm trying to recreat a MBC3 RTC
I divide in steps
• Read a fixed Value when the time is request
• Write to a Buffer/Latch then read back again
• Conect to a external RTC
I'm using this rom to do the tests
https://github.com/meithecatte/mbc3-fiddle
The code reads the fixed number fine, but i can't write to a buffer
The rest of the code (RAM/ROM access) Works fine, just the RTC
Here the parts of the code, that works when the CPU reads the RTC
ARCHITECTURE HARDWARE OF GBC_MBCx IS SIGNAL RAM_RTC_ENA : STD_LOGIC; SIGNAL ROM_BANK : STD_LOGIC_VECTOR (6 DOWNTO 0) := "0000001"; SIGNAL RAM_BANK : STD_LOGIC_VECTOR (1 DOWNTO 0); SIGNAL RTC_REG : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL RTC_TIME : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL CLK_HALT : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; SIGNAL RAM_REG : STD_LOGIC; SIGNAL SEGUNDOS : STD_LOGIC_VECTOR (7 DOWNTO 0) := x"00"; SIGNAL MINUTOS : STD_LOGIC_VECTOR (7 DOWNTO 0) := x"15"; SIGNAL HORAS : STD_LOGIC_VECTOR (7 DOWNTO 0) := x"05"; SIGNAL DIAS0 : STD_LOGIC_VECTOR (7 DOWNTO 0) := x"01"; SIGNAL DIAS1 : STD_LOGIC_VECTOR (7 DOWNTO 0) := x"00"; SIGNAL RTC_SEC : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL RTC_MIN : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL RTC_HORA : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL RTC_DIAS0 : STD_LOGIC_VECTOR (7 DOWNTO 0); SIGNAL RTC_DIAS1 : STD_LOGIC_VECTOR (7 DOWNTO 0); BEGIN
WHEN "010" => --$4000 ~ $5FFF (RAM Bank/RTC Register) CASE GBC_DATA (3 DOWNTO 0)IS ---------SRAM---------- WHEN "0000" => RAM_BANK <= "00"; RAM_REG <= '1'; WHEN "0001" => RAM_BANK <= "01"; RAM_REG <= '1'; WHEN "0010" => RAM_BANK <= "10"; RAM_REG <= '1'; WHEN "0011" => RAM_BANK <= "11"; RAM_REG <= '1'; ----------RTC----------- WHEN "1000" => --$08 SEGUNDOS RTC_REG <= x"08"; RAM_REG <= '0'; WHEN "1001" => --$09 MINUTOS RTC_REG <= x"09";--MINUTOS; RAM_REG <= '0'; WHEN "1010" => --$0A HORAS RTC_REG <= x"0A";--HORAS; RAM_REG <= '0'; WHEN "1011" => --$0B DIAS RTC_REG <= x"0B";--DIAS; RAM_REG <= '0'; WHEN "1100" => --$0C RTC_REG <= x"0C";--DIAS1; RAM_REG <= '0'; WHEN OTHERS => NULL; END CASE; WHEN OTHERS => NULL; END CASE;
GBC_DATA <= RTC_SEC WHEN GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND RTC_REG = x"08" AND RAM_REG = '0' ELSE "ZZZZZZZZ"; GBC_DATA <= RTC_MIN WHEN GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND RTC_REG = x"09" AND RAM_REG = '0' ELSE "ZZZZZZZZ"; GBC_DATA <= RTC_HORA WHEN GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND RTC_REG = x"0A" AND RAM_REG = '0' ELSE "ZZZZZZZZ"; GBC_DATA <= RTC_DIAS0 WHEN GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND RTC_REG = x"0B" AND RAM_REG = '0' ELSE "ZZZZZZZZ"; GBC_DATA <= RTC_DIAS1 WHEN GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND RTC_REG = x"0C" AND RAM_REG = '0' ELSE "ZZZZZZZZ"; CLK_WAIT:PROCESS(GBC_CLK) BEGIN IF RISING_EDGE (GBC_CLK) THEN CLK_HALT <= CLK_HALT + 1; END IF; END PROCESS; RTC_RD:PROCESS(RTC_REG, GBC_ADDRESS, RAM_RTC_ENA, SEGUNDOS, CLK_HALT)--, MINUTOS, HORAS, DIAS, DIAS1) BEGIN IF GBC_ADDRESS(15 DOWNTO 13) = "101" AND RAM_RTC_ENA = '1' AND GBC_CS = '1' AND GBC_WR = '1' AND CLK_HALT = "11" THEN CASE RTC_REG IS WHEN x"08" => -- SEGUNDOS RTC_SEC <= SEGUNDOS; WHEN x"09" => RTC_MIN <= MINUTOS; WHEN x"0A" => RTC_HORA <= HORAS; WHEN x"0B" => RTC_DIAS0 <= DIAS0; WHEN x"0C" => RTC_DIAS1 <= DIAS1; WHEN OTHERS => GBC_DATA <= "ZZZZZZZZ"; END CASE; END IF; END PROCESS;
Huge thanks for the support
Offline