Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
5 changes: 5 additions & 0 deletions Programming Files/Firmware 2024-10-04/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Firmware updated by AsCrNet

- support the ATARIMAX 8MBIT NEW cartridge.

documentation of the [.CAR](https://github.com/atari800/atari800/blob/master/DOC/cart.txt) format
110 changes: 102 additions & 8 deletions Source/QuartusProject/Max10_SD/atari_rom.vhd
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,20 @@ ARCHITECTURE structure OF atari_rom IS
constant CART_TYPE_TURBOSOFT : integer := 36;
constant CART_TYPE_ATRAX_128K : integer := 37;
constant CART_TYPE_4K : integer := 38;
constant CART_TYPE_ATARIMAX_8MBIT_NEW : integer := 39;
constant CART_TYPE_JACART_8K : integer := 40;
constant CART_TYPE_JACART_16K : integer := 41;
constant CART_TYPE_JACART_32K : integer := 42;
constant CART_TYPE_JACART_64K : integer := 43;
constant CART_TYPE_JACART_128K : integer := 44;
constant CART_TYPE_JACART_256K : integer := 45;
constant CART_TYPE_JACART_512K : integer := 46;
constant CART_TYPE_JACART_1024K : integer := 47;
constant CART_TYPE_LOW_BANK_8K : integer := 48;
constant CART_TYPE_2K : integer := 49;
constant CART_TYPE_SIC_PLUS_8MBIT : integer := 50;
constant CART_TYPE_ULTRACART_32K : integer := 51;
constant CART_TYPE_DCART_512K : integer := 52;
constant CART_TYPE_XEX : integer := 254;
constant CART_TYPE_NONE : integer := 255;

Expand Down Expand Up @@ -126,6 +140,13 @@ ARCHITECTURE structure OF atari_rom IS
signal sic_d500_byte : std_logic_vector(7 downto 0);
signal sic_read_d500 : boolean := false;

-- Ultracart
signal ultracart_bank : std_logic_vector(1 downto 0) := "00";
signal ultracart_enabled : std_logic := '1';

-- DCart
signal dcart_read_d500 : boolean := false;

-- XEX access
signal file_offset: std_logic_vector(15 downto 0);
signal xex_read_d500 : boolean := false;
Expand Down Expand Up @@ -207,7 +228,7 @@ BEGIN
CART_RD5 <= high_bank_enabled;
CART_RD4 <= low_bank_enabled;

CART_DATA <= data_out when ((CART_S5 = '0' and high_bank_enabled = '1') or (CART_S4 = '0' and low_bank_enabled = '1') or (CART_CTL = '0' and (sic_read_d500 or xex_read_d500)))
CART_DATA <= data_out when ((CART_S5 = '0' and high_bank_enabled = '1') or (CART_S4 = '0' and low_bank_enabled = '1') or (CART_CTL = '0' and (sic_read_d500 or xex_read_d500 or dcart_read_d500 )))
else "ZZZZZZZZ";

sram_cart_bus_enabled <= '0' when cart_type = CART_TYPE_BOOT else '1';
Expand All @@ -225,10 +246,13 @@ BEGIN
cart_s5_reg <= CART_S5;
cart_rw_reg <= CART_RW;
-- SIC D500-D51F read ?
sic_read_d500 <= (cart_type = CART_TYPE_SIC and CART_CTL = '0'
sic_read_d500 <= ((cart_type = CART_TYPE_SIC or cart_type = CART_TYPE_SIC_PLUS_8MBIT) and CART_CTL = '0'
and CART_RW = '1' and CART_ADDR(7 downto 5) = "000");
-- XEX D500-D5FF read ?
xex_read_d500 <= (cart_type = CART_TYPE_XEX and CART_CTL = '0' and CART_RW = '1');

-- DCART D500-D5FF read?
dcart_read_d500 <= (cart_type = CART_TYPE_DCART_512K and CART_CTL = '0' and CART_RW = '1');
end if;
end process;

Expand Down Expand Up @@ -257,6 +281,8 @@ BEGIN
low_bank_enabled <= '1';
elsif (new_cart_type = CART_TYPE_ATARIMAX_8MBIT) then
bank_out <= "1111111";
elsif (new_cart_type = CART_TYPE_ATARIMAX_8MBIT_NEW) then
bank_out <= "0000000";
elsif (new_cart_type >= CART_TYPE_XEGS_32K and new_cart_type <= CART_TYPE_XEGS_1024K) then
low_bank_enabled <= '1';
elsif (new_cart_type >= CART_TYPE_SW_XEGS_32K and new_cart_type <= CART_TYPE_SW_XEGS_1024K) then
Expand All @@ -271,9 +297,11 @@ BEGIN
oss_bank <= "01";
elsif (new_cart_type = CART_TYPE_OSS_16K_034M or new_cart_type = CART_TYPE_OSS_16K_043M) then
oss_bank <= "00";
elsif (new_cart_type = CART_TYPE_SIC) then
low_bank_enabled <= '1';
elsif (new_cart_type = CART_TYPE_SIC or new_cart_type = CART_TYPE_SIC_PLUS_8MBIT) then
sic_d500_byte <= (others => '0');
elsif (new_cart_type = CART_TYPE_LOW_BANK_8K) then
low_bank_enabled <= '1';
high_bank_enabled <= '0';
end if;
cart_type <= new_cart_type;
end if;
Expand All @@ -294,7 +322,7 @@ BEGIN
bank_out <= "000" & cart_addr_reg(3 downto 0);
end if;
-- atarimax 8mbit bankswitching
when CART_TYPE_ATARIMAX_8MBIT =>
when CART_TYPE_ATARIMAX_8MBIT | CART_TYPE_ATARIMAX_8MBIT_NEW =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= cart_addr_reg(6 downto 0);
-- xegs carts - schematic has RW as NC
Expand Down Expand Up @@ -376,6 +404,47 @@ BEGIN
when CART_TYPE_ATRAX_128K =>
high_bank_enabled <= not CART_DATA(7);
bank_out <= "000" & CART_DATA(3 downto 0);
-- Jataricart 8k & 1024k
when CART_TYPE_JACART_8K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "0000000";
when CART_TYPE_JACART_16K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "000000" & cart_addr_reg(0);
when CART_TYPE_JACART_32K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "00000" & cart_addr_reg(1 downto 0);
when CART_TYPE_JACART_64K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "0000" & cart_addr_reg(2 downto 0);
when CART_TYPE_JACART_128K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "000" & cart_addr_reg(3 downto 0);
when CART_TYPE_JACART_256K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "00" & cart_addr_reg(4 downto 0);
when CART_TYPE_JACART_512K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= "0" & cart_addr_reg(5 downto 0);
when CART_TYPE_JACART_1024K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= cart_addr_reg(6 downto 0);
-- Ultracart 32k
when CART_TYPE_ULTRACART_32K =>
if (cart_rw_reg = '1') then
if (ultracart_enabled = '1') then
if (ultracart_bank = "11") then
ultracart_enabled <= '0';
high_bank_enabled <= '0';
else
ultracart_bank <= std_logic_vector(unsigned(ultracart_bank) + 1);
end if;
else
ultracart_enabled <= '1';
ultracart_bank <= "00";
high_bank_enabled <= '1';
end if;
end if;
when others => null;
end case;

Expand Down Expand Up @@ -404,6 +473,18 @@ BEGIN
bank_out <= "00" & CART_DATA(4 downto 0);
sic_d500_byte <= CART_DATA;
end if;
-- Sic plus
when CART_TYPE_SIC_PLUS_8MBIT =>
if (cart_addr_reg(7 downto 6) = "00") then
high_bank_enabled <= not CART_DATA(6);
low_bank_enabled <= CART_DATA(5);
bank_out <= "0" & CART_DATA(7) & CART_DATA(4 downto 0);
sic_d500_byte <= CART_DATA;
end if;
-- DCART bankswitching
when CART_TYPE_DCART_512K =>
high_bank_enabled <= not cart_addr_reg(7);
bank_out <= '0' & cart_addr_reg(5 downto 0);
-- xex loader support - D500,D501 are lo-byte hi-byte of file offset (in 256 byte chunks)
when CART_TYPE_XEX =>
if (cart_addr_reg(7 downto 0) = x"00") then
Expand Down Expand Up @@ -450,7 +531,7 @@ BEGIN
-- When we get a new address from the cartridge port, set up the RAM address bus
-- to get the correct data
process (cart_addr_reg, cart_s4_reg, cart_s5_reg, cart_ctl_reg,
cart_type, bank_out, bounty_bob_bank8, bounty_bob_bank9, oss_bank)
cart_type, bank_out, bounty_bob_bank8, bounty_bob_bank9, oss_bank, dcart_read_d500)
begin
fpga_address_in <= (others => '0');
sram_address_in <= (others => '0');
Expand All @@ -467,7 +548,7 @@ BEGIN

elsif (cart_type /= CART_TYPE_NONE) then

if (cart_s5_reg = '0' or cart_s4_reg = '0') then
if (cart_s5_reg = '0' or cart_s4_reg = '0' or dcart_read_d500) then
sram_ce <= '1';
end if;

Expand Down Expand Up @@ -532,7 +613,7 @@ BEGIN
else
sram_address_in <= "00000011" & cart_addr_reg(11 downto 0); -- 0xB000 access
end if;
when CART_TYPE_SIC | CART_TYPE_MEGACART_16K | CART_TYPE_MEGACART_32K | CART_TYPE_MEGACART_64K |
when CART_TYPE_SIC | CART_TYPE_SIC_PLUS_8MBIT | CART_TYPE_MEGACART_16K | CART_TYPE_MEGACART_32K | CART_TYPE_MEGACART_64K |
CART_TYPE_MEGACART_128K | CART_TYPE_MEGACART_256K | CART_TYPE_MEGACART_512K | CART_TYPE_MEGACART_1024K =>
if (cart_s4_reg = '0') then
sram_address_in <= bank_out(5 downto 0) & "0" & cart_addr_reg;
Expand All @@ -541,6 +622,19 @@ BEGIN
end if;
when CART_TYPE_4k =>
sram_address_in <= "00000000" & cart_addr_reg(11 downto 0); -- 0xB000 access
when CART_TYPE_2k =>
sram_address_in <= "000000000" & cart_addr_reg(10 downto 0); -- 0xB800 access
when CART_TYPE_ULTRACART_32K =>
if (ultracart_enabled = '1' and cart_s5_reg = '0') then
sram_address_in <= "00000" & ultracart_bank & cart_addr_reg(12 downto 0);
else
sram_ce <= '0';
end if;
when CART_TYPE_DCART_512K =>
if dcart_read_d500 then
-- Map to what is B5xx
sram_address_in <= bank_out & "10101" & cart_addr_reg(7 downto 0);
end if;
when others => null;
end case;

Expand Down
31 changes: 31 additions & 0 deletions Source/QuartusProject/Max10_SD/software/sdcard/ultimate.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,20 @@ static int ledVal = 0x1E;
#define CART_TYPE_TURBOSOFT 36 // 64k,128k
#define CART_TYPE_ATRAX_128K 37 // 128k
#define CART_TYPE_4_K 38 // 4k
#define CART_TYPE_ATARIMAX_8MBIT_N 39 // 1024k
#define CART_TYPE_JACART_8K 40 // 8k
#define CART_TYPE_JACART_16K 41 // 16k
#define CART_TYPE_JACART_32K 42 // 32k
#define CART_TYPE_JACART_64K 43 // 64k
#define CART_TYPE_JACART_128K 44 // 128k
#define CART_TYPE_JACART_256K 45 // 256k
#define CART_TYPE_JACART_512K 46 // 512k
#define CART_TYPE_JACART_1024K 47 // 1024k
#define CART_TYPE_LOW_BANK_8K 48 // 8k
#define CART_TYPE_2_K 49 // 2k
#define CART_TYPE_SIC_PLUS_8MBIT 50 // 1024k
#define CART_TYPE_ULTRACART_32K 51 // 32k
#define CART_TYPE_DCART_512K 52 // 512k
#define CART_TYPE_XEX 254
#define CART_TYPE_NONE 255

Expand Down Expand Up @@ -326,11 +340,28 @@ int load_cart(char *filename)
else if (car_type == 44) cart_type = CART_TYPE_OSS_8K;
else if (car_type == 45) cart_type = CART_TYPE_OSS_16K_043M;
else if (car_type == 50 || car_type == 51) cart_type = CART_TYPE_TURBOSOFT;
else if (car_type == 52) cart_type = CART_TYPE_ULTRACART_32K;
else if (car_type == 53) cart_type = CART_TYPE_LOW_BANK_8K;
else if (car_type >= 54 && car_type <=56) cart_type = CART_TYPE_SIC;
else if (car_type == 57 ) {
cart_type = CART_TYPE_2_K;
memset(dst32, 255, 6144);
}
else if (car_type == 58 ) {
cart_type = CART_TYPE_4_K;
memset(dst32, 255, 4096);
}
else if (car_type == 83) cart_type = CART_TYPE_SIC_PLUS_8MBIT;
else if (car_type == 75) cart_type = CART_TYPE_ATARIMAX_8MBIT_N;
else if (car_type == 104) cart_type = CART_TYPE_JACART_8K;
else if (car_type == 105) cart_type = CART_TYPE_JACART_16K;
else if (car_type == 106) cart_type = CART_TYPE_JACART_32K;
else if (car_type == 107) cart_type = CART_TYPE_JACART_64K;
else if (car_type == 108) cart_type = CART_TYPE_JACART_128K;
else if (car_type == 109) cart_type = CART_TYPE_JACART_256K;
else if (car_type == 110) cart_type = CART_TYPE_JACART_512K;
else if (car_type == 111) cart_type = CART_TYPE_JACART_1024K;
else if (car_type == 112) cart_type = CART_TYPE_DCART_512K;
else { cart_type = -2; break; } // unsupported car type
bytesToCopy -= 16;
src32 += 4;
Expand Down