ドレミファソが出ただけなんですが・・・w
GWを費やしてやっとドレミファソが出たw
— MobileFF (@mobile_FF_) May 8, 2022
PB-1000にYMF825Boardを繋いで発音させてみた。たぶん、PB-1000でSPI通信で何かをやったのって何気に本邦初だったりしてw#カシオ #ポケコン pic.twitter.com/jrfSylyS65
1986年発売のポケコン PB-1000で、2017年発売のYMF825 Boardを制御するという試みでございます。
そもそもは、PB-1000でFM音源を制御、といえば、言わずと知れたJun Amano氏の「PB-1000 Forever!」に掲載されているMiyura氏の「CASIO PB-1000/C用 FM音源ボードの作成」がすでに存在しています。このような情報ソースをまとめてくださっているAmano氏の功績に改めて感謝、感謝です!
CASIO PB-1000 FOREVER!:CASIO PB-1000/C用 FM音源ボード作成 http://www.lsigame.com/pb-1000/technote/ym2413/ym2413.htm
ただ、この記事で使用している音源チップ(YM2413)は記事が書かれた当時から現在まで、オークション等での入手が前提で入手経路が限られること、またDAC用のチップや水晶発振器等々、必要な部品点数が多く作成のハードルが少々高いことがネックで、中の人も簡単には手を出せない感じだったのですが、そんな中で、「YMF825Board」というキットが存在することを知りました。
こちらは実質PB-1000のポートと基板を配線するのみで動作するので、工作としてのハードルはかなり下がります。とはいえ、YMF825Boardも5年前の商品で現状は、秋月電子さんのみ在庫を持っているようですので、ほしい方はお早めに。
準備するもの
- PB-1000本体
- YMF825Board
- 1.27ピッチのヘッダピン(15ピンx2列)
- ヘッダピンとYMF825Boardを接続する適当な配線用ケーブル 6本
配線する
通信する
YMF825との通信は、SPI方式になります。
SPI方式自体の詳細は、以下ページを参考にしました。
「SPI」の解説 - しなぷすのハード製作記 https://synapse.kyoto/glossary/spi/page001.html
この記事ではSPIの仕組みそのものの説明は割愛しますので、仕組みについては上記ページ等を御覧ください。
Arduinoなど、今どきの組み込み用途のモジュールを使えば、SPI用のライブラリも標準で持っていたりするので、かなり簡単かつ可読性の高いコーディングで実現できますが、PB-1000は当然ながらBIOSレベルではSPI通信をサポートしているはずもないので、ソフトウェアで頑張ってSPI通信を実現する必要があります。
PB-1000で外部にH/Lの信号を簡単に流す最も簡単な方法は、おそらくアセンブラでPEレジスタおよびPDレジスタ(P0〜P7に対応している)を操作する方法になるかと思います。PB-1000の外部ポートのピンアサインや、PE/PDレジスタの使い方に関しては、上記のMiyura氏のページのコード例が大いに参考になりました。深く御礼申し上げます。
PB-1000のCPUであるHD61700からは、P0〜P7という信号が出ていて、そのうちP0〜P4は外部接続端子に直結しています。
PEレジスタは、P0〜P7のうちどのポートをOutputにするかを決定するものです。
PST PE,&H0F
とすると、P7〜P4はInput、P3〜P0はOutputに設定されます。
それに続いて、PDレジスタに値を出力すると、Outputに設定されたポートに信号が出力されます。
つまりここで、
PST PD,&H05
とすると、P3、P1は0(L)、P2、P0は1(H)が出力されます。
ちなみに、中の人の失敗談としては、PEでアウトプットに有効なポートが選択できるので、たとえばP3だけ信号を出したい、とかであれば、
PST PE,&H08
PST PD,&H08
みたいにすればいいのかな〜って思っていたのですが、これだとP0〜P2がLになってしまったりHになってしまったりが不定になってしまうようで、意図しないタイミングでMOSI、RST、SCKが変化してしまってうまくいきません。
現時点の各ポートの状態は内部で保持しつつ、変化させたいポートのビットだけを書き換えて、信号出力は常にP0〜P3を同時に行うようにしなければいけません。
あとは、MOSIに出力するのがMSB FIRST(上位ビットから順番に出力)であること、2バイトごとに出力する場合と、複数バイトまとめて出力する場合があることに注意して出力する感じです。
プログラムの処理内容は、基本的にArduino用にヤマハが公開していたサンプルコード(現在は、hasebemsさんがGitHubで公開している)の処理をそのままなぞってPB-1000のアセンブラに移植しました。また、処理内容の理解には福野泰介さんのIchigoJam Basic用のサンプルコードも大変参考になりました。ご両名にもこの場を借りて御礼申し上げます。
hasebems/YMF825_sample | GitHub
https://github.com/hasebems/YMF825_sample
YMF825 x IchigoJamで鳴らすFM音源チャイム、BASICでつくるYMF825Board用FM音源エディタ | 福野泰介の一日一創 https://fukuno.jig.jp/1848
また、HD61700のアセンブラの文法などなどについては、「123のブログ」さまの以下ページを参考にさせていただきました。ありがとうございます。
HD61700クロス・アセンブラ
ソースの作成と実行
ソースは素人なのでだいぶ汚いと思いますが、Dropboxに置きましたのでそちらをご覧ください。いけてねえコードだな、俺が直してやったぜ!とか大歓迎です。ご自由にお使いください。派生物も連絡等不要です。
ソースコードのダウンロード:YMF825T0.ASM
一応、PB-1000単体でもアセンブルできるようにはしたつもりですが、基本的なコード作成とアセンブルはPC上で行いました。PCでのアセンブルはPB-1000界隈では知らぬ者のいない、あお氏のHD61を利用させていただいております。あおさんいつもありがとうございます。
HD61700 SPIRITS https://hd61700.yukimizake.net/
- BASICプログラムとして転送して実行
- HD61でデフォルトでアセンブルすると、.bas形式のBASICファイルができる
- そのコードの先頭に、共通のコードを追加
- これをRS-232CでPB-1000に転送
- 外部ポートをFA-7/MD-100から、YMF825Boardの配線につなぎ替える
- PB-1000側では、転送されたファイルに適当な名称をつける
- BASICモードに入る
- CLEAR ,2048 などを実行して機械語領域を確保する(この例では2048バイト)
- BASICモードに入り、「load "ファイル名"」でBASICプログラムとしてファイルを読み込む。このとき、DA Errorが出るが気にしなくて良い(はず)
- プログラムを実行して暫く待つとビープ音がなって、実行用のEXEファイルができる
- MENUに戻って、できあがったEXEファイルを実行
- PBFファイルとして転送して変換
- あからじめ、PB-1000にPBFTOBIN.EXEを作成しておく
- HD61で「/p」オプションを付けると、.basの代わりに.pbf形式のファイルができる
- PB-1000上ではPBFTOBIN.EXEを実行すると待機モードになるので、PC側から.pbfファイルを送信する。PBFTOBINで自動的に受信され、実行が完了するとEXEファイルができている
- 外部ポートをFA-7/MD-100から、YMF825Boardの配線につなぎ替える
- できあがったEXEファイルをMENUから実行
コメント
コメントを投稿