repo2/mist/atari800core_mist.vhd
70 | markw | --------------------------------------------------------------------------- -- (c) 2013 mark watson
|
|
16 | markw | -- 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.
|
|||
---------------------------------------------------------------------------
|
|||
1 | markw | ||
LIBRARY ieee;
|
|||
USE ieee.std_logic_1164.all;
|
|||
use ieee.numeric_std.all;
|
|||
LIBRARY work;
|
|||
16 | markw | ENTITY atari800core_mist IS
|
|
1 | 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
|
|||
);
|
|||
16 | markw | END atari800core_mist;
|
|
1 | markw | ||
16 | markw | ARCHITECTURE vhdl OF atari800core_mist IS
|
|
1 | markw | ||
16 | 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
|
|||
1 | markw | );
|
|
end component;
|
|||
1316 | 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;
|
|||
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);
|
|||
SPI_SCK : in std_logic;
|
|||
SPI_SS3 : in std_logic;
|
|||
SPI_DI : in std_logic
|
|||
);
|
|||
end component osd;
|
|||
968 | 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;
|
|||
1 | markw | component user_io
|
|
1316 | markw | GENERIC (
|
|
STRLEN : integer := 0;
|
|||
PS2DIV : integer := 1500 );
|
|||
1 | markw | PORT(
|
|
1316 | markw | clk_sys : in std_logic;
|
|
clk_sd : in std_logic;
|
|||
conf_str : in std_logic_vector(8*STRLEN-1 downto 0);
|
|||
215 | markw | ||
-- mist spi to firmware
|
|||
SPI_CLK : in std_logic;
|
|||
SPI_SS_IO : in std_logic;
|
|||
SPI_MISO : out std_logic;
|
|||
SPI_MOSI : in std_logic;
|
|||
-- joysticks
|
|||
JOYSTICK_0 : out std_logic_vector(5 downto 0);
|
|||
JOYSTICK_1 : out std_logic_vector(5 downto 0);
|
|||
JOYSTICK_ANALOG_0 : out std_logic_vector(15 downto 0);
|
|||
JOYSTICK_ANALOG_1 : out std_logic_vector(15 downto 0);
|
|||
1 | markw | BUTTONS : out std_logic_vector(1 downto 0);
|
|
70 | markw | SWITCHES : out std_logic_vector(1 downto 0);
|
|
1316 | markw | STATUS : out std_logic_vector(63 downto 0);
|
|
215 | markw | ||
1316 | markw | -- video switches
|
|
scandoubler_disable: out std_logic;
|
|||
ypbpr: out std_logic;
|
|||
no_csync: out std_logic;
|
|||
215 | markw | -- ps2
|
|
PS2_KBD_CLK : out std_logic;
|
|||
PS2_KBD_DATA : out std_logic;
|
|||
-- serial (one way?)
|
|||
SERIAL_DATA : in std_logic_vector(7 downto 0);
|
|||
SERIAL_STROBE : in std_logic;
|
|||
-- connection to sd card emulation
|
|||
sd_lba : in std_logic_vector(31 downto 0);
|
|||
1316 | markw | sd_rd : in std_logic_vector(1 downto 0);
|
|
sd_wr : in std_logic_vector(1 downto 0);
|
|||
215 | markw | sd_ack : out std_logic;
|
|
1316 | markw | sd_ack_conf : out std_logic;
|
|
215 | markw | sd_conf : in std_logic;
|
|
sd_sdhc : in std_logic;
|
|||
sd_dout : out std_logic_vector(7 downto 0);
|
|||
sd_dout_strobe : out std_logic;
|
|||
sd_din : in std_logic_vector(7 downto 0);
|
|||
1316 | markw | sd_din_strobe : out std_logic;
|
|
sd_buff_addr : out std_logic_vector(8 downto 0);
|
|||
img_size : out std_logic_vector(31 downto 0);
|
|||
img_mounted : out std_logic_vector(1 downto 0)
|
|||
1 | markw | );
|
|
215 | markw | end component;
|
|
1 | markw | ||
1316 | markw | component data_io
|
|
port (
|
|||
clk_sys : in std_logic;
|
|||
215 | markw | ||
1316 | markw | SPI_SCK : in std_logic;
|
|
SPI_SS2 : in std_logic;
|
|||
SPI_DI : in std_logic;
|
|||
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;
|
|||
16 | markw | signal AUDIO_L_PCM : std_logic_vector(15 downto 0);
|
|
signal AUDIO_R_PCM : std_logic_vector(15 downto 0);
|
|||
1316 | markw | signal AUDIO_R_PCM_IN : std_logic_vector(19 downto 0);
|
|
1 | markw | ||
16 | markw | signal VGA_VS_RAW : std_logic;
|
|
signal VGA_HS_RAW : std_logic;
|
|||
346 | markw | signal VGA_CS_RAW : std_logic;
|
|
1 | markw | ||
16 | markw | signal RESET_n : std_logic;
|
|
signal CLK : std_logic;
|
|||
signal CLK_SDRAM : std_logic;
|
|||
1 | markw | ||
174 | markw | signal CLK_PLL1 : std_logic; -- cascaded to get better pal clock
|
|
signal PLL1_LOCKED : std_logic;
|
|||
70 | markw | SIGNAL PS2_CLK : std_logic;
|
|
SIGNAL PS2_DAT : std_logic;
|
|||
88 | markw | SIGNAL CONSOL_OPTION_RAW : STD_LOGIC;
|
|
16 | markw | SIGNAL CONSOL_OPTION : STD_LOGIC;
|
|
88 | markw | SIGNAL CONSOL_SELECT_RAW : STD_LOGIC;
|
|
16 | markw | SIGNAL CONSOL_SELECT : STD_LOGIC;
|
|
88 | markw | SIGNAL CONSOL_START_RAW : STD_LOGIC;
|
|
16 | markw | SIGNAL CONSOL_START : STD_LOGIC;
|
|
70 | markw | SIGNAL FKEYS : std_logic_vector(11 downto 0);
|
|
1 | markw | ||
16 | markw | signal capslock_pressed : std_logic;
|
|
signal capsheld_next : std_logic;
|
|||
signal capsheld_reg : std_logic;
|
|||
signal spi_miso_io : std_logic;
|
|||
1 | markw | ||
16 | markw | signal mist_buttons : std_logic_vector(1 downto 0);
|
|
signal mist_switches : std_logic_vector(1 downto 0);
|
|||
1316 | markw | signal mist_status : std_logic_vector(63 downto 0);
|
|
1 | markw | ||
16 | markw | signal JOY1 : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|
signal JOY2 : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|||
signal JOY1_n : STD_LOGIC_VECTOR(4 DOWNTO 0);
|
|||
signal JOY2_n : STD_LOGIC_VECTOR(4 DOWNTO 0);
|
|||
88 | markw | signal joy_still : std_logic;
|
|
1 | markw | ||
244 | markw | 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);
|
|||
16 | markw | SIGNAL KEYBOARD_RESPONSE : STD_LOGIC_VECTOR(1 DOWNTO 0);
|
|
SIGNAL KEYBOARD_SCAN : STD_LOGIC_VECTOR(5 DOWNTO 0);
|
|||
907 | markw | signal atari_keyboard : std_logic_vector(63 downto 0);
|
|
1 | markw | ||
22 | 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 : 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;
|
|||
signal SDRAM_REFRESH : std_logic;
|
|||
signal SDRAM_RESET_N : std_logic;
|
|||
70 | markw | -- dma/virtual drive
|
|
signal DMA_ADDR_FETCH : std_logic_vector(23 downto 0);
|
|||
1316 | markw | signal DMA_ADDR_FETCH_IOCTL : std_logic_vector(23 downto 0);
|
|
signal DMA_ADDR_FETCH_ZPU : std_logic_vector(23 downto 0);
|
|||
70 | markw | signal DMA_WRITE_DATA : std_logic_vector(31 downto 0);
|
|
1316 | markw | signal DMA_WRITE_DATA_IOCTL : std_logic_vector(31 downto 0);
|
|
signal DMA_WRITE_DATA_ZPU : std_logic_vector(31 downto 0);
|
|||
70 | markw | signal DMA_FETCH : std_logic;
|
|
1316 | markw | signal DMA_FETCH_ZPU : std_logic;
|
|
signal DMA_FETCH_IOCTL : std_logic;
|
|||
70 | markw | signal DMA_32BIT_WRITE_ENABLE : std_logic;
|
|
1316 | markw | signal DMA_32BIT_WRITE_ENABLE_ZPU : std_logic;
|
|
70 | markw | signal DMA_16BIT_WRITE_ENABLE : std_logic;
|
|
1316 | markw | signal DMA_16BIT_WRITE_ENABLE_ZPU : std_logic;
|
|
signal DMA_16BIT_WRITE_ENABLE_IOCTL : std_logic;
|
|||
70 | markw | signal DMA_8BIT_WRITE_ENABLE : std_logic;
|
|
1316 | markw | signal DMA_8BIT_WRITE_ENABLE_ZPU : std_logic;
|
|
70 | markw | signal DMA_READ_ENABLE : std_logic;
|
|
1316 | markw | signal DMA_READ_ENABLE_ZPU : std_logic;
|
|
70 | markw | signal DMA_MEMORY_READY : std_logic;
|
|
1316 | markw | signal DMA_MEMORY_READY_ZPU : std_logic;
|
|
70 | markw | signal DMA_MEMORY_DATA : std_logic_vector(31 downto 0);
|
|
signal ZPU_ADDR_ROM : std_logic_vector(15 downto 0);
|
|||
signal ZPU_ROM_DATA : std_logic_vector(31 downto 0);
|
|||
1316 | markw | signal ZPU_IN1 : std_logic_vector(31 downto 0);
|
|
signal ZPU_IN2 : std_logic_vector(31 downto 0);
|
|||
70 | markw | signal ZPU_OUT1 : std_logic_vector(31 downto 0);
|
|
signal ZPU_OUT2 : std_logic_vector(31 downto 0);
|
|||
signal ZPU_OUT3 : std_logic_vector(31 downto 0);
|
|||
signal ZPU_OUT4 : std_logic_vector(31 downto 0);
|
|||
907 | markw | signal ZPU_OUT6 : std_logic_vector(31 downto 0);
|
|
70 | markw | ||
signal zpu_pokey_enable : std_logic;
|
|||
signal zpu_sio_txd : std_logic;
|
|||
signal zpu_sio_rxd : std_logic;
|
|||
signal zpu_sio_command : std_logic;
|
|||
845 | markw | SIGNAL ASIO_CLOCKOUT : std_logic;
|
|
70 | markw | ||
-- system control from zpu
|
|||
signal ram_select : std_logic_vector(2 downto 0);
|
|||
signal reset_atari : std_logic;
|
|||
signal pause_atari : std_logic;
|
|||
SIGNAL speed_6502 : std_logic_vector(5 downto 0);
|
|||
932 | markw | signal turbo_vblank_only : std_logic;
|
|
198 | markw | signal emulated_cartridge_select: std_logic_vector(5 downto 0);
|
|
1316 | markw | signal cart_type_byte : std_logic_vector(7 downto 0);
|
|
845 | markw | signal key_type : std_logic;
|
|
signal atari800mode : std_logic;
|
|||
1316 | markw | signal turbo_drive : std_logic_vector(2 downto 0);
|
|
70 | markw | ||
215 | markw | -- connection to sd card emulation
|
|
signal sd_lba : std_logic_vector(31 downto 0);
|
|||
1316 | markw | signal sd_rd : std_logic_vector(1 downto 0);
|
|
signal sd_wr : std_logic_vector(1 downto 0);
|
|||
215 | markw | signal sd_ack : std_logic;
|
|
1316 | markw | signal sd_ack_conf : std_logic;
|
|
215 | markw | signal sd_conf : std_logic;
|
|
signal sd_sdhc : std_logic;
|
|||
signal sd_dout : std_logic_vector(7 downto 0);
|
|||
signal sd_dout_strobe : std_logic;
|
|||
signal sd_din : std_logic_vector(7 downto 0);
|
|||
signal sd_din_strobe : std_logic;
|
|||
1316 | markw | signal sd_buff_addr: std_logic_vector(8 downto 0);
|
|
signal img_size : std_logic_vector(31 downto 0);
|
|||
signal img_mounted : std_logic_vector(1 downto 0);
|
|||
70 | markw | ||
1316 | markw | signal zpu_secbuf_addr : std_logic_vector(8 downto 0);
|
|
signal zpu_secbuf_d : std_logic_vector(7 downto 0);
|
|||
signal zpu_secbuf_we : std_logic;
|
|||
signal zpu_secbuf_q : std_logic_vector(7 downto 0);
|
|||
215 | markw | signal mist_sd_sdo : std_logic;
|
|
signal mist_sd_sck : std_logic;
|
|||
signal mist_sd_sdi : std_logic;
|
|||
signal mist_sd_cs : std_logic;
|
|||
1316 | markw | -- data io
|
|
signal rom_loaded : std_logic;
|
|||
type ioctl_t is (
|
|||
IOCTL_IDLE,
|
|||
IOCTL_UNLOAD,
|
|||
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;
|
|||
signal cold_reset : std_logic;
|
|||
signal zpu_cold_reset : std_logic;
|
|||
signal zpu_unl_reset : std_logic;
|
|||
70 | markw | -- ps2
|
|
261 | markw | signal PS2_KEYS : STD_LOGIC_VECTOR(511 downto 0);
|
|
signal PS2_KEYS_NEXT : STD_LOGIC_VECTOR(511 downto 0);
|
|||
70 | markw | ||
84 | markw | -- scandoubler
|
|
signal half_scandouble_enable_reg : std_logic;
|
|||
signal half_scandouble_enable_next : std_logic;
|
|||
signal VIDEO_B : std_logic_vector(7 downto 0);
|
|||
210 | markw | -- turbo freezer!
|
|
signal freezer_enable : std_logic;
|
|||
signal freezer_activate: std_logic;
|
|||
261 | markw | -- paddles
|
|
signal paddle_mode_next : std_logic;
|
|||
signal paddle_mode_reg : std_logic;
|
|||
907 | markw | -- video settings
|
|
signal pal : std_logic;
|
|||
signal scandouble : std_logic;
|
|||
signal scanlines : std_logic;
|
|||
signal video_mode : std_logic_vector(2 downto 0);
|
|||
1316 | markw | signal scandoubler_disable : std_logic;
|
|
968 | markw | signal ypbpr : std_logic;
|
|
1316 | markw | signal no_csync : std_logic;
|
|
signal sd_hs : std_logic;
|
|||
signal sd_vs : std_logic;
|
|||
signal sd_red_o : std_logic_vector(5 downto 0);
|
|||
signal sd_green_o : std_logic_vector(5 downto 0);
|
|||
signal sd_blue_o : std_logic_vector(5 downto 0);
|
|||
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);
|
|||
907 | markw | ||
918 | markw | -- pll reconfig
|
|
signal CLK_RECONFIG_PLL : std_logic;
|
|||
signal CLK_RECONFIG_PLL_LOCKED : std_logic;
|
|||
1316 | markw | constant SDRAM_BASE : unsigned(23 downto 0) := x"800000";
|
|
constant CARTRIDGE_MEM : unsigned(23 downto 0) := x"D00000";
|
|||
constant SDRAM_ROM_ADDR : unsigned(23 downto 0):= x"F00000";
|
|||
968 | markw | ||
1316 | markw | constant CONF_STR : string :=
|
|
"A800XL;;"&
|
|||
"F,ROM,Load ROM;"&
|
|||
"F,ROMCAR,Load Cart;"&
|
|||
"S0,ATRXEX,Load Disk 1;"&
|
|||
"S1,ATRXEX,Load Disk 2;"&
|
|||
"P1,Video;"&
|
|||
"P2,System;"&
|
|||
"P1O5,Video,NTSC,PAL;"&
|
|||
"P1O6,Scanlines,Off,On;"&
|
|||
"P2O8A,CPU Speed,1x,2x,4x,8x,16x;"&
|
|||
"P2OB,Turbo at VBL only,Off,On;"&
|
|||
"P2OC,Machine,XL/XE,400/800;"&
|
|||
"P2ODF,XL/XE Memory,64K,128K,320KB Compy,320KB Rambo,576K Compy,576K Rambo,1088K,4MB;"&
|
|||
"P2OGI,400/800 Memory,8K,16K,32K,48K,52K;"&
|
|||
"P2OJ,Keyboard,ISO,ANSI;"&
|
|||
"P2OKM,Drive speed,Standard,Fast-6,Fast-5,Fast-4,Fast-3,Fast-2,Fast-1,Fast-0;"&
|
|||
"P2ON,Dual Pokey,No,Yes;"&
|
|||
"T1,Reset;"&
|
|||
"T2,Cold reset;"&
|
|||
"T3,Cold reset with unload;";
|
|||
-- 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;
|
|||
1 | markw | BEGIN
|
|
261 | markw | -- hack for paddles
|
|
process(clk,RESET_N)
|
|||
begin
|
|||
if (RESET_N = '0') then
|
|||
paddle_mode_reg <= '0';
|
|||
elsif (clk'event and clk='1') then
|
|||
paddle_mode_reg <= paddle_mode_next;
|
|||
end if;
|
|||
end process;
|
|||
284 | markw | process(paddle_mode_reg, joy1, joy2)
|
|
261 | markw | begin
|
|
joy1_n <= (others=>'1');
|
|||
joy2_n <= (others=>'1');
|
|||
if (paddle_mode_reg = '1') then
|
|||
joy1_n <= "111"¬(joy1(4)&joy1(5)); --FLRDU
|
|||
joy2_n <= "111"¬(joy2(4)&joy2(5));
|
|||
else
|
|||
joy1_n <= not(joy1(4 downto 0));
|
|||
joy2_n <= not(joy2(4 downto 0));
|
|||
end if;
|
|||
end process;
|
|||
paddle_mode_next <= paddle_mode_reg xor (not(ps2_keys(16#11F#)) and ps2_keys_next(16#11F#)); -- left windows key
|
|||
1 | markw | -- mist spi io
|
|
215 | markw | spi_do <= spi_miso_io when CONF_DATA0 ='0' else 'Z';
|
|
1 | markw | ||
1316 | markw | sd_conf <= '0';
|
|
sd_sdhc <= '1';
|
|||
my_user_io : user_io
|
|||
GENERIC map (STRLEN => CONF_STR'length)
|
|||
1 | markw | PORT map(
|
|
1316 | markw | 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),
|
|||
215 | markw | JOYSTICK_0 => joy2,
|
|
JOYSTICK_1 => joy1,
|
|||
244 | markw | JOYSTICK_ANALOG_0(15 downto 8) => joy2x,
|
|
JOYSTICK_ANALOG_0(7 downto 0) => joy2y,
|
|||
JOYSTICK_ANALOG_1(15 downto 8) => joy1x,
|
|||
JOYSTICK_ANALOG_1(7 downto 0) => joy1y,
|
|||
1 | markw | BUTTONS => mist_buttons,
|
|
70 | markw | SWITCHES => mist_switches,
|
|
1316 | markw | STATUS => mist_status,
|
|
scandoubler_disable => scandoubler_disable,
|
|||
ypbpr => ypbpr,
|
|||
no_csync => no_csync,
|
|||
215 | markw | ||
PS2_KBD_CLK => ps2_clk,
|
|||
PS2_KBD_DATA => ps2_dat,
|
|||
1316 | markw | ||
215 | markw | SERIAL_DATA => (others=>'0'),
|
|
SERIAL_STROBE => '0',
|
|||
sd_lba => sd_lba,
|
|||
sd_rd => sd_rd,
|
|||
sd_wr => sd_wr,
|
|||
sd_ack => sd_ack,
|
|||
1316 | markw | sd_ack_conf => sd_ack_conf,
|
|
215 | markw | sd_conf => sd_conf,
|
|
sd_sdhc => sd_sdhc,
|
|||
sd_dout => sd_dout,
|
|||
sd_dout_strobe => sd_dout_strobe,
|
|||
sd_din => sd_din,
|
|||
1316 | markw | sd_din_strobe => sd_din_strobe,
|
|
sd_buff_addr => sd_buff_addr,
|
|||
img_mounted => img_mounted,
|
|||
img_size => img_size
|
|||
);
|
|||
215 | markw | ||
1316 | markw | -- PS2 to pokey
|
|
keyboard_map1 : entity work.ps2_to_atari800
|
|||
70 | markw | PORT MAP
|
|
(
|
|||
CLK => clk,
|
|||
RESET_N => reset_n,
|
|||
PS2_CLK => ps2_clk,
|
|||
PS2_DAT => ps2_dat,
|
|||
845 | markw | ||
INPUT => zpu_out4,
|
|||
907 | markw | ATARI_KEYBOARD_OUT => atari_keyboard,
|
|
845 | markw | KEY_TYPE => key_type,
|
|
1316 | markw | ||
70 | markw | KEYBOARD_SCAN => KEYBOARD_SCAN,
|
|
KEYBOARD_RESPONSE => KEYBOARD_RESPONSE,
|
|||
1 | markw | ||
88 | markw | CONSOL_START => CONSOL_START_RAW,
|
|
CONSOL_SELECT => CONSOL_SELECT_RAW,
|
|||
CONSOL_OPTION => CONSOL_OPTION_RAW,
|
|||
1316 | markw | ||
210 | markw | FKEYS => FKEYS,
|
|
261 | markw | FREEZER_ACTIVATE => freezer_activate,
|
|
1316 | markw | ||
261 | markw | PS2_KEYS_NEXT_OUT => ps2_keys_next,
|
|
PS2_KEYS => ps2_keys
|
|||
70 | markw | );
|
|
88 | markw | ||
1316 | markw | CONSOL_START <= CONSOL_START_RAW or (mist_buttons(1) and not(joy1_n(4)));
|
|
joy_still <= joy1_n(3) and joy1_n(2) and joy1_n(1) and joy1_n(0);
|
|||
CONSOL_SELECT <= CONSOL_SELECT_RAW or (mist_buttons(1) and joy1_n(4) and not(joy_still));
|
|||
CONSOL_OPTION <= CONSOL_OPTION_RAW or (mist_buttons(1) and joy1_n(4) and joy_still);
|
|||
1 | markw | ||
1316 | markw | dac_left : hq_dac
|
|
port map
|
|||
(
|
|||
reset => not(reset_n),
|
|||
clk => clk,
|
|||
clk_ena => '1',
|
|||
pcm_in => AUDIO_L_PCM&"0000",
|
|||
dac_out => audio_l
|
|||
);
|
|||
1 | markw | ||
1316 | markw | AUDIO_R_PCM_IN <= AUDIO_R_PCM&"0000" when mist_status(23) = '1' else AUDIO_L_PCM&"0000";
|
|
dac_right : hq_dac
|
|||
port map
|
|||
(
|
|||
reset => not(reset_n),
|
|||
clk => clk,
|
|||
clk_ena => '1',
|
|||
pcm_in => AUDIO_R_PCM_IN,
|
|||
dac_out => audio_r
|
|||
);
|
|||
reconfig_pll : entity work.pll_reconfig -- This only exists to generate reset!!
|
|||
PORT MAP(inclk0 => CLOCK_27(0),
|
|||
c0 => CLK_RECONFIG_PLL,
|
|||
locked => CLK_RECONFIG_PLL_LOCKED);
|
|||
1 | markw | ||
1316 | markw | process (CLK_RECONFIG_PLL, CLK_RECONFIG_PLL_LOCKED)
|
|
begin
|
|||
if CLK_RECONFIG_PLL_LOCKED = '0' then
|
|||
rom_loaded <= '0';
|
|||
elsif rising_edge(CLK_RECONFIG_PLL) then
|
|||
if ioctl_download = '1' then -- FIXME: synchronize
|
|||
rom_loaded <= '1';
|
|||
end if;
|
|||
end if;
|
|||
end process;
|
|||
918 | markw | pll_switcher : work.switch_pal_ntsc
|
|
1316 | markw | GENERIC MAP
|
|
(
|
|||
CLOCKS => 4,
|
|||
918 | markw | SYNC_ON => 1
|
|
1316 | markw | )
|
|
PORT MAP
|
|||
(
|
|||
RECONFIG_CLK => CLK_RECONFIG_PLL,
|
|||
RESET_N => CLK_RECONFIG_PLL_LOCKED,
|
|||
PAL => PAL,
|
|||
SWITCH_ENA => not ioctl_download and rom_loaded,
|
|||
INPUT_CLK => CLOCK_27(0),
|
|||
PLL_CLKS(0) => CLK_SDRAM,
|
|||
PLL_CLKS(1) => CLK,
|
|||
PLL_CLKS(2) => SDRAM_CLK,
|
|||
918 | markw | RESET_N_OUT => RESET_N
|
|
1316 | markw | );
|
|
165 | markw | ||
1316 | markw | atarixl_simple_sdram1 : entity work.atari800core_simple_sdram
|
|
16 | markw | GENERIC MAP
|
|
(
|
|||
cycle_length => 32,
|
|||
70 | markw | internal_rom => 0,
|
|
27 | markw | internal_ram => 0,
|
|
84 | markw | video_bits => 8,
|
|
palette => 0
|
|||
16 | markw | )
|
|
PORT MAP
|
|||
(
|
|||
CLK => CLK,
|
|||
70 | markw | RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
|
|
1 | markw | ||
40 | markw | VIDEO_VS => VGA_VS_RAW,
|
|
VIDEO_HS => VGA_HS_RAW,
|
|||
346 | markw | VIDEO_CS => VGA_CS_RAW,
|
|
84 | markw | VIDEO_B => VIDEO_B,
|
|
VIDEO_G => open,
|
|||
VIDEO_R => open,
|
|||
1 | markw | ||
16 | markw | AUDIO_L => AUDIO_L_PCM,
|
|
AUDIO_R => AUDIO_R_PCM,
|
|||
1 | markw | ||
70 | 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),
|
|||
1 | markw | ||
244 | markw | PADDLE0 => signed(joy1x),
|
|
PADDLE1 => signed(joy1y),
|
|||
PADDLE2 => signed(joy2x),
|
|||
PADDLE3 => signed(joy2y),
|
|||
16 | markw | KEYBOARD_RESPONSE => KEYBOARD_RESPONSE,
|
|
KEYBOARD_SCAN => KEYBOARD_SCAN,
|
|||
1 | markw | ||
70 | markw | SIO_COMMAND => zpu_sio_command,
|
|
SIO_RXD => zpu_sio_txd,
|
|||
SIO_TXD => zpu_sio_rxd,
|
|||
845 | markw | SIO_CLOCKOUT => ASIO_CLOCKOUT,
|
|
1 | markw | ||
16 | markw | CONSOL_OPTION => CONSOL_OPTION,
|
|
CONSOL_SELECT => CONSOL_SELECT,
|
|||
CONSOL_START => CONSOL_START,
|
|||
22 | 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,
|
|||
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,
|
|||
70 | markw | SDRAM_REFRESH => SDRAM_REFRESH,
|
|
16 | markw | ||
70 | markw | DMA_FETCH => dma_fetch,
|
|
DMA_READ_ENABLE => dma_read_enable,
|
|||
DMA_32BIT_WRITE_ENABLE => dma_32bit_write_enable,
|
|||
DMA_16BIT_WRITE_ENABLE => dma_16bit_write_enable,
|
|||
DMA_8BIT_WRITE_ENABLE => dma_8bit_write_enable,
|
|||
DMA_ADDR => dma_addr_fetch,
|
|||
DMA_WRITE_DATA => dma_write_data,
|
|||
MEMORY_READY_DMA => dma_memory_ready,
|
|||
DMA_MEMORY_DATA => dma_memory_data,
|
|||
16 | markw | ||
1316 | markw | RAM_SELECT => ram_select,
|
|
16 | markw | PAL => PAL,
|
|
70 | markw | HALT => pause_atari,
|
|
198 | markw | THROTTLE_COUNT_6502 => speed_6502,
|
|
932 | markw | TURBO_VBLANK_ONLY => turbo_vblank_only,
|
|
210 | markw | emulated_cartridge_select => emulated_cartridge_select,
|
|
freezer_enable => freezer_enable,
|
|||
freezer_activate => freezer_activate
|
|||
1 | markw | );
|
|
1316 | markw | sdram_adaptor : entity work.sdram_statemachine
|
|
GENERIC MAP(ADDRESS_WIDTH => 22,
|
|||
AP_BIT => 10,
|
|||
COLUMN_WIDTH => 8,
|
|||
ROW_WIDTH => 12
|
|||
)
|
|||
PORT MAP(CLK_SYSTEM => CLK,
|
|||
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,
|
|||
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
|
|||
);
|
|||
22 | markw | ||
1316 | markw | SDRAM_A(12) <= '0';
|
|
1 | markw | ||
1316 | markw | mist_data_io: data_io
|
|
port map (
|
|||
clk_sys => CLK,
|
|||
16 | markw | ||
1316 | markw | SPI_SCK => SPI_SCK,
|
|
SPI_SS2 => SPI_SS2,
|
|||
SPI_DI => SPI_DI,
|
|||
1 | markw | ||
1316 | markw | ioctl_wait => '0',
|
|
ioctl_download => ioctl_download,
|
|||
ioctl_index => ioctl_index,
|
|||
ioctl_wr => ioctl_wr,
|
|||
ioctl_addr => ioctl_addr,
|
|||
ioctl_dout => ioctl_dout
|
|||
);
|
|||
16 | markw | ||
1316 | markw | dma_read_enable <= '0' when ioctl_state /= IOCTL_IDLE else dma_read_enable_zpu;
|
|
dma_addr_fetch <= dma_addr_fetch_ioctl when ioctl_state /= IOCTL_IDLE else dma_addr_fetch_zpu;
|
|||
dma_write_data <= dma_write_data_ioctl when ioctl_state /= IOCTL_IDLE else dma_write_data_zpu;
|
|||
dma_fetch <= dma_fetch_ioctl when ioctl_state /= IOCTL_IDLE else dma_fetch_zpu;
|
|||
dma_8bit_write_enable <= '0' when ioctl_state /= IOCTL_IDLE else dma_8bit_write_enable_zpu;
|
|||
dma_16bit_write_enable <= dma_16bit_write_enable_ioctl when ioctl_state /= IOCTL_IDLE else dma_16bit_write_enable_zpu;
|
|||
dma_32bit_write_enable <= '0' when ioctl_state /= IOCTL_IDLE else dma_32bit_write_enable_zpu;
|
|||
dma_memory_ready_zpu <= '0' when ioctl_state /= IOCTL_IDLE else dma_memory_ready;
|
|||
emulated_cartridge_select <=
|
|||
"000001" when cart_type_byte = x"01" -- standard 8k
|
|||
else "100001" when cart_type_byte = x"02" -- standard 16k
|
|||
else "001101" when cart_type_byte = x"08" -- Williams 64k
|
|||
else "001010" when cart_type_byte = x"09" -- Express 64
|
|||
else "001001" when cart_type_byte = x"0a" -- Diamond 64
|
|||
else "001000" when cart_type_byte = x"0b" -- SDX64
|
|||
else "110000" when cart_type_byte = x"0c" -- XEGS 32k
|
|||
else "110001" when cart_type_byte = x"0d" -- XEGS 64k
|
|||
else "110010" when cart_type_byte = x"0e" -- XEGS 128k
|
|||
else "000100" when cart_type_byte = x"0f" -- OSS 16
|
|||
else "001100" when cart_type_byte = x"11" -- ATRAX 128
|
|||
else "001101" when cart_type_byte = x"16" -- Williams 32k (=Williams 64k)
|
|||
else "110011" when cart_type_byte = x"17" -- XEGS 256
|
|||
else "110100" when cart_type_byte = x"18" -- XEGS 512
|
|||
else "110101" when cart_type_byte = x"19" -- XEGS 1024
|
|||
else "101000" when cart_type_byte = x"1a" -- MEGA 16
|
|||
else "101001" when cart_type_byte = x"1b" -- MEGA 32
|
|||
else "101010" when cart_type_byte = x"1c" -- MEGA 64
|
|||
else "101011" when cart_type_byte = x"1d" -- MEGA 128
|
|||
else "101100" when cart_type_byte = x"1e" -- MEGA 256
|
|||
else "101101" when cart_type_byte = x"1f" -- MEGA 512
|
|||
else "101110" when cart_type_byte = x"20" -- MEGA 1024
|
|||
else "111000" when cart_type_byte = x"21" -- SXEGS 32
|
|||
else "111001" when cart_type_byte = x"22" -- SXEGS 64
|
|||
else "111010" when cart_type_byte = x"23" -- SXEGS 128
|
|||
else "111011" when cart_type_byte = x"24" -- SXEGS 256
|
|||
else "111100" when cart_type_byte = x"25" -- SXEGS 512
|
|||
else "111101" when cart_type_byte = x"26" -- SXEGS 1024
|
|||
else "100011" when cart_type_byte = x"28" -- BLIZZARD 16
|
|||
else "000010" when cart_type_byte = x"29" -- ATARIMAX 128
|
|||
else "000011" when cart_type_byte = x"2a" -- ATARIMAX 1024
|
|||
else "100100" when cart_type_byte = x"38" -- SIC 512
|
|||
else "000000";
|
|||
process (CLK, RESET_N)
|
|||
variable sdram_a: unsigned(23 downto 0);
|
|||
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_ioctl <= '0';
|
|||
dma_16bit_write_enable_ioctl <= '0';
|
|||
if cold_reset = '1' then
|
|||
-- reset with unload
|
|||
cart_type_byte <= (others => '0');
|
|||
dma_addr_fetch_ioctl <= std_logic_vector(SDRAM_BASE);
|
|||
ioctl_state <= IOCTL_UNLOAD;
|
|||
elsif ioctl_download_D = '0' and ioctl_download = '1' then
|
|||
-- cart loading starts
|
|||
ioctl_state <= IOCTL_WRITE;
|
|||
cart_type_byte <= (others => '0');
|
|||
end if;
|
|||
when IOCTL_UNLOAD =>
|
|||
if dma_fetch_ioctl = '1' then
|
|||
if dma_memory_ready = '1' then
|
|||
dma_fetch_ioctl <= '0';
|
|||
dma_16bit_write_enable_ioctl <= '0';
|
|||
dma_addr_fetch_ioctl <= std_logic_vector(unsigned(dma_addr_fetch_ioctl) + 2);
|
|||
end if;
|
|||
elsif dma_addr_fetch_ioctl = std_logic_vector(SDRAM_BASE + x"10000") then
|
|||
ioctl_state <= IOCTL_IDLE;
|
|||
reset_load <= '1';
|
|||
else
|
|||
dma_fetch_ioctl <= '1';
|
|||
dma_16bit_write_enable_ioctl <= '1';
|
|||
dma_write_data_ioctl <= (others => '0');
|
|||
end if;
|
|||
when IOCTL_WRITE =>
|
|||
if ioctl_download = '0' then
|
|||
-- end of download
|
|||
ioctl_state <= IOCTL_IDLE;
|
|||
reset_load <= '1';
|
|||
if ioctl_index = x"02" then
|
|||
-- ROM file type detection from size
|
|||
if ioctl_addr = '0'&x"002000" then cart_type_byte <= x"01"; -- standard 8k
|
|||
elsif ioctl_addr = '0'&x"004000" then cart_type_byte <= x"02"; -- standard 16k
|
|||
elsif ioctl_addr = '0'&x"008000" then cart_type_byte <= x"0c"; -- Atari XEGS 32k
|
|||
elsif ioctl_addr = '0'&x"010000" then cart_type_byte <= x"0d"; -- Atari XEGS 64k
|
|||
elsif ioctl_addr = '0'&x"020000" then cart_type_byte <= x"0e"; -- Atari XEGS 128k
|
|||
elsif ioctl_addr = '0'&x"100000" then cart_type_byte <= x"2a"; -- Atarimax 1024k
|
|||
end if;
|
|||
end if;
|
|||
elsif ioctl_wr = '1' then
|
|||
-- new word arrived from IO controller
|
|||
if (ioctl_index = x"42" and unsigned(ioctl_addr) = 6) then
|
|||
-- CAR header type field
|
|||
cart_type_byte <= ioctl_dout(15 downto 8);
|
|||
elsif (ioctl_index = x"42" and unsigned(ioctl_addr) < 16) then
|
|||
-- skip CAR header
|
|||
null;
|
|||
else
|
|||
dma_fetch_ioctl <= '1';
|
|||
dma_16bit_write_enable_ioctl <= '1';
|
|||
dma_write_data_ioctl <= ioctl_dout & ioctl_dout;
|
|||
if ioctl_index(7 downto 1) = "0000000" then -- 0 or 1
|
|||
-- BASIC + OS ROM
|
|||
sdram_a := unsigned(ioctl_addr(23 downto 0)) + SDRAM_ROM_ADDR;
|
|||
else
|
|||
sdram_a := unsigned(ioctl_addr(23 downto 0)) + CARTRIDGE_MEM;
|
|||
end if;
|
|||
if ioctl_index = x"42" then
|
|||
sdram_a := sdram_a - 16;
|
|||
end if;
|
|||
dma_addr_fetch_ioctl <= std_logic_vector(sdram_a);
|
|||
ioctl_state <= IOCTL_ACK;
|
|||
end if;
|
|||
end if;
|
|||
when IOCTL_ACK =>
|
|||
if dma_memory_ready = '1' then
|
|||
dma_fetch_ioctl <= '0';
|
|||
dma_16bit_write_enable_ioctl <= '0';
|
|||
ioctl_state <= IOCTL_WRITE;
|
|||
end if;
|
|||
when others => null;
|
|||
end case;
|
|||
end if;
|
|||
end process;
|
|||
LED <= zpu_sio_rxd;
|
|||
scandouble <= not scandoubler_disable;
|
|||
84 | 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';
|
|||
elsif (clk'event and clk='1') then
|
|||
half_scandouble_enable_reg <= half_scandouble_enable_next;
|
|||
end if;
|
|||
end process;
|
|||
half_scandouble_enable_next <= not(half_scandouble_enable_reg);
|
|||
scandoubler1: entity work.scandoubler
|
|||
GENERIC MAP
|
|||
(
|
|||
video_bits=>6
|
|||
)
|
|||
PORT MAP
|
|||
(
|
|||
CLK => CLK,
|
|||
RESET_N => RESET_N and SDRAM_RESET_N and not(reset_atari),
|
|||
907 | markw | VGA => scandouble,
|
|
1316 | markw | COMPOSITE_ON_HSYNC => '0', -- OSD needs separate sync, handle csync in the final mix
|
|
84 | markw | ||
colour_enable => half_scandouble_enable_reg,
|
|||
doubled_enable => '1',
|
|||
907 | markw | scanlines_on => scanlines,
|
|
84 | markw | ||
-- GTIA interface
|
|||
244 | markw | pal => PAL,
|
|
84 | markw | colour_in => VIDEO_B,
|
|
vsync_in => VGA_VS_RAW,
|
|||
hsync_in => VGA_HS_RAW,
|
|||
346 | markw | csync_in => VGA_CS_RAW,
|
|
84 | markw | ||
-- TO TV...
|
|||
1316 | markw | R => sd_red_o,
|
|
G => sd_green_o,
|
|||
B => sd_blue_o,
|
|||
84 | markw | ||
1316 | markw | VSYNC => sd_vs,
|
|
HSYNC => sd_hs
|
|||
84 | markw | );
|
|
1316 | markw | osd_inst: osd
|
|
port map (
|
|||
clk_sys => CLK,
|
|||
SPI_SCK => SPI_SCK,
|
|||
SPI_SS3 => SPI_SS3,
|
|||
SPI_DI => SPI_DI,
|
|||
968 | markw | ||
1316 | markw | R_in => sd_red_o,
|
|
G_in => sd_green_o,
|
|||
B_in => sd_blue_o,
|
|||
HSync => sd_hs,
|
|||
VSync => sd_vs,
|
|||
968 | markw | ||
1316 | markw | R_out => osd_red_o,
|
|
G_out => osd_green_o,
|
|||
B_out => osd_blue_o
|
|||
);
|
|||
rgb2ypbpr_inst: 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
|
|||
);
|
|||
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;
|
|||
-- 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' and no_csync='0') or ypbpr='1' else sd_hs;
|
|||
VGA_VS <= '1' when (scandoubler_disable='1' and no_csync='0') or ypbpr='1' else sd_vs;
|
|||
sector_buffer: entity work.DualPortRAM
|
|||
generic map (
|
|||
addrbits => 9,
|
|||
databits => 8
|
|||
)
|
|||
port map (
|
|||
clock => CLK,
|
|||
-- Port A - IO Controller side
|
|||
address_a => sd_buff_addr,
|
|||
data_a => sd_dout,
|
|||
wren_a => sd_dout_strobe,
|
|||
q_a => sd_din,
|
|||
-- Port B - ZPU side
|
|||
address_b => zpu_secbuf_addr,
|
|||
data_b => zpu_secbuf_d,
|
|||
wren_b => zpu_secbuf_we,
|
|||
q_b => zpu_secbuf_q
|
|||
);
|
|||
process (CLK, RESET_N)
|
|||
begin
|
|||
if RESET_N = '0' then
|
|||
zpu_in1(31 downto 29) <= "000";
|
|||
zpu_secbuf_we <= '0';
|
|||
elsif rising_edge(CLK) then
|
|||
sd_lba <= zpu_out2;
|
|||
sd_rd <= zpu_out3(31 downto 30);
|
|||
sd_wr <= zpu_out3(29 downto 28);
|
|||
zpu_secbuf_addr <= zpu_out3(16 downto 8);
|
|||
zpu_secbuf_d <= zpu_out3(7 downto 0);
|
|||
zpu_secbuf_we <= zpu_out3(17);
|
|||
if img_mounted(0) = '1' then
|
|||
zpu_in2 <= img_size;
|
|||
zpu_in1(30) <= not zpu_in1(30);
|
|||
elsif img_mounted(1) = '1' then
|
|||
zpu_in2 <= img_size;
|
|||
zpu_in1(31) <= not zpu_in1(31);
|
|||
elsif zpu_out3(18) = '1' then
|
|||
zpu_in2 <= X"000000"&zpu_secbuf_q;
|
|||
end if;
|
|||
zpu_in1(29) <= sd_ack;
|
|||
end if;
|
|||
end process;
|
|||
zpu_in1(28 downto 0) <=
|
|||
turbo_drive&X"00"&
|
|||
(atari_keyboard(28))&ps2_keys(16#5A#)&ps2_keys(16#174#)&ps2_keys(16#16B#)&ps2_keys(16#172#)&ps2_keys(16#175#)& -- (esc)FLRDU
|
|||
'0'&zpu_unl_reset&zpu_cold_reset&FKEYS(8 downto 0);
|
|||
zpu: entity work.zpucore
|
|||
70 | markw | GENERIC MAP
|
|
(
|
|||
platform => 1,
|
|||
1316 | markw | spi_clock_div => 4, -- 28MHz/2. Max for SD cards is 25MHz...
|
|
907 | markw | nMHz_clock_div => 27,
|
|
memory => 8192
|
|||
70 | markw | )
|
|
PORT MAP
|
|||
(
|
|||
-- standard...
|
|||
CLK => CLK,
|
|||
RESET_N => RESET_N and sdram_reset_n,
|
|||
-- dma bus master (with many waitstates...)
|
|||
1316 | markw | ZPU_ADDR_FETCH => dma_addr_fetch_zpu,
|
|
ZPU_DATA_OUT => dma_write_data_zpu,
|
|||
ZPU_FETCH => dma_fetch_zpu,
|
|||
ZPU_32BIT_WRITE_ENABLE => dma_32bit_write_enable_zpu,
|
|||
ZPU_16BIT_WRITE_ENABLE => dma_16bit_write_enable_zpu,
|
|||
ZPU_8BIT_WRITE_ENABLE => dma_8bit_write_enable_zpu,
|
|||
ZPU_READ_ENABLE => dma_read_enable_zpu,
|
|||
ZPU_MEMORY_READY => dma_memory_ready_zpu,
|
|||
70 | markw | ZPU_MEMORY_DATA => dma_memory_data,
|
|
-- rom bus master
|
|||
-- data on next cycle after addr
|
|||
ZPU_ADDR_ROM => zpu_addr_rom,
|
|||
215 | markw | ZPU_ROM_DATA => zpu_rom_data,
|
|
70 | markw | ||
215 | markw | ZPU_ROM_WREN => open,
|
|
70 | markw | ||
857 | markw | -- nmhz clock
|
|
CLK_nMHz => CLOCK_27(0),
|
|||
70 | markw | -- spi master
|
|
845 | markw | ZPU_SPI_DI => mist_sd_sdo,
|
|
ZPU_SPI_CLK => mist_sd_sck,
|
|||
ZPU_SPI_DO => mist_sd_sdi,
|
|||
ZPU_SPI_SELECT0 => mist_sd_cs,
|
|||
ZPU_SPI_SELECT1 => open,
|
|||
70 | markw | ||
-- SIO
|
|||
-- Ditto for speaking to Atari, we have a built in Pokey
|
|||
ZPU_POKEY_ENABLE => zpu_pokey_enable,
|
|||
ZPU_SIO_TXD => zpu_sio_txd,
|
|||
ZPU_SIO_RXD => zpu_sio_rxd,
|
|||
ZPU_SIO_COMMAND => zpu_sio_command,
|
|||
845 | markw | ZPU_SIO_CLK => ASIO_CLOCKOUT,
|
|
70 | markw | ||
-- external control
|
|||
-- switches etc. sector DMA blah blah.
|
|||
1316 | markw | ZPU_IN1 => zpu_in1,
|
|
-- ZPU_IN1 => X"000"&
|
|||
-- "00"&
|
|||
-- (atari_keyboard(28))&ps2_keys(16#5A#)&ps2_keys(16#174#)&ps2_keys(16#16B#)&ps2_keys(16#172#)&ps2_keys(16#175#)& -- (esc)FLRDU
|
|||
-- (FKEYS(11) or (mist_buttons(0) and not(joy1_n(4))))&(FKEYS(10) or (mist_buttons(0) and joy1_n(4) and joy_still))&(FKEYS(9) or (mist_buttons(0) and joy1_n(4) and not(joy_still)))&FKEYS(8 downto 0),
|
|||
ZPU_IN2 => zpu_in2,
|
|||
907 | markw | ZPU_IN3 => atari_keyboard(31 downto 0),
|
|
ZPU_IN4 => atari_keyboard(63 downto 32),
|
|||
70 | markw | ||
-- ouputs - e.g. Atari system control, halt, throttle, rom select
|
|||
ZPU_OUT1 => zpu_out1,
|
|||
ZPU_OUT2 => zpu_out2,
|
|||
ZPU_OUT3 => zpu_out3,
|
|||
907 | markw | ZPU_OUT4 => zpu_out4,
|
|
ZPU_OUT6 => zpu_out6 --video mode
|
|||
70 | markw | );
|
|
1316 | markw | zpu_cold_reset <= mist_status(2) or FKEYS(9);
|
|
zpu_unl_reset <= mist_status(3) or FKEYS(10);
|
|||
70 | markw | ||
1316 | markw | cold_reset <= zpu_cold_reset or zpu_unl_reset;
|
|
reset_atari <= mist_status(1) or mist_buttons(1) or zpu_out1(1) or reset_load;
|
|||
speed_6502 <= "000001" when mist_status(10 downto 8) = "000" else
|
|||
"000010" when mist_status(10 downto 8) = "001" else
|
|||
"000100" when mist_status(10 downto 8) = "010" else
|
|||
"001000" when mist_status(10 downto 8) = "011" else
|
|||
"010000";
|
|||
932 | markw | ||
1316 | markw | turbo_vblank_only <= mist_status(11);
|
|
907 | markw | ||
1316 | markw | atari800mode <= mist_status(12);
|
|
ram_select <= mist_status(15 downto 13) when atari800mode = '0' else mist_status(18 downto 16);
|
|||
PAL <= mist_status(5);
|
|||
scanlines <= mist_status(6);
|
|||
key_type <= mist_status(19);
|
|||
turbo_drive <= mist_status(22 downto 20);
|
|||
907 | markw | ||
1316 | markw | pause_atari <= '1' when zpu_out1(0) = '1' or ioctl_state /= IOCTL_IDLE else '0';
|
|
freezer_enable <= zpu_out1(25);
|
|||
907 | markw | ||
zpu_rom1: entity work.zpu_rom
|
|||
70 | markw | port map(
|
|
clock => clk,
|
|||
1316 | markw | address => zpu_addr_rom(13 downto 2),
|
|
70 | markw | q => zpu_rom_data
|
|
);
|
|||
1316 | markw | enable_179_clock_div_zpu_pokey : entity work.enable_divider
|
|
70 | markw | generic map (COUNT=>32) -- cycle_length
|
|
port map(clk=>clk,reset_n=>reset_n,enable_in=>'1',enable_out=>zpu_pokey_enable);
|
|||
16 | markw | END vhdl;
|