summaryrefslogtreecommitdiffstats
path: root/de1/fpga-bbc-pq/master/dram-floating-pins.patch
blob: 2c751841528deef803ac26280780e2adc88f9b79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
diff --git a/bbc_micro_de1.vhd b/bbc_micro_de1.vhd
index 2788103..fa7b2e8 100644
--- a/bbc_micro_de1.vhd
+++ b/bbc_micro_de1.vhd
@@ -70,7 +70,7 @@ generic (
 	-- 5 Not used
 	-- 6 Not used
 	-- 7 MOS
-	ROM_OFFSET			:	std_logic_vector(7 downto 0) := "00001000"
+	ROM_OFFSET			:	std_logic_vector(21 downto 0) := std_logic_vector(to_unsigned(16#20000#,22))
 	);
 port (
 	-- Clocks
@@ -663,6 +663,7 @@ signal sys_via_ca2_out	:	std_logic;
 signal sys_via_ca2_oe_n	:	std_logic;
 signal sys_via_pa_in	:	std_logic_vector(7 downto 0);
 signal sys_via_pa_out	:	std_logic_vector(7 downto 0);
+signal effective_sys_via_pa_out	:	std_logic_vector(7 downto 0);
 signal sys_via_pa_oe_n	:	std_logic_vector(7 downto 0);
 signal sys_via_cb1_in	:	std_logic := '0';
 signal sys_via_cb1_out	:	std_logic;
@@ -745,6 +746,9 @@ signal romsel			:	std_logic_vector(3 downto 0);
 
 signal mhz1_enable		:	std_logic;		-- Set for access to any 1 MHz peripheral
 
+signal video_data 	: std_logic_vector (7 downto 0);
+signal cpu_ram_di 	: std_logic_vector (7 downto 0);
+
 begin
 	-------------------------
 	-- COMPONENT INSTANCES
@@ -800,6 +804,8 @@ begin
 		cpu_a,
 		cpu_di,
 		cpu_do );
+
+	crtc_lpstb <='0';
 		
 	crtc : mc6845 port map (
 		clock,
@@ -826,7 +832,7 @@ begin
 		vidproc_enable,
 		cpu_a(0),
 		cpu_do,
-		SRAM_DQ(7 downto 0),
+		video_data,
 		vidproc_invert_n,
 		vidproc_disen,
 		crtc_cursor,
@@ -850,7 +856,7 @@ begin
 		reset_n,
 		clock, -- Data input is synchronised from the bus clock domain
 		vid_clken,
-		SRAM_DQ(6 downto 0),
+		video_data(6 downto 0),
 		ttxt_glr,
 		ttxt_dew,
 		ttxt_crs,
@@ -889,6 +895,8 @@ begin
 		mhz4_clken,
 		clock
 		);
+
+	effective_sys_via_pa_out <= sys_via_pa_out or sys_via_pa_oe_n;
 	
 	-- User VIA
 	user_via : m6522 port map (
@@ -1118,7 +1126,7 @@ begin
 	
 	-- CPU data bus mux and interrupts
 	cpu_di <=
-		SRAM_DQ(7 downto 0) when ram_enable = '1' else
+		cpu_ram_di	when ram_enable = '1' else
 		FL_DQ		when rom_enable = '1' else
 		FL_DQ		when mos_enable = '1' else
 		crtc_do		when crtc_enable = '1' else
@@ -1137,19 +1145,17 @@ begin
 	FL_CE_N <= '0';
 	FL_OE_N <= '0';
 	FL_WE_N <= '1';
-	FL_ADDR(21 downto 17) <= ROM_OFFSET(7 downto 3);
-	FL_ADDR(16 downto 14) <=
-		"111" when mos_enable = '1' else
-		"0" & romsel(1 downto 0);
+	FL_ADDR(21 downto 17) <= ROM_OFFSET(21 downto 17);
+	FL_ADDR(16 downto 14) <= "111" when mos_enable = '1' else "0" &  romsel(1 downto 0);
 	FL_ADDR(13 downto 0) <= cpu_a(13 downto 0);		
 		
 	-- SRAM bus
 	SRAM_UB_N <= '1';
 	SRAM_LB_N <= '0';
-	SRAM_CE_N <= '0';
+	SRAM_CE_N <= clock;
 	SRAM_OE_N <= '0';
-	SRAM_DQ(15 downto 8) <= (others => '0');
-	
+	video_data <= SRAM_DQ(7 downto 0);
+
 	-- Synchronous outputs to SRAM
 	process(clock,reset_n)
 	variable ram_write : std_logic;
@@ -1158,23 +1164,25 @@ begin
 	
 		if reset_n = '0' then
 			SRAM_WE_N <= '1';
-			SRAM_DQ(7 downto 0) <= (others => 'Z');
+			SRAM_DQ(15 downto 0) <= (others => 'Z');
 		elsif rising_edge(clock) then
-			-- Default to inputs
-			SRAM_DQ(7 downto 0) <= (others => 'Z');
-			
 			-- Register SRAM signals to outputs (clock must be at least 2x CPU clock)
 			if vid_clken = '1' then
-				-- Fetch data from previous CPU cycle
+				-- set up bus for CPU cycle
 				SRAM_WE_N <= not ram_write;
 				SRAM_ADDR <= "00" & cpu_a(15 downto 0);
 				if ram_write = '1' then
+					SRAM_DQ(15 downto 8) <=(others =>'0');
 					SRAM_DQ(7 downto 0) <= cpu_do;
+				else
+					SRAM_DQ(15 downto 0) <= (others => 'Z');
 				end if;
 			else
-				-- Fetch data from previous display cycle
+				cpu_ram_di <= SRAM_DQ(7 downto 0);
+				-- setup crtc cycle 
 				SRAM_WE_N <= '1';
 				SRAM_ADDR <= "000" & display_a;
+				SRAM_DQ(15 downto 0) <= (others => 'Z');
 			end if;
 		end if;
 	end process;
@@ -1242,24 +1250,25 @@ begin
 	
 	-- Connections to System VIA
 	-- ADC
-	sys_via_cb1_in <= '1'; -- /EOC
+	sys_via_cb1_in <= '0'; -- EOC
 	-- CRTC
 	sys_via_ca1_in <= crtc_vsync;
 	sys_via_cb2_in <= crtc_lpstb;
 	-- Keyboard
 	sys_via_ca2_in <= keyb_int;
 	sys_via_pa_in(7) <= keyb_out;
-	sys_via_pa_in(6 downto 0) <= sys_via_pa_out(6 downto 0); -- Must loop back output pins or keyboard won't work
-	keyb_column <= sys_via_pa_out(3 downto 0);
-	keyb_row <= sys_via_pa_out(6 downto 4);
+	sys_via_pa_in(6 downto 0) <= effective_sys_via_pa_out(6 downto 0); -- Must loop back output pins or keyboard won't work
+	keyb_column <= effective_sys_via_pa_out(3 downto 0);
+	keyb_row <= effective_sys_via_pa_out(6 downto 4);
 	-- Sound
-	sound_di <= sys_via_pa_out;
+	sound_di <= effective_sys_via_pa_out;
 	-- Others (idle until missing bits implemented)
 	sys_via_pb_in(7 downto 4) <= (others => '1');
 	
 	-- Connections to User VIA (user port is output on green LEDs)
 	user_via_ca1_in <= '1'; -- Pulled up
 	--LEDG <= user_via_pb_out;
+        --LEDG(7 downto 2) <= (others => '0');
 	
 	-- MMBEEB
 	user_via_cb1_in <= user_via_pb_out(1);
@@ -1290,15 +1299,15 @@ begin
 	disp_addr_offs <= ic32(5 downto 4);
 	caps_lock_led_n <= ic32(6);
 	shift_lock_led_n <= ic32(7);
+
 	
 	process(clock,reset_n)
 	variable bit_num : integer;
 	begin
 		bit_num := to_integer(unsigned(sys_via_pb_out(2 downto 0)));
-	
 		if reset_n = '0' then
-			ic32 <= (others => '0');
-		elsif rising_edge(clock) then
+			ic32 <= (others => '1');
+		elsif rising_edge(clock) then -- the real beep latches this on the 1MHz bus clock exactly once per sys_via_enable
 			ic32(bit_num) <= sys_via_pb_out(3);
 		end if;
 	end process;
@@ -1311,6 +1320,9 @@ begin
 	-- DEBUG STUFF
 	-----------------
 	
+	DRAM_DQ <= (others => 'Z');
+	DRAM_DQ <= (others => 'Z');
+
 	GPIO_0(0) <= not (crtc_hsync xor crtc_vsync);
 	GPIO_0(1) <= crtc_de;