Skip to content

Commit f802101

Browse files
committed
Optional half cycle earlier MREQ, IORQ, RD, WR signals
1 parent 3c2be84 commit f802101

File tree

3 files changed

+104
-7
lines changed

3 files changed

+104
-7
lines changed

src/ci2406_z80.v

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,9 @@ module ci2406_z80(
257257
.iorq_n (io_out[34]),
258258
.rd_n (io_out[ 2]),
259259
.wr_n (io_out[ 3]),
260-
.rfsh_n (io_out[ 5])
260+
.rfsh_n (io_out[ 5]),
261+
262+
.early_signals(custom_settings[0])
261263
);
262264
endmodule
263265

@@ -282,9 +284,26 @@ module z80 (
282284
output wire wr_n,
283285
output wire rfsh_n,
284286
output wire halt_n,
285-
output wire busak_n
287+
output wire busak_n,
288+
289+
input wire early_signals
286290
);
287291

292+
wire normal_mreq_n;
293+
wire normal_iorq_n;
294+
wire normal_rd_n;
295+
wire normal_wr_n;
296+
297+
wire early_mreq_n;
298+
wire early_iorq_n;
299+
wire early_rd_n;
300+
wire early_wr_n;
301+
302+
assign mreq_n = early_signals ? early_mreq_n : normal_mreq_n;
303+
assign iorq_n = early_signals ? early_iorq_n : normal_iorq_n;
304+
assign rd_n = early_signals ? early_rd_n : normal_rd_n;
305+
assign wr_n = early_signals ? early_wr_n : normal_wr_n;
306+
288307
tv80s #(
289308
.Mode(0), // Z80 mode
290309
.T2Write(1),// wr_n active in T2
@@ -298,10 +317,14 @@ module z80 (
298317
.nmi_n (nmi_n),
299318
.busrq_n (busrq_n),
300319
.m1_n (m1_n),
301-
.mreq_n (mreq_n),
302-
.iorq_n (iorq_n),
303-
.rd_n (rd_n),
304-
.wr_n (wr_n),
320+
.mreq_n (normal_mreq_n),
321+
.iorq_n (normal_iorq_n),
322+
.rd_n (normal_rd_n),
323+
.wr_n (normal_wr_n),
324+
.early_mreq_n (early_mreq_n),
325+
.early_iorq_n (early_iorq_n),
326+
.early_rd_n (early_rd_n),
327+
.early_wr_n (early_wr_n),
305328
.rfsh_n (rfsh_n),
306329
.halt_n (halt_n),
307330
.busak_n (busak_n),

src/tv80/tv80s.v

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
module tv80s (/*AUTOARG*/
2828
// Outputs
2929
m1_n, mreq_n, iorq_n, rd_n, wr_n, rfsh_n, halt_n, busak_n, A, dout,
30+
early_mreq_n, early_iorq_n, early_rd_n, early_wr_n,
3031
// Inputs
3132
reset_n, clk, wait_n, int_n, nmi_n, busrq_n, di, cen,
3233
// Data bus state
@@ -50,6 +51,12 @@ module tv80s (/*AUTOARG*/
5051
output iorq_n;
5152
output rd_n;
5253
output wr_n;
54+
55+
output early_mreq_n;
56+
output early_iorq_n;
57+
output early_rd_n;
58+
output early_wr_n;
59+
5360
output rfsh_n;
5461
output halt_n;
5562
output busak_n;
@@ -62,6 +69,11 @@ module tv80s (/*AUTOARG*/
6269
reg rd_n;
6370
reg wr_n;
6471

72+
reg early_mreq_n;
73+
reg early_iorq_n;
74+
reg early_rd_n;
75+
reg early_wr_n;
76+
6577
wire intcycle_n;
6678
wire no_read;
6779
output write;
@@ -161,5 +173,64 @@ module tv80s (/*AUTOARG*/
161173
end // else: !if(!reset_n)
162174
end // always @ (posedge clk or negedge reset_n)
163175

176+
always @(negedge clk or negedge reset_n)
177+
begin
178+
if (!reset_n)
179+
begin
180+
early_rd_n <= 1'b1;
181+
early_wr_n <= 1'b1;
182+
early_iorq_n <= 1'b1;
183+
early_mreq_n <= 1'b1;
184+
end
185+
else if(cen)
186+
begin
187+
early_rd_n <= 1'b1;
188+
early_wr_n <= 1'b1;
189+
early_iorq_n <= 1'b1;
190+
early_mreq_n <= 1'b1;
191+
if (mcycle[0])
192+
begin
193+
if (tstate[1] || (tstate[2] && wait_n == 1'b0))
194+
begin
195+
early_rd_n <= ~ intcycle_n;
196+
early_mreq_n <= ~ intcycle_n;
197+
early_iorq_n <= intcycle_n;
198+
end
199+
`ifdef TV80_REFRESH
200+
if (tstate[3])
201+
early_mreq_n <= 1'b0;
202+
`endif
203+
end // if (mcycle[0])
204+
else
205+
begin
206+
if ((tstate[1] || (tstate[2] && wait_n == 1'b0)) && no_read == 1'b0 && write == 1'b0)
207+
begin
208+
early_rd_n <= 1'b0;
209+
early_iorq_n <= ~ iorq;
210+
early_mreq_n <= iorq;
211+
end
212+
if (T2Write == 0)
213+
begin
214+
if (tstate[2] && write == 1'b1)
215+
begin
216+
early_wr_n <= 1'b0;
217+
early_iorq_n <= ~ iorq;
218+
early_mreq_n <= iorq;
219+
end
220+
end
221+
else
222+
begin
223+
if ((tstate[1] || (tstate[2] && wait_n == 1'b0)) && write == 1'b1)
224+
begin
225+
early_wr_n <= 1'b0;
226+
early_iorq_n <= ~ iorq;
227+
early_mreq_n <= iorq;
228+
end
229+
end // else: !if(T2write == 0)
230+
231+
end // else: !if(mcycle[0])
232+
end // else: !if(!reset_n)
233+
end // always @ (posedge clk or negedge reset_n)
234+
164235
endmodule // t80s
165236

test_chipignite/tb.v

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module tb ();
1515
// Wire up the inputs and outputs:
1616
reg clk;
1717
reg rst_n;
18+
reg [31:0] custom_settings;
1819
wire [35:0] io_in;
1920
wire [35:0] io_out;
2021
wire [35:0] io_oeb;
@@ -78,7 +79,9 @@ module tb ();
7879
.rst_n (rst_n), // not reset
7980
.io_in (io_in),
8081
.io_out (io_out),
81-
.io_oeb (io_oeb)
82+
.io_oeb (io_oeb),
83+
84+
.custom_settings(custom_settings)
8285
);
8386

8487
endmodule

0 commit comments

Comments
 (0)