MSX&FlashAirでNTPサーバーより時刻取得(FA_TIME Ver0.01)2017年03月19日 23:53

FlashAirのHTTPリクエスト機能を利用して、NTPサーバー(ntp-a1.nict.go.jp)から時刻を取得し、
FlashAirのRTC及びMSXの時刻を設定するプログラム。

FA_CLOCK.COM と違い、自分自身でNTPサーバーに時刻取得に行くのでluaスクリプト不要。
SDカードの初期化も自前で行うので、似非RAM上などにプログラム配置すればノーマルな1chipMSXでも動作するはず。

オプションは以下の通り。
/T[+-]xx タイムゾーンを指定します。デフォルトは/T-09(日本標準時)です。
+05や-03など数字部分は必ず2桁で指定してください。

/Sxx SDカードが接続されているスロットを指定します。
デフォルトは1chipMSXで利用している8D(3-2)です。
MegaFlashROM SCC+ SDでの利用時は適宜設定してみてください。

/M FlashAirのRTCのみ設定し、MSXの時計は設定しません。

W-03でテストしてるけど、iSDIOしか使ってないのでW-01やW-02でも利用可能かも。
(持ってないからテストできない…)

ダウンロードはこちら


FlashAirでHTTPリクエスト2017年03月14日 23:49


HTTPレスポンス

1chipMSXからFlashAirのiSDIOを利用してHTTPリクエスト発行し、レスポンスを受け取ることができた。
とりあえず、タイムサーバーから時刻を受け取ってFlashAirのRTCにセットするプログラムを組んでみるつもり。
パラメーターの大半がハードコーディングになりそうな予感…

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から時刻取得できると思う。

ダウンロードはこちら


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、いろいろ遊べて楽しいデバイスだ。

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回投げている(力技)。
それ以外にもずいぶん無駄が多いコードのような気がするけど、アセンブラは初めてなのでしょうがないことにする。