Project

General

Profile

177 markw
--------------------------------------------------------------------------- -- (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;

LIBRARY work;

233 markw
ENTITY atari5200core_mist IS
925 markw
GENERIC
(
CSYNC : IN integer
);
177 markw
PORT
(
CLOCK_27 : IN STD_LOGIC_VECTOR(1 downto 0);

VGA_VS : OUT STD_LOGIC;
VGA_HS : OUT STD_LOGIC;
VGA_B : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
VGA_G : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
VGA_R : OUT STD_LOGIC_VECTOR(5 DOWNTO 0);

AUDIO_L : OUT std_logic;
AUDIO_R : OUT std_logic;

SDRAM_BA : OUT STD_LOGIC_VECTOR(1 downto 0);
SDRAM_nCS : OUT STD_LOGIC;
SDRAM_nRAS : OUT STD_LOGIC;
SDRAM_nCAS : OUT STD_LOGIC;
SDRAM_nWE : OUT STD_LOGIC;
SDRAM_DQMH : OUT STD_LOGIC;
SDRAM_DQML : OUT STD_LOGIC;
SDRAM_CLK : OUT STD_LOGIC;
SDRAM_CKE : OUT STD_LOGIC;
SDRAM_A : OUT STD_LOGIC_VECTOR(12 DOWNTO 0);
SDRAM_DQ : INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);

LED : OUT std_logic;

UART_TX : OUT STD_LOGIC;
UART_RX : IN STD_LOGIC;

SPI_DO : INOUT STD_LOGIC;
SPI_DI : IN STD_LOGIC;
SPI_SCK : IN STD_LOGIC;
SPI_SS2 : IN STD_LOGIC;
SPI_SS3 : IN STD_LOGIC;
SPI_SS4 : IN STD_LOGIC;
CONF_DATA0 : IN STD_LOGIC -- AKA SPI_SS5
);
233 markw
END atari5200core_mist;
177 markw
233 markw
ARCHITECTURE vhdl OF atari5200core_mist IS
177 markw
component hq_dac
port (
reset :in std_logic;
clk :in std_logic;
clk_ena : in std_logic;
pcm_in : in std_logic_vector(19 downto 0);
dac_out : out std_logic
);
end component;

