1chipNextorMSX更新 (Ver1.06) ― 2017年03月05日 18:17
FlashAirのRTC取得プログラム (FA_CLOCK Ver0.01) ― 2017年03月05日 18:21
1chipMSX専用、FlashAirのRTCから取得した日付時刻をMSXに設定するプログラム。
プログラム内でSDカードの初期化は行っていないので、1chipNextorMSX等SDHCを利用できる環境必須で。
FlashAirのRTCをluaスクリプトで設定の上ご利用ください。
※余り厳密なエラーチェックはしていないので暴走とかしたらごめんなさい。
ダウンロードはこちら。
RTC設定luaスクリプトのサンプル。
FlashAirがインターネットにアクセスできる(STAモード等)事前提。
FlashAirのカレントに
SCRIPT ディレクトリ
を用意
FlashAirのSD_WLANディレクトリのCONFIGファイルに1行追加
LUA_RUN_SCRIPT=/SCRIPT/startup.lua
このサイトからダウンロードした
libFlashTime.lua
をlibFT.luaという名前でSCRIPTディレクトリに配置
以下スクリプトを
startup.lua
という名前でSCRIPTディレクトリに配置
---------------------------------------------
print("Script Start")
sleep(5500)
local t = require "/SCRIPT/libFT"
print("Get Time from NICT")
t.SetNICT();
print("Script End")
これで起動時にFlashAirのRTCに現在時刻がセットされる。
あとは、FA_CLOCK.COMを実行するごとに
FlashAirから取得した日付時刻をMSXに設定する。
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回投げている(力技)。
それ以外にもずいぶん無駄が多いコードのような気がするけど、アセンブラは初めてなのでしょうがないことにする。
最近のコメント