1Chip MSXの改造その2

1Chip MSXではMarcel de KogelさんのMISSIONや、TINY野郎さんのSG2MSXでよく遊びます。COLECOVISIONやSC-3000はMSX1と似ているので移植ものも多いですが、コンバーターで変換すればVGAのきれいな画面でNGLOAD.COMみたいに遊べるのが嬉しいです。

http://www.geocities.jp/parallel_computer_inc/bios.html

ただ1つ残念なのは、MSX1のPSG音源はAY-3-8910なのですが、COLECOVISIONやSC-3000のDCSG音源であるSN76489とは異なるため、サウンド出力だけはソフトウェアエミュレーションとなり再現性が低くなっているところです。そこで1Chip MSXVHDLで書かれているので、SMSのソースコードからSN76489を1Chip MSXに移植してみました。

https://code.google.com/p/mist-board/source/browse/#svn%2Ftrunk%2Fcores%2Fsms%2Fsrc

基本的には既存のPSGを真似して、I/Oポート&H3FにDCSGを実装するだけです。

emsx_top.vhdl

 component psg
    port(
      clk21m  : in std_logic;
      reset   : in std_logic;
      clkena  : in std_logic;
      req     : in std_logic;
      ack     : out std_logic;
      wrt     : in std_logic;
      adr     : in std_logic_vector(15 downto 0);
      dbi     : out std_logic_vector(7 downto 0);
      dbo     : in std_logic_vector(7 downto 0);
      joya    : inout std_logic_vector(5 downto 0);
      stra    : out std_logic;
      joyb    : inout std_logic_vector(5 downto 0);
      strb    : out std_logic;
      kana    : out std_logic;
      cmtin   : in std_logic;
      keymode : in std_logic;
      wave    : out std_logic_vector(9 downto 0)
    );
  end component;

  component dcsg
  port (clk	: in  STD_LOGIC;
	WR_n	: in  STD_LOGIC;
	D_in	: in  STD_LOGIC_VECTOR (7 downto 0);
	output: out STD_LOGIC);
  end component;

(省略)

  -- PSG signals
  signal PsgReq      : std_logic;
--  signal PsgAck      : std_logic;
  signal PsgDbi      : std_logic_vector(7 downto 0);
  signal PsgAmp      : std_logic_vector(9 downto 0);

  -- DCSG signals
  signal DcsgReq      : std_logic;

(省略)

  -- Sound signals
  constant DAC_MSBI  : integer := 13;
  signal DACin       : std_logic_vector(DAC_MSBI downto 0);
  signal DACout      : std_logic;
  signal DACout2     : std_logic;

(省略)

  pDac_S <= DACout when Kmap = '0' else DACout2;

(省略)

  U30 : psg
    port map(clk21m, reset, clkena, PsgReq, Open, wrt, adr, PsgDbi, dbo, 
             pJoyA, pStrA, pJoyB, pStrB, Kana, CmtIn, KeyMode, PsgAmp);

  DcsgReq	<= req when( mem = '0' and adr(7 downto 0) = "00111111")else '0';	-- I/O:3Fh		/ DCSG(SN76489)
  U35 : dcsg
  port map (
    clk		=> clk21m,
    WR_n	=> (not DcsgReq),
    D_in	=> dbo,
    output	=> DACout2
  );

プロジェクトには以下のファイルを追加します。

dac.vhd
psg_noise.vhd
psg_tone.vhd
psg.vhd (← COMPONENTの名前をdcsgにリネームする)

クロックclk21mを1/6にします。

process (clk)
begin
if rising_edge(clk) then
if( clk_divide
= "1100000" )then
clk_divide <= "0000000";
else
clk_divide <= clk_divide+1;
end if;
end if;
end process;
clk32 <= std_logic(clk_divide(6));