841 markw
COMPONENT rgb2ypbpr
PORT (
red : IN std_logic_vector(5 DOWNTO 0);
green : IN std_logic_vector(5 DOWNTO 0);
blue : IN std_logic_vector(5 DOWNTO 0);
y : OUT std_logic_vector(5 DOWNTO 0);
pb : OUT std_logic_vector(5 DOWNTO 0);
pr : OUT std_logic_vector(5 DOWNTO 0)
);
END COMPONENT;
220 markw
841 markw
component osd
generic ( OSD_COLOR : integer := 1 ); -- blue
port (
clk_sys : in std_logic;
R_in : in std_logic_vector(5 downto 0);
G_in : in std_logic_vector(5 downto 0);
B_in : in std_logic_vector(5 downto 0);
HSync : in std_logic;
VSync : in std_logic;
220 markw
841 markw
R_out : out std_logic_vector(5 downto 0);
G_out : out std_logic_vector(5 downto 0);
B_out : out std_logic_vector(5 downto 0);
220 markw
841 markw
SPI_SCK : in std_logic;
SPI_SS3 : in std_logic;
SPI_DI : in std_logic
);
end component osd;
220 markw
841 markw
component user_io
generic (
STRLEN : integer := 0;
PS2DIV : integer := 1500 );
port (
clk_sys : in std_logic;
clk_sd : in std_logic;
SPI_CLK, SPI_SS_IO, SPI_MOSI :in std_logic;
SPI_MISO : out std_logic;
conf_str : in std_logic_vector(8*STRLEN-1 downto 0);
joystick_0 : out std_logic_vector(31 downto 0);
joystick_1 : out std_logic_vector(31 downto 0);
joystick_analog_0 : out std_logic_vector(15 downto 0);
joystick_analog_1 : out std_logic_vector(15 downto 0);
status: out std_logic_vector(31 downto 0);
switches : out std_logic_vector(1 downto 0);
buttons : out std_logic_vector(1 downto 0);
scandoubler_disable: out std_logic;
ypbpr: out std_logic;
ps2_kbd_clk : out std_logic;
ps2_kbd_data : out std_logic;
ps2_mouse_clk : out std_logic;
ps2_mouse_data : out std_logic;
serial_data : in std_logic_vector(7 downto 0);
serial_strobe : in std_logic
);
end component user_io;
220 markw
841 markw
component data_io
port (
clk_sys : in std_logic;
177 markw
841 markw
SPI_SCK : in std_logic;
SPI_SS2 : in std_logic;
SPI_DI : in std_logic;
220 markw
841 markw
ioctl_wait : in std_logic;
ioctl_download : out std_logic;
ioctl_index : out std_logic_vector(7 downto 0);
ioctl_wr : out std_logic;
ioctl_addr : out std_logic_vector(24 downto 0);
ioctl_dout : out std_logic_vector(15 downto 0)
);
end component data_io;
177 markw
841 markw
signal AUDIO_L_PCM : std_logic_vector(15 downto 0);
signal AUDIO_R_PCM : std_logic_vector(15 downto 0);
177 markw
841 markw
signal VGA_VS_RAW : std_logic;
signal VGA_HS_RAW : std_logic;
signal VGA_CS_RAW : std_logic;
177 markw
841 markw
signal RESET_n : std_logic;
signal PLL_LOCKED : std_logic;
signal CLK : std_logic;
signal CLK_SDRAM : std_logic;
177 markw
841 markw
SIGNAL PS2_CLK : std_logic;
SIGNAL PS2_DAT : std_logic;
SIGNAL FKEYS : std_logic_vector(11 downto 0);
177 markw
841 markw
signal capslock_pressed : std_logic;
signal capsheld_next : std_logic;
signal capsheld_reg : std_logic;
177 markw
841 markw
signal spi_miso_io : std_logic;
177 markw
841 markw
signal mist_buttons : std_logic_vector(1 downto 0);
signal mist_switches : std_logic_vector(1 downto 0);
signal mist_status : std_logic_vector(31 downto 0);
signal mist_JOY1X : std_logic_vector(7 downto 0);
signal mist_JOY1Y : std_logic_vector(7 downto 0);
signal mist_JOY2X : std_logic_vector(7 downto 0);
signal mist_JOY2Y : std_logic_vector(7 downto 0);
177 markw
841 markw
signal JOY1 : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal JOY2 : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal JOY1X : std_logic_vector(7 downto 0);
signal JOY1Y : std_logic_vector(7 downto 0);
signal JOY2X : std_logic_vector(7 downto 0);
signal JOY2Y : std_logic_vector(7 downto 0);
signal JOY1_n : STD_LOGIC_VECTOR(4 DOWNTO 0);
signal JOY2_n : STD_LOGIC_VECTOR(4 DOWNTO 0);
signal joy_still : std_logic;
842 markw
signal FIRE2: std_logic_vector(3 downto 0);
177 markw
841 markw
SIGNAL KEYBOARD_RESPONSE : STD_LOGIC_VECTOR(1 DOWNTO 0);
SIGNAL KEYBOARD_SCAN : STD_LOGIC_VECTOR(5 DOWNTO 0);
signal controller_select : std_logic_vector(1 downto 0);
177 markw
841 markw
SIGNAL PAL : std_logic;
SIGNAL COMPOSITE_ON_HSYNC : std_logic;
SIGNAL VGA : std_logic;
177 markw
841 markw
signal SDRAM_REQUEST : std_logic;
signal SDRAM_REQUEST_COMPLETE : std_logic;
signal SDRAM_READ_ENABLE : STD_LOGIC;
signal SDRAM_WRITE_ENABLE : std_logic;
signal SDRAM_ADDR_OUT : STD_LOGIC_VECTOR(22 DOWNTO 0);
signal SDRAM_ADDR_IN : STD_LOGIC_VECTOR(22 DOWNTO 0);
signal SDRAM_DO : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal SDRAM_DI : STD_LOGIC_VECTOR(31 DOWNTO 0);
signal SDRAM_WIDTH_8bit_ACCESS : std_logic;
signal SDRAM_WIDTH_16bit_ACCESS : std_logic;
signal SDRAM_WIDTH_32bit_ACCESS : std_logic;
177 markw
841 markw
signal SDRAM_REFRESH : std_logic;
signal SDRAM_RESET_N : std_logic;
177 markw
841 markw
-- dma/virtual drive
signal DMA_ADDR_FETCH : std_logic_vector(23 downto 0);
signal DMA_WRITE_DATA : std_logic_vector(31 downto 0);
signal DMA_FETCH : std_logic;
signal DMA_32BIT_WRITE_ENABLE : std_logic;
signal DMA_16BIT_WRITE_ENABLE : std_logic;
signal DMA_8BIT_WRITE_ENABLE : std_logic;
signal DMA_READ_ENABLE : std_logic;
signal DMA_MEMORY_READY : std_logic;
177 markw
841 markw
signal pause_btnD : std_logic;
signal pause_state : std_logic;
signal reset_atari : std_logic;
signal pause_atari : std_logic;
SIGNAL speed_6502 : std_logic_vector(5 downto 0);
177 markw
841 markw
-- data io
type ioctl_t is (
IOCTL_IDLE,
IOCTL_WRITE,
IOCTL_ACK);
signal ioctl_state : ioctl_t;
signal ioctl_download : std_logic;
signal ioctl_download_D: std_logic;
signal ioctl_index : std_logic_vector(7 downto 0);
signal ioctl_wr : std_logic;
signal ioctl_addr : std_logic_vector(24 downto 0);
signal ioctl_dout : std_logic_vector(15 downto 0);
signal reset_load : std_logic;
177 markw
841 markw
type cart_t is (
CART_32k,
CART_16k_1,
CART_16k_2,
CART_8k,
CART_4k);
signal cart_type : cart_t;
177 markw
841 markw
-- ps2
signal PS2_KEYS : STD_LOGIC_VECTOR(511 downto 0);
signal PS2_KEYS_NEXT : STD_LOGIC_VECTOR(511 downto 0);
177 markw
841 markw
-- scandoubler
signal half_scandouble_enable_reg : std_logic;
signal half_scandouble_enable_next : std_logic;
signal scanlines_reg : std_logic;
signal VIDEO_B : std_logic_vector(7 downto 0);
signal scandoubler_disable : std_logic;
signal ypbpr : std_logic;
177 markw
841 markw
signal sd_hs : std_logic;
signal sd_vs : std_logic;
signal osd_red_i : std_logic_vector(5 downto 0);
signal osd_green_i : std_logic_vector(5 downto 0);
signal osd_blue_i : std_logic_vector(5 downto 0);
signal osd_vs_i : std_logic;
signal osd_hs_i : std_logic;
signal osd_red_o : std_logic_vector(5 downto 0);
signal osd_green_o : std_logic_vector(5 downto 0);
signal osd_blue_o : std_logic_vector(5 downto 0);
signal vga_y_o : std_logic_vector(5 downto 0);
signal vga_pb_o : std_logic_vector(5 downto 0);
signal vga_pr_o : std_logic_vector(5 downto 0);
220 markw
841 markw
constant CONF_STR : string :=
"A5200;A52BIN;"&
"O3,16k Cart,1 Chip,2 Chips;"&
"O2,Joystick swap,Off,On;"&
"O46,CPU Speed,1x,2x,4x,8x,16x;"&
"O1,Scanlines,Off,On;"&
"T0,Reset;";
177 markw
841 markw
-- convert string to std_logic_vector to be given to user_io
function to_slv(s: string) return std_logic_vector is
constant ss: string(1 to s'length) := s;
variable rval: std_logic_vector(1 to 8 * s'length);
variable p: integer;
variable c: integer;
begin
for i in ss'range loop
p := 8 * i;
c := character'pos(ss(i));
rval(p - 7 to p) := std_logic_vector(to_unsigned(c,8));
end loop;
return rval;
end function;
177 markw
925 markw
CONSTANT V01 : std_logic_vector(0 TO 1):="01";

841 markw
BEGIN
177 markw
841 markw
pal <= '1';
vga <= not scandoubler_disable;

177 markw
-- mist spi io
841 markw
spi_do <= spi_miso_io when CONF_DATA0 ='0' else 'Z';
177 markw
841 markw
mist_user_io : user_io
generic map (STRLEN => CONF_STR'length)
PORT map(
clk_sys => CLK,
clk_sd => CLK,
SPI_CLK => SPI_SCK,
SPI_SS_IO => CONF_DATA0,
SPI_MISO => SPI_miso_io,
SPI_MOSI => SPI_DI,
conf_str => to_slv(CONF_STR),
JOYSTICK_0 => joy1,
JOYSTICK_1 => joy2,
JOYSTICK_ANALOG_0(15 downto 8) => mist_joy1x,
JOYSTICK_ANALOG_0(7 downto 0) => mist_joy1y,
JOYSTICK_ANALOG_1(15 downto 8) => mist_joy2x,
JOYSTICK_ANALOG_1(7 downto 0) => mist_joy2y,
BUTTONS => mist_buttons,
SWITCHES => mist_switches,
STATUS => mist_status,
scandoubler_disable => scandoubler_disable,
ypbpr => ypbpr,
220 markw
841 markw
PS2_KBD_CLK => ps2_clk,
PS2_KBD_DATA => ps2_dat,
220 markw
841 markw
SERIAL_DATA => (others=>'0'),
SERIAL_STROBE => '0'
);
220 markw
842 markw
joy1_n <= not(joy1(4 downto 0)) when mist_status(2) = '0' else not(joy2(4 downto 0));
joy2_n <= not(joy2(4 downto 0)) when mist_status(2) = '0' else not(joy1(4 downto 0));
841 markw
joy1x <= mist_joy1x when mist_status(2) = '0' else mist_joy2x;
joy1y <= mist_joy1y when mist_status(2) = '0' else mist_joy2y;
joy2x <= mist_joy2x when mist_status(2) = '0' else mist_joy1x;
joy2y <= mist_joy2y when mist_status(2) = '0' else mist_joy1y;
177 markw
842 markw
FIRE2 <= "00" & joy2(5)&joy1(5) when mist_status(2) = '0' else "00"&joy1(5)&joy2(5);

177 markw
-- PS2 to pokey
222 markw
keyboard_map1 : entity work.ps2_to_atari5200
177 markw
PORT MAP
(
CLK => clk,
RESET_N => reset_n,
PS2_CLK => ps2_clk,
PS2_DAT => ps2_dat,
222 markw
842 markw
FIRE2 => FIRE2,
222 markw
CONTROLLER_SELECT => CONTROLLER_SELECT, -- selected stick keyboard/shift button
177 markw
KEYBOARD_SCAN => KEYBOARD_SCAN,
KEYBOARD_RESPONSE => KEYBOARD_RESPONSE,

265 markw
FKEYS => FKEYS,

PS2_KEYS => PS2_KEYS,
PS2_KEYS_NEXT_OUT => PS2_KEYS_NEXT
177 markw
);
222 markw
-- stick 0: consol(1 downto 0)="00"
177 markw
222 markw
joy_still <= joy1_n(3) and joy1_n(2) and joy1_n(1) and joy1_n(0); -- TODO, need something better here I think! e.g. keypad? 5200 not centreing
841 markw
177 markw
dac_left : hq_dac
port map
(
841 markw
reset => not(reset_n),
clk => clk,
clk_ena => '1',
pcm_in => AUDIO_L_PCM&"0000",
dac_out => audio_l
177 markw
);

dac_right : hq_dac
port map
(
841 markw
reset => not(reset_n),
clk => clk,
clk_ena => '1',
pcm_in => AUDIO_R_PCM&"0000",
dac_out => audio_r
177 markw
);

mist_pll : entity work.pll_ntsc
PORT MAP(inclk0 => CLOCK_27(0),
841 markw
c0 => CLK_SDRAM,
c1 => CLK,
c2 => SDRAM_CLK,
locked => PLL_LOCKED);
177 markw
reset_n <= PLL_LOCKED;

841 markw
atari5200 : entity work.atari5200core_simplesdram
GENERIC MAP
(
cycle_length => 32,
-- internal_rom => 4, --5200 rom...
-- internal_rom => 0, --5200 rom...
-- internal_ram => 16384 -- only 1 option for 5200...
video_bits => 8,
palette => 0
)
PORT MAP
177 markw
(
841 markw
CLK => CLK,
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
177 markw
841 markw
VIDEO_VS => VGA_VS_RAW,
VIDEO_HS => VGA_HS_RAW,
VIDEO_CS => VGA_CS_RAW,
VIDEO_B => VIDEO_B,
VIDEO_G => open,
VIDEO_R => open,
177 markw
841 markw
AUDIO_L => AUDIO_L_PCM,
AUDIO_R => AUDIO_R_PCM,
177 markw
841 markw
-- JOYSTICK
JOY1_X => signed(joy1x),
JOY1_Y => signed(joy1y),
JOY2_X => signed(joy2x),
JOY2_Y => signed(joy2y),
177 markw
841 markw
JOY1_n => JOY1_n(4)&JOY1_n(0)&JOY1_n(1)&JOY1_n(2)&JOY1_n(3),
JOY2_n => JOY2_n(4)&JOY2_n(0)&JOY2_n(1)&JOY2_n(2)&JOY2_n(3),
177 markw
841 markw
KEYBOARD_RESPONSE => KEYBOARD_RESPONSE,
KEYBOARD_SCAN => KEYBOARD_SCAN,
177 markw
841 markw
SDRAM_REQUEST => SDRAM_REQUEST,
SDRAM_REQUEST_COMPLETE => SDRAM_REQUEST_COMPLETE,
SDRAM_READ_ENABLE => SDRAM_READ_ENABLE,
SDRAM_WRITE_ENABLE => SDRAM_WRITE_ENABLE,
SDRAM_ADDR => SDRAM_ADDR_OUT,
SDRAM_DO => SDRAM_DO,
SDRAM_DI => SDRAM_DI,
SDRAM_32BIT_WRITE_ENABLE => SDRAM_WIDTH_32bit_ACCESS,
SDRAM_16BIT_WRITE_ENABLE => SDRAM_WIDTH_16bit_ACCESS,
SDRAM_8BIT_WRITE_ENABLE => SDRAM_WIDTH_8bit_ACCESS,
SDRAM_REFRESH => SDRAM_REFRESH,
177 markw
841 markw
DMA_FETCH => dma_fetch, -- in
DMA_READ_ENABLE => dma_read_enable, -- in
DMA_32BIT_WRITE_ENABLE => dma_32bit_write_enable, -- in
DMA_16BIT_WRITE_ENABLE => dma_16bit_write_enable, -- in
DMA_8BIT_WRITE_ENABLE => dma_8bit_write_enable, -- in
DMA_ADDR => dma_addr_fetch, -- in
DMA_WRITE_DATA => dma_write_data, -- in
MEMORY_READY_DMA => dma_memory_ready, -- out
DMA_MEMORY_DATA => open, -- out

--PAL => PAL,
HALT => pause_atari,
THROTTLE_COUNT_6502 => speed_6502,
--emulated_cartridge_select => emulated_cartridge_select,
--freezer_enable => freezer_enable,
--freezer_activate => freezer_activate,

CONTROLLER_SELECT => CONTROLLER_SELECT
177 markw
);
sdram_adaptor : entity work.sdram_statemachine
GENERIC MAP(ADDRESS_WIDTH => 22,
841 markw
AP_BIT => 10,
COLUMN_WIDTH => 8,
ROW_WIDTH => 12
)
177 markw
PORT MAP(CLK_SYSTEM => CLK,
841 markw
CLK_SDRAM => CLK_SDRAM,
RESET_N => RESET_N,
READ_EN => SDRAM_READ_ENABLE,
WRITE_EN => SDRAM_WRITE_ENABLE,
REQUEST => SDRAM_REQUEST,
BYTE_ACCESS => SDRAM_WIDTH_8BIT_ACCESS,
WORD_ACCESS => SDRAM_WIDTH_16BIT_ACCESS,
LONGWORD_ACCESS => SDRAM_WIDTH_32BIT_ACCESS,
REFRESH => SDRAM_REFRESH,
ADDRESS_IN => SDRAM_ADDR_IN,
DATA_IN => SDRAM_DI,
SDRAM_DQ => SDRAM_DQ,
COMPLETE => SDRAM_REQUEST_COMPLETE,
SDRAM_BA0 => SDRAM_BA(0),
SDRAM_BA1 => SDRAM_BA(1),
SDRAM_CKE => SDRAM_CKE,
SDRAM_CS_N => SDRAM_nCS,
SDRAM_RAS_N => SDRAM_nRAS,
SDRAM_CAS_N => SDRAM_nCAS,
SDRAM_WE_N => SDRAM_nWE,
SDRAM_ldqm => SDRAM_DQML,
SDRAM_udqm => SDRAM_DQMH,
DATA_OUT => SDRAM_DO,
SDRAM_ADDR => SDRAM_A(11 downto 0),
reset_client_n => SDRAM_RESET_N
);

177 markw
SDRAM_A(12) <= '0';

841 markw
LED <= not ioctl_download;
177 markw
841 markw
process(clk,RESET_N,SDRAM_RESET_N,reset_atari)
begin
if ((RESET_N and SDRAM_RESET_N and not(reset_atari))='0') then
half_scandouble_enable_reg <= '0';
scanlines_reg <= '0';
elsif (clk'event and clk='1') then
half_scandouble_enable_reg <= half_scandouble_enable_next;
scanlines_reg <= mist_status(1);
end if;
end process;
177 markw
841 markw
half_scandouble_enable_next <= not(half_scandouble_enable_reg);
177 markw
841 markw
scandoubler1: entity work.scandoubler
GENERIC MAP
177 markw
(
video_bits=>6
)
841 markw
PORT MAP
177 markw
(
CLK => CLK,
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
841 markw
177 markw
VGA => vga,
925 markw
COMPOSITE_ON_HSYNC => V01(csync),
177 markw
colour_enable => half_scandouble_enable_reg,
doubled_enable => '1',
265 markw
scanlines_on => scanlines_reg,
841 markw
177 markw
-- GTIA interface
841 markw
pal => PAL,
177 markw
colour_in => VIDEO_B,
vsync_in => VGA_VS_RAW,
hsync_in => VGA_HS_RAW,
346 markw
csync_in => VGA_CS_RAW,
177 markw
841 markw
-- TO OSD
R => osd_red_i,
G => osd_green_i,
B => osd_blue_i,
177 markw
841 markw
VSYNC => sd_vs,
HSYNC => sd_hs
);
177 markw
841 markw
osd_inst: osd
port map (
clk_sys => CLK,
SPI_SCK => SPI_SCK,
SPI_SS3 => SPI_SS3,
SPI_DI => SPI_DI,
177 markw
841 markw
R_in => osd_red_i,
G_in => osd_green_i,
B_in => osd_blue_i,
HSync => sd_hs,
VSync => sd_vs,
177 markw
841 markw
R_out => osd_red_o,
G_out => osd_green_o,
B_out => osd_blue_o
);
177 markw
841 markw
rgb2component: rgb2ypbpr
port map (
red => osd_red_o,
green => osd_green_o,
blue => osd_blue_o,
y => vga_y_o,
pb => vga_pb_o,
pr => vga_pr_o
);
177 markw
841 markw
-- If 15kHz Video - composite sync to VGA_HS and VGA_VS high for MiST RGB cable
VGA_HS <= not (sd_hs xor sd_vs) when scandoubler_disable='1' or ypbpr='1' else sd_hs;
VGA_VS <= '1' when scandoubler_disable='1' or ypbpr='1' else sd_vs;
VGA_R <= vga_pr_o when ypbpr='1' else osd_red_o;
VGA_G <= vga_y_o when ypbpr='1' else osd_green_o;
VGA_B <= vga_pb_o when ypbpr='1' else osd_blue_o;
177 markw
841 markw
pause_atari <= ioctl_download or pause_state;
process (CLK, RESET_N) begin
if RESET_N = '0' then
pause_state <= '0';
elsif rising_edge(CLK) then
pause_btnD <= joy1(6) or joy2(6);
if (joy1(6) or joy2(6)) = '1' and pause_btnD = '0' then
pause_state <= not pause_state;
end if;
end if;
end process;
177 markw
841 markw
reset_atari <= mist_status(0) or mist_buttons(1) or reset_load;
speed_6502 <= "000001" when mist_status(6 downto 4) = "000" else
"000010" when mist_status(6 downto 4) = "001" else
"000100" when mist_status(6 downto 4) = "010" else
"001000" when mist_status(6 downto 4) = "011" else
"010000";
177 markw
841 markw
dma_read_enable <= '0'; -- in
dma_32bit_write_enable <= '0'; -- in
dma_8bit_write_enable <= '0'; -- in
177 markw
841 markw
mist_data_io: data_io
port map (
clk_sys => CLK,

SPI_SCK => SPI_SCK,
SPI_SS2 => SPI_SS2,
SPI_DI => SPI_DI,

ioctl_wait => '0',
ioctl_download => ioctl_download,
ioctl_index => ioctl_index,
ioctl_wr => ioctl_wr,
ioctl_addr => ioctl_addr,
ioctl_dout => ioctl_dout
);

process (CLK, RESET_N) begin
if RESET_N = '0' then
ioctl_state <= IOCTL_IDLE;
reset_load <= '0';
elsif rising_edge(CLK) then
ioctl_download_D <= ioctl_download;
case ioctl_state is
when IOCTL_IDLE =>
reset_load <= '0';
dma_fetch <= '0';
dma_16bit_write_enable <= '0';
if ioctl_download_D = '0' and ioctl_download = '1' then
cart_type <= CART_32k;
ioctl_state <= IOCTL_WRITE;
end if;
when IOCTL_WRITE =>
if ioctl_download = '0' then
if ioctl_addr(15 downto 12) = x"5" then cart_type <= CART_4k;
elsif ioctl_addr(15 downto 12) = x"6" then cart_type <= CART_8k;
elsif ioctl_addr(15 downto 12) = x"8" then
if mist_status(3) = '0' then cart_type <= CART_16k_1; else cart_type <= CART_16k_2; end if;
end if;
ioctl_state <= IOCTL_IDLE;
reset_load <= '1';
elsif ioctl_wr = '1' then
dma_fetch <= '1';
dma_16bit_write_enable <= '1';
dma_write_data <= ioctl_dout & ioctl_dout;
dma_addr_fetch <= ioctl_addr(23 downto 0);
ioctl_state <= IOCTL_ACK;
end if;
when IOCTL_ACK =>
if dma_memory_ready = '1' then
dma_fetch <= '0';
dma_16bit_write_enable <= '0';
ioctl_state <= IOCTL_WRITE;
end if;
when others => null;
end case;
end if;
end process;

922 markw
process (SDRAM_ADDR_OUT, cart_type) begin
841 markw
SDRAM_ADDR_IN <= SDRAM_ADDR_OUT;
case cart_type is
when CART_16k_1 =>
-- one chip 16k
case SDRAM_ADDR_OUT(15 downto 14) is
when "10" => SDRAM_ADDR_IN(15 downto 14) <= "01";
when others => null;
end case;

when CART_16k_2 =>
-- two chip 16k
case SDRAM_ADDR_OUT(15 downto 13) is
when "011" => SDRAM_ADDR_IN(15 downto 13) <= "010";
when "100" => SDRAM_ADDR_IN(15 downto 13) <= "011";
when "101" => SDRAM_ADDR_IN(15 downto 13) <= "011";
when others => null;
end case;

when CART_8k =>
-- 8k
SDRAM_ADDR_IN(15 downto 13) <= "010";

when CART_4k =>
-- 4k
SDRAM_ADDR_IN(15 downto 12) <= "0100";

when others => null;
end case;

end process;

177 markw
END vhdl;