Apple2 a última versión

This commit is contained in:
antoniovillena 2016-04-28 14:11:26 +02:00
parent 90e0749c58
commit bba00ea2ba
7 changed files with 76 additions and 35 deletions

View File

@ -76,7 +76,7 @@
<association xil_pn:name="Implementation" xil_pn:seqID="13"/> <association xil_pn:name="Implementation" xil_pn:seqID="13"/>
</file> </file>
<file xil_pn:name="source/apple2_zxuno_v3.ucf" xil_pn:type="FILE_UCF"> <file xil_pn:name="source/apple2_zxuno_v3.ucf" xil_pn:type="FILE_UCF">
<association xil_pn:name="Implementation" xil_pn:seqID="114"/> <association xil_pn:name="Implementation" xil_pn:seqID="67"/>
</file> </file>
</files> </files>

View File

@ -0,0 +1 @@
copy /B Apple33.nib + LodeRunner.nib + MarioBros.nib + MoonPatrol.nib + SpyVsSpy.nib + Zaxxon.nib + ZorkIII.nib + Choplifter.nib + Karateka.nib + Pacman.nib apple2_10disks.img

View File

View File

@ -1,5 +1,5 @@
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- --
-- Papilio DUO with Classic computing shield top-level module for the Apple ][ -- Papilio DUO with Classic computing shield top-level module for the Apple ][
-- --
-- VLA -- VLA
@ -26,6 +26,7 @@ entity APPLE2_TOP is
CLOCK50 : in std_logic; CLOCK50 : in std_logic;
LED : out std_logic; LED : out std_logic;
LED2 : out std_logic;
I_RESET : in std_logic; I_RESET : in std_logic;
-- SRAM -- SRAM
@ -59,8 +60,7 @@ entity APPLE2_TOP is
O_AUDIO_L : out std_logic; -- ADC Data O_AUDIO_L : out std_logic; -- ADC Data
O_AUDIO_R : out std_logic; -- ADC Data O_AUDIO_R : out std_logic; -- ADC Data
SW_LEFT : in std_logic; BTN2 : in std_logic;
SW_UP : in std_logic;
JOYSTICK1 : in std_logic_vector(4 downto 0) JOYSTICK1 : in std_logic_vector(4 downto 0)
); );
@ -108,17 +108,53 @@ architecture datapath of APPLE2_TOP is
signal PDL_STROBE : std_logic; signal PDL_STROBE : std_logic;
signal joy1_x, joy1_y : std_logic; signal joy1_x, joy1_y : std_logic;
signal csjudlr1 : std_logic_vector(6 downto 0); signal csjudlr1 : std_logic_vector(6 downto 0);
signal BTN3 : std_logic;
signal keyCode : unsigned(11 downto 0);
signal resetKey : std_logic;
signal imageCount : unsigned(7 downto 0) := (others => '0');
begin begin
reset <= I_RESET or power_on_reset; reset <= I_RESET or power_on_reset;
resetKey <= '1' when keyCode = X"007" else '0'; --F12 reset
img_select : process (keyCode) --Disk image selection = SHIFT + Fx (F1 to F10)
begin
if keyCode = X"105" then --F1
imageCount <= X"00";
elsif keyCode = X"106" then
imageCount <= X"01";
elsif keyCode = X"104" then
imageCount <= X"02";
elsif keyCode = X"10C" then
imageCount <= X"03";
elsif keyCode = X"103" then
imageCount <= X"04";
elsif keyCode = X"10B" then
imageCount <= X"05";
elsif keyCode = X"183" then
imageCount <= X"06";
elsif keyCode = X"10A" then
imageCount <= X"07";
elsif keyCode = X"101" then
imageCount <= X"08";
elsif keyCode = X"109" then --F10
imageCount <= X"09";
else
imageCount <= imageCount + 0;
end if;
end process;
power_on : process(CLK_14M) power_on : process(CLK_14M)
begin begin
if rising_edge(CLK_14M) then if rising_edge(CLK_14M) then
if flash_clk(22) = '1' then if flash_clk(22) = '1' and resetKey = '0' then
power_on_reset <= '0'; power_on_reset <= '0';
end if; elsif resetKey = '1' then
power_on_reset <= '1';
end if;
end if; end if;
end process; end process;
@ -126,7 +162,11 @@ begin
flash_clkgen : process (CLK_14M) flash_clkgen : process (CLK_14M)
begin begin
if rising_edge(CLK_14M) then if rising_edge(CLK_14M) then
flash_clk <= flash_clk + 1; if resetKey = '0' then
flash_clk <= flash_clk + 1;
else
flash_clk <= "00000000000000000000000";
end if;
end if; end if;
end process; end process;
@ -138,6 +178,8 @@ begin
O_CLK_28M => CLK_28M, O_CLK_28M => CLK_28M,
O_CLK_14M => CLK_14M O_CLK_14M => CLK_14M
); );
BTN3 <= '1';
-- joystick inputs, these should probably be debounced first -- joystick inputs, these should probably be debounced first
csjudlr1 <= "00" & JOYSTICK1; csjudlr1 <= "00" & JOYSTICK1;
@ -149,7 +191,7 @@ begin
-- y x bt3 bt2 bt1 -- y x bt3 bt2 bt1
-- Paddle buttons -- Paddle buttons
GAMEPORT <= "00" & joy1_y & joy1_x & SW_LEFT & SW_UP & not csjudlr1(4) & '0'; --"0000" & "0000"; -- (not KEY(2 downto 0)) & "0"; GAMEPORT <= "00" & joy1_y & joy1_x & not BTN3 & not BTN2 & not csjudlr1(4) & '0'; --"0000" & "0000"; -- (not KEY(2 downto 0)) & "0";
-- fake analog joystick... -- fake analog joystick...
-- PDL_STROBE starts the counter -- PDL_STROBE starts the counter
@ -244,6 +286,7 @@ begin
PS2_Data => PS2_DAT, PS2_Data => PS2_DAT,
CLK_14M => CLK_14M, CLK_14M => CLK_14M,
reset => reset, reset => reset,
key_code => keyCode, --Q
read => read_key, read => read_key,
K => K K => K
); );
@ -284,7 +327,7 @@ begin
ram_we => TRACK_RAM_WE ram_we => TRACK_RAM_WE
); );
image <= "0" & "000000000"; image <= "00" & imageCount; --disk image selection
SD_DAT3 <= CS_N; SD_DAT3 <= CS_N;
SD_CMD <= MOSI; SD_CMD <= MOSI;
@ -309,7 +352,6 @@ begin
SRAM_WE_N <= not ram_we; SRAM_WE_N <= not ram_we;
LED <= not CS_N; --Led SD LED <= not CS_N; --Led SD
-- LED2 <= '1' when imageCount = "0000000001" else '0'; --Led ext3
-- Set all other unused bidirectional ports to tri-state
end datapath; end datapath;

