Line 15... |
Line 15... |
*/
|
*/
|
|
|
`timescale 1ns / 1ps
|
`timescale 1ns / 1ps
|
|
|
module sound1942;
|
module sound1942;
|
wire [7:0]cpu_in, cpu_out;
|
|
wire [15:0]adr;
|
|
wire m1_n, mreq_n, iorq_n, rd_n, wr_n, rfsh_n, halt_n, busak_n;
|
|
wire bus_error;
|
|
// inputs to Z80
|
// inputs to Z80
|
reg reset_n, clk, wait_n, int_n, nmi_n, busrq_n, sound_clk;
|
reg reset_n, clk, int_n, sound_clk;
|
|
|
initial begin
|
initial begin
|
//$dumpfile("dump.lxt");
|
//$dumpfile("dump.lxt");
|
//$dumpvars(1,map.ym2203_0);
|
//$dumpvars(1,map.ym2203_0);
|
// $dumpvars();
|
// $dumpvars();
|
// $dumpon;
|
// $dumpon;
|
// $shm_open("1942.shm");
|
// $shm_open("1942.shm");
|
// $shm_probe( sound1942, "ACTFS" );
|
// $shm_probe( sound1942, "ACTFS" );
|
reset_n=0;
|
reset_n=0;
|
nmi_n=1;
|
|
wait_n=1;
|
|
#1500 reset_n=1;
|
#1500 reset_n=1;
|
// change finish time depending on song
|
// change finish time depending on song
|
// #400e6 $finish;
|
//#4e6 $finish;
|
#10e9 $finish;
|
#5e9 $finish;
|
end
|
end
|
|
|
always begin // main clock
|
always begin // main clock
|
clk=0;
|
clk=0;
|
forever clk = #167 ~clk;
|
forever clk = #167 ~clk;
|
Line 59... |
Line 53... |
//$display("IRQ request @ %t us",$time/1e6);
|
//$display("IRQ request @ %t us",$time/1e6);
|
#(int_low_time) int_n=1;
|
#(int_low_time) int_n=1;
|
end
|
end
|
end
|
end
|
|
|
|
always #22676 $display("%d", amp0_y+amp1_y ); // 44.1kHz sample
|
|
|
tv80n cpu( //outputs
|
wire [3:0] ay0_a, ay0_b, ay0_c, ay1_a, ay1_b, ay1_c;
|
.m1_n(m1_n), .mreq_n(mreq_n), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n),
|
computer_1942 #(0) game( .clk(clk), .sound_clk(sound_clk),
|
.rfsh_n(rfsh_n), .halt_n(halt_n), .busak_n(busak_n), .A(adr), .do(cpu_out),
|
.int_n(int_n), .reset_n(reset_n),
|
// Inputs
|
.ay0_a(ay0_a), .ay0_b(ay0_b), .ay0_c(ay0_c),
|
.reset_n(reset_n), .clk(clk), .wait_n(wait_n),
|
.ay1_a(ay1_a), .ay1_b(ay1_b), .ay1_c(ay1_c) );
|
.int_n(int_n), .nmi_n(nmi_n), .busrq_n(busrq_n), .di(cpu_in) );
|
// sound amplifier:
|
|
wire [15:0] amp0_y, amp1_y;
|
MAP map( .adr(adr), .din(cpu_out), .dout(cpu_in), .clk(clk),
|
SQM_AMP amp0( .A(ay0_a), .B(ay0_b), .C(ay0_c), .Y( amp0_y ));
|
.sound_clk( sound_clk ), .wr_n(wr_n), .rd_n(rd_n),
|
SQM_AMP amp1( .A(ay1_a), .B(ay1_b), .C(ay1_c), .Y( amp1_y ));
|
.bus_error(bus_error), .reset_n(reset_n) );
|
|
|
|
|
|
|
|
endmodule
|
endmodule
|
|
|
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
module MAP(
|
module computer_1942
|
input [15:0] adr,
|
#(parameter dump_regs=0) // set to 1 to dump sqmusic registers
|
input [7:0] din,
|
(
|
output [7:0] dout,
|
|
input clk,
|
input clk,
|
input sound_clk,
|
input sound_clk,
|
input rd_n,
|
|
input wr_n,
|
|
input reset_n,
|
input reset_n,
|
output bus_error );
|
input int_n,
|
|
output [3:0] ay0_a,
|
|
output [3:0] ay0_b,
|
|
output [3:0] ay0_c,
|
|
output [3:0] ay1_a,
|
|
output [3:0] ay1_b,
|
|
output [3:0] ay1_c
|
|
);
|
|
reg wait_n, nmi_n, busrq_n;
|
|
|
|
wire [7:0]cpu_in, cpu_out;
|
|
wire [15:0]adr;
|
|
wire m1_n, mreq_n, iorq_n, rd_n, wr_n, rfsh_n, halt_n, busak_n;
|
|
wire bus_error;
|
|
|
|
|
wire [3:0] ay0_a, ay0_b, ay0_c, ay1_a, ay1_b, ay1_c;
|
wire [3:0] ay0_a, ay0_b, ay0_c, ay1_a, ay1_b, ay1_c;
|
wire [15:0] amp0_y, amp1_y;
|
wire [15:0] amp0_y, amp1_y;
|
|
|
wire [7:0]ram_out, rom_out, latch_out;
|
wire [7:0]ram_out, rom_out, latch_out;
|
Line 98... |
Line 100... |
wire latch_enable = adr==16'h6000 ? 1 : 0;
|
wire latch_enable = adr==16'h6000 ? 1 : 0;
|
wire ay_0_enable = adr==16'h8000 || adr==16'h8001 ? 1:0;
|
wire ay_0_enable = adr==16'h8000 || adr==16'h8001 ? 1:0;
|
wire ay_1_enable = adr==16'hC000 || adr==16'hC001 ? 1:0;
|
wire ay_1_enable = adr==16'hC000 || adr==16'hC001 ? 1:0;
|
assign bus_error = ~ram_enable & ~rom_enable & ~latch_enable &
|
assign bus_error = ~ram_enable & ~rom_enable & ~latch_enable &
|
~ay_0_enable & ~ay_1_enable;
|
~ay_0_enable & ~ay_1_enable;
|
assign dout=ram_out | rom_out | latch_out;
|
assign cpu_in=ram_out | rom_out | latch_out;
|
/*
|
/*
|
always @(negedge rd_n)
|
always @(negedge rd_n)
|
if( !rd_n && adr==8'h38 )
|
if( !rd_n && adr==8'h38 )
|
$display("IRQ processing started @ %t us",$time/1e6);
|
$display("IRQ processing started @ %t us",$time/1e6);
|
*/
|
*/
|
RAM ram(.adr(adr[10:0]), .din(din), .dout(ram_out), .enable( ram_enable ),
|
initial begin
|
|
nmi_n=1;
|
|
wait_n=1;
|
|
end
|
|
|
|
tv80n cpu( //outputs
|
|
.m1_n(m1_n), .mreq_n(mreq_n), .iorq_n(iorq_n), .rd_n(rd_n), .wr_n(wr_n),
|
|
.rfsh_n(rfsh_n), .halt_n(halt_n), .busak_n(busak_n), .A(adr), .do(cpu_out),
|
|
// Inputs
|
|
.reset_n(reset_n), .clk(clk), .wait_n(wait_n),
|
|
.int_n(int_n), .nmi_n(nmi_n), .busrq_n(busrq_n), .di(cpu_in) );
|
|
|
|
RAM ram(.adr(adr[10:0]), .din(cpu_out), .dout(ram_out), .enable( ram_enable ),
|
.clk(clk), .wr_n(wr_n), .rd_n(rd_n) );
|
.clk(clk), .wr_n(wr_n), .rd_n(rd_n) );
|
ROM rom(.adr(adr[13:0]), .data(rom_out), .enable(rom_enable),
|
ROM rom(.adr(adr[13:0]), .data(rom_out), .enable(rom_enable),
|
.rd_n(rd_n), .clk(clk));
|
.rd_n(rd_n), .clk(clk));
|
SOUND_LATCH sound_latch( .dout(latch_out), .enable(latch_enable),
|
SOUND_LATCH sound_latch( .dout(latch_out), .enable(latch_enable),
|
.clk(clk), .rd_n(rd_n) );
|
.clk(clk), .rd_n(rd_n) );
|
|
|
// fake_ay ay_0( .adr(adr[0]), .din(din), .clk(clk), .wr_n(~ay_0_enable|wr_n) );
|
// fake_ay ay_0( .adr(adr[0]), .din(din), .clk(clk), .wr_n(~ay_0_enable|wr_n) );
|
|
|
AY_3_8910_capcom ay_0( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
|
AY_3_8910_capcom #(dump_regs,0) ay_0( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
|
.din(din), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_0_enable),
|
.din(cpu_out), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_0_enable),
|
.A(ay0_a), .B(ay0_b), .C(ay0_c) );
|
.A(ay0_a), .B(ay0_b), .C(ay0_c) );
|
AY_3_8910_capcom ay_1( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
|
AY_3_8910_capcom #(dump_regs,1) ay_1( .reset_n(reset_n), .clk(clk), .sound_clk(sound_clk),
|
.din(din), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_1_enable),
|
.din(cpu_out), .adr(adr[0]), .wr_n(wr_n), .cs_n(~ay_1_enable),
|
.A(ay1_a), .B(ay1_b), .C(ay1_c) );
|
.A(ay1_a), .B(ay1_b), .C(ay1_c) );
|
|
|
SQM_AMP amp0( .A(ay0_a), .B(ay0_b), .C(ay0_c), .Y( amp0_y ));
|
|
SQM_AMP amp1( .A(ay1_a), .B(ay1_b), .C(ay1_c), .Y( amp1_y ));
|
|
|
|
always #22676 $display("%d", amp0_y+amp1_y ); // 44.1kHz sample
|
|
// initial $dumpvars(0,ym2203_0);
|
|
endmodule
|
endmodule
|
|
|
//////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////
|
// this module is used to check the communication of the
|
// this module is used to check the communication of the
|
// Z80 with the AY-3-8910
|
// Z80 with the AY-3-8910
|