BASICからマニアックにSCCをいじってみよう(CMD SCC)

ここからは 「SCCというサウンドチップ自体をいじってみたい」という方のための内容になります。

SCCで音を鳴らすため方法自体はとてもシンプルなのですが、そもそもアクセスするためにはスロットを切り替える必要があり、BASICから気軽にレジスタに値を出力してみる、というようなことができません。

そこで、PSGに対するSOUND文のように、簡単にSCCにアクセスするための拡張コマンドを作成してみました。

CMD SCC のインストール

以下のプログラムを実行すると、BASICに新しいコマンド "CMD SCC" が追加されます。

CMD SCC インストールプログラム … CMDSCC.BASNandemoSCCforBASIC.zip に同梱)

10 '------------------- 20 'INSTALL "CMD SCC" 30 '------------------- 40 CLEAR300,&HDB00 50 FOR I=&HDB00 TO &HDB41:READ A$:POKE I,VAL("&H"+A$):NEXT 60 DEFUSR=&HDB00:A=USR(0) 70 DATA21,C3,0D,22,0D,FE,21,DB,01,22,0F,FE,C9,7E,FE,53 80 DATAC0,CD,66,46,FE,43,C0,CD,66,46,FE,43,C0,CD,66,46 90 DATAFE,28,C0,23,CD,2F,54,ED,53,35,DB,7E,FE,2C,C0,23 100 DATACD,1C,52,E5,21,00,00,5F,3A,10,FE,CD,14,00,E1,23 110 DATAF1,C9

CMD SCC の使い方

サンプルプログラム

SCCの5チャンネル全てを使って音を出すプログラムです。

SCCのレジスタは、PSGのレジスタに似た構造となっているので、BASICのSOUND文で音を鳴らす方法にかなり近いです。

SOUND文と比較したコメントなども書いておいたので、参考にしてみてください。

CMD SCC サンプルプログラム … SMPSCC.BASNandemoSCCforBASIC.zip に同梱)

1000 '------------------------------------ 1010 ' SAMPLE PROGAM FOR CMD SCC 1020 '------------------------------------ 1030 'SCC ノ ソンザイスル スロット 1040 ' キホンスロット1 = &H01 1050 ' キホンスロット2 = &H02 1060 ' MSX0(カクチョウスロット0-3) = &H8C 1070 ' MSXPLAYer(カクチョウスロット1-3) = &H8D 1080 POKE&HFE10,&H01 1090 ' 1100 'モード キリカエ(for SNATCHER) 1110 CMD SCC(&HBFFE,0):'メガROM ゴカン モード 1120 ' 1130 'バンク キリカエ 1140 CMD SCC(&H9000,&H3F):'SCC ノ オヤクソク 1150 ' 1200 'ハケイ データ (32byte * 4ch) 1210 ' chA : 9800~981F 1220 ' chB : 9820~983F 1230 ' chC : 9840~985F 1240 ' chD : 9860~987F 1250 ' chE : (chD ト オナジ) 1260 FOR CH=0 TO 3:RESTORE 1290:'chA-chE オナジ ハケイ ニ スル 1270 FOR I=0 TO 31:READ A$:CMD SCC(&H9800+CH*32+I,VAL("&H"+A$)) 1280 NEXT:NEXT 1290 DATA 00,07,0F,17,1F,27,2F,37,3F,47,4F,57,5F,67,6F,77 1300 DATA 80,88,90,98,A0,A8,B0,B8,C0,C8,D0,D8,E0,E8,F0,F8 1310 ' 1400 'チャンネル ON/OFF(1:ON 0:OFF) 1410 ' chE|chD|chC|chB|chA : 988F = SOUND 7,n ノ ビットハンテン 1420 CMD SCC(&H988F,&HB00000):'chA-chE スベテOFF 1430 ' 1500 'シュウハスウ データ (2byte * 5ch) 1510 ' chA : 9880,9881 = SOUND 0,n:SOUND 1,m 1520 ' chB : 9882,9883 = SOUND 2,n:SOUND 3,m 1530 ' chC : 9884,9885 = SOUND 4,n:SOUND 5,m 1540 ' chD : 9886,9887 1550 ' chE : 9888,9889 1560 CMD SCC(&H9880,&HAC):CMD SCC(&H9881,1):'chA : o4c ← 01ACH 1570 CMD SCC(&H9882,&H53):CMD SCC(&H9883,1):'chB : o4e ← 0153H 1580 CMD SCC(&H9884,&H1D):CMD SCC(&H9885,1):'chC : o4g ← 011DH 1590 CMD SCC(&H9886,&HE3):CMD SCC(&H9887,0):'chD : o4b ← 00E3H 1600 CMD SCC(&H9888,&HBE):CMD SCC(&H9889,0):'chE : o5d ← 00BEH 1610 ' 1700 'ボリューム データ (1byte * 5ch) 1710 ' chA : 988A = SOUND 8,n 1720 ' chB : 988B = SOUND 9,n 1730 ' chC : 988C = SOUND 10,n 1740 ' chD : 988D 1750 ' chE : 988E 1760 CMD SCC(&H988A,15):'chA : v15 1770 CMD SCC(&H988B,15):'chB : v15 1780 CMD SCC(&H988C,15):'chC : v15 1790 CMD SCC(&H988D,15):'chD : v15 1800 CMD SCC(&H988E,15):'chE : v15 1810 ' 2000 'エンソウ 2010 ' PLAY"v15o4c","v15o4e","v15o4g","v15o4b","v15o5d" 2020 PRINT"HIT ANY KEY TO PLAY";:A$=INPUT$(1):PRINT 2030 CMD SCC(&H988F,&B11111):'chA-chE スベテON 2040 PRINT"HIT ANY KEY TO STOP";:A$=INPUT$(1):PRINT 2050 CMD SCC(&H988F,&B00000):'chA-chE スベテOFF

最後に

CMD SCC などという名前ですが、実際は特定スロットの特定アドレスにデータを書き込むだけのコマンド だったりするので、FE10Hの値を書き換えれば、裏RAMやFM-PACへのアクセスもできます。 やっていることは「スロット指定のPOKE文」みたいなものですね。

処理も重いので、この命令だけを使って音楽演奏をさせるのはなかなか難しいですが、SCCの仕組みを学んだり、波形をエディットして音色を確認するくらいであれば、十分実用に耐えると思います。

興味を持ったというマニアックな方は、ぜひSCCを色々と触ってみてはいかがでしょうか。


SCC音源をBASICから使ってみよう に戻る

DEEP! P6!/MSX! に戻る