1chipNextorMSX更新 (Ver1.06)2017年03月05日 18:17

Ver1.0.6

Ver1.0.5のBugfix
Nextor利用時の起動時[F09]押下で内蔵RAMDISKだけでなくSDカードも無効になっていたのを修正。

ダウンロードはこちら



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