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回投げている(力技)。
それ以外にもずいぶん無駄が多いコードのような気がするけど、アセンブラは初めてなのでしょうがないことにする。
FA_CLOCK更新 (FA_CLOCK Ver0.02) ― 2017年03月12日 00:08
初アセンブラがなんだか楽しくなっていろいろいじっていたけど、ひと段落したので公開。
Ver0.01で起動直後の時刻取得に失敗していたのは、実際にNTPサーバーからの時刻取得に時間がかかっている場合の模様。
そこで、FlashAirのRTCに値がセットされていない場合、適当なWait(約2秒)を入れて複数回時刻取得を試みるよう変更してみた。
リトライ中、何かキーを押下することで中断可能。
ついでにコマンドラインオプションとして/Rと/Sを追加
/R[0-F] FlashAirからの読み取り試行回数を指定。0で無制限(255回)
初期値はA(試行10回=最初に1回、リトライ9回)
/Sxx MegaSDが存在するスロットを指定する、ようにしたつもり。
MegaFlashROM SCC+ SDでも使えるようになってる、かも。
初期値は8B(3-2)
※こっちのオプションは未検証。検証できる機器持ってない…
ダウンロードはこちら
※Luaスクリプト使わなくてもSDIOで直接サーバーから時刻を取得する事も可能らしい。
※FlashAir、いろいろ遊べて楽しいデバイスだ。
FA_CLOCK更新 (FA_CLOCK Ver0.03) ― 2017年03月12日 19:18
Ver0.03
SDカードの初期化処理追加。
これにより、SDHC非対応の1chipMSXでもFlashAirから時刻取得可能に。
例えば
・事前にLuaスクリプトによるRTC設定が正常に動作するFlashAirを準備
・ESE-RAM等SDカード以外にFA_CLOCK.COMを配置。
・1chipMSXのSDカードスロットにFlashAirをセットし、FA_CLOCK.COMを実行
といった手順。
FA_CLOCK.COMはiSDIOを利用してFlashAirから情報を取得している=FATを一切見ていないので、
このような動作も可能。
多分、FlashAirがFAT32フォーマットのままでもRTCから時刻取得できると思う。
ダウンロードはこちら
最近のコメント