diff --git a/c64.sv b/c64.sv index 2fb5bbf..0e1799f 100644 --- a/c64.sv +++ b/c64.sv @@ -43,8 +43,8 @@ module emu output CE_PIXEL, //Video aspect ratio for HDMI. Most retro systems have ratio 4:3. - output [11:0] VIDEO_ARX, - output [11:0] VIDEO_ARY, + output [11:0] VIDEO_ARX, + output [11:0] VIDEO_ARY, output [7:0] VGA_R, output [7:0] VGA_G, @@ -68,8 +68,8 @@ module emu // b[1]: user button // b[0]: osd button output [1:0] BUTTONS, - - input CLK_AUDIO, // 24.576 MHz + + input CLK_AUDIO, // 24.576 MHz output [15:0] AUDIO_L, output [15:0] AUDIO_R, output AUDIO_S, // 1 - signed audio samples, 0 - unsigned @@ -157,8 +157,8 @@ localparam CONF_STR = { "D0S1,D64T64,Mount Drive #9;", "OP,Enable Drive #9,No,Yes;", "-;", - "F,PRG,Load File;", - "F,CRT,Load Cartridge;", + "F4,PRG,Load File;", + "F5,CRT,Load Cartridge;", "-;", "F,TAP,Tape Load;", "R7,Tape Play/Pause;", @@ -422,6 +422,7 @@ cartridge cartridge .IOF_ena(IOF_rom), .max_ram(max_ram), .freeze_key(freeze_key), + .mod_key(mod_key), .nmi(nmi), .nmi_ack(nmi_ack) ); @@ -710,6 +711,7 @@ wire ram_ce; wire ram_we; wire nmi_ack; wire freeze_key; +wire mod_key; wire IOE; wire IOF; @@ -751,6 +753,7 @@ fpga64_sid_iec fpga64 .nmi_n(~nmi), .nmi_ack(nmi_ack), .freeze_key(freeze_key), + .mod_key(mod_key), .dma_n(1'b1), .roml(romL), .romh(romH), diff --git a/rtl/cartridge.v b/rtl/cartridge.v index 7156724..0f83f72 100644 --- a/rtl/cartridge.v +++ b/rtl/cartridge.v @@ -44,6 +44,7 @@ module cartridge output reg max_ram, // Enable whole C64 RAM in Ultimax mode input freeze_key, + input mod_key, output reg nmi, input nmi_ack ); @@ -109,6 +110,7 @@ wire freeze_req = (~old_freeze & freeze_key); reg old_nmiack = 0; wire freeze_ack = (nmi & ~old_nmiack & nmi_ack); +wire freeze_crt = freeze_ack & ~mod_key; // 0018 - EXROM line status // 0019 - GAME line status @@ -124,7 +126,7 @@ always @(posedge clk32) begin if (!cart_attached) allow_freeze <= 1; // Otherwise it defaults to 0 and freeze/restore does not work after dettaching a freezer (just once). old_freeze <= freeze_key; - if(freeze_req & allow_freeze) nmi <= 1; + if(freeze_req & (allow_freeze | mod_key)) nmi <= 1; old_nmiack <= nmi_ack; if(freeze_ack) nmi <= 0; @@ -164,7 +166,7 @@ always @(posedge clk32) begin // controlled by DE00 1: begin if(nmi) allow_freeze <= 0; - if(!init_n || freeze_ack) begin + if(!init_n || freeze_crt) begin cart_disable <= 0; exrom_overide <= 1; game_overide <= 0; @@ -238,7 +240,7 @@ always @(posedge clk32) begin cart_disable <= c64_data_out[7]; end end - if(freeze_ack) begin + if(freeze_crt) begin cart_disable <= 0; game_overide <= 0; allow_freeze <= 0; @@ -346,7 +348,7 @@ always @(posedge clk32) begin IOF_ena <= 1; end - if(freeze_ack) begin + if(freeze_crt) begin game_overide <= 0; allow_freeze <= 0; end @@ -406,7 +408,7 @@ always @(posedge clk32) begin // Super Snapshot v5 -(64k rom 8*8k banks/4*16k banks, 32k ram 4*8k banks) 20: begin - if(!init_n || freeze_ack) begin + if(!init_n || freeze_crt) begin init_n <= 1; romL_we <= 1; bank_lo <= 0; diff --git a/rtl/fpga64_keyboard.vhd b/rtl/fpga64_keyboard.vhd index be0596d..655c2e5 100644 --- a/rtl/fpga64_keyboard.vhd +++ b/rtl/fpga64_keyboard.vhd @@ -47,6 +47,7 @@ entity fpga64_keyboard is pbo: out unsigned(7 downto 0); restore_key : out std_logic; + mod_key : out std_logic; -- Config -- backwardsReadingEnabled = 1 allows reversal of PIA registers to still work. @@ -138,6 +139,9 @@ architecture rtl of fpga64_keyboard is signal key_Q: std_logic := '0'; signal key_runstop: std_logic := '0'; + signal mod_key1: std_logic := '0'; + signal mod_key2: std_logic := '0'; + -- for joystick emulation on PS2 signal old_state : std_logic; @@ -145,7 +149,9 @@ begin pressed <= ps2_key(9); --extended<= ps2_key(8); - + + mod_key <= mod_key1 or mod_key2; + matrix: process(clk) begin if rising_edge(clk) then @@ -328,12 +334,14 @@ begin when X"1C" => key_A <= pressed; when X"1D" => key_W <= pressed; when X"1E" => key_2 <= pressed; + when X"1F" => mod_key1 <= pressed; when X"21" => key_C <= pressed; when X"22" => key_X <= pressed; when X"23" => key_D <= pressed; when X"24" => key_E <= pressed; when X"25" => key_4 <= pressed; when X"26" => key_3 <= pressed; + when X"27" => mod_key2 <= pressed; when X"29" => key_space <= pressed; when X"2A" => key_V <= pressed; when X"2B" => key_F <= pressed; diff --git a/rtl/fpga64_sid_iec.vhd b/rtl/fpga64_sid_iec.vhd index 9745278..411e3e4 100644 --- a/rtl/fpga64_sid_iec.vhd +++ b/rtl/fpga64_sid_iec.vhd @@ -80,6 +80,7 @@ port( IOF : out std_logic; -- cart signals LCA CPU_hasbus : out std_logic; -- CPU has the bus STROBE freeze_key : out std_logic; + mod_key : out std_logic; ioF_ext : in std_logic; ioE_ext : in std_logic; @@ -732,6 +733,7 @@ port map ( pbo => cia1_pbi, restore_key => freeze_key, + mod_key => mod_key, backwardsReadingEnabled => '1' );