Project

General

Profile

---------------------------------------------------------------------------
-- (c) 2013 mark watson
-- I am happy for anyone to use this for non-commercial use.
-- If my vhdl files are used commercially or otherwise sold,
-- please contact me for explicit permission at scrameta (gmail).
-- This applies for source and binary form and derived works.
---------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use IEEE.STD_LOGIC_MISC.all;


ENTITY mmu IS
GENERIC
(
system : integer := 0 -- 0=Atari XL,1=Atari 800, 10=Atari5200 (space left for more systems)
);
PORT
(
ADDR : IN STD_LOGIC_VECTOR(15 DOWNTO 11);
REF_N : IN STD_LOGIC;
RD4 : IN STD_LOGIC;
RD5 : IN STD_LOGIC;
MPD_N : IN STD_LOGIC;
REN : IN STD_LOGIC; --ROM ON on/off
BE_N: IN STD_LOGIC; --BASIC ON on/off
MAP_N : IN STD_LOGIC;
S4_N : OUT STD_LOGIC;
S5_N : OUT STD_LOGIC;
BASIC : OUT STD_LOGIC;
IO : OUT STD_LOGIC;
OS : OUT STD_LOGIC;
CI : OUT STD_LOGIC
);

END mmu;

ARCHITECTURE vhdl of mmu is
signal S4 : std_logic;
signal S5 : std_logic;
signal OSEN : std_logic;

signal BASIC_INT : std_logic;
signal OS_INT : std_logic;
signal IO_INT : std_logic;
BEGIN
--CHIP MMU800XL GAL16V8 COMPLEX_MODE
--
--A11 A12 A13 A14 A15 MAP RD4 RD5 REN GND
--REF S5 BASIC MPD OS CI IO BE S4 VCC
--
--/S4 = /A13 & /A14 & A15 & RD4 & REF;
--/S5 = A13 & /A14 & A15 & RD5 & REF;
--
--/IO = A12 & /A11 & /A13 & A14 & A15 & REF;
--
--/OS = A13 & A14 & A15 & REN & REF
--+ /A12 & /A13 & A14 & A15 & REN & REF
--+ A12 & A11 & /A13 & A14 & A15 & MPD & REN & REF
--+ A12 & /A11 & /A13 & A14 & /A15 & /MAP & REN & REF;
--
--/CI = /A13 & /A14 & A15 & RD4 & REF
--+ A13 & /A14 & A15 & RD5 & REF
--+ A13 & /BE & /A14 & A15 & /RD5 & REF
--+ /OS
--+ A12 & /A11 & /A13 & A14 & A15 & REF
--+ /REF;
--
--/BASIC = A13 & /BE & /A14 & A15 & /RD5 & REF;

S4 <= not(ADDR(13)) and NOT(ADDR(14)) and ADDR(15) and RD4 and REF_N; --100X (8000-9fff)
S5 <= ADDR(13) and NOT(ADDR(14)) and ADDR(15) and RD5 and REF_N; --101x (A000-Bfff)
IO_INT <= ADDR(12) and NOT(ADDR(11)) and NOT(ADDR(13)) and ADDR(14) and ADDR(15) and REF_N; --11010 (D000-D7ff)

OSEN <= REN and REF_N;
OS_INT <= (ADDR(13) and ADDR(14) and ADDR(15) and OSEN) --111x (E000-Ffff)
or (not(ADDR(12)) and not(ADDR(13)) and ADDR(14) and ADDR(15) and OSEN) --1100 (C000-Cfff)
or (ADDR(12) and ADDR(11) and not(ADDR(13)) and ADDR(14) and ADDR(15) and MPD_N and OSEN) --11011(D800-Dfff)
or (ADDR(12) and NOT(ADDR(11)) and not(ADDR(13)) and ADDR(14) and NOT(ADDR(15)) and NOT(MAP_N) and OSEN); --01010(5000-5fff) self test

CI <= S4
or S5
or BASIC_INT
or OS_INT
or IO_INT
or not(REF_N); --Refresh cycle

BASIC_INT <= ADDR(13) and not(BE_N) and not(ADDR(14)) and ADDR(15) and NOT(RD5) and REF_N; --101x (A000-Bfff) when no cart and basic on

S4_N <= not(S4);
S5_N <= not(S5);

BASIC <= BASIC_INT;
OS <= OS_INT;
IO <= IO_INT;

END vhdl;

(37-37/63)