View File

@ -61,16 +61,13 @@ NET SRAM_DQ<7> LOC="P104" | IOSTANDARD = LVCMOS33;
NET SRAM_WE_N LOC="P134" | IOSTANDARD=LVCMOS33; NET SRAM_WE_N LOC="P134" | IOSTANDARD=LVCMOS33;
NET JOYSTICK1(0) LOC="P142" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(0) LOC="P5" | IOSTANDARD=LVCMOS33 | PULLUP; #right
NET JOYSTICK1(1) LOC="P1" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(1) LOC="P2" | IOSTANDARD=LVCMOS33 | PULLUP; #left
NET JOYSTICK1(2) LOC="P2" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(2) LOC="P1" | IOSTANDARD=LVCMOS33 | PULLUP; #down
NET JOYSTICK1(4) LOC="P5" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(4) LOC="P6" | IOSTANDARD=LVCMOS33 | PULLUP; #btn1
NET JOYSTICK1(3) LOC="P143" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(3) LOC="P142" | IOSTANDARD=LVCMOS33 | PULLUP; #up
NET BTN2 LOC="P143" | IOSTANDARD=LVCMOS33 | PULLUP; #btn2
NET LED LOC="P10" | IOSTANDARD=LVCMOS33; NET LED LOC="P10" | IOSTANDARD=LVCMOS33;
#NET LED2 LOC="P11" | IOSTANDARD=LVCMOS33; #EXT3 test led
#NET SW_LEFT LOC="P33" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_UP LOC="P34" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_DOWN LOC="P101" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_RIGHT LOC="P100" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;

