Redid z80 integration from start, duplicate chars have been fixed

This commit is contained in:
Dreaded_X 2020-04-17 15:20:59 +02:00
parent bd9a0f03d8
commit 2a6d26f7a4

View File

@ -201,17 +201,16 @@ module mojo_top(
.new_rx_data(new_rx_data) .new_rx_data(new_rx_data)
); );
reg [13:0] addr_q, addr_d; reg [13:0] addr_q, addr_d, addr_t, addr_n, addr_r;
reg [6:0] scroll_q, scroll_d; reg[7:0] write_data_q, write_data_d;
reg[7:0] write_data; reg write_enable, write_enable_c_q, write_enable_c_d;
reg write_enable;
wire[7:0] sram_read_data; wire[7:0] sram_read_data;
sram #(.SIZE(8), .DEPTH(CHAR_HMAX*CHAR_VMAX)) sram( sram #(.SIZE(8), .DEPTH(CHAR_HMAX*CHAR_VMAX)) sram(
.clk(hdmi_clk), .clk(hdmi_clk),
.read_address(char_index_q), .read_address(char_index_q),
.write_address(addr_q), .write_address(addr_q-1),
.read_data(sram_read_data), .read_data(sram_read_data),
.write_data(write_data), .write_data(write_data_q),
.write_en(write_enable) .write_en(write_enable)
); );
@ -222,7 +221,7 @@ module mojo_top(
charx = (hdmix >> (SCALE-1)) % 8; charx = (hdmix >> (SCALE-1)) % 8;
chary = (hdmiy >> (SCALE-1)) % 8; chary = (hdmiy >> (SCALE-1)) % 8;
char_index_d = ((hdmix >> (SCALE+2)) + CHAR_HMAX*(hdmiy >> (SCALE+2)) + CHAR_HMAX*scroll_q) % (CHAR_HMAX*CHAR_VMAX); char_index_d = (hdmix >> (SCALE+2)) + CHAR_HMAX*(hdmiy >> (SCALE+2));
//char_color = char_index_d[5:0]; //char_color = char_index_d[5:0];
char_color = 6'b111111; char_color = 6'b111111;
@ -256,76 +255,54 @@ module mojo_top(
if (hdmix == WIDTH-1 && hdmiy == HEIGHT-1) begin if (hdmix == WIDTH-1 && hdmiy == HEIGHT-1) begin
frame_d = frame_q + 1'b1; frame_d = frame_q + 1'b1;
end end
// new_tx_data = 1'b0; // Disable write during IO request
// write_enable = 1'b0; write_enable = z80_ioreq && write_enable_c_q;
// write_data = 1'b0;
// addr_d = addr_q;
// if (new_rx_data) begin
// new_tx_data = 1'b1;
// tx_data = rx_data;
//
// if (rx_data == "\r") begin
// end else if (rx_data == "\n") begin
// addr_d = addr_q - (addr_q % CHAR_HMAX) + CHAR_HMAX;
// end else if (rx_data == 8) begin
// addr_d = addr_q - 1'b1;
// end else begin
// write_enable = 1'b1;
// write_data = rx_data - 32;
// addr_d = addr_q + 1'b1;
// end
// end
end end
reg bottom_of_screen_q, bottom_of_screen_d;
always @(posedge z80_clk) begin always @(posedge z80_clk) begin
write_enable = 1'b0; write_data_d = write_data_q;
write_data = 1'b0; write_enable_c_d = write_enable_c_q;
addr_d = addr_q; addr_d = addr_q;
scroll_d = scroll_q;
bottom_of_screen_d = bottom_of_screen_q;
// @todo Hook up address lines
// if (z80_ioreq != 1 && z80_m1 != 0 && z80_address[7:0] == 8'h10) begin // if (z80_ioreq != 1 && z80_m1 != 0 && z80_address[7:0] == 8'h10) begin
if (z80_ioreq != 1 && z80_m1 != 0 && z80_wr != 1) begin if (z80_ioreq != 1 && z80_m1 != 0 && z80_wr != 1) begin
if (z80_data == "\r") begin if (z80_data == "\r") begin
addr_d = addr_q - (addr_q % CHAR_HMAX); addr_d = addr_r;
write_enable_c_d = 0;
end else if (z80_data == "\n") begin end else if (z80_data == "\n") begin
addr_d = addr_q + CHAR_HMAX; addr_d = addr_n;
write_enable_c_d = 0;
end else begin end else begin
write_enable = 1'b1; write_data_d = z80_data - 32;
write_data = z80_data - 32; addr_d = addr_t;
addr_d = addr_q + 1'b1; write_enable_c_d = 1;
end end
if (bottom_of_screen_d == 1 && addr_d >= CHAR_HMAX*scroll_q) begin
scroll_d = (scroll_q + 1'b1) % CHAR_VMAX;
end
if (addr_d >= CHAR_HMAX*CHAR_VMAX) begin
bottom_of_screen_d = 1'b1;
addr_d = addr_d - CHAR_HMAX*CHAR_VMAX;
end
end end
end end
// IO request starts
always @(negedge z80_ioreq) begin
addr_t = (addr_q + 1) % (CHAR_HMAX*CHAR_VMAX);
addr_n = (addr_q + CHAR_HMAX) % (CHAR_HMAX*CHAR_VMAX);
addr_r = (addr_q - (addr_q % CHAR_HMAX)) % (CHAR_HMAX*CHAR_VMAX);
end
always @(posedge hdmi_clk) begin always @(posedge hdmi_clk) begin
if (rst) begin if (rst) begin
frame_q <= 1'b0; frame_q <= 1'b0;
char_index_q <= 1'b0; char_index_q <= 1'b0;
addr_q <= 1'b0; addr_q <= 1'b0;
scroll_q <= 1'b0; write_data_q <= 0;
bottom_of_screen_q <= 1'b0; write_enable_c_q <= 0;
end else begin end else begin
if (z80_ioreq == 1) begin
addr_q <= addr_d;
scroll_q <= scroll_d;
bottom_of_screen_q <= bottom_of_screen_d;
end
frame_q <= frame_d; frame_q <= frame_d;
char_index_q <= char_index_d; char_index_q <= char_index_d;
addr_q <= addr_d;
write_data_q <= write_data_d;
write_enable_c_q <= write_enable_c_d;
end end
end end