MSXによるFlashAirのカードステータス(日付時刻)読み取りの覚書 ― 2017年03月05日 22:12
FA_CLOCK.COM作成したときの覚書。
取り敢えず、初アセンブラ。
この間発掘したDOS2TOOLSのディスクよりM80&l80を1chipMSXにコピー。
以下、コーディングはWindowsマシン、コンパイルは1chipMSXで実行。
基本的には東芝のデベロッパーサイトに基づきコーディング。
SDコマンドは48、取得したい日付時刻は0570hから4バイト。
コマンド引数はこちらのサイトを参考に計算
実際に投げたコマンドは
70h 90h 0Ah E0h 03h 95h
先頭70hはSDコマンド(40h+30h(48))、最後の95hはCRCだけどダミー。
引数の 90h 0Ah E0h 03hは
10010000000010101110000000000011
として、
最初の6ビットが定数(なのかな?)、100100
次の17ビットがアドレス、00000010101110000=570h
最後の9ビットがデータ長さ0000011=3h
これで0570hから4バイトのデータが取得できた。
コマンド投げた後のレスポンスはしばらくFFhが続いた後(100~150バイト位)
FEが来てそこからデータが続く。
データが指定した長さ(今回は4バイト)着た後、レスポンスは0になる。
0が500バイトほど続いて、2バイト何かのデータが入ってFFに戻る。
多分、指定した長さに関わらず合計512バイト帰ってきてるんだろう。
レスポンスはFFになるまで読み取る。
取得した日付時刻データは以下の構成みたい。
日付2バイト=16ビット
先頭7ビット=年(1980年からの経過年)
次の4ビット=月
最後の5ビット=日
時刻2バイト=16ビット
先頭5ビット=時
次の6ビット=分
最後5ビット=秒(2秒単位)
例えば、644A44AFが来たら
日付644A(4Aの方が上位)、時刻44AF(AFの方が上位)として
Year Mon Date
0100101 0011 00100
1980+37/ 3/ 4
で
2017/3/4
Hour MIn
10101 111010 00100
21: 58: 8(4*2)
で
21:58:8
となる。
ここのサンプルコードと解釈違うけど、多分これで正しいはず。
適当にシフト&マスクして目的の値を取り出し、
後はMSXの日付時刻設定用のシステムコール(2B&2D)で設定。
実際には、起動直後の場合のみFlashAirからの値取得に失敗することがあるので、コマンドを2回投げている(力技)。
それ以外にもずいぶん無駄が多いコードのような気がするけど、アセンブラは初めてなのでしょうがないことにする。
コメント
トラックバック
このエントリのトラックバックURL: http://miyako.asablo.jp/blog/2017/03/05/8393856/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。