View File

@ -61,15 +61,12 @@ NET SRAM_DQ(7) LOC="P127" | IOSTANDARD=LVCMOS33;
NET SRAM_WE_N LOC="P118" | IOSTANDARD=LVCMOS33; NET SRAM_WE_N LOC="P118" | IOSTANDARD=LVCMOS33;
NET JOYSTICK1(0) LOC="P1" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(0) LOC="P7" | IOSTANDARD=LVCMOS33 | PULLUP; #right
NET JOYSTICK1(1) LOC="P5" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(1) LOC="P6" | IOSTANDARD=LVCMOS33 | PULLUP; #left
NET JOYSTICK1(2) LOC="P6" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(2) LOC="P5" | IOSTANDARD=LVCMOS33 | PULLUP; #down
NET JOYSTICK1(4) LOC="P7" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(4) LOC="P2" | IOSTANDARD=LVCMOS33 | PULLUP; #btn1
NET JOYSTICK1(3) LOC="P2" | IOSTANDARD=LVCMOS33; NET JOYSTICK1(3) LOC="P1" | IOSTANDARD=LVCMOS33 | PULLUP; #up
NET BTN2 LOC="P39" | IOSTANDARD=LVCMOS33 | PULLUP; #btn2
NET LED LOC="P10" | IOSTANDARD=LVCMOS33; NET LED LOC="P10" | IOSTANDARD=LVCMOS33;
#NET LED2 LOC="P11" | IOSTANDARD=LVCMOS33; #EXT3 test led
#NET SW_LEFT LOC="P33" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_UP LOC="P34" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_DOWN LOC="P101" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;
#NET SW_RIGHT LOC="P100" | IOSTANDARD=LVCMOS33 | DRIVE=8 | SLEW=FAST;

View File

@ -24,6 +24,7 @@ entity keyboard is
CLK_14M : in std_logic; CLK_14M : in std_logic;
read : in std_logic; -- Read strobe read : in std_logic; -- Read strobe
reset : in std_logic; reset : in std_logic;
key_code : out unsigned(11 downto 0);
K : out unsigned(7 downto 0) -- Latched, decoded keyboard data K : out unsigned(7 downto 0) -- Latched, decoded keyboard data
); );
end keyboard; end keyboard;
@ -69,9 +70,9 @@ begin
Scan_DAV => code_available, Scan_DAV => code_available,
Scan_Code => code); Scan_Code => code);
K <= key_pressed & "00" & ascii(4 downto 0) when ctrl = '1' else K <= key_pressed & "00" & ascii(4 downto 0) when ctrl = '1' and ascii /= "00" else
key_pressed & ascii(6 downto 0); key_pressed & ascii(6 downto 0) when ascii /= "00" else X"00"; --Q ascii
shift_ctrl : process (CLK_14M, reset) shift_ctrl : process (CLK_14M, reset)
begin begin
if reset = '1' then if reset = '1' then
@ -132,6 +133,7 @@ begin
elsif code = LEFT_SHIFT or code = RIGHT_SHIFT or code = LEFT_CTRL then elsif code = LEFT_SHIFT or code = RIGHT_SHIFT or code = LEFT_CTRL then
next_state <= IDLE; next_state <= IDLE;
else else
next_state <= NORMAL_KEY; next_state <= NORMAL_KEY;
end if; end if;
@ -155,6 +157,8 @@ begin
shifted_code <= "00" & alt & shift & latched_code; shifted_code <= "00" & alt & shift & latched_code;
key_code <= shifted_code when state = KEY_UP else X"000"; --Q
EN_us: if KEYMAP = "EN-us" generate EN_us: if KEYMAP = "EN-us" generate
with shifted_code select with shifted_code select
ascii <= ascii <=