diff --git a/Programming Files/Firmware 2024-10-04/Max10_SD_10_04_2024.pof b/Programming Files/Firmware 2024-10-04/Max10_SD_10_04_2024.pof new file mode 100644 index 0000000..35c8dbf Binary files /dev/null and b/Programming Files/Firmware 2024-10-04/Max10_SD_10_04_2024.pof differ diff --git a/Programming Files/Firmware 2024-10-04/README.md b/Programming Files/Firmware 2024-10-04/README.md new file mode 100644 index 0000000..f3af932 --- /dev/null +++ b/Programming Files/Firmware 2024-10-04/README.md @@ -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 \ No newline at end of file diff --git a/Source/QuartusProject/Max10_SD/atari_rom.vhd b/Source/QuartusProject/Max10_SD/atari_rom.vhd index 13a0c7f..73088cf 100644 --- a/Source/QuartusProject/Max10_SD/atari_rom.vhd +++ b/Source/QuartusProject/Max10_SD/atari_rom.vhd @@ -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; @@ -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; @@ -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'; @@ -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; @@ -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 @@ -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; @@ -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 @@ -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; @@ -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 @@ -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'); @@ -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; @@ -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; @@ -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; diff --git a/Source/QuartusProject/Max10_SD/software/sdcard/ultimate.c b/Source/QuartusProject/Max10_SD/software/sdcard/ultimate.c index d277142..aabb708 100644 --- a/Source/QuartusProject/Max10_SD/software/sdcard/ultimate.c +++ b/Source/QuartusProject/Max10_SD/software/sdcard/ultimate.c @@ -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 @@ -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;