1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-01-20 01:34:38 +00:00

Scramble HW: add Anteater and Losttomb

+ Dark Planet, but buggy
This commit is contained in:
Gyorgy Szombathelyi 2020-02-01 00:26:30 +01:00
parent 2c328833fa
commit 072867e19c
5 changed files with 91 additions and 16 deletions

View File

@ -60,7 +60,9 @@ module ScrambleMist
//`define CORE_NAME "MOONWAR"
//`define CORE_NAME "SPDCOIN"
//`define CORE_NAME "CALIPSO"
`define CORE_NAME "DARKPLNT"
//`define CORE_NAME "DARKPLNT" // video problem
//`define CORE_NAME "ANTEATER"
`define CORE_NAME "LOSTTOMB"
integer hwsel = 0;
reg [7:0] input0;
@ -98,8 +100,21 @@ always @(*) begin
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_two_players, 1'b0, m_one_player, 1'b0 };
input1 = { 4'hf, 2'b00, 1'b0, 1'b0 }; // 6xunused, freeplay, freeze
input2 = { 4'hf, 1'b0, 1'b0, 1'b1, 1'b1}; // 4xunused, lives, difficulty, unknown, unused
end else if (`CORE_NAME == "SPDCOIN") begin
end else if (`CORE_NAME == "DARKPLNT") begin
hwsel = 4;
input0 = ~{ m_coin1, m_coin2, 3'b000, m_two_players | m_fireB, m_one_player | m_fireA, m_fireC };
input1 = 8'h00;
input2 = 8'h00;
end else if (`CORE_NAME == "ANTEATER") begin
hwsel = 5;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_fireA, m_fireB };
input1 = ~{ m_fire2A, m_fire2B, m_left2, m_right2, m_up2, m_down2, 2'b11 };
input2 = ~{ 1'b1, m_two_players, 2'b10, 3'b111, m_one_player };
end else if (`CORE_NAME == "LOSTTOMB") begin
hwsel = 6;
input0 = ~{ m_coin1, m_coin2, m_left, m_right, m_down, m_up, m_one_player, m_two_players };
input1 = ~{ 1'b0, m_fireA, m_left2, m_right2, m_down2, m_up2, 2'b01 };
input2 = ~{ 4'h0, 1'b0, 2'b10, 1'b0 }; //4xunused, demo sounds, 2xcoinage, unused
end
end

View File

@ -383,7 +383,9 @@ begin
cpu_busrq_l <= cpu_addr(15);
end if;
if I_HWSEL = I_HWSEL_SCRAMBLE then
if I_HWSEL = I_HWSEL_DARKPLNT then
if cpu_addr(15) = '1' then page_4to7_l <= '0'; end if;
elsif I_HWSEL = I_HWSEL_SCRAMBLE then
if (cpu_addr(15 downto 14) = "01") then page_4to7_l <= '0'; end if;
else
if (cpu_addr(15 downto 14) = "10") then page_4to7_l <= '0'; end if;
@ -396,7 +398,12 @@ begin
begin
waen_l <= '1';
objen_l <= '1';
if I_HWSEL /= I_HWSEL_FROGGER then
if I_HWSEL = I_HWSEL_DARKPLNT then
if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then
if (cpu_addr(13 downto 11) = "010") then waen_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "011") then objen_l <= '0'; end if;
end if;
elsif I_HWSEL /= I_HWSEL_FROGGER then
if (page_4to7_l = '0') and (cpu_rfsh_l = '1') then
if (cpu_addr(13 downto 11) = "001") then waen_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "010") then objen_l <= '0'; end if;
@ -412,7 +419,11 @@ begin
vramrd_l <= '1';
objramrd_l <= '1';
if I_HWSEL /= I_HWSEL_FROGGER then
if I_HWSEL = I_HWSEL_DARKPLNT then
if (page_4to7_l = '0') and (cpu_rd_l = '0') then
if (cpu_addr(13 downto 11) = "010") then vramrd_l <= '0'; end if;
end if;
elsif I_HWSEL /= I_HWSEL_FROGGER then
if (page_4to7_l = '0') and (cpu_rd_l = '0') then
if (cpu_addr(13 downto 11) = "001") then vramrd_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "010") then objramrd_l <= '0'; end if;
@ -427,7 +438,13 @@ begin
objramwr_l <= '1';
select_l <= '1';
if I_HWSEL /= I_HWSEL_FROGGER then
if I_HWSEL = I_HWSEL_DARKPLNT then
if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then
if (cpu_addr(13 downto 11) = "010") then vramwr_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "001") then objramwr_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "110") then select_l <= '0'; end if; -- control reg
end if;
elsif I_HWSEL /= I_HWSEL_FROGGER then
if (page_4to7_l = '0') and (cpu_wr_l = '0') and (wren = '1') then
if (cpu_addr(13 downto 11) = "001") then vramwr_l <= '0'; end if;
if (cpu_addr(13 downto 11) = "010") then objramwr_l <= '0'; end if;
@ -456,7 +473,9 @@ begin
--6805 ? (POUT2)
--6806 screen vertical flip
--6807 screen horizontal flip
if I_HWSEL /= I_HWSEL_FROGGER then
if I_HWSEL = I_HWSEL_DARKPLNT then
addr := cpu_addr(3 downto 1);
elsif I_HWSEL /= I_HWSEL_FROGGER then
addr := cpu_addr(2 downto 0);
else
addr := cpu_addr(4 downto 2);
@ -491,7 +510,14 @@ begin
p_control_reg_assign : process(control_reg, I_HWSEL)
begin
if I_HWSEL /= I_HWSEL_FROGGER then
if I_HWSEL = I_HWSEL_DARKPLNT then
intst_l <= control_reg(2);
iopc7 <= '0';
pout1 <= '0';
starson <= '0';
hcma <= control_reg(7);
vcma <= not control_reg(6);
elsif I_HWSEL /= I_HWSEL_FROGGER then
-- Scramble
intst_l <= control_reg(1);
iopc7 <= control_reg(2);

View File

@ -398,7 +398,18 @@ begin
i8255_1D_cs_l <= '1';
i8255_1E_cs_l <= '1';
if I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO then
if I_HWSEL = I_HWSEL_DARKPLNT then
-- the interface one
if (I_ADDR(13 downto 11) = "101") and (I_ADDR(15) = '1') then
i8255_1D_cs_l <= '0';
end if;
-- the button one
if (I_ADDR(13 downto 11) = "100") and (I_ADDR(15) = '1') then
i8255_1E_cs_l <= '0';
end if;
i8255_addr <= I_ADDR(3 downto 2);
elsif I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO or I_HWSEL = I_HWSEL_ANTEATER or I_HWSEL = I_HWSEL_LOSTTOMB then
-- the interface one
if (I_ADDR(13 downto 11) = "100") and (I_ADDR(15) = '1') then
i8255_1D_cs_l <= '0';
@ -489,7 +500,12 @@ begin
i8255_1E_pa <= I_PA;
i8255_1E_pb <= I_PB;
i8255_1E_pc <= I_PC when I_HWSEL = I_HWSEL_SCOBRA or I_HWSEL = I_HWSEL_CALIPSO else I_PC or net_1e10_i&'0'&net_1e12_i&"00000";
i8255_1E_pc <= I_PC when I_HWSEL = I_HWSEL_SCOBRA or
I_HWSEL = I_HWSEL_CALIPSO or
I_HWSEL = I_HWSEL_DARKPLNT or
I_HWSEL = I_HWSEL_ANTEATER or
I_HWSEL = I_HWSEL_LOSTTOMB
else I_PC or net_1e10_i&'0'&net_1e12_i&"00000";
O_COIN_COUNTER <= not I_IOPC7; -- open drain actually

View File

@ -8,5 +8,7 @@ package scramble_pack is
constant I_HWSEL_SCOBRA : integer := 2; -- SuperCobra, TazzMania
constant I_HWSEL_CALIPSO : integer := 3; -- Calipso
constant I_HWSEL_DARKPLNT : integer := 4; -- Dark Planet
constant I_HWSEL_ANTEATER : integer := 5; -- Ant Eater (SCOBRA with obj_ram address line obfuscation)
constant I_HWSEL_LOSTTOMB : integer := 6; -- Lost Tomb (SCOBRA with obj_ram address line obfuscation)
end;

View File

@ -407,17 +407,33 @@ begin
end process;
p_obj_rom_addr : process(h256, vram_addr_xor, vram_dout, objdata, I_HCNT, I_HWSEL)
variable obj_rom_addr_base : std_logic_vector(12 downto 0);
begin
obj_rom_addr( 2 downto 0) <= vram_addr_xor(2 downto 0);
obj_rom_addr_base( 2 downto 0) := vram_addr_xor(2 downto 0);
if (h256 = '0') then
-- a
obj_rom_addr(12 downto 3) <= "00" & vram_dout; -- background objects
obj_rom_addr_base(12 downto 3) := "00" & vram_dout; -- background objects
else
obj_rom_addr(12 downto 11) <= "00";
obj_rom_addr_base(12 downto 11) := "00";
if I_HWSEL = I_HWSEL_CALIPSO then
obj_rom_addr(12 downto 11) <= objdata(7 downto 6);
obj_rom_addr_base(12 downto 11) := objdata(7 downto 6);
end if;
obj_rom_addr(10 downto 3) <= objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites
obj_rom_addr_base(10 downto 3) := objdata(5 downto 0) & vram_addr_xor(3) & (objdata(6) xor I_HCNT(3)); -- sprites
end if;
if I_HWSEL = I_HWSEL_ANTEATER then
obj_rom_addr <= "00" & not(obj_rom_addr_base(0) xor obj_rom_addr_base(6)) &
(obj_rom_addr_base(2) xor obj_rom_addr_base(10)) &
obj_rom_addr_base(8 downto 7) &
(obj_rom_addr_base(4) xor obj_rom_addr_base(9) xor (obj_rom_addr_base(2) and obj_rom_addr_base(10))) &
obj_rom_addr_base(5 downto 0);
elsif I_HWSEL = I_HWSEL_LOSTTOMB then
obj_rom_addr <= "00" & ((obj_rom_addr_base(1) and obj_rom_addr_base(7)) or (not obj_rom_addr_base(1) and obj_rom_addr_base(8))) &
obj_rom_addr_base(9) &
(obj_rom_addr_base(7) xor (obj_rom_addr_base(1) and (obj_rom_addr_base(7) xor obj_rom_addr_base(10)))) &
((obj_rom_addr_base(1) and obj_rom_addr_base(8)) or (not obj_rom_addr_base(1) and obj_rom_addr_base(10))) &
obj_rom_addr_base(6 downto 0);
else
obj_rom_addr <= obj_rom_addr_base;
end if;
end process;