A ja zamiast robić nowy cartridge, zrobiłem nowy emulator na FPGA :)


Co do Twojego problemu, AI mówi:
Brakuje wyłączania cartridge'a. To najpewniej jest cały problem.
Jak działa Barbarian: to cartridge typu J(atari)Cart, 256 KB w 32 bankach po 8 KB.
Dostęp do $D500-$D57F wybiera bank o numerze z dolnych 7 bitów adresu i włącza cartridge.
Dostęp do $D580-$D5FF (A7 = 1) wyłącza cartridge. Wtedy linia RD5 idzie w stan niski i pod $A000-$BFFF widać RAM Atari.
Gra mocno z tego korzysta. Program w cartridge'u to spakowany plik XEX z małym loaderem: loader na chwilę włącza bank (STA $D500,X), czyta bajt, wyłącza cartridge (STA $D580) i zapisuje bajt do RAM-u. Sporo danych gry ląduje właśnie pod $A000-$BF89, a potem gra działa z tego RAM-u przy wyłączonym cartridge'u.
Co jest nie tak w jego układzie:
Nie ma sterowania RD5, cartridge jest zawsze widoczny. RAM pod $A000-$BFFF jest więc stale zasłonięty przez EPROM, a dane, które loader tam zapisuje, idą w próżnię.
Ignoruje A7. STA $D580 u niego nie wyłącza cartridge'a, tylko przełącza na bank 0.
Poprawiona wersja: potrzebny jest dodatkowy pin RD5 do złącza cartridge'a, zamiast na sztywno podłączonego +5 V jak w zwykłym cartridge'u. RD5 ma być w stanie wysokim po włączeniu zasilania, żeby Atari w ogóle zauważyło cartridge.
Poprawiony kod:
library ieee;
use ieee.std_logic_1164.all;
entity bankregister is
port (
a : in std_logic_vector(7 downto 0); -- A0..A7
cctl : in std_logic; -- aktywne 0 ($D5xx)
phi2 : in std_logic;
bank : out std_logic_vector(5 downto 0); -- A13..A18 EPROM-u
rd5 : out std_logic -- do RD5 złącza (1 = cartridge widoczny pod $A000)
);
end bankregister;
architecture cartridge of bankregister is
signal b : std_logic_vector(5 downto 0) := (others => '0'); -- start: bank 0
signal en : std_logic := '1'; -- start: włączony
begin
process(phi2)
begin
if falling_edge(phi2) then
if cctl = '0' then
if a(7) = '0' then -- $D500-$D57F: wybór banku + włączenie
b <= a(5 downto 0);
en <= '1';
else -- $D580-$D5FF: wyłączenie
en <= '0';
end if;
end if;
end if;
end process;
bank <= b;
rd5 <= en;
end cartridge;
Dodatkowe uwagi:
Stan po resecie: układ ustawia bank 0 i "włączony" tylko przy włączeniu zasilania. Gdyby po resecie Atari Barbarian nie startował ponownie, trzeba podać sygnał resetu do CPLD albo zrobić reset przez wyłączenie zasilania. W bankach 1-17 tego pliku jest mała procedura, która przełącza z powrotem na bank 0, więc zwykle i tak działa.
Zatrzaskiwanie na opadającym zboczu PHI2: to działa, o ile CCTL i adres trzymają się jeszcze chwilę po tym zboczu. Na prawdziwym Atari zwykle tak jest, ale jeśli wybór banku będzie łapał się niepewnie, lepiej zatrzaskiwać w trakcie PHI2 = 1.
EPROM 4 Mbit przy pliku 256 KB: A18 jest wtedy niepotrzebne, a górna połowa EPROM-u nieużywana. Gra używa tylko banków 0-31, więc to nie przeszkadza.
Post's attachmentsbarbarian1.jpg 277.47 kb, nikt jeszcze nie pobierał tego pliku.
barbarian2.jpg 269.01 kb, nikt jeszcze nie pobierał tego pliku.
Tylko zalogowani mogą pobierać załączniki.