Apple1_MiST/rtl/tms9918/tms9918.v

117 lines
2.5 KiB
Verilog

module tms9918
(
input RESET,
input clk,
input ena,
// control signals
input csr_n,
input csw_n,
input mode,
output int_n,
// cpu I/O
input [0:7] cd_i,
output [0:7] cd_o,
// vram
output vram_we,
output [0:13] vram_a,
output [0:7] vram_d_o,
input [0:7] vram_d_i,
// video
output HS,
output VS,
output [5:0] R,
output [5:0] G,
output [5:0] B
);
vdp18_core
#(
.is_pal_g(0) // NTSC
)
vdp
(
.clk_i ( clk ),
.clk_en_10m7_i ( ena ),
.reset_n_i ( ~RESET ),
.csr_n_i ( csr_n ),
.csw_n_i ( csw_n ),
.mode_i ( mode ),
.int_n_o ( int_n ),
.cd_i ( cd_i ),
.cd_o ( cd_o ),
.vram_we_o ( vram_we ),
.vram_a_o ( vram_a ),
.vram_d_o ( vram_d_o ),
.vram_d_i ( vram_d_i ),
.rgb_r_o ( vdp_r_ ),
.rgb_g_o ( vdp_g_ ),
.rgb_b_o ( vdp_b_ ),
.hsync_n_o ( vdp_hs ),
.vsync_n_o ( vdp_vs )
);
// video wires
wire vdp_vs;
wire vdp_hs;
wire [0:7] vdp_r_;
wire [0:7] vdp_g_;
wire [0:7] vdp_b_;
wire [5:0] vdp_r = { vdp_r_[0],vdp_r_[1],vdp_r_[2],vdp_r_[3],vdp_r_[4],vdp_r_[5] } ;
wire [5:0] vdp_g = { vdp_g_[0],vdp_g_[1],vdp_g_[2],vdp_g_[3],vdp_g_[4],vdp_g_[5] } ;
wire [5:0] vdp_b = { vdp_b_[0],vdp_b_[1],vdp_b_[2],vdp_b_[3],vdp_b_[4],vdp_b_[5] } ;
/******************************************************************************************/
/******************************************************************************************/
/***************************************** @test ******************************************/
/******************************************************************************************/
/******************************************************************************************/
reg [15:0] hcnt;
reg [15:0] vcnt;
reg flip = 0;
localparam EXTRA_PIXELS = 0; // 5
always @(posedge clk) begin
if(ena) begin
if(RESET) begin
hcnt <= -36;
vcnt <= 0;
end
else begin
flip = ~flip;
if(flip) begin
hcnt <= hcnt + 1;
if(hcnt == 341+EXTRA_PIXELS) begin
hcnt <= 0;
vcnt <= vcnt + 1;
if(vcnt == 260) vcnt <= 0;
end
end
end
end
end
assign VS = 1 ? (vcnt < 4 ? 0 : 1) : vdp_hs;
assign HS = 1 ? (hcnt < 20 ? 0 : 1) : vdp_vs;
wire blank = (vcnt < 8) || (hcnt < 60 || hcnt > 340);
assign R = 1 ? (blank ? 0 : vdp_r) : vdp_r;
assign G = 1 ? (blank ? 0 : vdp_g) : vdp_r;
assign B = 1 ? (blank ? 0 : vdp_b) : vdp_r;
endmodule