diff --git a/cores/SamCoupe/asic.v b/cores/SamCoupe/asic.v
index 6a60669..af6a145 100644
--- a/cores/SamCoupe/asic.v
+++ b/cores/SamCoupe/asic.v
@@ -226,23 +226,29 @@ module asic (
mem_contention = 1'b0;
io_contention = 1'b0;
- if (screen_off == 1'b0 && hc[3:0]<4'd10)
- io_contention = 1'b1;
- if (screen_off == 1'b1 && (hc[3:0]==4'd0 ||
- hc[3:0]==4'd1 ||
- hc[3:0]==4'd8 ||
- hc[3:0]==4'd9) )
- io_contention = 1'b1;
+// if (screen_off == 1'b0 && hc[3:0]<4'd10)
+// io_contention = 1'b1;
+// if (screen_off == 1'b1 && (hc[3:0]==4'd0 ||
+// hc[3:0]==4'd1 ||
+// hc[3:0]==4'd8 ||
+// hc[3:0]==4'd9) )
+// io_contention = 1'b1;
- if (fetching_pixels == 1'b1 && hc[3:0]<4'd10)
+ if (fetching_pixels == 1'b1 && hc[3:0]<4'd10) begin
mem_contention = 1'b1;
+ //io_contention = 1'b1;
+ end
if (fetching_pixels == 1'b0 && (hc[3:0]==4'd0 ||
hc[3:0]==4'd1 ||
hc[3:0]==4'd8 ||
- hc[3:0]==4'd9) )
+ hc[3:0]==4'd9) ) begin
mem_contention = 1'b1;
- if (screen_mode == 2'b00 && hc[3:0]<4'd10 && (hc<10'd128 || hc>=10'd256))
+ //io_contention = 1'b1;
+ end
+ if (screen_mode == 2'b00 && hc[3:0]<4'd10 && (hc<10'd128 || hc>=10'd256)) begin
mem_contention = 1'b1; // extra contention for MODE 1
+ //io_contention = 1'b1;
+ end
end
assign asic_is_using_ram = mem_contention & fetching_pixels;
diff --git a/cores/SamCoupe/pines_zxuno.ucf b/cores/SamCoupe/pines_zxuno.ucf
index 3098d56..9f4219d 100644
--- a/cores/SamCoupe/pines_zxuno.ucf
+++ b/cores/SamCoupe/pines_zxuno.ucf
@@ -1,34 +1,34 @@
# Clocks & debug
NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33;
-#NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33;
+#NET "testled" LOC="2" | IOSTANDARD = LVCMOS33;
NET "clk50mhz" PERIOD=20 ns;
NET "clk12" PERIOD=83 ns;
# Video output
-NET "r<2>" LOC="P93" | IOSTANDARD = LVCMOS33;
-NET "r<1>" LOC="P92" | IOSTANDARD = LVCMOS33;
-NET "r<0>" LOC="P88" | IOSTANDARD = LVCMOS33;
-NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33;
-NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33;
-NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33;
-NET "b<2>" LOC="P81" | IOSTANDARD = LVCMOS33;
-NET "b<1>" LOC="P80" | IOSTANDARD = LVCMOS33;
-NET "b<0>" LOC="P79" | IOSTANDARD = LVCMOS33;
-NET "csync" LOC="P87" | IOSTANDARD = LVCMOS33;
-#NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33;
-NET "stdn" LOC="P67" | IOSTANDARD = LVCMOS33;
-NET "stdnb" LOC="P66" | IOSTANDARD = LVCMOS33;
+NET "r<2>" LOC="P97" | IOSTANDARD = LVCMOS33;
+NET "r<1>" LOC="P95" | IOSTANDARD = LVCMOS33;
+NET "r<0>" LOC="P94" | IOSTANDARD = LVCMOS33;
+NET "g<2>" LOC="P88" | IOSTANDARD = LVCMOS33;
+NET "g<1>" LOC="P87" | IOSTANDARD = LVCMOS33;
+NET "g<0>" LOC="P85" | IOSTANDARD = LVCMOS33;
+NET "b<2>" LOC="P84" | IOSTANDARD = LVCMOS33;
+NET "b<1>" LOC="P83" | IOSTANDARD = LVCMOS33;
+NET "b<0>" LOC="P82" | IOSTANDARD = LVCMOS33;
+NET "csync" LOC="P93" | IOSTANDARD = LVCMOS33;
+#NET "vsync" LOC="P92" | IOSTANDARD = LVCMOS33;
+NET "stdn" LOC="P51" | IOSTANDARD = LVCMOS33;
+NET "stdnb" LOC="P50" | IOSTANDARD = LVCMOS33;
# Sound input/output
-NET "audio_out_left" LOC="P8" | IOSTANDARD = LVCMOS33;
-NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33;
-NET "ear" LOC="P105" | IOSTANDARD = LVCMOS33;
+NET "audio_out_left" LOC="P98" | IOSTANDARD = LVCMOS33;
+NET "audio_out_right" LOC="P99" | IOSTANDARD = LVCMOS33;
+NET "ear" LOC="P1" | IOSTANDARD = LVCMOS33;
# Keyboard and mouse
-NET "clkps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN
-NET "dataps2" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN
-#NET "mouseclk" LOC="P94" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN
-#NET "mousedata" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN
+NET "clkps2" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN
+NET "dataps2" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN
+#NET "mouseclk" LOC="P57" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN
+#NET "mousedata" LOC="P56" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN
# SRAM
NET "sram_addr<0>" LOC="P115" | IOSTANDARD = LVCMOS33;
@@ -51,34 +51,32 @@ NET "sram_addr<16>" LOC="P139" | IOSTANDARD = LVCMOS33;
NET "sram_addr<17>" LOC="P141" | IOSTANDARD = LVCMOS33;
NET "sram_addr<18>" LOC="P138" | IOSTANDARD = LVCMOS33;
-NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33;
-NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33;
-NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33;
-NET "sram_data<3>" LOC="P99" | IOSTANDARD = LVCMOS33;
-NET "sram_data<4>" LOC="P100" | IOSTANDARD = LVCMOS33;
-NET "sram_data<5>" LOC="P101" | IOSTANDARD = LVCMOS33;
-NET "sram_data<6>" LOC="P102" | IOSTANDARD = LVCMOS33;
-NET "sram_data<7>" LOC="P104" | IOSTANDARD = LVCMOS33;
+NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33;
+NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33;
+NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33;
+NET "sram_data<3>" LOC="P105" | IOSTANDARD = LVCMOS33;
+NET "sram_data<4>" LOC="P104" | IOSTANDARD = LVCMOS33;
+NET "sram_data<5>" LOC="P102" | IOSTANDARD = LVCMOS33;
+NET "sram_data<6>" LOC="P101" | IOSTANDARD = LVCMOS33;
+NET "sram_data<7>" LOC="P100" | IOSTANDARD = LVCMOS33;
-NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33;
+NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33;
# SPI Flash
#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33;
#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33;
#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33;
#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33;
-#NET "flash_ext1" LOC="P62" | IOSTANDARD = LVCMOS33;
-#NET "flash_ext2" LOC="P61" | IOSTANDARD = LVCMOS33;
# SD/MMC
-#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33;
-#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33;
-#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33;
-#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33;
+#NET "sd_cs_n" LOC="P78" | IOSTANDARD = LVCMOS33;
+#NET "sd_clk" LOC="P80" | IOSTANDARD = LVCMOS33;
+#NET "sd_mosi" LOC="P79" | IOSTANDARD = LVCMOS33;
+#NET "sd_miso" LOC="P81" | IOSTANDARD = LVCMOS33;
# JOYSTICK
-#NET "joyup" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6
-#NET "joydown" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4
-#NET "joyleft" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3
-#NET "joyright" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2
-#NET "joyfire" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7
+#NET "joyup" LOC="P74" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6
+#NET "joydown" LOC="P67" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4
+#NET "joyleft" LOC="P59" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3
+#NET "joyright" LOC="P58" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2
+#NET "joyfire" LOC="P75" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7
diff --git a/cores/SamCoupe/pines_zxuno_Ap.ucf b/cores/SamCoupe/pines_zxuno_Ap.ucf
new file mode 100644
index 0000000..9f4219d
--- /dev/null
+++ b/cores/SamCoupe/pines_zxuno_Ap.ucf
@@ -0,0 +1,82 @@
+# Clocks & debug
+NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33;
+#NET "testled" LOC="2" | IOSTANDARD = LVCMOS33;
+NET "clk50mhz" PERIOD=20 ns;
+NET "clk12" PERIOD=83 ns;
+
+# Video output
+NET "r<2>" LOC="P97" | IOSTANDARD = LVCMOS33;
+NET "r<1>" LOC="P95" | IOSTANDARD = LVCMOS33;
+NET "r<0>" LOC="P94" | IOSTANDARD = LVCMOS33;
+NET "g<2>" LOC="P88" | IOSTANDARD = LVCMOS33;
+NET "g<1>" LOC="P87" | IOSTANDARD = LVCMOS33;
+NET "g<0>" LOC="P85" | IOSTANDARD = LVCMOS33;
+NET "b<2>" LOC="P84" | IOSTANDARD = LVCMOS33;
+NET "b<1>" LOC="P83" | IOSTANDARD = LVCMOS33;
+NET "b<0>" LOC="P82" | IOSTANDARD = LVCMOS33;
+NET "csync" LOC="P93" | IOSTANDARD = LVCMOS33;
+#NET "vsync" LOC="P92" | IOSTANDARD = LVCMOS33;
+NET "stdn" LOC="P51" | IOSTANDARD = LVCMOS33;
+NET "stdnb" LOC="P50" | IOSTANDARD = LVCMOS33;
+
+# Sound input/output
+NET "audio_out_left" LOC="P98" | IOSTANDARD = LVCMOS33;
+NET "audio_out_right" LOC="P99" | IOSTANDARD = LVCMOS33;
+NET "ear" LOC="P1" | IOSTANDARD = LVCMOS33;
+
+# Keyboard and mouse
+NET "clkps2" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN
+NET "dataps2" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN
+#NET "mouseclk" LOC="P57" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN
+#NET "mousedata" LOC="P56" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN
+
+# SRAM
+NET "sram_addr<0>" LOC="P115" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<1>" LOC="P116" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<2>" LOC="P117" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<3>" LOC="P119" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<4>" LOC="P120" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<5>" LOC="P123" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<6>" LOC="P126" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<7>" LOC="P131" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<8>" LOC="P127" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<9>" LOC="P124" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<10>" LOC="P118" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<11>" LOC="P121" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<12>" LOC="P133" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<13>" LOC="P132" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<14>" LOC="P137" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<15>" LOC="P140" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<16>" LOC="P139" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<17>" LOC="P141" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<18>" LOC="P138" | IOSTANDARD = LVCMOS33;
+
+NET "sram_data<0>" LOC="P114" | IOSTANDARD = LVCMOS33;
+NET "sram_data<1>" LOC="P112" | IOSTANDARD = LVCMOS33;
+NET "sram_data<2>" LOC="P111" | IOSTANDARD = LVCMOS33;
+NET "sram_data<3>" LOC="P105" | IOSTANDARD = LVCMOS33;
+NET "sram_data<4>" LOC="P104" | IOSTANDARD = LVCMOS33;
+NET "sram_data<5>" LOC="P102" | IOSTANDARD = LVCMOS33;
+NET "sram_data<6>" LOC="P101" | IOSTANDARD = LVCMOS33;
+NET "sram_data<7>" LOC="P100" | IOSTANDARD = LVCMOS33;
+
+NET "sram_we_n" LOC="P134" | IOSTANDARD = LVCMOS33;
+
+# SPI Flash
+#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33;
+#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33;
+#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33;
+#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33;
+
+# SD/MMC
+#NET "sd_cs_n" LOC="P78" | IOSTANDARD = LVCMOS33;
+#NET "sd_clk" LOC="P80" | IOSTANDARD = LVCMOS33;
+#NET "sd_mosi" LOC="P79" | IOSTANDARD = LVCMOS33;
+#NET "sd_miso" LOC="P81" | IOSTANDARD = LVCMOS33;
+
+# JOYSTICK
+#NET "joyup" LOC="P74" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6
+#NET "joydown" LOC="P67" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4
+#NET "joyleft" LOC="P59" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3
+#NET "joyright" LOC="P58" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2
+#NET "joyfire" LOC="P75" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7
diff --git a/cores/SamCoupe/pines_zxuno_v3.ucf b/cores/SamCoupe/pines_zxuno_v3.ucf
new file mode 100644
index 0000000..010937a
--- /dev/null
+++ b/cores/SamCoupe/pines_zxuno_v3.ucf
@@ -0,0 +1,107 @@
+# Clocks & debug
+NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33;
+#NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33;
+NET "clk50mhz" PERIOD=20 ns;
+NET "clk12" PERIOD=83 ns;
+
+# Video output
+NET "r<2>" LOC="P93" | IOSTANDARD = LVCMOS33;
+NET "r<1>" LOC="P92" | IOSTANDARD = LVCMOS33;
+NET "r<0>" LOC="P88" | IOSTANDARD = LVCMOS33;
+NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33;
+NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33;
+NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33;
+NET "b<2>" LOC="P81" | IOSTANDARD = LVCMOS33;
+NET "b<1>" LOC="P80" | IOSTANDARD = LVCMOS33;
+NET "b<0>" LOC="P79" | IOSTANDARD = LVCMOS33;
+NET "csync" LOC="P87" | IOSTANDARD = LVCMOS33;
+#NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33;
+NET "stdn" LOC="P67" | IOSTANDARD = LVCMOS33;
+NET "stdnb" LOC="P66" | IOSTANDARD = LVCMOS33;
+
+# Sound input/output
+NET "audio_out_left" LOC="P8" | IOSTANDARD = LVCMOS33;
+NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33;
+NET "ear" LOC="P105" | IOSTANDARD = LVCMOS33;
+
+# Keyboard and mouse
+NET "clkps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN
+NET "dataps2" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN
+#NET "mouseclk" LOC="P94" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN
+#NET "mousedata" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN
+
+# SRAM
+NET "sram_addr<0>" LOC="P139" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<1>" LOC="P140" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<2>" LOC="P141" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<3>" LOC="P142" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<4>" LOC="P143" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<5>" LOC="P137" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<6>" LOC="P134" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<7>" LOC="P133" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<8>" LOC="P131" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<9>" LOC="P117" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<10>" LOC="P116" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<11>" LOC="P115" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<12>" LOC="P114" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<13>" LOC="P112" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<14>" LOC="P99" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<15>" LOC="P100" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<16>" LOC="P101" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<17>" LOC="P102" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<18>" LOC="P104" | IOSTANDARD = LVCMOS33;
+
+#NET "sram_addr<0>" LOC="P143" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<1>" LOC="P142" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<2>" LOC="P141" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<3>" LOC="P140" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<4>" LOC="P139" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<5>" LOC="P104" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<6>" LOC="P102" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<7>" LOC="P101" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<8>" LOC="P100" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<9>" LOC="P99" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<10>" LOC="P112" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<11>" LOC="P114" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<12>" LOC="P115" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<13>" LOC="P116" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<14>" LOC="P117" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<15>" LOC="P131" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<16>" LOC="P133" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<17>" LOC="P134" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<18>" LOC="P137" | IOSTANDARD = LVCMOS33;
+
+#NET "sram_addr<19>" LOC="P111" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<20>" LOC="P138" | IOSTANDARD = LVCMOS33;
+
+NET "sram_data<0>" LOC="P132" | IOSTANDARD = LVCMOS33;
+NET "sram_data<1>" LOC="P126" | IOSTANDARD = LVCMOS33;
+NET "sram_data<2>" LOC="P123" | IOSTANDARD = LVCMOS33;
+NET "sram_data<3>" LOC="P120" | IOSTANDARD = LVCMOS33;
+NET "sram_data<4>" LOC="P119" | IOSTANDARD = LVCMOS33;
+NET "sram_data<5>" LOC="P121" | IOSTANDARD = LVCMOS33;
+NET "sram_data<6>" LOC="P124" | IOSTANDARD = LVCMOS33;
+NET "sram_data<7>" LOC="P127" | IOSTANDARD = LVCMOS33;
+
+NET "sram_we_n" LOC="P118" | IOSTANDARD = LVCMOS33;
+
+# SPI Flash
+#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33;
+#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33;
+#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33;
+#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33;
+#NET "flash_ext1" LOC="P62" | IOSTANDARD = LVCMOS33;
+#NET "flash_ext2" LOC="P61" | IOSTANDARD = LVCMOS33;
+
+# SD/MMC
+#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33;
+#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33;
+#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33;
+#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33;
+
+# JOYSTICK
+#NET "joyup" LOC="P142" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6
+#NET "joydown" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4
+#NET "joyleft" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3
+#NET "joyright" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2
+#NET "joyfire" LOC="P143" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7
diff --git a/cores/SamCoupe/pines_zxuno_v4.ucf b/cores/SamCoupe/pines_zxuno_v4.ucf
new file mode 100644
index 0000000..89a52f2
--- /dev/null
+++ b/cores/SamCoupe/pines_zxuno_v4.ucf
@@ -0,0 +1,85 @@
+# Clocks & debug
+NET "clk50mhz" LOC="P55" | IOSTANDARD = LVCMOS33;
+NET "testled" LOC="P10" | IOSTANDARD = LVCMOS33;
+NET "clk50mhz" PERIOD=20 ns;
+NET "clk12" PERIOD=83 ns;
+
+# Video output
+NET "b<2>" LOC="P93" | IOSTANDARD = LVCMOS33;
+NET "b<1>" LOC="P92" | IOSTANDARD = LVCMOS33;
+NET "b<0>" LOC="P88" | IOSTANDARD = LVCMOS33;
+NET "g<2>" LOC="P84" | IOSTANDARD = LVCMOS33;
+NET "g<1>" LOC="P83" | IOSTANDARD = LVCMOS33;
+NET "g<0>" LOC="P82" | IOSTANDARD = LVCMOS33;
+NET "r<2>" LOC="P81" | IOSTANDARD = LVCMOS33;
+NET "r<1>" LOC="P80" | IOSTANDARD = LVCMOS33;
+NET "r<0>" LOC="P79" | IOSTANDARD = LVCMOS33;
+NET "hsync" LOC="P87" | IOSTANDARD = LVCMOS33;
+NET "vsync" LOC="P85" | IOSTANDARD = LVCMOS33;
+NET "stdn" LOC="P66" | IOSTANDARD = LVCMOS33;
+NET "stdnb" LOC="P67" | IOSTANDARD = LVCMOS33;
+
+# Sound input/output
+NET "audio_out_left" LOC="P10" | IOSTANDARD = LVCMOS33;
+NET "audio_out_right" LOC="P9" | IOSTANDARD = LVCMOS33;
+NET "ear" LOC="P94" | IOSTANDARD = LVCMOS33;
+
+# Keyboard and mouse
+NET "clkps2" LOC="P99" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 1 DIN
+NET "dataps2" LOC="P98" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 5 DIN
+#NET "mouseclk" LOC="P95" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 6 DIN
+#NET "mousedata" LOC="P97" | IOSTANDARD = LVCMOS33 | PULLUP; # pin 2 DIN
+
+# SRAM
+NET "sram_addr<0>" LOC="P141" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<1>" LOC="P139" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<2>" LOC="P137" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<3>" LOC="P134" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<4>" LOC="P133" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<5>" LOC="P120" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<6>" LOC="P118" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<7>" LOC="P116" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<8>" LOC="P114" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<9>" LOC="P112" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<10>" LOC="P104" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<11>" LOC="P102" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<12>" LOC="P101" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<13>" LOC="P100" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<14>" LOC="P111" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<15>" LOC="P131" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<16>" LOC="P138" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<17>" LOC="P140" | IOSTANDARD = LVCMOS33;
+NET "sram_addr<18>" LOC="P142" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<19>" LOC="P105" | IOSTANDARD = LVCMOS33;
+#NET "sram_addr<20>" LOC="P143" | IOSTANDARD = LVCMOS33;
+
+NET "sram_data<0>" LOC="P132" | IOSTANDARD = LVCMOS33;
+NET "sram_data<1>" LOC="P127" | IOSTANDARD = LVCMOS33;
+NET "sram_data<2>" LOC="P124" | IOSTANDARD = LVCMOS33;
+NET "sram_data<3>" LOC="P123" | IOSTANDARD = LVCMOS33;
+NET "sram_data<4>" LOC="P115" | IOSTANDARD = LVCMOS33;
+NET "sram_data<5>" LOC="P117" | IOSTANDARD = LVCMOS33;
+NET "sram_data<6>" LOC="P119" | IOSTANDARD = LVCMOS33;
+NET "sram_data<7>" LOC="P126" | IOSTANDARD = LVCMOS33;
+
+NET "sram_we_n" LOC="P121" | IOSTANDARD = LVCMOS33;
+
+# SPI Flash
+#NET "flash_cs_n" LOC="P38" | IOSTANDARD = LVCMOS33;
+#NET "flash_clk" LOC="P70" | IOSTANDARD = LVCMOS33;
+#NET "flash_mosi" LOC="P64" | IOSTANDARD = LVCMOS33;
+#NET "flash_miso" LOC="P65" | IOSTANDARD = LVCMOS33;
+
+# SD/MMC
+#NET "sd_cs_n" LOC="P59" | IOSTANDARD = LVCMOS33;
+#NET "sd_clk" LOC="P75" | IOSTANDARD = LVCMOS33;
+#NET "sd_mosi" LOC="P74" | IOSTANDARD = LVCMOS33;
+#NET "sd_miso" LOC="P78" | IOSTANDARD = LVCMOS33;
+
+# JOYSTICK
+#NET "joyup" LOC="P1" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY6
+#NET "joydown" LOC="P5" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY4
+#NET "joyleft" LOC="P6" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY3
+#NET "joyright" LOC="P7" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY2
+#NET "joyfire" LOC="P2" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY7
+#NET "btn2" LOC="P8" | IOSTANDARD = LVCMOS33 | PULLUP; #JOY5
diff --git a/cores/SamCoupe/ps2_keyb.v b/cores/SamCoupe/ps2_keyb.v
index 537ee88..65b43fa 100644
--- a/cores/SamCoupe/ps2_keyb.v
+++ b/cores/SamCoupe/ps2_keyb.v
@@ -65,6 +65,7 @@ module ps2_keyb(
wire extended;
wire released;
assign scancode_dout = kbcode;
+ wire teclado_limpio;
/*
| BSY | x | x | x | ERR | RLS | EXT | PEN |
@@ -101,6 +102,7 @@ module ps2_keyb(
.scan(kbcode),
.extended(extended),
.released(released),
+ .kbclean(teclado_limpio),
.sam_row(rows),
.sam_col(cols),
.master_reset(master_reset),
@@ -114,6 +116,16 @@ module ps2_keyb(
.rewind(regaddr_changed == 1'b1 && zxuno_addr == KEYMAP)
);
+ keyboard_pressed_status comprueba_teclado_limpio (
+ .clk(clk),
+ .rst(1'b0),
+ .scan_received(nueva_tecla),
+ .scancode(kbcode),
+ .extended(extended),
+ .released(released),
+ .kbclean(teclado_limpio)
+ );
+
ps2_host_to_kb escritura_a_teclado (
.clk(clk),
.ps2clk_ext(clkps2),
diff --git a/cores/SamCoupe/ram.v b/cores/SamCoupe/ram.v
index ba56e85..50792ad 100644
--- a/cores/SamCoupe/ram.v
+++ b/cores/SamCoupe/ram.v
@@ -35,59 +35,10 @@ module ram_dual_port_turnos (
inout wire [7:0] sram_d
);
- parameter ASIC = 2'd0,
- CPUADDR = 2'd1,
- CPUWRITE = 2'd2;
-
-// assign sram_d = ((state == CPUADDR && cpu_we_n == 1'b0) || state == CPUWRITE)? data_from_cpu : 8'hZZ;
-// assign sram_we_n = (cpu_we_n == 1'b0 && state == CPUWRITE)? 1'b0 : 1'b1;
-
-// reg [1:0] state = ASIC;
-// always @(posedge clk) begin
-// case (state)
-// ASIC:
-// begin
-// data_to_asic <= sram_d;
-// if (whichturn == 1'b0) begin
-// sram_a <= cpuramaddr;
-// state <= CPUADDR;
-// end
-// else
-// sram_a <= vramaddr;
-// end
-// CPUADDR:
-// begin
-// data_to_cpu <= sram_d;
-// if (whichturn == 1'b1) begin
-// sram_a <= vramaddr;
-// state <= ASIC;
-// end
-// else begin
-// sram_a <= cpuramaddr;
-// if (cpu_we_n == 1'b0) begin
-// state <= CPUWRITE;
-// end
-// end
-// end
-// CPUWRITE:
-// begin
-// if (whichturn == 1'b1) begin
-// sram_a <= vramaddr;
-// state <= ASIC;
-// end
-// else if (cpu_we_n == 1'b1) begin
-// sram_a <= cpuramaddr;
-// state <= CPUADDR;
-// end
-// end
-// default: state <= ASIC;
-// endcase
-// end
-
assign sram_d = (cpu_we_n == 1'b0 && whichturn == 1'b0)? data_from_cpu : 8'hZZ;
always @* begin
- //data_to_cpu = 8'hFF;
- //data_to_asic = 8'hFF;
+ data_to_cpu = 8'hFF;
+ data_to_asic = 8'hFF;
if (whichturn == 1'b1) begin // ASIC
sram_a = vramaddr;
sram_we_n = 1'b1;
diff --git a/cores/SamCoupe/relojes.v b/cores/SamCoupe/relojes.v
index fbb368e..8e26e3f 100644
--- a/cores/SamCoupe/relojes.v
+++ b/cores/SamCoupe/relojes.v
@@ -114,7 +114,7 @@ module relojes
.CLKOUT1_DUTY_CYCLE (0.500),
.CLKOUT2_DIVIDE (100),
.CLKOUT2_PHASE (0.000),
- .CLKOUT3_DUTY_CYCLE (0.500),
+ .CLKOUT2_DUTY_CYCLE (0.500),
.CLKOUT3_DIVIDE (75),
.CLKOUT3_PHASE (0.000),
.CLKOUT3_DUTY_CYCLE (0.500),
diff --git a/cores/SamCoupe/saa1099.v b/cores/SamCoupe/saa1099.v
index 649de1f..d20b334 100644
--- a/cores/SamCoupe/saa1099.v
+++ b/cores/SamCoupe/saa1099.v
@@ -536,8 +536,8 @@ module saa1099_envelope_gen (
stereoshape <= 1'b0;
envshape <= 3'b000;
envclock <= 1'b0;
- write_to_address_prev = 1'b0;
- write_to_data_prev = 1'b0;
+ write_to_address_prev <= 1'b0;
+ write_to_data_prev <= 1'b0;
pending_data <= 1'b0;
end
else begin
diff --git a/cores/SamCoupe/samcoupe.gise b/cores/SamCoupe/samcoupe.gise
new file mode 100644
index 0000000..7d25f8f
--- /dev/null
+++ b/cores/SamCoupe/samcoupe.gise
@@ -0,0 +1,187 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 11.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cores/SamCoupe/samcoupe.v b/cores/SamCoupe/samcoupe.v
index e100bc1..9700164 100644
--- a/cores/SamCoupe/samcoupe.v
+++ b/cores/SamCoupe/samcoupe.v
@@ -159,7 +159,7 @@ module samcoupe (
);
ram_dual_port_turnos ram_512k (
- .clk(clk24),
+ .clk(1'b0 /*clk24*/),
.whichturn(asic_is_using_ram),
.vramaddr(vramaddr),
.cpuramaddr(cpuramaddr),
diff --git a/cores/SamCoupe/samcoupe.xise b/cores/SamCoupe/samcoupe.xise
index 1044dca..e46263a 100644
--- a/cores/SamCoupe/samcoupe.xise
+++ b/cores/SamCoupe/samcoupe.xise
@@ -9,89 +9,89 @@
-
+
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
+
+
+
@@ -104,6 +104,7 @@
+
@@ -115,7 +116,7 @@
-
+
@@ -126,7 +127,7 @@
-
+
@@ -143,11 +144,12 @@
+
-
+
@@ -163,6 +165,7 @@
+
@@ -185,7 +188,6 @@
-
@@ -196,7 +198,7 @@
-
+
@@ -225,7 +227,9 @@
+
+
@@ -235,6 +239,7 @@
+
@@ -247,7 +252,7 @@
-
+
@@ -290,7 +295,6 @@
-
@@ -321,7 +325,6 @@
-
@@ -364,6 +367,7 @@
+
@@ -395,7 +399,7 @@
-
+
@@ -415,9 +419,7 @@
-
-
-
+
diff --git a/cores/SamCoupe/scancode_to_speccy.v b/cores/SamCoupe/scancode_to_speccy.v
index dc3e81f..51e8688 100644
--- a/cores/SamCoupe/scancode_to_speccy.v
+++ b/cores/SamCoupe/scancode_to_speccy.v
@@ -26,6 +26,7 @@ module scancode_to_sam (
input wire [7:0] scan,
input wire extended,
input wire released,
+ input wire kbclean,
//------------------------
input wire [8:0] sam_row,
output wire [7:0] sam_col,
@@ -118,7 +119,7 @@ module scancode_to_sam (
always @(posedge clk) begin
if (scan_received == 1'b1)
key_is_pending <= 1'b1;
- if (rst == 1'b1)
+ if (rst == 1'b1 || (kbclean == 1'b1 && state == IDLE && scan_received == 1'b0))
state <= CLEANMATRIX;
else begin
case (state)
@@ -219,7 +220,7 @@ module scancode_to_sam (
end
CPUTIME: begin
if (rewind == 1'b1) begin
- cpuaddr = 14'h0000;
+ cpuaddr <= 14'h0000;
state <= IDLE;
end
else if (cpuread == 1'b1) begin
@@ -247,19 +248,6 @@ module scancode_to_sam (
state <= IDLE;
end
end
- // else if (state == UPDCOUNTERS1) begin
- // if (~released)
- // keycount <= keycount + 4'b0001; // suma 1 al contador de pulsaciones
- // else if (released && keycount != 4'b0000)
- // keycount <= keycount + 4'b1111; // o le resta 1 al contador de pulsaciones, pero sin bajar de 0
- // state <= UPDCOUNTERS2;
- // end
- // else if (state == UPDCOUNTERS2) begin
- // if (keycount == 4'b0000) // si es la última tecla soltada, limpia la matriz de teclado del Spectrum
- // state <= CLEANMATRIX;
- // else
- // state <= IDLE;
- // end
default: begin
state <= IDLE;
end
@@ -267,3 +255,86 @@ module scancode_to_sam (
end
end
endmodule
+
+module keyboard_pressed_status (
+ input wire clk,
+ input wire rst,
+ input wire scan_received,
+ input wire [7:0] scancode,
+ input wire extended,
+ input wire released,
+ output reg kbclean
+ );
+
+ parameter
+ RESETTING = 2'd0,
+ UPDATING = 2'd1,
+ SCANNING = 2'd2;
+
+ reg keybstat_ne[0:255]; // non extended keymap
+ reg keybstat_ex[0:255]; // extended keymap
+ reg [7:0] addrscan = 8'h00; // keymap bit address
+ reg keypressed_ne = 1'b0; // there is at least one key pressed
+ reg keypressed_ex = 1'b0; // there is at least one extended key pressed
+ reg [1:0] state = RESETTING;
+
+ integer i;
+ initial begin
+ kbclean = 1'b1;
+ for (i=0;i<256;i=i+1) begin
+ keybstat_ne[i] = 1'b0;
+ keybstat_ex[i] = 1'b0;
+ end
+ end
+
+ always @(posedge clk) begin
+ if (rst == 1'b1) begin
+ state <= RESETTING;
+ addrscan <= 8'h00;
+ end
+ else begin
+ case (state)
+ RESETTING:
+ begin
+ if (addrscan == 8'hFF) begin
+ addrscan <= 8'h00;
+ state <= SCANNING;
+ kbclean <= 1'b1;
+ end
+ else begin
+ keybstat_ne[addrscan] <= 1'b0;
+ keybstat_ex[addrscan] <= 1'b0;
+ addrscan <= addrscan + 8'd1;
+ end
+ end
+ UPDATING:
+ begin
+ state <= SCANNING;
+ addrscan <= 8'h00;
+ kbclean <= 1'b0;
+ keypressed_ne <= 1'b0;
+ keypressed_ex <= 1'b0;
+ if (extended == 1'b0)
+ keybstat_ne[scancode] <= ~released;
+ else
+ keybstat_ex[scancode] <= ~released;
+ end
+ SCANNING:
+ begin
+ if (scan_received == 1'b1)
+ state <= UPDATING;
+ addrscan <= addrscan + 8'd1;
+ if (addrscan == 8'hFF) begin
+ kbclean <= ~(keypressed_ne | keypressed_ex);
+ keypressed_ne <= 1'b0;
+ keypressed_ex <= 1'b0;
+ end
+ else begin
+ keypressed_ne <= keypressed_ne | keybstat_ne[addrscan];
+ keypressed_ex <= keypressed_ex | keybstat_ex[addrscan];
+ end
+ end
+ endcase
+ end
+ end
+endmodule