Project

General

Profile

-- -----------------------------------------------------------------------
--
-- Turbo Chameleon
--
-- Multi purpose FPGA expansion for the Commodore 64 computer
--
-- -----------------------------------------------------------------------
-- Copyright 2005-2018 by Peter Wendrich (pwsoft@syntiac.com)
-- http://www.syntiac.com
--
-- This source file is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Lesser General Public License as published
-- by the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This source file is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
--
-- -----------------------------------------------------------------------
--
-- Chameleon timing and I/O driver. Handles all the timing and multiplexing
-- details of the cartridge port for the Chameleon second edition.
-- - Detects the type of mode the chameleon is running in.
-- - Multiplexes the PS/2 keyboard and mouse signals.
-- - Gives access to joysticks and keyboard on a C64 in cartridge mode.
-- - Gives access to joysticks and keyboard on a docking-station
-- - Gives access to MMC card and serial-flash through
-- - Drives the two LEDs on the Chameleon (or an optional Amiga keyboard).
-- - Can optionally give access to the IEC bus
-- - Can optionally give access to other C64 resources like the SID.
--
-- -----------------------------------------------------------------------
-- enable_docking_station - Enable support for the docking-station.
-- enable_cdtv_remove - Enable support for the cdtv remote. CDTV will
-- be mapped to first two joysticks and the "keys"
-- array when set to true. Otherwise the raw ir signal
-- is also available for external decoding.
-- enable_c64_joykeyb - Automatically read joystick and keyboard on the C64 bus.
-- Take note this disables the C64 bus access feature
-- on this entity (c64_* inputs).
-- enable_c64_4player - Enable 4player support on the user-port of the C64.
-- The flag enable_c64_joykeyb must be true for this to work.
-- -----------------------------------------------------------------------
-- clk - system clock
-- ena_1mhz - Enable must be '1' one clk cycle each 1 Mhz.
-- phi2_n - PHI2 clock from the cartridge port (inverted on Chameleon)
-- dotclock_n - Dotclock from the cartridge port (inverted on Chameleon)
--
-- reset - Perform a reset of the subsystems. Should be high directly at
-- start and stay high for a while to give soft PLL time to
-- lock to phi2_n (in cartridge mode).
--
-- ir_data - Data from IR-eye for decoding the CDTV remote signals
-- ioef - Combined IO_E and IO_F from the cartridge port
-- romlh - Combined ROML and ROMH from the cartridge port
-- dma_out - Drives DMA line, when high pulls DMA signal low
-- rw_out - Drives R/W line, when high pulls R/W signal low.
--
-- sa_dir
-- sa_oe
-- sa15_out
-- low_a
-- sd_dir
-- sd_oe
-- low_d
--
-- no_clock - '0' when connected to C64 cartridge port.
-- '1' when in standalone mode or docking-station connected.
-- docking_station - '0' standalone/cartrdige mode
-- '1' when docking-station is connected.
-- -----------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- -----------------------------------------------------------------------

entity chameleon2_io is
generic (
enable_docking_station : boolean := true;
enable_cdtv_remote : boolean := false;
enable_c64_joykeyb : boolean := false;
enable_c64_4player : boolean := false
);
port (
-- Clocks
clk : in std_logic;
ena_1mhz : in std_logic;
phi2_n : in std_logic;
dotclock_n : in std_logic;

-- Control
reset : in std_logic;
-- Toplevel signals
ir_data : in std_logic;

clock_ior : out std_logic;
clock_iow : out std_logic;

ioef : in std_logic;
romlh : in std_logic;
dma_out : out std_logic;
game_out : out std_logic;
exrom_out : out std_logic;

ba_in : in std_logic;
-- rw_in : in std_logic;
rw_out : out std_logic;

sa_dir : out std_logic;
sa_oe : out std_logic;
sa15_out : out std_logic;
low_a : inout unsigned(15 downto 0);

sd_dir : out std_logic;
sd_oe : out std_logic;
low_d : inout unsigned(7 downto 0);

-- Config
no_clock : out std_logic;
docking_station : out std_logic;

-- C64 timing (only for C64 related cores)
phi_mode : in std_logic := '0';
phi_out : out std_logic;
phi_cnt : out unsigned(7 downto 0);
phi_end_0 : out std_logic;
phi_end_1 : out std_logic;
phi_post_1 : out std_logic;
phi_post_2 : out std_logic;
phi_post_3 : out std_logic;
phi_post_4 : out std_logic;
-- C64 bus (only for C64 related cores)
c64_vicii_data : in unsigned(7 downto 0) := (others => '1');
c64_cs : in std_logic := '0';
c64_cs_roms : in std_logic := '0';
c64_cs_vicii : in std_logic := '0';
c64_cs_clockport : in std_logic := '0';
c64_we : in std_logic := '0';
c64_a : in unsigned(15 downto 0) := (others => '0');
c64_d : in unsigned(7 downto 0) := (others => '1');
c64_q : out unsigned(7 downto 0);

-- Joysticks
joystick1 : out unsigned(5 downto 0);
joystick2 : out unsigned(5 downto 0);
joystick3 : out unsigned(5 downto 0);
joystick4 : out unsigned(5 downto 0);

-- Keyboards
-- 0 = col0, row0
-- 1 = col1, row0
-- 8 = col0, row1
-- 63 = col7, row7
keys : out unsigned(63 downto 0);
restore_key_n : out std_logic;
amiga_reset_n : out std_logic;
amiga_trigger : out std_logic;
amiga_scancode : out unsigned(7 downto 0)
);
end entity;
(11-11/48)