レトロでハードな物語

レトロなゲーム機・マイコン・中古デバイスなどをArduinoやAVRで再活用する方法を模索しています。

MSXとATmega328Pの送受信ルーチンを実装する

2022年08月31日 | 電子工作

前回MSXのBASICコマンドのフックを書き換えて、BASICコマンドで自作のプログラムを実行できるようにしました。そこで前回のプログラムにATmega328Pとの送受信ルーチンを実装して、ATmega経由でのSDカード読み書きを行えるようにしたいと思います。

まずはATmega328Pとの配線ですが、以前に送受信テストをしたときと同じです。デバッグのためにOLEDもそのまま接続してあります。さらにここへSDカードをつなげました。SDカードはSPIで接続するので配線は以下のようになります。

ATmega328P      → SDカード端子
( )はArduino IDEでのピン番号

17(11)MOSI → 2 CMD/DI
18(12)MISO → 7 DAT0/DO
19(13)SCK  → 5 CLK
16(10)     → 1 DAT3/CS
3.3V       → 4 VDD
GND        → 3、6 GND



次にMSX側のプログラムですが、手始めに前回作成したIPLコマンドのファイル一覧表示(Fコマンド)を実装してみようと思います。

前にテストしたとおり、MSXの汎用入出力インターフェース(PSG AY-3-8910)を使うので送受信は少し複雑です。このインターフェースの詳細はここにあります。

MSXからの送信は汎用入出力インターフェース2の6、7ピンを4回使って1バイトのデータを送ります。このとき8ピンをデータ送信タイミングのクロックとして使い、1ピンからの入力をATmegaの送信許可の信号として使用しました。

MSXの受信は汎用入出力インターフェース2の1〜4ピンを入力として、2回使って1バイトのデータを受け取ります。このとき8ピンをデータ受信タイミングのクロックとして使い、6ピンからの入力をATmegaからの送信可能の信号として使用しています。

ATmega側のSDカード読み書きはArduino IDEのライブラリを利用するので簡単です。MSXからIPL Fコマンドが送られてきたら、SDカードのルートディレクトリ(今回はサブフォルダは扱いません)にあるファイルの名前とサイズを取得して文字列としてMSXに返信します。そしてMSX側は送られた文字を1文字ずつ画面に表示していきます。


作成したMSXのプログラムはこちらです。(マウスの右クリックで保存してください)

Makefile
files.asm

ATmega328Pのスケッチはこちらです。(マウスの右クリックで保存してください)

ATmega328MSX_SD.ino


MSXのプログラムはZ80のアセンブラソースです。前回と同様にUbuntu上のz88dkのアセンブラを使っています。makeを実行するとfiles.wavが作成されますので、MSXのカセットインターフェイスから読み込ませることが出来ます。
具体的な使い方は、上記スケッチを書き込んだATmega328PをMSXにつないだら電源を入れ、以下のコマンドを入力してwavファイルを読み込みます。

clear 200,&he000
bload"cas:",r

プログラムが読み込まれた後、IPLコマンドの初期化が行われます。

MSX BASICのコマンドラインからIPL Fと入力するとATmega328PにつながれているSDカードのルートディレクトリにあるファイル一覧が表示されます。



ファイル名の脇に表示されているのはファイルサイズです。ファイル一覧の表示中にスペースキーを押すと、表示を一時停止させることが出来ます。スペースキーを離すと表示が再開されます。

今回使用したATmega328Pは3.3V、8MHzで動作させていますが、より高速のマイコンを使う場合は送受信タイミングが合わずデータの取りこぼしが発生するかもしれません。その時はアセンブラソースfiles.asmのwait:ルーチンを書き換えてウェイトを増やしてみてください。

IPL F以外のコマンドはまだ実装していませんが、コマンドの引数をATmega328Pに渡すところまでは作ってあります。また後ほど実装していきたいと思います。



最新の画像もっと見る

コメントを投稿