library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; use ieee.std_logic_textio.all; library std_developerskit ; -- used for to_string -- use std_developerskit.std_iopak.all; entity atari800xl_tb is end; architecture rtl of atari800xl_tb is constant CLK_A_PERIOD : time := 1 us / (1.79*32); signal reset_n : std_logic; signal clk_a : std_logic; -- VIDEO OUT - PAL/NTSC, original Atari timings approx (may be higher res) SIGNAL VIDEO_VS : STD_LOGIC; SIGNAL VIDEO_HS : STD_LOGIC; SIGNAL VIDEO_CS : STD_LOGIC; SIGNAL VIDEO_COLOUR : STD_LOGIC_VECTOR(7 DOWNTO 0); -- These ones are probably only needed for e.g. svideo SIGNAL VIDEO_BLANK : std_logic; SIGNAL VIDEO_BURST : std_logic; SIGNAL VIDEO_START_OF_FIELD : std_logic; SIGNAL VIDEO_ODD_LINE : std_logic; -- AUDIO - Pokey/GTIA 1-bit and Covox all mixed -- TODO - choose stereo/mono pokey SIGNAL AUDIO_L : std_logic_vector(15 downto 0); SIGNAL AUDIO_R : std_logic_vector(15 downto 0); -- JOYSTICK SIGNAL JOY1_n : std_logic_vector(4 downto 0); -- FRLDU, 0=pressed SIGNAL JOY2_n : std_logic_vector(4 downto 0); -- FRLDU, 0=pressed -- Pokey keyboard matrix -- Standard component available to connect this to PS2 SIGNAL KEYBOARD_RESPONSE : STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL KEYBOARD_SCAN : STD_LOGIC_VECTOR(5 DOWNTO 0); -- SIO SIGNAL SIO_COMMAND : std_logic; SIGNAL SIO_RXD : std_logic; SIGNAL SIO_TXD : std_logic; -- PIA SIGNAL CA1_IN : STD_LOGIC; SIGNAL CB1_IN: STD_LOGIC; SIGNAL CA2_OUT : STD_LOGIC; SIGNAL CA2_DIR_OUT: STD_LOGIC; SIGNAL CB2_OUT : STD_LOGIC; SIGNAL CB2_DIR_OUT: STD_LOGIC; SIGNAL CA2_IN: STD_LOGIC; SIGNAL CB2_IN: STD_LOGIC; SIGNAL PORTA_IN : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL PORTA_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL PORTA_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL PORTB_IN : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL PORTB_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0); --SIGNAL PORTB_DIR_OUT : STD_LOGIC_VECTOR(7 DOWNTO 0); -- GTIA signal GTIA_TRIG : std_logic_vector(3 downto 0); -- ANTIC signal ANTIC_LIGHTPEN : std_logic; -- CARTRIDGE ACCESS SIGNAL CART_RD4 : STD_LOGIC; SIGNAL CART_RD5 : STD_LOGIC; -- PBI SIGNAL PBI_WRITE_DATA : std_logic_vector(31 downto 0); -- INTERNAL ROM/RAM SIGNAL RAM_ADDR : STD_LOGIC_VECTOR(18 DOWNTO 0); SIGNAL RAM_DO : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL RAM_REQUEST : STD_LOGIC; SIGNAL RAM_REQUEST_COMPLETE : STD_LOGIC; SIGNAL RAM_WRITE_ENABLE : STD_LOGIC; SIGNAL ROM_ADDR : STD_LOGIC_VECTOR(21 DOWNTO 0); SIGNAL ROM_DO : STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL ROM_REQUEST : STD_LOGIC; SIGNAL ROM_REQUEST_COMPLETE : STD_LOGIC; -- CONFIG SIGNAL ROM_IN_RAM : STD_LOGIC; -- POTS SIGNAL POT_RESET : STD_LOGIC; SIGNAL POT_IN : STD_LOGIC_VECTOR(7 downto 0); SIGNAL CONSOL_OPTION : STD_LOGIC; SIGNAL CONSOL_SELECT : STD_LOGIC; SIGNAL CONSOL_START: STD_LOGIC; begin p_clk_gen_a : process begin clk_a <= '1'; wait for CLK_A_PERIOD/2; clk_a <= '0'; wait for CLK_A_PERIOD - (CLK_A_PERIOD/2 ); end process; reset_n <= '0', '1' after 1000ns; JOY1_N <= (others=>'1'); JOY2_N <= (others=>'1'); KEYBOARD_RESPONSE <= "11"; CONSOL_OPTION <= '1'; CONSOL_SELECT <= '1'; CONSOL_OPTION <= '1'; -- PIA mapping CA1_IN <= '1'; CB1_IN <= '1'; CA2_IN <= CA2_OUT when CA2_DIR_OUT='1' else '1'; CB2_IN <= CB2_OUT when CB2_DIR_OUT='1' else '1'; SIO_COMMAND <= CB2_OUT; PORTA_IN <= ((JOY2_n(3)&JOY2_n(2)&JOY2_n(1)&JOY2_n(0)&JOY1_n(3)&JOY1_n(2)&JOY1_n(1)&JOY1_n(0)) and not (porta_dir_out)) or (porta_dir_out and porta_out); PORTB_IN <= PORTB_OUT; -- ANTIC lightpen ANTIC_LIGHTPEN <= JOY2_n(4) and JOY1_n(4); -- GTIA triggers GTIA_TRIG <= "11"&JOY2_n(4)&JOY1_n(4); -- Cartridge not inserted CART_RD4 <= '0'; CART_RD5 <= '0'; POT_IN(7 downto 4) <= (others=>'0'); atari800xlinst : entity work.atari800xl PORT MAP ( CLK => CLK_A, RESET_N => RESET_N, VIDEO_VS => VIDEO_VS, VIDEO_HS => VIDEO_HS, VIDEO_CS => VIDEO_CS, COLOUR => VIDEO_COLOUR, VIDEO_BLANK => VIDEO_BLANK, VIDEO_BURST => VIDEO_BURST, VIDEO_START_OF_FIELD => VIDEO_START_OF_FIELD, VIDEO_ODD_LINE => VIDEO_ODD_LINE, AUDIO_L => AUDIO_L, AUDIO_R => AUDIO_R, SIO_AUDIO => "00000000", CA1_IN => CA1_IN, CB1_IN => CB1_IN, CA2_IN => CA2_IN, CA2_OUT => CA2_OUT, CA2_DIR_OUT => CA2_DIR_OUT, CB2_IN => CB2_IN, CB2_OUT => CB2_OUT, CB2_DIR_OUT => CB2_DIR_OUT, PORTA_IN => PORTA_IN, PORTA_DIR_OUT => PORTA_DIR_OUT, PORTA_OUT => PORTA_OUT, PORTB_IN => PORTB_IN, PORTB_DIR_OUT => open,--PORTB_DIR_OUT, PORTB_OUT => PORTB_OUT, KEYBOARD_RESPONSE => KEYBOARD_RESPONSE, KEYBOARD_SCAN => KEYBOARD_SCAN, POT_IN => POT_IN, POT_RESET => POT_RESET, -- PBI CART_RD4 => CART_RD4, CART_RD5 => CART_RD5, CART_S4_n => open, CART_S5_N => open, CART_CCTL_N => open, PBI_MPD_N => '1', PBI_REF_N_IN => '1', PBI_EXTSEL_N => '1', SIO_RXD => SIO_RXD, SIO_TXD => SIO_TXD, CONSOL_OPTION => CONSOL_OPTION, CONSOL_SELECT => CONSOL_SELECT, CONSOL_START=> CONSOL_START, GTIA_TRIG => GTIA_TRIG, ANTIC_LIGHTPEN => ANTIC_LIGHTPEN, ANTIC_REFRESH => open ); end rtl;