Revision 317
Added by markw over 10 years ago
sockit/avalon_atari_dma.vhd | ||
---|---|---|
|
||
ARCHITECTURE vhdl OF avalon_atari_dma IS
|
||
SIGNAL BYTE_ADDRESS : STD_LOGIC_VECTOR(1 downto 0);
|
||
SIGNAL SPECIAL_MEM : STD_LOGIC;
|
||
SIGNAL DMA_MEMORY_DATA_LOW : STD_LOGIC_VECTOR(7 downto 0);
|
||
BEGIN
|
||
DMA_FETCH <= (READ or WRITE) and CHIPSELECT;
|
||
DMA_READ_ENABLE <= READ;
|
||
DMA_ADDR <= ADDRESS&BYTE_ADDRESS;
|
||
WAITREQUEST <= NOT(MEMORY_READY_DMA) or not(RESET_N);
|
||
|
||
process(BYTEENABLE, DMA_MEMORY_DATA, WRITEDATA)
|
||
process(ADDRESS)
|
||
begin
|
||
special_mem <= '0';
|
||
-- $00000-$0FFFF = Own ROM/RAM
|
||
-- $10000-$1FFFF = Atari
|
||
-- $20000-$2FFFF = Atari - savestate (gtia/antic/pokey have memory behind them)
|
||
if (or_reduce(std_logic_vector(ADDRESS(21 downto 19))) = '0') then -- special area
|
||
special_mem <= ADDRESS(15);
|
||
end if;
|
||
end process;
|
||
|
||
process(SPECIAL_MEM, DMA_MEMORY_DATA)
|
||
begin
|
||
DMA_MEMORY_DATA_LOW <= DMA_MEMORY_DATA(7 downto 0);
|
||
if (SPECIAL_MEM = '1') then
|
||
DMA_MEMORY_DATA_LOW <= DMA_MEMORY_DATA(15 downto 8);
|
||
end if;
|
||
end process;
|
||
|
||
process(BYTEENABLE, DMA_MEMORY_DATA_LOW, WRITEDATA, SPECIAL_MEM)
|
||
begin
|
||
BYTE_ADDRESS <= "00";
|
||
DMA_8BIT_WRITE_ENABLE <= '0';
|
||
DMA_32BIT_WRITE_ENABLE <= '0';
|
||
... | ... | |
case BYTEENABLE is
|
||
when "0001" =>
|
||
DMA_8BIT_WRITE_ENABLE <= '1';
|
||
READDATA <= DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0);
|
||
READDATA <= DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW;
|
||
DMA_WRITE_DATA <= x"000000"&WRITEDATA(7 downto 0);
|
||
when "0010" =>
|
||
BYTE_ADDRESS <= "01";
|
||
DMA_8BIT_WRITE_ENABLE <= '1';
|
||
READDATA <= DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0);
|
||
READDATA <= DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW;
|
||
DMA_WRITE_DATA <= x"000000"&WRITEDATA(15 downto 8);
|
||
when "0100" =>
|
||
BYTE_ADDRESS <= "10";
|
||
DMA_8BIT_WRITE_ENABLE <= '1';
|
||
READDATA <= DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0);
|
||
READDATA <= DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW;
|
||
DMA_WRITE_DATA <= x"000000"&WRITEDATA(23 downto 16);
|
||
when "1000" =>
|
||
BYTE_ADDRESS <= "11";
|
||
DMA_8BIT_WRITE_ENABLE <= '1';
|
||
READDATA <= DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0)&DMA_MEMORY_DATA(7 downto 0);
|
||
READDATA <= DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW&DMA_MEMORY_DATA_LOW;
|
||
DMA_WRITE_DATA <= x"000000"&WRITEDATA(31 downto 24);
|
||
when "1111" =>
|
||
DMA_32BIT_WRITE_ENABLE <= '1';
|
Also available in: Unified diff
Add shadow hardware regs hack as in zpu