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 MSXはVHDLで書かれているので、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));