2024.1.7
前へ
次へ
ホームページトップへ戻る


PICBASICコンパイラ

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
まるでインタプリタ。でもコンパイラです。超カンタン超シンプルです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第126回]



●SDカードIF(46)SDカードの日付時刻情報

このところずっとCSVファイルについて主にExcelを中心に書いてきました。
書き始めた当初は4〜5回ていどで終るつもりだったのですが思っていたよりも随分長く書くことになってしまいました。
本来のテーマからはやや脱線した感があります。
年も改まったことでもありますからこのあたりで本来のテーマに戻るべく、資料の整理にかかったのですが。
そのうちに書くつもりでいたSDカードの日付時刻情報についてまだ書いてなかったことに気が付きました。
CSVファイルについて深追いしているうちにすっかり忘れてしまっていました。
SDカードの日付時刻情報というのは、SDカードにファイルをセーブしたときの日付時刻をファイル名やファイルサイズなどと同時にSDカードのディレクトリエリアに記録する日時データのことです。
その情報はSDカードのディレクトリ(Windowsの場合にはフォルダ)を開いたときにファイル名とともに表示されます。
こちらは[第108回]でお見せした画像です。

TEST28.BINからセーブしたときの日時を記録するようにしました。

今回はディレクトリデータの中で日時の情報を記録するルールについて説明をします。
TEST29.BINのところを見ると更新日時は2023年12月1日 21時14分と表示されています。
秒は表示されていません。
更新日時のほかにファイルの作成日時というものもあるのですがWindowsでは作成日時は表示されないようです。
現在作業中のPICBASICコンパイラではファイルは作成するだけで更新はしませんから作成=更新という扱いになります。
以下TEST29.BINの場合を例にあげて具体的に説明をします。
下はSDカードのディレクトリエリアのダンプリストです。



FAT16システムでは1つのファイルについて32バイトを使います。
その中で日付データと時刻データはそれぞれ2バイト16ビットを使います。
赤で囲んだ部分がそのエリアです。
Aが作成時刻でBが作成日付です。
Windowsではここは参照されないようです。
Cが更新時刻でDが更新日付です。

それでは具体的にその値を見ていくことにします。
エクスプローラでSDカードのディレクトリ(フォルダ)を開いて表示されたTEST29.BINの更新時刻は21時14分です。
そのデータは上のリストのCの赤四角で囲んだ値です。
時刻は2バイト16ビットで示します。
普通に読むとC7A9ですが一般に特にマシン語系の値は下位バイトの方から先に書きます。
ですからこの場合にはC7が下位でA9が上位になります。
それを上位・下位の順に表記するとA9C7になります。
この16ビットのデータはビットに区切って下のように時分秒が割り当てられます。

時 00〜23の値を5ビットで示す。16進数では00〜17。
分 00〜59の値を6ビットで示す。16進数では00〜3B。
秒 00〜59の値を5ビットで示す→ビットが足りないので秒÷2の値で示す。00〜29。16進数では00〜1D。

そのルールに従ってA9C7から時刻に変換してみます。

A9C7をビットで表示します。
10101001 11000111
それを上位から5、6、5ビットに分けます。
10101 001110 00111
時(15)  分(0E) 秒(07) になります。
各値を十進数に直します。
15(=21) 21時
0E(=14) 14分
07 7×2=14秒

次は日付について見てみます。
TEST29.BINの更新日付は2023年12月1日です。
そのデータは上のリストのDの赤四角で囲んだ値です。
日付も2バイト16ビットで示します。
普通に読むと8157ですが日付も時刻と同様に下位バイトの方から先に書きます。
ですからこの場合には81が下位で57が上位になります。
それを上位・下位の順に表記すると5781になります。
この16ビットのデータはビットに区切って下のように年月日が割り当てられます。
年 1980年を起算0年とする経過年数を7ビットで示す。最大127(=7F)。
月 1〜12を4ビットで示す。1〜C。
日 1〜31を5ビットで示す。01〜1F。

そのルールに従って5781から年月日に変換してみます。

5781をビットで表示します。
01010111 10000001
それを上位から7、4、5ビットに分けます。
0101011 1100 00001
2B(=43) 1980+43=2023年
C(=12) 12月
1       1日

もうひとつその上のTEST28.BINについても同じようにして時刻と年月日を求めてみます。
ちょっと時間がなくなってきてしまいましたので簡単に数字だけで示します。
TEST28.BINの更新日時は23年11月10日 21時46分です。

時刻データはADCBです。
10101101 11001011
10101 101110 01011
15(=21時)
2E(=46分)
0B(=11) 11×2=22秒

日付データは576Aです。
01010111 01101010
0101011 1011 01010
2B(=43) 1980+43=2023年
B(=11) 11月
0A(=10) 10日


PICBASICコンパイラ[第126回]
2024.1.7upload

前へ
次へ
ホームページトップへ戻る