前回でSDカード読み書きの部分が完成したので、最後にファイルのリネームと削除ルーチンを追加します。
今回追加するコマンドは以下の2つです。
SDファイルのリネーム IPL R "旧ファイル名","新ファイル名"
SDファイルの削除 IPL K "ファイル名"
このコマンドのプログラム自体は難しいものではないのですが、Arduino IDEのSDライブラリにはリネーム機能がないのでファイルを別名でコピーして代用するしかなさそうです。ただし、ファイルコピーの機能もないのでファイルを読み込んで別名で書き出す操作が必要になってきます。
ところが、前回作成したセーブコマンドIPL Sは処理が遅かったので、その点を改善しないとリネームはPC側で行ったほうがマシということになってしまいそうです。
そんな訳でこれらの課題を考慮しながら作成したプログラムは以下のようになりました。
MSXのプログラム(マウスの右クリックで保存してください)
Makefile
sdreader.asm
IPLコマンド仕様
ATmega328Pのスケッチ(マウスの右クリックで保存してください)
ATmega328MSX_SD.ino
MSXのアセンブラソースはこれまで同様z88dkでコンパイルします。makeを実行するとsdreader.wavが作成されるので、以下のコマンドを入力してMSXのカセットインターフェイスから読み込みます。
clear 0,&hefef (第一パラメータはBASICの文字列領域のサイズ : デフォルト200)
bload"cas:",r
作成したプログラムはEFF0〜F37D番地に置かれます。z88dkで作成したプログラムの邪魔にならないようにしたつもりですが、何らかの理由でアドレスを変更したいときはMakefileの9行目とsdreader.asmの17行目の記述を書き換えてください。
前回までのATmega328Pのスケッチでは、ほとんどのデータのSDカードへの書き込みをバイト単位で行っていました。でも、フラッシュメモリは書き込みのときに一定サイズのデータを一度に書き込むようになっています。そのためバイト単位の書き込みは効率がよくありませんでした。
そこで今回はデータをできるだけひとまとめにしてSDに書き込むようにスケッチを変更しました。
試しにz88dkのコンパイル済みサンプルex10b.casの読み書き時間を計ってみました。(SDカードは書き込みスピードの遅い安価なものを使用)
ファイルサイズ 10,141バイト (コンパイルを行うz88dkのバージョンで異なる)
アドレス 9C40〜C3B6番地 (コンパイルを行うz88dkのバージョンで異なる)
読み込み 10.5秒 (コマンド入力から右上のキャラクタ表示が消えるまで)
書き込み 125秒 (コマンド入力からOKのプロンプトが表示されるまで)
リネーム 1秒 (コマンド入力からOKのプロンプトが表示されるまで)
※数あるサンプルのうち、exから始まるものの大部分はスペースキーを押すと停止します。その後screen0などと入力すればBASICのコマンドプロンプトが表示されますので、IPL Sによる書き込みテストなどを行うことが出来ます。
比較としてex10b.wavを作成してみると、サウンドの長さは67秒でした。
当たり前ですが、読み込みはカセットインターフェイスに比べて格段に早いですね。それに比べて書き込みには時間がかかります。でも、なぜかリネームは非常に高速です。リネームは読み書きをATmegaのみで行いますが、書き込みはMSXからデータを送る処理が入るので、フラッシュメモリへの書き込みタイミングにうまく合致しないのかもしれません。
個人的にはz88dkで作成したプログラムをopenMSXでテストしてから実機で動かすという使い方になるので、IPL FとIPL L以外のコマンドはあまり使用しません。なので書き込みのIPL Sコマンドはこのままでもいいかなと思っています。
残念なのは、このSD読み書きのプログラム自体はカセットインターフェイスから読み込むしか手段がないことです。(わざわざFDドライブ買うのも馬鹿らしいですし)
z88dkのプログラムを実行後、バグとかでBASICのコマンドプロンプトに戻れなくなったときは電源を落とすしかなく(手持ちのMSXにはリセットボタンがない)、再度カセットインターフェイスからプログラムを読み込むことになります。
そのたびにPCでWAVファイルを再生するのは面倒なので、WAVファイルをCD-RWに焼いて音楽CDを作ってポータブルDVDプレーヤーで読み込ませることにしました。一見外付けDVDドライブのようですが、アナログ接続というふざけた構成です。
でも、それなりに使える環境になりました。
ところで使用しているMSXのPHC-SPCはハードオフで購入したものですが、スペックを調べてみるとこんな機種でした。64KBのメモリを持っているのですが、32KBはBASICのROMと重なっていて使用できません。もったいないのでいつかは今回作成したプログラムの一部分をROMの裏のRAMに置きたいと思っています。
しかし先日MSX3の発表があり販売も現実的になったので、そのうちMSX1には興味がなくなって実現しないかもしれません。
最新の画像[もっと見る]
- ラスベリーパイのベアメタル環境でLVGLを使う 5日前
- ラスベリーパイのベアメタル環境でLVGLを使う 5日前
- ラスベリーパイのベアメタル環境でLVGLを使う 5日前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
- ILI9341搭載のタッチパネルをLVGLで利用する 2週間前
※コメント投稿者のブログIDはブログ作成者のみに通知されます