diff --git a/cores/c64/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd b/cores/c64/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd index ae1ebc0..de08b5a 100644 --- a/cores/c64/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd +++ b/cores/c64/rtl/fpga64_keyboard_matrix_mark_mcdougall.vhd @@ -72,10 +72,14 @@ architecture rtl of fpga64_keyboard_matrix is signal key_return: std_logic := '0'; signal key_left: std_logic := '0'; signal key_right: std_logic := '0'; - signal key_f7: std_logic := '0'; signal key_f1: std_logic := '0'; + signal key_f2: std_logic := '0'; signal key_f3: std_logic := '0'; + signal key_f4: std_logic := '0'; signal key_f5: std_logic := '0'; + signal key_f6: std_logic := '0'; + signal key_f7: std_logic := '0'; + signal key_f8: std_logic := '0'; signal key_up: std_logic := '0'; signal key_down: std_logic := '0'; @@ -144,7 +148,7 @@ architecture rtl of fpga64_keyboard_matrix is -- for joystick emulation on PS2 signal joySelKey : std_logic; - signal joyKeys : std_logic_vector(joyA'range); -- active high + signal joyKeys : std_logic_vector(joyA'range) := (others => '0'); -- active high signal joyA_s : unsigned(joyA'range); -- active low signal joyB_s : unsigned(joyB'range); -- active low signal joySel : std_logic_vector(1 downto 0) := "00"; @@ -206,10 +210,10 @@ begin ((pbi(0) or not key_del) and (pbi(1) or not key_return) and (pbi(2) or not (key_left or key_right)) and - (pbi(3) or not key_f7) and - (pbi(4) or not key_f1) and - (pbi(5) or not key_f3) and - (pbi(6) or not key_f5) and + (pbi(3) or not (key_f7 or key_f8)) and + (pbi(4) or not (key_f1 or key_f2)) and + (pbi(5) or not (key_f3 or key_f4)) and + (pbi(6) or not (key_f5 or key_f6)) and (pbi(7) or not (key_up or key_down)))); pao(1) <= pai(1) and joyA_s(1) and ((not backwardsReadingEnabled) or @@ -220,7 +224,7 @@ begin (pbi(4) or not key_Z) and (pbi(5) or not key_S) and (pbi(6) or not key_E) and - (pbi(7) or not (key_left or key_up or key_shiftL)))); + (pbi(7) or not (key_left or key_up or key_shiftL or key_f2 or key_f4 or key_f6 or key_f8)))); pao(2) <= pai(2) and joyA_s(2) and ((not backwardsReadingEnabled) or ((pbi(0) or not key_5) and @@ -348,7 +352,7 @@ begin (pai(7) or not key_Q); pbo(7) <= pbi(7) and (pai(0) or not (key_up or key_down)) and - (pai(1) or not (key_left or key_up or key_shiftL)) and + (pai(1) or not (key_left or key_up or key_shiftL or key_f2 or key_f4 or key_f6 or key_f8)) and (pai(2) or not key_X) and (pai(3) or not key_V) and (pai(4) or not key_N) and @@ -371,25 +375,22 @@ begin releaseFlag <= '0'; extendedFlag <= '0'; case theScanCode is - when X"01" => key_pound <= not releaseFlag; - when X"03" => key_F5 <= not releaseFlag; - when X"04" => key_F3 <= not releaseFlag; when X"05" => key_F1 <= not releaseFlag; - when X"06" => -- F2 - if releaseFlag = '0' then - traceKey <= '1'; - end if; - when X"09" => key_plus <= not releaseFlag; - when X"0A" => -- F8 - if releaseFlag = '0' then - diskChgKey <= '1'; - end if; - when X"0B" => -- F6 - if releaseFlag = '0' then - trace2Key <= '1'; - end if; - when X"0C" => restore_key <= not releaseFlag; -- F4 + when X"06" => key_F2 <= not releaseFlag; + when X"04" => key_F3 <= not releaseFlag; + when X"0C" => key_F4 <= not releaseFlag; + when X"03" => key_F5 <= not releaseFlag; + when X"0B" => key_F6 <= not releaseFlag; when X"83" => key_F7 <= not releaseFlag; + when X"0A" => key_F8 <= not releaseFlag; + when X"01" => key_pound <= not releaseFlag; -- F9 + when X"09" => key_plus <= not releaseFlag; -- F10 + when X"78" => -- F11 + if key_ctrl = '1' then + reset_key <= not releaseFlag; + else + restore_key <= not releaseFlag; + end if; when X"0E" => key_arrowleft <= not releaseFlag; when X"11" => key_commodore <= not releaseFlag; when X"12" => if extendedFlag = '0' then key_shiftl <= not releaseFlag; end if; @@ -458,14 +459,6 @@ begin when X"74" => if extendedFlag = '0' then joyKeys(3) <= not releaseFlag; else key_right <= not releaseFlag; end if; when X"75" => if extendedFlag = '0' then joyKeys(0) <= not releaseFlag; else key_up <= not releaseFlag; end if; when X"76" => key_runstop <= not releaseFlag; - when X"78" => -- F11 - if key_ctrl = '1' then - reset_key <= not releaseFlag; - else - if releaseFlag = '0' then - joySelKey <= '1'; - end if; - end if; when others => null; end case; end if; diff --git a/cores/c64/rtl/mist/c64_mist.vhd b/cores/c64/rtl/mist/c64_mist.vhd index da042e1..5557440 100644 --- a/cores/c64/rtl/mist/c64_mist.vhd +++ b/cores/c64/rtl/mist/c64_mist.vhd @@ -348,8 +348,6 @@ end component cartridge; signal c64_data_out: std_logic_vector(7 downto 0); signal sdram_addr: std_logic_vector(24 downto 0); signal sdram_data_out: std_logic_vector(7 downto 0); - - -- cartridge signals LCA signal cart_id : std_logic_vector(15 downto 0); -- cart ID or cart type @@ -509,7 +507,6 @@ end component cartridge; signal tap_wrreq : std_logic; signal tap_wrfull : std_logic; signal tap_fifo_error : std_logic; - signal tap_loaded : std_logic; signal tap_mode : std_logic; signal tap_play : std_logic; signal tap_play_btn: std_logic; @@ -652,35 +649,38 @@ begin joyA_c64 <= joyB_int when status(3)='1' else joyA_int; joyB_c64 <= joyA_int when status(3)='1' else joyB_int; - sdram_addr <= c64_addr_temp when iec_cycle='0' else ioctl_ram_addr when ioctl_download = '1' else tap_play_addr; + sdram_addr <= c64_addr_temp when iec_cycle='0' else ioctl_ram_addr when ioctl_download = '1' or erasing = '1' else tap_play_addr; sdram_data_out <= c64_data_out when iec_cycle='0' else ioctl_ram_data; -- ram_we and ce are active low sdram_ce <= mem_ce when iec_cycle='0' else ioctl_iec_cycle_used or tap_mem_ce; - sdram_we <= not ram_we when iec_cycle='0' else ioctl_iec_cycle_used when ioctl_download = '1' else '0'; + sdram_we <= not ram_we when iec_cycle='0' else ioctl_iec_cycle_used when ioctl_download = '1' or erasing = '1' else '0'; process(clk_c64) begin - if falling_edge(clk_c64) then + if rising_edge(clk_c64) then old_download <= ioctl_download; iec_cycleD <= iec_cycle; cart_hdr_wr <= '0'; - if(iec_cycle='1' and iec_cycleD='0' and ioctl_ram_wr='1') then + if iec_cycle = '0' and iec_cycleD = '1' and ioctl_ram_wr = '1' then ioctl_ram_wr <= '0'; - ioctl_iec_cycle_used <= '1'; - ioctl_ram_addr <= ioctl_load_addr; - ioctl_load_addr <= ioctl_load_addr + "1"; + ioctl_ram_addr <= ioctl_load_addr; + ioctl_load_addr <= ioctl_load_addr + 1; if erasing = '1' then - ioctl_ram_data <= (others => '0'); + -- fill RAM with 64 bytes 0, 64 bytes ff + -- same as VICE uses + -- Freeload and probably some more code depend on some kind of pattern + ioctl_ram_data <= (others => ioctl_load_addr(6)); else ioctl_ram_data <= ioctl_data; end if; - else - if(iec_cycle='0') then - ioctl_iec_cycle_used <= '0'; - end if; + ioctl_iec_cycle_used <= '1'; + end if; + -- second IEC cycle - SDRAM data written, disable WE on the next + if iec_cycle = '1' and iec_cycleD = '1' and ioctl_iec_cycle_used = '1' then + ioctl_iec_cycle_used <= '0'; end if; if ioctl_wr='1' then @@ -740,9 +740,8 @@ begin if ioctl_addr = 0 then ioctl_load_addr <= '0' & X"200000"; ioctl_ram_data <= ioctl_data; - else - ioctl_ram_wr <= '1'; end if; + ioctl_ram_wr <= '1'; end if; end if; @@ -752,10 +751,6 @@ begin erase_cram <= '1'; end if; - if old_download /= ioctl_download and ioctl_index = x"42" then - tap_loaded <= old_download; - end if; - if status(5)='1' or buttons(1)='1' then cart_attached <= '0'; end if; @@ -1212,21 +1207,23 @@ begin end if; tap_play_btnD <= tap_play_btn; - if tap_loaded = '1' and tap_play_btnD = '0' and tap_play_btn = '1' then + if tap_play_btnD = '0' and tap_play_btn = '1' then tap_play <= not tap_play; end if; - if tap_fifo_error = '1' or tap_play_addr = tap_last_addr then tap_play <= '0'; end if; +-- if tap_fifo_error = '1' then tap_play <= '0'; end if; iec_cycle_rD <= iec_cycle; tap_wrreq <= '0'; - if iec_cycle = '0' and iec_cycle_rD = '1' and tap_play = '1' and tap_wrfull = '0' then - tap_play_addr <= tap_play_addr + 1; + if iec_cycle = '0' and iec_cycle_rD = '1' and + ioctl_download = '0' and tap_play_addr /= tap_last_addr and tap_wrfull = '0' then tap_mem_ce <= '1'; end if; + -- second IEC cycle - SDRAM data ready on the next if iec_cycle = '1' and iec_cycle_rD = '1' and tap_mem_ce = '1' then tap_mem_ce <= '0'; tap_wrreq <= '1'; + tap_play_addr <= tap_play_addr + 1; end if; end if; end process; diff --git a/cores/c64/rtl/mos6526.v b/cores/c64/rtl/mos6526.v index 3543490..0131d4f 100644 --- a/cores/c64/rtl/mos6526.v +++ b/cores/c64/rtl/mos6526.v @@ -155,11 +155,11 @@ end always @(posedge clk) begin if (!res_n) icr[4] <= 1'b0; else begin - if (!flag_n && flag_n_prev) icr[4] <= 1'b1; if (phi2_p) begin - flag_n_prev <= flag_n; if (int_reset) icr[4] <= 1'b0; end + flag_n_prev <= flag_n; + if (!flag_n && flag_n_prev) icr[4] <= 1'b1; end end