From 5442bf26bc153cb80f6bcbe0ed21e8b5a20c030d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aitor=20G=C3=B3mez?= Date: Thu, 24 Nov 2022 14:21:11 +0100 Subject: [PATCH] C/MS Audio support and Sound Blaster FM compatibility Adlib's invisibility option is replaced by complete disable of the OPL2 chip. --- PCXT.sv | 62 ++- files.qip | 5 +- rtl/KFPC-XT/HDL/Chipset.sv | 11 +- rtl/KFPC-XT/HDL/Peripherals.sv | 106 ++++- rtl/{ => sound}/jt89/LICENSE | 0 rtl/{ => sound}/jt89/README.md | 0 .../SN76489 - Development - SMS Power!.pdf | Bin rtl/{ => sound}/jt89/doc/filter_notes.ods | Bin rtl/{ => sound}/jt89/doc/notes.ods | Bin .../jt89/doc/texas_instruments_sn76489an.pdf | Bin rtl/{ => sound}/jt89/hdl/jt89.qip | 0 rtl/{ => sound}/jt89/hdl/jt89.v | 0 rtl/{ => sound}/jt89/hdl/jt89.vhd | 0 rtl/{ => sound}/jt89/hdl/jt89.yaml | 0 rtl/{ => sound}/jt89/hdl/jt89_mixer.v | 0 rtl/{ => sound}/jt89/hdl/jt89_noise.v | 0 rtl/{ => sound}/jt89/hdl/jt89_sms.v | 0 rtl/{ => sound}/jt89/hdl/jt89_sms.vhd | 0 rtl/{ => sound}/jt89/hdl/jt89_tone.v | 0 rtl/{ => sound}/jt89/hdl/jt89_vol.v | 0 rtl/{ => sound}/jt89/hdl/mixer/jt12_comb.v | 0 rtl/{ => sound}/jt89/hdl/mixer/jt12_dac2.v | 0 .../jt89/hdl/mixer/jt12_interpol.v | 0 rtl/{ => sound}/jt89/syn/quartus/jt89.qip | 0 rtl/{ => sound}/jt89/syn/quartus/jt89_sms.qip | 0 .../jt89/syn/quartus/jt89_verilog.qip | 0 rtl/{ => sound}/jt89/ver/jt89_tb/go | 0 rtl/{ => sound}/jt89/ver/jt89_tb/inputs.cc | 0 rtl/{ => sound}/jt89/ver/jt89_tb/jt89_tb.v | 0 rtl/{ => sound}/jt89/ver/verilator/go | 0 rtl/{ => sound}/jt89/ver/verilator/test.cpp | 0 rtl/{ => sound}/jt89/ver/verilator/test.gtkw | 0 .../jt89/ver/verilator/tests/1.jtt | 0 .../jt89/ver/verilator/tests/dr.jtt | 0 .../jt89/ver/verilator/tests/no-ch2.jtt | 0 .../jt89/ver/verilator/tests/vol.jtt | 0 .../jt89/ver/verilator/tests/vol2-ch1.jtt | 0 .../jt89/ver/verilator/tests/vol2-ch2.jtt | 0 .../jt89/ver/verilator/tests/vol2-ch3.jtt | 0 .../jt89/ver/verilator/tests/vol2.jtt | 0 rtl/{ => sound}/jtopl/LICENSE | 0 rtl/{ => sound}/jtopl/README.md | 0 rtl/{ => sound}/jtopl/doc/Makefile | 0 rtl/{ => sound}/jtopl/doc/Y8950 app notes.pdf | Bin rtl/{ => sound}/jtopl/doc/Y8950 datasheet.pdf | Bin rtl/{ => sound}/jtopl/doc/YM2413.pdf | Bin .../jtopl/doc/YM3812 datasheet.pdf | Bin .../doc/Yamaha YM3812 Application Manual.pdf | Bin rtl/{ => sound}/jtopl/doc/lfo_count.cc | 0 rtl/{ => sound}/jtopl/doc/notes.ods | Bin rtl/{ => sound}/jtopl/doc/opl3.c | 0 rtl/{ => sound}/jtopl/doc/opl3.h | 0 rtl/{ => sound}/jtopl/doc/opll.c | 0 rtl/{ => sound}/jtopl/doc/opll.h | 0 rtl/{ => sound}/jtopl/doc/opll_patches.c | 0 .../jtopl/doc/ym2413 app notes.pdf | Bin rtl/{ => sound}/jtopl/hdl/common.yaml | 0 rtl/{ => sound}/jtopl/hdl/jt2413.v | 0 rtl/{ => sound}/jtopl/hdl/jt2413.yaml | 0 rtl/{ => sound}/jtopl/hdl/jt26.qip | 0 rtl/{ => sound}/jtopl/hdl/jt26.yaml | 0 rtl/{ => sound}/jtopl/hdl/jtopl.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl.yaml | 0 rtl/{ => sound}/jtopl/hdl/jtopl2.qip | 0 rtl/{ => sound}/jtopl/hdl/jtopl2.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl2.yaml | 0 rtl/{ => sound}/jtopl/hdl/jtopl_acc.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_csr.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_div.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_cnt.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_comb.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_ctrl.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_final.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_pure.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_eg_step.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_exprom.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_lfo.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_logsin.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_mmr.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_noise.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_op.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pg.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pg_comb.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pg_inc.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pg_rhy.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pg_sum.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_pm.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_reg.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_reg_ch.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_sh.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_sh_rst.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_single_acc.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_slot_cnt.v | 0 rtl/{ => sound}/jtopl/hdl/jtopl_timers.v | 0 rtl/{ => sound}/jtopl/hdl/jtopll.yaml | 0 rtl/{ => sound}/jtopl/hdl/jtopll_mmr.v | 0 rtl/{ => sound}/jtopl/hdl/jtopll_reg.v | 0 rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.cpp | 0 rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.sh | 0 rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.v | 0 .../jtopl/ver/jtopl_eg_comb_tb/README | 0 .../jtopl/ver/jtopl_eg_comb_tb/sim.sh | 0 .../jtopl/ver/jtopl_eg_comb_tb/test.cpp | 0 .../jtopl/ver/jtopl_eg_comb_tb/test.v | 0 .../ver/jtopl_eg_comb_tb/tests/attack.tst | 0 .../jtopl/ver/verilator/VGMParser.cpp | 0 .../jtopl/ver/verilator/VGMParser.hpp | 0 .../jtopl/ver/verilator/WaveWritter.cpp | 0 .../jtopl/ver/verilator/WaveWritter.hpp | 0 .../jtopl/ver/verilator/feature.hpp | 0 rtl/{ => sound}/jtopl/ver/verilator/mmr.lut | 0 rtl/{ => sound}/jtopl/ver/verilator/sim.sh | 0 rtl/{ => sound}/jtopl/ver/verilator/test.cpp | 0 .../jtopl/ver/verilator/tests/am.jtt | 0 .../jtopl/ver/verilator/tests/fb.jtt | 0 .../jtopl/ver/verilator/tests/fnum.jtt | 0 .../jtopl/ver/verilator/tests/keycode.jtt | 0 .../jtopl/ver/verilator/tests/ksl1.jtt | 0 .../jtopl/ver/verilator/tests/ksl2.jtt | 0 .../jtopl/ver/verilator/tests/ksl3.jtt | 0 .../jtopl/ver/verilator/tests/mod.jtt | 0 .../jtopl/ver/verilator/tests/noteG.jtt | 0 .../jtopl/ver/verilator/tests/perc.jtt | 0 .../jtopl/ver/verilator/tests/rates.jtt | 0 .../jtopl/ver/verilator/tests/slots.jtt | 0 .../jtopl/ver/verilator/tests/slots_mod.jtt | 0 .../jtopl/ver/verilator/tests/timers.jtt | 0 .../jtopl/ver/verilator/tests/tl.jtt | 0 .../jtopl/ver/verilator/tests/tone.jtt | 0 .../jtopl/ver/verilator/tests/tone_w1.jtt | 0 .../jtopl/ver/verilator/tests/tone_w2.jtt | 0 .../jtopl/ver/verilator/tests/tone_w3.jtt | 0 .../jtopl/ver/verilator/tests/vib.jtt | 0 rtl/sound/saa1099.sv | 403 ++++++++++++++++++ 135 files changed, 565 insertions(+), 22 deletions(-) rename rtl/{ => sound}/jt89/LICENSE (100%) rename rtl/{ => sound}/jt89/README.md (100%) rename rtl/{ => sound}/jt89/doc/SN76489 - Development - SMS Power!.pdf (100%) rename rtl/{ => sound}/jt89/doc/filter_notes.ods (100%) rename rtl/{ => sound}/jt89/doc/notes.ods (100%) rename rtl/{ => sound}/jt89/doc/texas_instruments_sn76489an.pdf (100%) rename rtl/{ => sound}/jt89/hdl/jt89.qip (100%) rename rtl/{ => sound}/jt89/hdl/jt89.v (100%) rename rtl/{ => sound}/jt89/hdl/jt89.vhd (100%) rename rtl/{ => sound}/jt89/hdl/jt89.yaml (100%) rename rtl/{ => sound}/jt89/hdl/jt89_mixer.v (100%) rename rtl/{ => sound}/jt89/hdl/jt89_noise.v (100%) rename rtl/{ => sound}/jt89/hdl/jt89_sms.v (100%) rename rtl/{ => sound}/jt89/hdl/jt89_sms.vhd (100%) rename rtl/{ => sound}/jt89/hdl/jt89_tone.v (100%) rename rtl/{ => sound}/jt89/hdl/jt89_vol.v (100%) rename rtl/{ => sound}/jt89/hdl/mixer/jt12_comb.v (100%) rename rtl/{ => sound}/jt89/hdl/mixer/jt12_dac2.v (100%) rename rtl/{ => sound}/jt89/hdl/mixer/jt12_interpol.v (100%) rename rtl/{ => sound}/jt89/syn/quartus/jt89.qip (100%) rename rtl/{ => sound}/jt89/syn/quartus/jt89_sms.qip (100%) rename rtl/{ => sound}/jt89/syn/quartus/jt89_verilog.qip (100%) rename rtl/{ => sound}/jt89/ver/jt89_tb/go (100%) rename rtl/{ => sound}/jt89/ver/jt89_tb/inputs.cc (100%) rename rtl/{ => sound}/jt89/ver/jt89_tb/jt89_tb.v (100%) rename rtl/{ => sound}/jt89/ver/verilator/go (100%) rename rtl/{ => sound}/jt89/ver/verilator/test.cpp (100%) rename rtl/{ => sound}/jt89/ver/verilator/test.gtkw (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/1.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/dr.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/no-ch2.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/vol.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/vol2-ch1.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/vol2-ch2.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/vol2-ch3.jtt (100%) rename rtl/{ => sound}/jt89/ver/verilator/tests/vol2.jtt (100%) rename rtl/{ => sound}/jtopl/LICENSE (100%) rename rtl/{ => sound}/jtopl/README.md (100%) rename rtl/{ => sound}/jtopl/doc/Makefile (100%) rename rtl/{ => sound}/jtopl/doc/Y8950 app notes.pdf (100%) rename rtl/{ => sound}/jtopl/doc/Y8950 datasheet.pdf (100%) rename rtl/{ => sound}/jtopl/doc/YM2413.pdf (100%) rename rtl/{ => sound}/jtopl/doc/YM3812 datasheet.pdf (100%) rename rtl/{ => sound}/jtopl/doc/Yamaha YM3812 Application Manual.pdf (100%) rename rtl/{ => sound}/jtopl/doc/lfo_count.cc (100%) rename rtl/{ => sound}/jtopl/doc/notes.ods (100%) rename rtl/{ => sound}/jtopl/doc/opl3.c (100%) rename rtl/{ => sound}/jtopl/doc/opl3.h (100%) rename rtl/{ => sound}/jtopl/doc/opll.c (100%) rename rtl/{ => sound}/jtopl/doc/opll.h (100%) rename rtl/{ => sound}/jtopl/doc/opll_patches.c (100%) rename rtl/{ => sound}/jtopl/doc/ym2413 app notes.pdf (100%) rename rtl/{ => sound}/jtopl/hdl/common.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jt2413.v (100%) rename rtl/{ => sound}/jtopl/hdl/jt2413.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jt26.qip (100%) rename rtl/{ => sound}/jtopl/hdl/jt26.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl2.qip (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl2.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl2.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_acc.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_csr.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_div.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_cnt.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_comb.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_ctrl.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_final.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_pure.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_eg_step.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_exprom.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_lfo.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_logsin.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_mmr.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_noise.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_op.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pg.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pg_comb.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pg_inc.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pg_rhy.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pg_sum.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_pm.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_reg.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_reg_ch.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_sh.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_sh_rst.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_single_acc.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_slot_cnt.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopl_timers.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopll.yaml (100%) rename rtl/{ => sound}/jtopl/hdl/jtopll_mmr.v (100%) rename rtl/{ => sound}/jtopl/hdl/jtopll_reg.v (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.cpp (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.sh (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg/sweep.v (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg_comb_tb/README (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg_comb_tb/sim.sh (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg_comb_tb/test.cpp (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg_comb_tb/test.v (100%) rename rtl/{ => sound}/jtopl/ver/jtopl_eg_comb_tb/tests/attack.tst (100%) rename rtl/{ => sound}/jtopl/ver/verilator/VGMParser.cpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/VGMParser.hpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/WaveWritter.cpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/WaveWritter.hpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/feature.hpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/mmr.lut (100%) rename rtl/{ => sound}/jtopl/ver/verilator/sim.sh (100%) rename rtl/{ => sound}/jtopl/ver/verilator/test.cpp (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/am.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/fb.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/fnum.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/keycode.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/ksl1.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/ksl2.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/ksl3.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/mod.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/noteG.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/perc.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/rates.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/slots.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/slots_mod.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/timers.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/tl.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/tone.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/tone_w1.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/tone_w2.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/tone_w3.jtt (100%) rename rtl/{ => sound}/jtopl/ver/verilator/tests/vib.jtt (100%) create mode 100644 rtl/sound/saa1099.sv diff --git a/PCXT.sv b/PCXT.sv index 3510ac6..33e536d 100644 --- a/PCXT.sv +++ b/PCXT.sv @@ -229,7 +229,9 @@ module emu "P1-;", "P2,Audio & Video;", "P2-;", - "P2OA,Adlib,On,Invisible;", + //"P2OA,Adlib,On,Invisible;", // status[10] is available, remove this line when used + "P2OA,C/MS Audio,Enabled,Disabled;", + "P2oAB,OPL2,Adlib 388h,SB FM 388h/228h, Disabled;", "P2o01,Speaker Volume,1,2,3,4;", "P2o23,Tandy Volume,1,2,3,4;", "P2o45,Audio Boost,No,2x,4x;", @@ -297,7 +299,6 @@ module emu reg ioctl_wait; wire [21:0] gamma_bus; - wire adlibhide = status[10] | xtctl[4]; wire [13:0] joy0, joy1; wire [15:0] joya0, joya1; @@ -1072,7 +1073,10 @@ module emu .clk_en_opl2 (cen_opl2), // clk_en_opl2 .jtopl2_snd_e (jtopl2_snd_e), .tandy_snd_e (tandy_snd_e), - .adlibhide (adlibhide), + .opl2_io (xtctl[4] ? 2'b10 : status[43:42]), + .cms_en (~status[10]), + .o_cms_l (cms_l_snd_e), + .o_cms_r (cms_r_snd_e), .tandy_video (tandy_mode), .tandy_bios_flag (tandy_bios_flag), .tandy_16_gfx (tandy_16_gfx), @@ -1160,6 +1164,11 @@ module emu //////////////////////////// AUDIO /////////////////////////////////// // + wire [15:0] cms_l_snd_e; + wire [16:0] cms_l_snd; + wire [15:0] cms_r_snd_e; + wire [16:0] cms_r_snd; + wire [15:0] jtopl2_snd_e; wire [16:0] jtopl2_snd; wire [10:0] tandy_snd_e; @@ -1170,8 +1179,25 @@ module emu always @(posedge CLK_AUDIO) begin reg [15:0] oldj_0, oldj_1; + reg [15:0] oldcl_0, oldcl_1; + reg [15:0] oldcr_0, oldcr_1; reg [10:0] oldt_0, oldt_1; + oldj_0 <= jtopl2_snd_e; + oldj_1 <= oldj_0; + if(oldj_0 == oldj_1) + jtopl2_snd <= {oldj_1[15],oldj_1}; + + oldcl_0 <= cms_l_snd_e; + oldcl_1 <= oldcl_0; + if(oldcl_0 == oldcl_1) + cms_l_snd <= {oldcl_1[15],oldcl_1}; + + oldcr_0 <= cms_r_snd_e; + oldcr_1 <= oldcr_0; + if(oldcr_0 == oldcr_1) + cms_r_snd <= {oldcr_1[15],oldcr_1}; + oldj_0 <= jtopl2_snd_e; oldj_1 <= oldj_0; if(oldj_0 == oldj_1) @@ -1207,22 +1233,36 @@ module emu end endfunction - reg [15:0] cmp; - reg [15:0] out; + reg [15:0] cmp_l; + reg [15:0] out_l; always @(posedge CLK_AUDIO) begin - reg [16:0] tmp; + reg [16:0] tmp_l; - tmp <= jtopl2_snd + tandy_snd + spk_vol; + tmp_l <= jtopl2_snd + cms_l_snd + tandy_snd + spk_vol; // clamp the output - out <= (^tmp[16:15]) ? {tmp[16], {15{tmp[15]}}} : tmp[15:0]; + out_l <= (^tmp_l[16:15]) ? {tmp_l[16], {15{tmp_l[15]}}} : tmp_l[15:0]; - cmp <= compr(out); + cmp_l <= compr(out_l); + end + + reg [15:0] cmp_r; + reg [15:0] out_r; + always @(posedge CLK_AUDIO) + begin + reg [16:0] tmp_r; + + tmp_r <= jtopl2_snd + cms_r_snd + tandy_snd + spk_vol; + + // clamp the output + out_r <= (^tmp_r[16:15]) ? {tmp_r[16], {15{tmp_r[15]}}} : tmp_r[15:0]; + + cmp_r <= compr(out_r); end - assign AUDIO_L = status[37:36] ? cmp : out; - assign AUDIO_R = status[37:36] ? cmp : out; + assign AUDIO_L = status[37:36] ? cmp_l : out_l; + assign AUDIO_R = status[37:36] ? cmp_r : out_r; assign AUDIO_S = 1; assign AUDIO_MIX = status[39:38]; diff --git a/files.qip b/files.qip index 37a526b..6c7b4eb 100644 --- a/files.qip +++ b/files.qip @@ -4,8 +4,9 @@ set_global_assignment -name QIP_FILE rtl/pll.qip set_global_assignment -name QIP_FILE rtl/common/common.qip set_global_assignment -name QIP_FILE rtl/video/video.qip set_global_assignment -name QIP_FILE rtl/uart/uart.qip -set_global_assignment -name QIP_FILE rtl/jt89/hdl/jt89.qip -set_global_assignment -name QIP_FILE rtl/jtopl/hdl/jtopl2.qip +set_global_assignment -name SYSTEMVERILOG_FILE "rtl/sound/saa1099.sv" +set_global_assignment -name QIP_FILE rtl/sound/jt89/hdl/jt89.qip +set_global_assignment -name QIP_FILE rtl/sound/jtopl/hdl/jtopl2.qip set_global_assignment -name QIP_FILE rtl/8088/8088.qip set_global_assignment -name SYSTEMVERILOG_FILE "rtl/KFPC-XT/HDL/KFSDRAM/HDL/KFSDRAM.sv" set_global_assignment -name SYSTEMVERILOG_FILE "rtl/KFPC-XT/HDL/KFPS2KB/HDL/KFPS2KB_Shift_Register.sv" diff --git a/rtl/KFPC-XT/HDL/Chipset.sv b/rtl/KFPC-XT/HDL/Chipset.sv index e80cb29..a656e5d 100644 --- a/rtl/KFPC-XT/HDL/Chipset.sv +++ b/rtl/KFPC-XT/HDL/Chipset.sv @@ -94,7 +94,11 @@ module CHIPSET ( // JTOPL input logic clk_en_opl2, output logic [15:0] jtopl2_snd_e, - input logic adlibhide, + input logic [1:0] opl2_io, + // C/MS Audio + input logic cms_en, + output logic [15:0] o_cms_l, + output logic [15:0] o_cms_r, // TANDY input logic tandy_video, input logic tandy_bios_flag, @@ -325,7 +329,10 @@ module CHIPSET ( .ps2_data_out (ps2_data_out), .clk_en_opl2 (clk_en_opl2), .jtopl2_snd_e (jtopl2_snd_e), - .adlibhide (adlibhide), + .opl2_io (opl2_io), + .cms_en (cms_en), + .o_cms_l (o_cms_l), + .o_cms_r (o_cms_r), .tandy_video (tandy_video), .tandy_snd_e (tandy_snd_e), .tandy_snd_rdy (tandy_snd_rdy), diff --git a/rtl/KFPC-XT/HDL/Peripherals.sv b/rtl/KFPC-XT/HDL/Peripherals.sv index f1a3b2d..90623f4 100644 --- a/rtl/KFPC-XT/HDL/Peripherals.sv +++ b/rtl/KFPC-XT/HDL/Peripherals.sv @@ -77,7 +77,11 @@ module PERIPHERALS #( // JTOPL input logic clk_en_opl2, output logic [15:0] jtopl2_snd_e, - input logic adlibhide, + input logic [1:0] opl2_io, + // C/MS Audio + input logic cms_en, + output reg [15:0] o_cms_l, + output reg [15:0] o_cms_r, // TANDY input logic tandy_video, output logic [10:0] tandy_snd_e, @@ -191,7 +195,9 @@ module PERIPHERALS #( wire nmi_mask_register_n = ~(tandy_video && iorq && ~address_enable_n && address[15:3] == (16'h00a0 >> 3)); // 0xa0 - 0xa7 wire tandy_chip_select_n = ~(iorq && ~address_enable_n && address[15:3] == (16'h00c0 >> 3)); // 0xc0 - 0xc7 - wire opl_chip_select_n = ~(iorq && ~address_enable_n && address[15:1] == (16'h0388 >> 1)); // 0x388 .. 0x389 + wire opl_388_select = (iorq && ~address_enable_n && ~opl2_io[1] && address[15:1] == (16'h0388 >> 1)); // 0x388 .. 0x389 (Adlib) + wire opl_228_select = (iorq && ~address_enable_n && (opl2_io == 2'b01) && address[15:1] == (16'h0228 >> 1)); // 0x228 .. 0x229 (Sound Blaster FM) + wire cms_220_select = (iorq && ~address_enable_n && address[15:4] == (16'h0220 >> 4)); // 0x220 .. 0x22F (C/MS Audio) wire video_chip_select_n = ~(tandy_video && ~iorq && ~address_enable_n & (address[19:17] == nmi_mask_register_data[3:1])); // 128KB wire cga_chip_select_n = ~(~iorq && ~address_enable_n && enable_cga & (address[19:15] == 5'b10111)); // B8000 - BFFFF (16 KB / 32 KB) wire mda_chip_select_n = ~(~iorq && ~address_enable_n && enable_mda & (address[19:15] == 6'b10110)); // B0000 - B7FFF (8 repeated blocks of 4Kb) @@ -476,8 +482,6 @@ module PERIPHERALS #( wire [7:0] jtopl2_dout; - wire [7:0] opl32_data; - assign opl32_data = adlibhide ? 8'hFF : jtopl2_dout; jtopl2 jtopl2_inst ( @@ -487,7 +491,7 @@ module PERIPHERALS #( .din(internal_data_bus), .dout(jtopl2_dout), .addr(address[0]), - .cs_n(opl_chip_select_n), + .cs_n(~(opl_228_select || opl_388_select)), .wr_n(io_write_n), .irq_n(), .snd(jtopl2_snd_e), @@ -507,6 +511,89 @@ module PERIPHERALS #( .sound(tandy_snd_e), .ready(tandy_snd_rdy) ); + +//------------------------------------------------------------------------------ + +reg [27:0] clk_rate; +always @(posedge clock) clk_rate <= clock_rate; + +reg ce_1us; +always @(posedge clock) begin + reg [27:0] sum = 0; + + ce_1us = 0; + sum = sum + 28'd1000000; + if(sum >= clk_rate) begin + sum = sum - clk_rate; + ce_1us = 1; + end +end + +//------------------------------------------------------------------------------ c/ms + + wire cms_rd = (address[3:0] == 4'h4 || address[3:0] == 4'hB) && cms_220_select && cms_en; + wire [7:0] data_from_cms = address[3] ? cms_det : 8'h7F; + + wire cms_wr = ~address[3] & cms_220_select & cms_en; + + reg [7:0] cms_det; + always @(posedge clock) if(~io_write_n && cms_wr && &address[2:1]) cms_det <= internal_data_bus; + + reg ce_saa; + always @(posedge clock) begin + reg [27:0] sum = 0; + + ce_saa = 0; + sum = sum + 28'd7159090; + if(sum >= clk_rate) begin + sum = sum - clk_rate; + ce_saa = 1; + end + end + + wire [7:0] saa1_l,saa1_r; + saa1099 ssa1 + ( + .clk_sys(clock), + .ce(ce_saa), + .rst_n(~reset & cms_en), + .cs_n(~(cms_wr && (address[2:1] == 0))), + .a0(address[0]), + .wr_n(io_write_n), + .din(internal_data_bus), + .out_l(saa1_l), + .out_r(saa1_r) + ); + + wire [7:0] saa2_l,saa2_r; + saa1099 ssa2 + ( + .clk_sys(clock), + .ce(ce_saa), + .rst_n(~reset & cms_en), + .cs_n(~(cms_wr && (address[2:1] == 1))), + .a0(address[0]), + .wr_n(io_write_n), + .din(internal_data_bus), + .out_l(saa2_l), + .out_r(saa2_r) + ); + + wire [8:0] cms_l = {1'b0, saa1_l} + {1'b0, saa2_l}; + wire [8:0] cms_r = {1'b0, saa1_r} + {1'b0, saa2_r}; + + reg [15:0] sample_pre_l, sample_pre_r; + always @(posedge clock) begin + sample_pre_l <= {2'b0, cms_l, cms_l[8:4]}; + sample_pre_r <= {2'b0, cms_r, cms_r[8:4]}; + end + + always @(posedge clock) begin + o_cms_l <= $signed(sample_pre_l) >>> ~{3'd7}; + o_cms_r <= $signed(sample_pre_r) >>> ~{3'd7}; + end + +// logic keybord_interrupt_ff; logic uart_interrupt_ff; @@ -1297,10 +1384,15 @@ module PERIPHERALS #( data_bus_out_from_chipset <= 1'b1; data_bus_out <= MDA_CRTC_DOUT_2; end - else if ((~opl_chip_select_n) && (~io_read_n)) + else if ((opl_228_select || opl_388_select) && ~io_read_n) begin data_bus_out_from_chipset <= 1'b1; - data_bus_out <= opl32_data; + data_bus_out <= jtopl2_dout; + end + else if (cms_rd) + begin + data_bus_out_from_chipset <= 1'b1; + data_bus_out <= data_from_cms; end else if ((uart_cs) && (~io_read_n)) begin diff --git a/rtl/jt89/LICENSE b/rtl/sound/jt89/LICENSE similarity index 100% rename from rtl/jt89/LICENSE rename to rtl/sound/jt89/LICENSE diff --git a/rtl/jt89/README.md b/rtl/sound/jt89/README.md similarity index 100% rename from rtl/jt89/README.md rename to rtl/sound/jt89/README.md diff --git a/rtl/jt89/doc/SN76489 - Development - SMS Power!.pdf b/rtl/sound/jt89/doc/SN76489 - Development - SMS Power!.pdf similarity index 100% rename from rtl/jt89/doc/SN76489 - Development - SMS Power!.pdf rename to rtl/sound/jt89/doc/SN76489 - Development - SMS Power!.pdf diff --git a/rtl/jt89/doc/filter_notes.ods b/rtl/sound/jt89/doc/filter_notes.ods similarity index 100% rename from rtl/jt89/doc/filter_notes.ods rename to rtl/sound/jt89/doc/filter_notes.ods diff --git a/rtl/jt89/doc/notes.ods b/rtl/sound/jt89/doc/notes.ods similarity index 100% rename from rtl/jt89/doc/notes.ods rename to rtl/sound/jt89/doc/notes.ods diff --git a/rtl/jt89/doc/texas_instruments_sn76489an.pdf b/rtl/sound/jt89/doc/texas_instruments_sn76489an.pdf similarity index 100% rename from rtl/jt89/doc/texas_instruments_sn76489an.pdf rename to rtl/sound/jt89/doc/texas_instruments_sn76489an.pdf diff --git a/rtl/jt89/hdl/jt89.qip b/rtl/sound/jt89/hdl/jt89.qip similarity index 100% rename from rtl/jt89/hdl/jt89.qip rename to rtl/sound/jt89/hdl/jt89.qip diff --git a/rtl/jt89/hdl/jt89.v b/rtl/sound/jt89/hdl/jt89.v similarity index 100% rename from rtl/jt89/hdl/jt89.v rename to rtl/sound/jt89/hdl/jt89.v diff --git a/rtl/jt89/hdl/jt89.vhd b/rtl/sound/jt89/hdl/jt89.vhd similarity index 100% rename from rtl/jt89/hdl/jt89.vhd rename to rtl/sound/jt89/hdl/jt89.vhd diff --git a/rtl/jt89/hdl/jt89.yaml b/rtl/sound/jt89/hdl/jt89.yaml similarity index 100% rename from rtl/jt89/hdl/jt89.yaml rename to rtl/sound/jt89/hdl/jt89.yaml diff --git a/rtl/jt89/hdl/jt89_mixer.v b/rtl/sound/jt89/hdl/jt89_mixer.v similarity index 100% rename from rtl/jt89/hdl/jt89_mixer.v rename to rtl/sound/jt89/hdl/jt89_mixer.v diff --git a/rtl/jt89/hdl/jt89_noise.v b/rtl/sound/jt89/hdl/jt89_noise.v similarity index 100% rename from rtl/jt89/hdl/jt89_noise.v rename to rtl/sound/jt89/hdl/jt89_noise.v diff --git a/rtl/jt89/hdl/jt89_sms.v b/rtl/sound/jt89/hdl/jt89_sms.v similarity index 100% rename from rtl/jt89/hdl/jt89_sms.v rename to rtl/sound/jt89/hdl/jt89_sms.v diff --git a/rtl/jt89/hdl/jt89_sms.vhd b/rtl/sound/jt89/hdl/jt89_sms.vhd similarity index 100% rename from rtl/jt89/hdl/jt89_sms.vhd rename to rtl/sound/jt89/hdl/jt89_sms.vhd diff --git a/rtl/jt89/hdl/jt89_tone.v b/rtl/sound/jt89/hdl/jt89_tone.v similarity index 100% rename from rtl/jt89/hdl/jt89_tone.v rename to rtl/sound/jt89/hdl/jt89_tone.v diff --git a/rtl/jt89/hdl/jt89_vol.v b/rtl/sound/jt89/hdl/jt89_vol.v similarity index 100% rename from rtl/jt89/hdl/jt89_vol.v rename to rtl/sound/jt89/hdl/jt89_vol.v diff --git a/rtl/jt89/hdl/mixer/jt12_comb.v b/rtl/sound/jt89/hdl/mixer/jt12_comb.v similarity index 100% rename from rtl/jt89/hdl/mixer/jt12_comb.v rename to rtl/sound/jt89/hdl/mixer/jt12_comb.v diff --git a/rtl/jt89/hdl/mixer/jt12_dac2.v b/rtl/sound/jt89/hdl/mixer/jt12_dac2.v similarity index 100% rename from rtl/jt89/hdl/mixer/jt12_dac2.v rename to rtl/sound/jt89/hdl/mixer/jt12_dac2.v diff --git a/rtl/jt89/hdl/mixer/jt12_interpol.v b/rtl/sound/jt89/hdl/mixer/jt12_interpol.v similarity index 100% rename from rtl/jt89/hdl/mixer/jt12_interpol.v rename to rtl/sound/jt89/hdl/mixer/jt12_interpol.v diff --git a/rtl/jt89/syn/quartus/jt89.qip b/rtl/sound/jt89/syn/quartus/jt89.qip similarity index 100% rename from rtl/jt89/syn/quartus/jt89.qip rename to rtl/sound/jt89/syn/quartus/jt89.qip diff --git a/rtl/jt89/syn/quartus/jt89_sms.qip b/rtl/sound/jt89/syn/quartus/jt89_sms.qip similarity index 100% rename from rtl/jt89/syn/quartus/jt89_sms.qip rename to rtl/sound/jt89/syn/quartus/jt89_sms.qip diff --git a/rtl/jt89/syn/quartus/jt89_verilog.qip b/rtl/sound/jt89/syn/quartus/jt89_verilog.qip similarity index 100% rename from rtl/jt89/syn/quartus/jt89_verilog.qip rename to rtl/sound/jt89/syn/quartus/jt89_verilog.qip diff --git a/rtl/jt89/ver/jt89_tb/go b/rtl/sound/jt89/ver/jt89_tb/go similarity index 100% rename from rtl/jt89/ver/jt89_tb/go rename to rtl/sound/jt89/ver/jt89_tb/go diff --git a/rtl/jt89/ver/jt89_tb/inputs.cc b/rtl/sound/jt89/ver/jt89_tb/inputs.cc similarity index 100% rename from rtl/jt89/ver/jt89_tb/inputs.cc rename to rtl/sound/jt89/ver/jt89_tb/inputs.cc diff --git a/rtl/jt89/ver/jt89_tb/jt89_tb.v b/rtl/sound/jt89/ver/jt89_tb/jt89_tb.v similarity index 100% rename from rtl/jt89/ver/jt89_tb/jt89_tb.v rename to rtl/sound/jt89/ver/jt89_tb/jt89_tb.v diff --git a/rtl/jt89/ver/verilator/go b/rtl/sound/jt89/ver/verilator/go similarity index 100% rename from rtl/jt89/ver/verilator/go rename to rtl/sound/jt89/ver/verilator/go diff --git a/rtl/jt89/ver/verilator/test.cpp b/rtl/sound/jt89/ver/verilator/test.cpp similarity index 100% rename from rtl/jt89/ver/verilator/test.cpp rename to rtl/sound/jt89/ver/verilator/test.cpp diff --git a/rtl/jt89/ver/verilator/test.gtkw b/rtl/sound/jt89/ver/verilator/test.gtkw similarity index 100% rename from rtl/jt89/ver/verilator/test.gtkw rename to rtl/sound/jt89/ver/verilator/test.gtkw diff --git a/rtl/jt89/ver/verilator/tests/1.jtt b/rtl/sound/jt89/ver/verilator/tests/1.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/1.jtt rename to rtl/sound/jt89/ver/verilator/tests/1.jtt diff --git a/rtl/jt89/ver/verilator/tests/dr.jtt b/rtl/sound/jt89/ver/verilator/tests/dr.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/dr.jtt rename to rtl/sound/jt89/ver/verilator/tests/dr.jtt diff --git a/rtl/jt89/ver/verilator/tests/no-ch2.jtt b/rtl/sound/jt89/ver/verilator/tests/no-ch2.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/no-ch2.jtt rename to rtl/sound/jt89/ver/verilator/tests/no-ch2.jtt diff --git a/rtl/jt89/ver/verilator/tests/vol.jtt b/rtl/sound/jt89/ver/verilator/tests/vol.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/vol.jtt rename to rtl/sound/jt89/ver/verilator/tests/vol.jtt diff --git a/rtl/jt89/ver/verilator/tests/vol2-ch1.jtt b/rtl/sound/jt89/ver/verilator/tests/vol2-ch1.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/vol2-ch1.jtt rename to rtl/sound/jt89/ver/verilator/tests/vol2-ch1.jtt diff --git a/rtl/jt89/ver/verilator/tests/vol2-ch2.jtt b/rtl/sound/jt89/ver/verilator/tests/vol2-ch2.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/vol2-ch2.jtt rename to rtl/sound/jt89/ver/verilator/tests/vol2-ch2.jtt diff --git a/rtl/jt89/ver/verilator/tests/vol2-ch3.jtt b/rtl/sound/jt89/ver/verilator/tests/vol2-ch3.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/vol2-ch3.jtt rename to rtl/sound/jt89/ver/verilator/tests/vol2-ch3.jtt diff --git a/rtl/jt89/ver/verilator/tests/vol2.jtt b/rtl/sound/jt89/ver/verilator/tests/vol2.jtt similarity index 100% rename from rtl/jt89/ver/verilator/tests/vol2.jtt rename to rtl/sound/jt89/ver/verilator/tests/vol2.jtt diff --git a/rtl/jtopl/LICENSE b/rtl/sound/jtopl/LICENSE similarity index 100% rename from rtl/jtopl/LICENSE rename to rtl/sound/jtopl/LICENSE diff --git a/rtl/jtopl/README.md b/rtl/sound/jtopl/README.md similarity index 100% rename from rtl/jtopl/README.md rename to rtl/sound/jtopl/README.md diff --git a/rtl/jtopl/doc/Makefile b/rtl/sound/jtopl/doc/Makefile similarity index 100% rename from rtl/jtopl/doc/Makefile rename to rtl/sound/jtopl/doc/Makefile diff --git a/rtl/jtopl/doc/Y8950 app notes.pdf b/rtl/sound/jtopl/doc/Y8950 app notes.pdf similarity index 100% rename from rtl/jtopl/doc/Y8950 app notes.pdf rename to rtl/sound/jtopl/doc/Y8950 app notes.pdf diff --git a/rtl/jtopl/doc/Y8950 datasheet.pdf b/rtl/sound/jtopl/doc/Y8950 datasheet.pdf similarity index 100% rename from rtl/jtopl/doc/Y8950 datasheet.pdf rename to rtl/sound/jtopl/doc/Y8950 datasheet.pdf diff --git a/rtl/jtopl/doc/YM2413.pdf b/rtl/sound/jtopl/doc/YM2413.pdf similarity index 100% rename from rtl/jtopl/doc/YM2413.pdf rename to rtl/sound/jtopl/doc/YM2413.pdf diff --git a/rtl/jtopl/doc/YM3812 datasheet.pdf b/rtl/sound/jtopl/doc/YM3812 datasheet.pdf similarity index 100% rename from rtl/jtopl/doc/YM3812 datasheet.pdf rename to rtl/sound/jtopl/doc/YM3812 datasheet.pdf diff --git a/rtl/jtopl/doc/Yamaha YM3812 Application Manual.pdf b/rtl/sound/jtopl/doc/Yamaha YM3812 Application Manual.pdf similarity index 100% rename from rtl/jtopl/doc/Yamaha YM3812 Application Manual.pdf rename to rtl/sound/jtopl/doc/Yamaha YM3812 Application Manual.pdf diff --git a/rtl/jtopl/doc/lfo_count.cc b/rtl/sound/jtopl/doc/lfo_count.cc similarity index 100% rename from rtl/jtopl/doc/lfo_count.cc rename to rtl/sound/jtopl/doc/lfo_count.cc diff --git a/rtl/jtopl/doc/notes.ods b/rtl/sound/jtopl/doc/notes.ods similarity index 100% rename from rtl/jtopl/doc/notes.ods rename to rtl/sound/jtopl/doc/notes.ods diff --git a/rtl/jtopl/doc/opl3.c b/rtl/sound/jtopl/doc/opl3.c similarity index 100% rename from rtl/jtopl/doc/opl3.c rename to rtl/sound/jtopl/doc/opl3.c diff --git a/rtl/jtopl/doc/opl3.h b/rtl/sound/jtopl/doc/opl3.h similarity index 100% rename from rtl/jtopl/doc/opl3.h rename to rtl/sound/jtopl/doc/opl3.h diff --git a/rtl/jtopl/doc/opll.c b/rtl/sound/jtopl/doc/opll.c similarity index 100% rename from rtl/jtopl/doc/opll.c rename to rtl/sound/jtopl/doc/opll.c diff --git a/rtl/jtopl/doc/opll.h b/rtl/sound/jtopl/doc/opll.h similarity index 100% rename from rtl/jtopl/doc/opll.h rename to rtl/sound/jtopl/doc/opll.h diff --git a/rtl/jtopl/doc/opll_patches.c b/rtl/sound/jtopl/doc/opll_patches.c similarity index 100% rename from rtl/jtopl/doc/opll_patches.c rename to rtl/sound/jtopl/doc/opll_patches.c diff --git a/rtl/jtopl/doc/ym2413 app notes.pdf b/rtl/sound/jtopl/doc/ym2413 app notes.pdf similarity index 100% rename from rtl/jtopl/doc/ym2413 app notes.pdf rename to rtl/sound/jtopl/doc/ym2413 app notes.pdf diff --git a/rtl/jtopl/hdl/common.yaml b/rtl/sound/jtopl/hdl/common.yaml similarity index 100% rename from rtl/jtopl/hdl/common.yaml rename to rtl/sound/jtopl/hdl/common.yaml diff --git a/rtl/jtopl/hdl/jt2413.v b/rtl/sound/jtopl/hdl/jt2413.v similarity index 100% rename from rtl/jtopl/hdl/jt2413.v rename to rtl/sound/jtopl/hdl/jt2413.v diff --git a/rtl/jtopl/hdl/jt2413.yaml b/rtl/sound/jtopl/hdl/jt2413.yaml similarity index 100% rename from rtl/jtopl/hdl/jt2413.yaml rename to rtl/sound/jtopl/hdl/jt2413.yaml diff --git a/rtl/jtopl/hdl/jt26.qip b/rtl/sound/jtopl/hdl/jt26.qip similarity index 100% rename from rtl/jtopl/hdl/jt26.qip rename to rtl/sound/jtopl/hdl/jt26.qip diff --git a/rtl/jtopl/hdl/jt26.yaml b/rtl/sound/jtopl/hdl/jt26.yaml similarity index 100% rename from rtl/jtopl/hdl/jt26.yaml rename to rtl/sound/jtopl/hdl/jt26.yaml diff --git a/rtl/jtopl/hdl/jtopl.v b/rtl/sound/jtopl/hdl/jtopl.v similarity index 100% rename from rtl/jtopl/hdl/jtopl.v rename to rtl/sound/jtopl/hdl/jtopl.v diff --git a/rtl/jtopl/hdl/jtopl.yaml b/rtl/sound/jtopl/hdl/jtopl.yaml similarity index 100% rename from rtl/jtopl/hdl/jtopl.yaml rename to rtl/sound/jtopl/hdl/jtopl.yaml diff --git a/rtl/jtopl/hdl/jtopl2.qip b/rtl/sound/jtopl/hdl/jtopl2.qip similarity index 100% rename from rtl/jtopl/hdl/jtopl2.qip rename to rtl/sound/jtopl/hdl/jtopl2.qip diff --git a/rtl/jtopl/hdl/jtopl2.v b/rtl/sound/jtopl/hdl/jtopl2.v similarity index 100% rename from rtl/jtopl/hdl/jtopl2.v rename to rtl/sound/jtopl/hdl/jtopl2.v diff --git a/rtl/jtopl/hdl/jtopl2.yaml b/rtl/sound/jtopl/hdl/jtopl2.yaml similarity index 100% rename from rtl/jtopl/hdl/jtopl2.yaml rename to rtl/sound/jtopl/hdl/jtopl2.yaml diff --git a/rtl/jtopl/hdl/jtopl_acc.v b/rtl/sound/jtopl/hdl/jtopl_acc.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_acc.v rename to rtl/sound/jtopl/hdl/jtopl_acc.v diff --git a/rtl/jtopl/hdl/jtopl_csr.v b/rtl/sound/jtopl/hdl/jtopl_csr.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_csr.v rename to rtl/sound/jtopl/hdl/jtopl_csr.v diff --git a/rtl/jtopl/hdl/jtopl_div.v b/rtl/sound/jtopl/hdl/jtopl_div.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_div.v rename to rtl/sound/jtopl/hdl/jtopl_div.v diff --git a/rtl/jtopl/hdl/jtopl_eg.v b/rtl/sound/jtopl/hdl/jtopl_eg.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg.v rename to rtl/sound/jtopl/hdl/jtopl_eg.v diff --git a/rtl/jtopl/hdl/jtopl_eg_cnt.v b/rtl/sound/jtopl/hdl/jtopl_eg_cnt.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_cnt.v rename to rtl/sound/jtopl/hdl/jtopl_eg_cnt.v diff --git a/rtl/jtopl/hdl/jtopl_eg_comb.v b/rtl/sound/jtopl/hdl/jtopl_eg_comb.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_comb.v rename to rtl/sound/jtopl/hdl/jtopl_eg_comb.v diff --git a/rtl/jtopl/hdl/jtopl_eg_ctrl.v b/rtl/sound/jtopl/hdl/jtopl_eg_ctrl.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_ctrl.v rename to rtl/sound/jtopl/hdl/jtopl_eg_ctrl.v diff --git a/rtl/jtopl/hdl/jtopl_eg_final.v b/rtl/sound/jtopl/hdl/jtopl_eg_final.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_final.v rename to rtl/sound/jtopl/hdl/jtopl_eg_final.v diff --git a/rtl/jtopl/hdl/jtopl_eg_pure.v b/rtl/sound/jtopl/hdl/jtopl_eg_pure.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_pure.v rename to rtl/sound/jtopl/hdl/jtopl_eg_pure.v diff --git a/rtl/jtopl/hdl/jtopl_eg_step.v b/rtl/sound/jtopl/hdl/jtopl_eg_step.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_eg_step.v rename to rtl/sound/jtopl/hdl/jtopl_eg_step.v diff --git a/rtl/jtopl/hdl/jtopl_exprom.v b/rtl/sound/jtopl/hdl/jtopl_exprom.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_exprom.v rename to rtl/sound/jtopl/hdl/jtopl_exprom.v diff --git a/rtl/jtopl/hdl/jtopl_lfo.v b/rtl/sound/jtopl/hdl/jtopl_lfo.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_lfo.v rename to rtl/sound/jtopl/hdl/jtopl_lfo.v diff --git a/rtl/jtopl/hdl/jtopl_logsin.v b/rtl/sound/jtopl/hdl/jtopl_logsin.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_logsin.v rename to rtl/sound/jtopl/hdl/jtopl_logsin.v diff --git a/rtl/jtopl/hdl/jtopl_mmr.v b/rtl/sound/jtopl/hdl/jtopl_mmr.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_mmr.v rename to rtl/sound/jtopl/hdl/jtopl_mmr.v diff --git a/rtl/jtopl/hdl/jtopl_noise.v b/rtl/sound/jtopl/hdl/jtopl_noise.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_noise.v rename to rtl/sound/jtopl/hdl/jtopl_noise.v diff --git a/rtl/jtopl/hdl/jtopl_op.v b/rtl/sound/jtopl/hdl/jtopl_op.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_op.v rename to rtl/sound/jtopl/hdl/jtopl_op.v diff --git a/rtl/jtopl/hdl/jtopl_pg.v b/rtl/sound/jtopl/hdl/jtopl_pg.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pg.v rename to rtl/sound/jtopl/hdl/jtopl_pg.v diff --git a/rtl/jtopl/hdl/jtopl_pg_comb.v b/rtl/sound/jtopl/hdl/jtopl_pg_comb.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pg_comb.v rename to rtl/sound/jtopl/hdl/jtopl_pg_comb.v diff --git a/rtl/jtopl/hdl/jtopl_pg_inc.v b/rtl/sound/jtopl/hdl/jtopl_pg_inc.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pg_inc.v rename to rtl/sound/jtopl/hdl/jtopl_pg_inc.v diff --git a/rtl/jtopl/hdl/jtopl_pg_rhy.v b/rtl/sound/jtopl/hdl/jtopl_pg_rhy.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pg_rhy.v rename to rtl/sound/jtopl/hdl/jtopl_pg_rhy.v diff --git a/rtl/jtopl/hdl/jtopl_pg_sum.v b/rtl/sound/jtopl/hdl/jtopl_pg_sum.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pg_sum.v rename to rtl/sound/jtopl/hdl/jtopl_pg_sum.v diff --git a/rtl/jtopl/hdl/jtopl_pm.v b/rtl/sound/jtopl/hdl/jtopl_pm.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_pm.v rename to rtl/sound/jtopl/hdl/jtopl_pm.v diff --git a/rtl/jtopl/hdl/jtopl_reg.v b/rtl/sound/jtopl/hdl/jtopl_reg.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_reg.v rename to rtl/sound/jtopl/hdl/jtopl_reg.v diff --git a/rtl/jtopl/hdl/jtopl_reg_ch.v b/rtl/sound/jtopl/hdl/jtopl_reg_ch.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_reg_ch.v rename to rtl/sound/jtopl/hdl/jtopl_reg_ch.v diff --git a/rtl/jtopl/hdl/jtopl_sh.v b/rtl/sound/jtopl/hdl/jtopl_sh.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_sh.v rename to rtl/sound/jtopl/hdl/jtopl_sh.v diff --git a/rtl/jtopl/hdl/jtopl_sh_rst.v b/rtl/sound/jtopl/hdl/jtopl_sh_rst.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_sh_rst.v rename to rtl/sound/jtopl/hdl/jtopl_sh_rst.v diff --git a/rtl/jtopl/hdl/jtopl_single_acc.v b/rtl/sound/jtopl/hdl/jtopl_single_acc.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_single_acc.v rename to rtl/sound/jtopl/hdl/jtopl_single_acc.v diff --git a/rtl/jtopl/hdl/jtopl_slot_cnt.v b/rtl/sound/jtopl/hdl/jtopl_slot_cnt.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_slot_cnt.v rename to rtl/sound/jtopl/hdl/jtopl_slot_cnt.v diff --git a/rtl/jtopl/hdl/jtopl_timers.v b/rtl/sound/jtopl/hdl/jtopl_timers.v similarity index 100% rename from rtl/jtopl/hdl/jtopl_timers.v rename to rtl/sound/jtopl/hdl/jtopl_timers.v diff --git a/rtl/jtopl/hdl/jtopll.yaml b/rtl/sound/jtopl/hdl/jtopll.yaml similarity index 100% rename from rtl/jtopl/hdl/jtopll.yaml rename to rtl/sound/jtopl/hdl/jtopll.yaml diff --git a/rtl/jtopl/hdl/jtopll_mmr.v b/rtl/sound/jtopl/hdl/jtopll_mmr.v similarity index 100% rename from rtl/jtopl/hdl/jtopll_mmr.v rename to rtl/sound/jtopl/hdl/jtopll_mmr.v diff --git a/rtl/jtopl/hdl/jtopll_reg.v b/rtl/sound/jtopl/hdl/jtopll_reg.v similarity index 100% rename from rtl/jtopl/hdl/jtopll_reg.v rename to rtl/sound/jtopl/hdl/jtopll_reg.v diff --git a/rtl/jtopl/ver/jtopl_eg/sweep.cpp b/rtl/sound/jtopl/ver/jtopl_eg/sweep.cpp similarity index 100% rename from rtl/jtopl/ver/jtopl_eg/sweep.cpp rename to rtl/sound/jtopl/ver/jtopl_eg/sweep.cpp diff --git a/rtl/jtopl/ver/jtopl_eg/sweep.sh b/rtl/sound/jtopl/ver/jtopl_eg/sweep.sh similarity index 100% rename from rtl/jtopl/ver/jtopl_eg/sweep.sh rename to rtl/sound/jtopl/ver/jtopl_eg/sweep.sh diff --git a/rtl/jtopl/ver/jtopl_eg/sweep.v b/rtl/sound/jtopl/ver/jtopl_eg/sweep.v similarity index 100% rename from rtl/jtopl/ver/jtopl_eg/sweep.v rename to rtl/sound/jtopl/ver/jtopl_eg/sweep.v diff --git a/rtl/jtopl/ver/jtopl_eg_comb_tb/README b/rtl/sound/jtopl/ver/jtopl_eg_comb_tb/README similarity index 100% rename from rtl/jtopl/ver/jtopl_eg_comb_tb/README rename to rtl/sound/jtopl/ver/jtopl_eg_comb_tb/README diff --git a/rtl/jtopl/ver/jtopl_eg_comb_tb/sim.sh b/rtl/sound/jtopl/ver/jtopl_eg_comb_tb/sim.sh similarity index 100% rename from rtl/jtopl/ver/jtopl_eg_comb_tb/sim.sh rename to rtl/sound/jtopl/ver/jtopl_eg_comb_tb/sim.sh diff --git a/rtl/jtopl/ver/jtopl_eg_comb_tb/test.cpp b/rtl/sound/jtopl/ver/jtopl_eg_comb_tb/test.cpp similarity index 100% rename from rtl/jtopl/ver/jtopl_eg_comb_tb/test.cpp rename to rtl/sound/jtopl/ver/jtopl_eg_comb_tb/test.cpp diff --git a/rtl/jtopl/ver/jtopl_eg_comb_tb/test.v b/rtl/sound/jtopl/ver/jtopl_eg_comb_tb/test.v similarity index 100% rename from rtl/jtopl/ver/jtopl_eg_comb_tb/test.v rename to rtl/sound/jtopl/ver/jtopl_eg_comb_tb/test.v diff --git a/rtl/jtopl/ver/jtopl_eg_comb_tb/tests/attack.tst b/rtl/sound/jtopl/ver/jtopl_eg_comb_tb/tests/attack.tst similarity index 100% rename from rtl/jtopl/ver/jtopl_eg_comb_tb/tests/attack.tst rename to rtl/sound/jtopl/ver/jtopl_eg_comb_tb/tests/attack.tst diff --git a/rtl/jtopl/ver/verilator/VGMParser.cpp b/rtl/sound/jtopl/ver/verilator/VGMParser.cpp similarity index 100% rename from rtl/jtopl/ver/verilator/VGMParser.cpp rename to rtl/sound/jtopl/ver/verilator/VGMParser.cpp diff --git a/rtl/jtopl/ver/verilator/VGMParser.hpp b/rtl/sound/jtopl/ver/verilator/VGMParser.hpp similarity index 100% rename from rtl/jtopl/ver/verilator/VGMParser.hpp rename to rtl/sound/jtopl/ver/verilator/VGMParser.hpp diff --git a/rtl/jtopl/ver/verilator/WaveWritter.cpp b/rtl/sound/jtopl/ver/verilator/WaveWritter.cpp similarity index 100% rename from rtl/jtopl/ver/verilator/WaveWritter.cpp rename to rtl/sound/jtopl/ver/verilator/WaveWritter.cpp diff --git a/rtl/jtopl/ver/verilator/WaveWritter.hpp b/rtl/sound/jtopl/ver/verilator/WaveWritter.hpp similarity index 100% rename from rtl/jtopl/ver/verilator/WaveWritter.hpp rename to rtl/sound/jtopl/ver/verilator/WaveWritter.hpp diff --git a/rtl/jtopl/ver/verilator/feature.hpp b/rtl/sound/jtopl/ver/verilator/feature.hpp similarity index 100% rename from rtl/jtopl/ver/verilator/feature.hpp rename to rtl/sound/jtopl/ver/verilator/feature.hpp diff --git a/rtl/jtopl/ver/verilator/mmr.lut b/rtl/sound/jtopl/ver/verilator/mmr.lut similarity index 100% rename from rtl/jtopl/ver/verilator/mmr.lut rename to rtl/sound/jtopl/ver/verilator/mmr.lut diff --git a/rtl/jtopl/ver/verilator/sim.sh b/rtl/sound/jtopl/ver/verilator/sim.sh similarity index 100% rename from rtl/jtopl/ver/verilator/sim.sh rename to rtl/sound/jtopl/ver/verilator/sim.sh diff --git a/rtl/jtopl/ver/verilator/test.cpp b/rtl/sound/jtopl/ver/verilator/test.cpp similarity index 100% rename from rtl/jtopl/ver/verilator/test.cpp rename to rtl/sound/jtopl/ver/verilator/test.cpp diff --git a/rtl/jtopl/ver/verilator/tests/am.jtt b/rtl/sound/jtopl/ver/verilator/tests/am.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/am.jtt rename to rtl/sound/jtopl/ver/verilator/tests/am.jtt diff --git a/rtl/jtopl/ver/verilator/tests/fb.jtt b/rtl/sound/jtopl/ver/verilator/tests/fb.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/fb.jtt rename to rtl/sound/jtopl/ver/verilator/tests/fb.jtt diff --git a/rtl/jtopl/ver/verilator/tests/fnum.jtt b/rtl/sound/jtopl/ver/verilator/tests/fnum.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/fnum.jtt rename to rtl/sound/jtopl/ver/verilator/tests/fnum.jtt diff --git a/rtl/jtopl/ver/verilator/tests/keycode.jtt b/rtl/sound/jtopl/ver/verilator/tests/keycode.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/keycode.jtt rename to rtl/sound/jtopl/ver/verilator/tests/keycode.jtt diff --git a/rtl/jtopl/ver/verilator/tests/ksl1.jtt b/rtl/sound/jtopl/ver/verilator/tests/ksl1.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/ksl1.jtt rename to rtl/sound/jtopl/ver/verilator/tests/ksl1.jtt diff --git a/rtl/jtopl/ver/verilator/tests/ksl2.jtt b/rtl/sound/jtopl/ver/verilator/tests/ksl2.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/ksl2.jtt rename to rtl/sound/jtopl/ver/verilator/tests/ksl2.jtt diff --git a/rtl/jtopl/ver/verilator/tests/ksl3.jtt b/rtl/sound/jtopl/ver/verilator/tests/ksl3.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/ksl3.jtt rename to rtl/sound/jtopl/ver/verilator/tests/ksl3.jtt diff --git a/rtl/jtopl/ver/verilator/tests/mod.jtt b/rtl/sound/jtopl/ver/verilator/tests/mod.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/mod.jtt rename to rtl/sound/jtopl/ver/verilator/tests/mod.jtt diff --git a/rtl/jtopl/ver/verilator/tests/noteG.jtt b/rtl/sound/jtopl/ver/verilator/tests/noteG.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/noteG.jtt rename to rtl/sound/jtopl/ver/verilator/tests/noteG.jtt diff --git a/rtl/jtopl/ver/verilator/tests/perc.jtt b/rtl/sound/jtopl/ver/verilator/tests/perc.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/perc.jtt rename to rtl/sound/jtopl/ver/verilator/tests/perc.jtt diff --git a/rtl/jtopl/ver/verilator/tests/rates.jtt b/rtl/sound/jtopl/ver/verilator/tests/rates.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/rates.jtt rename to rtl/sound/jtopl/ver/verilator/tests/rates.jtt diff --git a/rtl/jtopl/ver/verilator/tests/slots.jtt b/rtl/sound/jtopl/ver/verilator/tests/slots.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/slots.jtt rename to rtl/sound/jtopl/ver/verilator/tests/slots.jtt diff --git a/rtl/jtopl/ver/verilator/tests/slots_mod.jtt b/rtl/sound/jtopl/ver/verilator/tests/slots_mod.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/slots_mod.jtt rename to rtl/sound/jtopl/ver/verilator/tests/slots_mod.jtt diff --git a/rtl/jtopl/ver/verilator/tests/timers.jtt b/rtl/sound/jtopl/ver/verilator/tests/timers.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/timers.jtt rename to rtl/sound/jtopl/ver/verilator/tests/timers.jtt diff --git a/rtl/jtopl/ver/verilator/tests/tl.jtt b/rtl/sound/jtopl/ver/verilator/tests/tl.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/tl.jtt rename to rtl/sound/jtopl/ver/verilator/tests/tl.jtt diff --git a/rtl/jtopl/ver/verilator/tests/tone.jtt b/rtl/sound/jtopl/ver/verilator/tests/tone.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/tone.jtt rename to rtl/sound/jtopl/ver/verilator/tests/tone.jtt diff --git a/rtl/jtopl/ver/verilator/tests/tone_w1.jtt b/rtl/sound/jtopl/ver/verilator/tests/tone_w1.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/tone_w1.jtt rename to rtl/sound/jtopl/ver/verilator/tests/tone_w1.jtt diff --git a/rtl/jtopl/ver/verilator/tests/tone_w2.jtt b/rtl/sound/jtopl/ver/verilator/tests/tone_w2.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/tone_w2.jtt rename to rtl/sound/jtopl/ver/verilator/tests/tone_w2.jtt diff --git a/rtl/jtopl/ver/verilator/tests/tone_w3.jtt b/rtl/sound/jtopl/ver/verilator/tests/tone_w3.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/tone_w3.jtt rename to rtl/sound/jtopl/ver/verilator/tests/tone_w3.jtt diff --git a/rtl/jtopl/ver/verilator/tests/vib.jtt b/rtl/sound/jtopl/ver/verilator/tests/vib.jtt similarity index 100% rename from rtl/jtopl/ver/verilator/tests/vib.jtt rename to rtl/sound/jtopl/ver/verilator/tests/vib.jtt diff --git a/rtl/sound/saa1099.sv b/rtl/sound/saa1099.sv new file mode 100644 index 0000000..065e319 --- /dev/null +++ b/rtl/sound/saa1099.sv @@ -0,0 +1,403 @@ +//============================================================================ +// +// SAA1099 sound generator +// Copyright (C) 2016-2019 Sorgelig +// +// Based on SAA1099.v code from Miguel Angel Rodriguez Jodar +// Based on SAASound code from Dave Hooper +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +//============================================================================ +`timescale 1ns / 1ps +//`default_nettype none + + +module saa1099 +( + input clk_sys, + input ce, // 8 MHz + input rst_n, + input cs_n, + input a0, // 0=data, 1=address + input wr_n, + input [7:0] din, + output [7:0] out_l, + output [7:0] out_r +); + +reg [7:0] amplit0, amplit1, amplit2, amplit3, amplit4, amplit5; +reg [7:0] freq0, freq1, freq2, freq3, freq4, freq5; +reg [7:0] oct10, oct32, oct54; +reg [7:0] freqenable; +reg [7:0] noiseenable; +reg [7:0] noisegen; +reg [7:0] envelope0, envelope1; +reg [7:0] ctrl; + +reg [4:0] addr; +wire rst = ~rst_n | ctrl[1]; +reg wr; + +always @(posedge clk_sys) begin + reg old_wr; + old_wr <= wr_n; + + wr <= 0; + if(~rst_n) begin + addr <= 0; + {amplit0, amplit1, amplit2, amplit3, amplit4, amplit5} <= 0; + {freq0, freq1, freq2, freq3, freq4, freq5} <= 0; + {oct10, oct32, oct54} <= 0; + {freqenable, noiseenable, noisegen} <= 0; + {envelope0, envelope1} <= 0; + ctrl <= 0; + end + else begin + if(!cs_n & old_wr & !wr_n) begin + wr <= 1; + if(a0) addr <= din[4:0]; + else begin + case (addr) + 'h00: amplit0 <= din; + 'h01: amplit1 <= din; + 'h02: amplit2 <= din; + 'h03: amplit3 <= din; + 'h04: amplit4 <= din; + 'h05: amplit5 <= din; + + 'h08: freq0 <= din; + 'h09: freq1 <= din; + 'h0A: freq2 <= din; + 'h0B: freq3 <= din; + 'h0C: freq4 <= din; + 'h0D: freq5 <= din; + + 'h10: oct10 <= din; + 'h11: oct32 <= din; + 'h12: oct54 <= din; + + 'h14: freqenable <= din; + 'h15: noiseenable<= din; + 'h16: noisegen <= din; + + 'h18: envelope0 <= din; + 'h19: envelope1 <= din; + + 'h1C: ctrl <= din; + endcase + end + end + end +end + +wire [21:0] out0; +saa1099_triplet top +( + .*, + .vol('{amplit0, amplit1, amplit2}), + .env(envelope0), + + .freq('{freq0, freq1, freq2}), + .octave('{oct10[2:0], oct10[6:4], oct32[2:0]}), + .freq_en(freqenable[2:0]), + + .noise_en(noiseenable[2:0]), + .noise_freq(noisegen[1:0]), + + .wr_addr(wr & a0 & (din[4:0] == 'h18)), + .wr_data(wr & !a0 & (addr == 'h18)), + + .out(out0) +); + +wire [21:0] out1; +saa1099_triplet bottom +( + .*, + .vol('{amplit3, amplit4, amplit5}), + .env(envelope1), + + .freq('{freq3, freq4, freq5}), + .octave('{oct32[6:4], oct54[2:0], oct54[6:4]}), + .freq_en(freqenable[5:3]), + + .noise_en(noiseenable[5:3]), + .noise_freq(noisegen[5:4]), + + .wr_addr(wr & a0 & (din[4:0] == 'h19)), + .wr_data(wr & !a0 & (addr == 'h19)), + + .out(out1) +); + +saa1099_output_mixer outmix_l(.*, .en(ctrl[0]), .in0(out0[10:0]), .in1(out1[10:0]), .out(out_l)); +saa1099_output_mixer outmix_r(.*, .en(ctrl[0]), .in0(out0[21:11]), .in1(out1[21:11]), .out(out_r)); + +endmodule + +///////////////////////////////////////////////////////////////////////////////// +module saa1099_triplet +( + input rst, + input clk_sys, + input ce, + + input [7:0] vol[3], + input [7:0] env, + + input [7:0] freq[3], + input [2:0] octave[3], + input [2:0] freq_en, + + input [2:0] noise_en, + input [1:0] noise_freq, + + input wr_addr, + input wr_data, + + output[21:0] out +); + +wire tone0, tone1, tone2, noise; +wire pulse_noise, pulse_envelope; +wire[17:0] out0, out1, out2; + +saa1099_tone freq_gen0(.*, .out(tone0), .octave(octave[0]), .freq(freq[0]), .pulse(pulse_noise)); +saa1099_tone freq_gen1(.*, .out(tone1), .octave(octave[1]), .freq(freq[1]), .pulse(pulse_envelope)); +saa1099_tone freq_gen2(.*, .out(tone2), .octave(octave[2]), .freq(freq[2]), .pulse()); +saa1099_noise noise_gen(.*, .out(noise)); + +saa1099_amp amp0(.*, .mixmode({noise_en[0], freq_en[0]}), .tone(tone0), .envreg(0), .vol(vol[0]), .out(out0)); +saa1099_amp amp1(.*, .mixmode({noise_en[1], freq_en[1]}), .tone(tone1), .envreg(0), .vol(vol[1]), .out(out1)); +saa1099_amp amp2(.*, .mixmode({noise_en[2], freq_en[2]}), .tone(tone2), .envreg(env), .vol(vol[2]), .out(out2)); + +assign out[10:0] = {2'b00, out0[8:0] } + {2'b00, out1[8:0] } + {2'b00, out2[8:0] }; +assign out[21:11] = {2'b00, out0[17:9]} + {2'b00, out1[17:9]} + {2'b00, out2[17:9]}; + +endmodule + +///////////////////////////////////////////////////////////////////////////////// + +module saa1099_tone +( + input rst, + input clk_sys, + input ce, + input [2:0] octave, + input [7:0] freq, + output reg out, + output reg pulse +); + +wire [16:0] fcount = ((17'd511 - freq) << (4'd8 - octave)) - 1'd1; +always @(posedge clk_sys) begin + reg [16:0] count; + + pulse <= 0; + if(rst) begin + count <= fcount; + out <= 0; + end else if(ce) begin + if(!count) begin + count <= fcount; + pulse <= 1; + out <= ~out; + end else begin + count <= count - 1'd1; + end + end +end + +endmodule + +///////////////////////////////////////////////////////////////////////////////// + +module saa1099_noise +( + input rst, + input clk_sys, + input ce, + input pulse_noise, + input [1:0] noise_freq, + output out +); + +reg [16:0] lfsr = 0; +wire [16:0] new_lfsr = {(lfsr[0] ^ lfsr[2] ^ !lfsr), lfsr[16:1]}; +wire [10:0] fcount = (11'd256 << noise_freq) - 1'b1; + +always @(posedge clk_sys) begin + reg [10:0] count; + + if(rst) begin + count <= fcount; + end else + if(noise_freq != 3) begin + if(ce) begin + if(!count) begin + count <= fcount; + lfsr <= new_lfsr; + end else begin + count <= count - 1'd1; + end + end + end else if(pulse_noise) begin + lfsr <= new_lfsr; + end +end + +assign out = lfsr[0]; + +endmodule + +///////////////////////////////////////////////////////////////////////////////// + +module saa1099_amp +( + input rst, + input clk_sys, + input [7:0] envreg, + input [1:0] mixmode, + input tone, + input noise, + input wr_addr, + input wr_data, + input pulse_envelope, + input [7:0] vol, + output reg [17:0] out +); + +wire phases[8] = '{0,0,0,0,1,1,0,0}; +wire [1:0] env[8][2] = '{'{0,0}, '{1,1}, '{2,0}, '{2,0}, '{3,2}, '{3,2}, '{3,0}, '{3,0}}; +wire [3:0] levels[4][16] = +'{ + '{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + '{15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15}, + '{15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}, + '{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15} +}; + +reg [2:0] shape; +reg stereo; +wire resolution = envreg[4]; +wire enable = envreg[7]; +reg [3:0] counter; +reg phase; +wire[3:0] mask = {3'b000, resolution}; + +always @(posedge clk_sys) begin + reg clock; + reg new_data; + + if(rst | ~enable) begin + new_data <= 0; + stereo <= envreg[0]; + shape <= envreg[3:1]; + clock <= envreg[5]; + phase <= 0; + counter <= 0; + end + else begin + if(wr_data) new_data <= 1; + if(clock ? wr_addr : pulse_envelope) begin // pulse from internal or external clock? + counter <= counter + resolution + 1'd1; + if((counter | mask) == 15) begin + if(phase >= phases[shape]) begin + if(~shape[0]) counter <= 15; + if(new_data | shape[0]) begin // if we reached one of the designated points (3) or (4) and there is pending data, load it + new_data <= 0; + stereo <= envreg[0]; + shape <= envreg[3:1]; + clock <= envreg[5]; + phase <= 0; + if(new_data) counter <= 0; + end + end else begin + phase <= 1; + end + end + end + end +end + +wire [3:0] env_l = levels[env[shape][phase]][counter] & ~mask; +wire [3:0] env_r = stereo ? (4'd15 & ~mask) - env_l : env_l; // bit 0 of envreg inverts envelope shape + +reg [1:0] outmix; +always_comb begin + case(mixmode) + 0: outmix <= 0; + 1: outmix <= {tone, 1'b0}; + 2: outmix <= {noise, 1'b0}; + 3: outmix <= {tone & ~noise, tone & noise}; + endcase +end + +wire [8:0] vol_mix_l = {vol[3:1], vol[0] & ~enable, 5'b00000} >> outmix[0]; +wire [8:0] vol_mix_r = {vol[7:5], vol[4] & ~enable, 5'b00000} >> outmix[0]; +wire [8:0] env_out_l; +wire [8:0] env_out_r; +saa1099_mul_env mod_l(.vol(vol_mix_l[8:4]), .env(env_l), .out(env_out_l)); +saa1099_mul_env mod_r(.vol(vol_mix_r[8:4]), .env(env_r), .out(env_out_r)); + +always_comb begin + case({enable, outmix}) + 'b100, 'b101: out = {env_out_r, env_out_l}; + 'b001, 'b010: out = {vol_mix_r, vol_mix_l}; + default: out = 0; + endcase +end + +endmodule + +///////////////////////////////////////////////////////////////////////////////// + +module saa1099_mul_env +( + input [4:0] vol, + input [3:0] env, + output [8:0] out +); + +assign out = (env[0] ? vol : 9'd0)+ + (env[1] ? { vol,1'b0} : 9'd0)+ + (env[2] ? { vol,2'b00} : 9'd0)+ + (env[3] ? {vol,3'b000} : 9'd0); + +endmodule + +///////////////////////////////////////////////////////////////////////////////// + +module saa1099_output_mixer +( + input clk_sys, + input ce, + input en, + input [10:0] in0, + input [10:0] in1, + output reg [7:0] out +); + +wire [17:0] o = 18'd91 * ({1'b0,in0} + {1'b0,in1}); + +// Clean the audio. +always @(posedge clk_sys) begin + reg ced; + ced <= ce; + if(ced) out <= ~en ? 8'h00 : o[17:10]; +end + +endmodule