mirror of
https://github.com/nippur72/Apple1_MiST.git
synced 2024-09-28 16:54:45 +00:00
117 lines
2.5 KiB
Verilog
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
|