diff --git a/source/mojo_top.v b/source/mojo_top.v index c91e1df..6401116 100644 --- a/source/mojo_top.v +++ b/source/mojo_top.v @@ -201,17 +201,16 @@ module mojo_top( .new_rx_data(new_rx_data) ); - reg [13:0] addr_q, addr_d; - reg [6:0] scroll_q, scroll_d; - reg[7:0] write_data; - reg write_enable; + reg [13:0] addr_q, addr_d, addr_t, addr_n, addr_r; + reg[7:0] write_data_q, write_data_d; + reg write_enable, write_enable_c_q, write_enable_c_d; wire[7:0] sram_read_data; sram #(.SIZE(8), .DEPTH(CHAR_HMAX*CHAR_VMAX)) sram( .clk(hdmi_clk), .read_address(char_index_q), - .write_address(addr_q), + .write_address(addr_q-1), .read_data(sram_read_data), - .write_data(write_data), + .write_data(write_data_q), .write_en(write_enable) ); @@ -222,7 +221,7 @@ module mojo_top( charx = (hdmix >> (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 = 6'b111111; @@ -256,76 +255,54 @@ module mojo_top( if (hdmix == WIDTH-1 && hdmiy == HEIGHT-1) begin frame_d = frame_q + 1'b1; end - - // new_tx_data = 1'b0; - // write_enable = 1'b0; - // 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 + + // Disable write during IO request + write_enable = z80_ioreq && write_enable_c_q; end - reg bottom_of_screen_q, bottom_of_screen_d; always @(posedge z80_clk) begin - write_enable = 1'b0; - write_data = 1'b0; - addr_d = addr_q; - scroll_d = scroll_q; - bottom_of_screen_d = bottom_of_screen_q; + write_data_d = write_data_q; + write_enable_c_d = write_enable_c_q; + addr_d = addr_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_wr != 1) 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 - addr_d = addr_q + CHAR_HMAX; + addr_d = addr_n; + write_enable_c_d = 0; end else begin - write_enable = 1'b1; - write_data = z80_data - 32; - addr_d = addr_q + 1'b1; + write_data_d = z80_data - 32; + addr_d = addr_t; + write_enable_c_d = 1; 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 + // 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 if (rst) begin frame_q <= 1'b0; char_index_q <= 1'b0; addr_q <= 1'b0; - scroll_q <= 1'b0; - bottom_of_screen_q <= 1'b0; + write_data_q <= 0; + write_enable_c_q <= 0; 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; 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