▼▼ 資料編: .PDB の構造など ▼▼
- Part I 【.PDB の全体的な構造】
- Part II 【各種の .PDB の構造】
- MemoPad メモ帳
- ToDoList To Do
- AddressBook アドレス
- TealPaint
- Q Paint
- Mail メール
- EMemo decrio手書きメモ
- Datebook 予定表
- 手書きメモ PenPen, PenPenCol
- Part III 【pdbm.exe が扱うファイル】
【.PDB の全体的な構造】
これは, 極秘に入手した秘密情報である。だれにもばらしちゃいけない。約束だよっ, ねっ。 (← 大ウソ)
↑ホンキにしないように(笑)。この情報は, Pilot-Link.0.8.13の libsockにある pi-file.cに基づいている。
基礎編では, デスクトップに現れるプログラムを紹介してるけど, そこに現れないプログラムもけっこうあって, んで その中の pilot-file.exeとか使ってみると, こーゆー情報を詳しくみることができたりする。
ぜひみんなも動かしてみよー。あ, オフラインのプログラムなんで Palm/Pilotと通信したりはしないからクレードル持ち出しても無駄だよっ。
で, .PDB の全体は↓こんな風になっている。headerの構造は, pi-file.cにコメントとして詳しく載ってるんでみてみて。
項目名 | 1つ当たり サイズ | 数 |
---|---|---|
header | 78 Bytes | x 1 |
record entry header | 8 Bytes | x record数 |
\0\0 | 2 Bytes | |
app_info | いろいろ | x 1 (無いこともあるらしい) |
sort_info | いろいろ | x 0 か 1 (同上) |
record | いろいろ | x record数 |
PDBヘッダー 項目 | 位置 | 長さ |
---|---|---|
カテゴリー情報(app_info) の位置 | 52 | 4 Bytes |
ソート情報(sort_info) の位置 | 56 | 4 Bytes |
レコード件数 | 76 | 2 Bytes |
それによると, レコード数は headerの最後 2バイトに入っている。そーそー, ドラゴンボールって, 68000系のMPUだったはずなんで, 数値のバイト順みたいなソレは インテルでのソレとは逆なので, 注意してくらはい。
app_infoと sort_infoは, ものによってあったりなかったりして, それは headerのオフセット 52からの 4バイトが app_infoの位置, sort_infoは オフセット 56からの 4バイトがソレの位置。
ここが 0x00000000 ならば, app_info (あるいは sort_info)は入っていないってこと。
そしてそれらのデータの長さは, その次に来るデータの手前までなのだ。
※ app_infoっつーのはカテゴリーとか入ってっとこ。
各々のレコードを取りだすには, レコードの先頭位置ってのが record entry headerに入ってる訳なので, その指し示している位置から次のレコードの先頭までが実際のアレってこと。 んで, record entry headerを眺めてみると, 位置情報以外にも いろいろ情報が入ってたりする。
その一つ一つの record entry headerは, 前 4バイトでそのレコードの位置, 次が属性, その後 3バイトでユニークIDってな具合。 で, この属性とゆーのは, さらに 上 4bitが色々なフラグで, 下 4bitにカテゴリーの番号が入っている。 フラグは, そのレコードがプライベートだの何だのってゆーヤツ。
項目名 | サイズ | 内容 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
位置 (offset) | 4 Bytes | そのレコードの位置 | ||||||||||
属性 (record attributes) | 1 Byte |
| ||||||||||
UID (unique id) | 3 Bytes | 他のレコードと重複しない番号 (ID) |
で, app_info つまりカテゴリー。ソレは 1つにつき 16バイト(終端 0x00を除くと, 最大 15バイトまで)。それが最大 16個登録できる。っつっても Unfiledがあるので, 追加できるのは 15個。 ん, とゆーことは全部で 256バイト? ・・・ ではない。実はその先頭に 2バイト, それからうしろにもちょっとした情報が収められたりしているのだ。
(適当に付けた)項目名 | サイズ | |
---|---|---|
変更ビット (16ビット) | 2 Bytes | |
カテゴリー名 | category 0 (Unfiled) | 16 Bytes |
category 1 | 16 Bytes | |
〜 | ||
category15 | 16 Bytes | |
カテゴリーID(UID?) x16 | 16 Bytes | |
ラスト UID | 1 Byte | |
(不明) | 3 Bytes | |
各種 .PDBによって異なる | 不定 |
先頭の 2バイトってのは, カテゴリー1つにつき 1ビットで, 全部で 16ビットある訳。どーも変更ビットみたい。
うしろ側の情報はカテゴリーの ID (UID?)。こちらの情報は各々の .PDBで違うよーなので, また今度にしよー。 (^^;
【各種の .PDB の構造】
てとこで, 各種の .PDBの構造へとっとと説明が移る訳なんだな, これが。
で, それぞれ何が違うかっつーと, 一番の違いは(↑)の表での recordの部分。
そりでは, それぞれの record部分をみぃんなで見よー。
○ ● ◎
MemoPad
さて, まずは MemoPad。 でも安心し給へ。これってば一番簡単な構造なんだから。なにせ 1行目が表題になってるだけっつーんだから。他にこれといった情報もない, も〜 テキストだけ。 まぁ注意するのは改行コードかな。PCでは, よく復帰・改行になってっけど(つまり 0x0d, 0x0a ね), .PDBでのソレは改行(0x0a)だけ。 あっそれから, テキストの最後に nulコード(0x00)が付いていたりするよ。
▽ ▲ △
ToDoList
で, お次が ToDoList。 これには, 優先順位と期日と, そしてノートがある(それと完了チェックも)。では, どーゆー構造なのかさっそく見てみよう。
期日 | 完了, 優先順位 | 案件 | ノート |
2 Bytes | 1 Byte | 文字列 | 文字列 |
なんじゃそらってゆーくらい簡単な表になっちった。recordの先頭の 3バイトがそーゆー情報で, あとは 案件 0x00 ノート 0x00 とゆーふーになっておるのじゃ。 ノートがなかったら 0x00が 2つ続くだけ。それから 案件は最大 255バイトまで。
んで先頭の期日, これは 7bit, 4bit, 5bit でそれぞれ 年, 月, 日になっている。月と日は範囲内だからよいとして, 年は 1904〜2031 になってるんだよ。
でも, 期日の指定がなかったら 0xffff になるのさっ。
それから, 優先順位の先頭 1bitは, 完了チェックが付いているかどうかってヤツ。
あっそーそー, これらは libsockにある todo.cが参考になるかも知れない。
□ ◆ ◇
AddressBook
今度は AddressBook。これは, ちょいと構造が面倒かも。
phone | contents | offset | 各項目の内容 |
4 Bytes | 4 Bytes | 1 Byte | それぞれ文字列 |
AddressBook は項目数でゆーと 19個個。そりは ・・・ 姓, 名, 会社名, 5つ分の電話, 住所, 市町村, 都道府県, 郵便番号, 国, 役職, カスタム4つ分, ノートて感じ。 こーゆーのが nulコードターミネーター付きの文字列として連続して入っている訳。でも 19個すべてではなくて, 入力されているものだけってことに注意。 たとえば, 姓, 名と住所が入っているとすると 姓 0x00 名 0x00 住所 0x00 ってことで, 他の項目はそもそも含まれていない。
では, どの項目が選択されているのか, それを知るには contents を調べる必要がR。
コレ 1項目 1bit。だからこの場合 0x00000103 とゆーことになるんだよっ。下位から数えて 2bit分と, それから 6項目分飛ばして 1bitとゆーことだねっ。
うじゃ残りの (32-19=) 13bit分は? ・・・ んーと たぶん未使用, かな (だから全項目なら 0x0007ffff)。
それから, (↑)にある 19項目の, それぞれの長さは最大 255バイト。んでも最後の項目「ノート」はそーゆー制限はなかったりする(無制限ちゅー訳じゃないだろうけどもさ)。
んで, phoneとゆーのは何か。それは 5つ分の電話が何の電話番号かを表すもの。中には電話と関係ないのもあるけどさ。だから, どっちかっつーと連絡先って感じかな?
この 5つ分の連絡先は, それぞれ 8つの中から選ぶことができるよーになってて, そりは 会社, 自宅, Fax, その他, E-mail, 代表(メイン), ポケベル(ペ-ジャ), 携帯。これらは 0から順に番号が割りふられている模様。
phoneの, 下位 2バイト半(5ニブル?分) には, この情報が入ってたりする。もしもすべて E-Mailなら 0x00044444 って感じな訳。
先頭の 1バイトは余分で, 次の 1バイトの上位 4bit は, 多分 一覧表を見た時に表示される電話項目を表している(よーなものだろー。けっこう適当)。わはは。
(ニブル(nibble) を, 1ニブルとか 2ニブルとかって数えたことないんで, ホントにそーゆー表現してよいか不明)
offsetは会社名の項目のオフセットを表しているらしいんだけど, ちょっち矛盾があるような無いような・・。
◇
さて, WorkPad-J, つまり日本語版では新たに 3つほど項目が増えていたりする。 ソレらはすべてよみ (バビル二世ではない) 項目。 J-OS では, Lastnameを名前読み, Firstnameを名前 に扱ってたんだけど, それが日本語版 Palmデバイスでは, こんなバラバラになっちった。
- よみ(姓)
- よみ(名)
- 姓
- 名
さらに会社名(Company)も, よみ(会社), 会社名 とゆー具合に分離。 で, 最終的に項目が 3つ増えて, 全部で 22項目になったのけ? とゆーと, それが違う。
つまり, Lastname だけで姓とその読み, Firstname で名とその読み, Company で会社名とその読み, となったのじゃ。 それぞれ 0x01のコードを境にして 二つずつに分かれた訳なのさっ。 だから日本語版 Palmデバイスでのソレを別の環境に取り込むと, 途中にトーフが出てきたりなんかするのだ。「よみ」は 0x01 の後ろ側で「よみ」が入ってなかったりした場合は 0x01そのものも入っていないっぽい。
それから, 項目名について, 実は app_infoの中に項目名がすべて入ってんだよね, コレが。だから J-OSのばやいでも, 日本語版 Palmデバイスのばやいでも, 同様になっている。ただし「よみ」の項目については入っていないみたい。
△ ▼ △
TealPaint
それでは, TealPaintのフォーマットを紹介しよう。 これは, 次のような順番でデータが並んでいる。
- ヘッダー
- 一覧時のイメージ
- 通常時のイメージ
- コメント
んで, ヘッダーは, (↓)のような構造をしている。この表では, 横は 4バイト分を表している。 こんなもんかな。なんだか簡単に済ませ過ぎているような気がしなくもない (^^;
ヘッダー長さ(A) | |
一覧時のイメージの長さ(B) | |
通常時のイメージのオフセット(A+B) | |
通常時のイメージの長さ(C) | |
コメントのオフセット(A+B+C) | |
0x00, 0x00 | 横幅 |
高さ |
◇ ◆ □
Q Paint
では次に, Q Paintのフォーマットを取り上げよう。
こちらも TealPaint同様, 一覧時のイメージとゆーのがあるんだけど, コメントとゆーのはない(と思う)。
一つの項目当たり 2バイトで, その後ろに 10バイトの不明項目が続いている。んで, イメージとゆーのは, 高さ×長さのサイズになってる。
ところで, 横幅と長さの違いって何だっけ。ビット数とバイト数の違いか, それとも 8の倍数で繰り上げた感じのアレだったのか ・・・ 忘れちった。
(不明) | 横幅 | 高さ | 長さ | (不明) 10 Bytes | 一覧時のイメージ |
2 Bytes | 2 Bytes | 2 Bytes | 2 Bytes | 10 Bytes | イメージデータ |
そして, この後ろに (↓)の形式が続く。見れば分かるかもだけど 形式は全く同じ。
(不明) | 横幅 | 高さ | 長さ | (不明) 10 Bytes | 通常時のイメージ |
2 Bytes | 2 Bytes | 2 Bytes | 2 Bytes | 10 Bytes | イメージデータ |
◎ ○ ●
さてさて, Mailであ〜る。 これも, ほかの PDBと同じような感じになっている。すなわち, Inbox, Outbox, Deleted, Filed, Draft が, カテゴリーになってるってことさっ。 で, レコードの構造は とゆーと, メールヘッダの項目がいくつかと, 最後にメールボディ, そんな感じ。
項目名 | 内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
日時とかいろいろ |
| ||||||||
7つのメールヘッダー項目 | 7つ分の文字列 | ||||||||
メールボディ (本文) | 文字列 | ||||||||
不明 | 1 Byte |
最初は日付。この日付の構造は ToDoListのものと同じ。ただし 無効って場合は 0。
次に, 時間は 時
, 分
が 1バイトずつ。そして フラグ, 0x00 と続く, 計6バイト。
フラグはこんな感じ(↓)。 これって, たぶん readと addressing以外は, 新規にメールを作るときに設定できるもの(のはず)。
- read (読んだかどうか?)
- signature (サイン)
- confirmRead (受信確認)
- confirmDelivery (配送確認)
- priority (優先順位:2bit 高い/普通/低い)
- addressing (???:2bit)
この 6バイトの項目の次からは, 0x00を区切りとして幾つかの項目が並んでいて, そしてこの後に, (↑)でもゆったように 本文が続き, これも 0x00 で終わっている。 ・・・ はずなんだけど, 調べてみると 最後の最後に 余分に1バイト何かがくっついてくる感じ。しかも不定。何か意味がアルのか?
- Subject:
- From:
- To:
- Cc:
- Bcc:
- Reply-To:
- Sent-To:
うーむ, Sent-To:
なんてあったっけ
■ ▽ ○
Decrio EMemo
んで, デクリオの 手書きメモ: EMemoについての構造。
実は, Mutoh の BBSで, コレの公開の確認取ろうとしたんだけっちょ, やっぱし返事がない。うーみゅ ・・・
かといって, なにも公開しないんじゃ その手のツールは出てこないと思うしぃ, まっ, フライングっつーことで構わないかな。(^^;
当然だけれど, ここで公開しているのは Mutoh からのものではない訳なので, そこに問い合わせたりしないよーに。
ついでにゆーと, σ(^^) も, そことは関係ないパンピー。
さて, とりあえず, EMemoを PCにバックアップしたとしよう。すると, 次の二つがソレらしきものだと分かる訳だよね。
- EMXref-EM10.pdb
- EMInk-EM10.pdb
もちろん, そのメモ帳 MemoDB.pdb にも特殊なマーカーみたいなのが入ることになーる。 てことで, まずは, コレ MemoDB.pdb の部分, そして その次には EMXref-EM10.pdb をアレしていこう。
MemoDB.pdb ... 通常の MemoPadでのソレと, EMemoでのソレは, どう違うのだろーか。 たいてい, そのままにしておくと 手書きのとこには, EMemo-00-1-25-22-52-5 なーんてのが入ることになる。コレってば, 見たまんまのアレで, その時の日付と時刻な訳だよね。 でもその内部には, も少し別なものも入ってたりする。
文字列(最大 24Bytes) | 改行×2 | 固定文字列 ( Use Ink Viewer) | 改行 |
25 Bytes | 2 Bytes | 15 Bytes | 1 Byte |
でも, ここにはコレといった情報は含まれていない。トラブルかなんかで MemoDB.pdbがつぶれたとしても, 手書き情報は大丈夫。 (^^)v
◇
んで, 次に EMXref-EM10.pdb。ここにも手書き画像は入ってなくって, 手書き画像とメモ(MemoDB.pdb)との橋渡しって感じになっている。
レコードは, カテゴリー 1つで 1レコードのよう。つまりカテゴリーごとに分類された (手書きメモの)UIDの集合ってことだね。
てことで, 少なければここには 1レコード, 多くても 16レコードしかない。でも, ま, 多少間違っちゃってるかもだけどね。てへっ (^^)
項目名 | サイズ | 内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
カテゴリーに ついての情報 | 20 Bytes |
| ||||||||
手書きメモ UIDリンク (メモの数分繰り返し) | 一件あたり 47+α Bytes | 下図参照 |
カテゴリーについての情報の中にある 手書きメモ数で, その後につづく 手書きメモ UIDリンクの数が表されていて, コレで手書き画像の数がわかる ・・・ て訳ではない。残念ながら。
とゆーのも, ひとつの手書きメモの中に, 複数のページが含まれることもあるから。
で, (↓)がメモ帳UIDと手書き画像UIDのリンク情報。
項目名 | サイズ |
---|---|
メモレコードの UID | 4 Bytes |
メモのテキスト | 25 Bytes |
作成日時 | 8 Bytes |
更新日時 | 8 Bytes |
不明 | 1 Byte |
対応する"手書き"のページ数 | 1 Byte |
ページ数分の"手書き"レコード UID | 4 Byte × ページ数 |
1ページしか手書き画像がなければ全部で 51バイト。ページ数が増えるに従って 4バイトずつ増えるって訳だね。ページ数は最大 16ページのよーだから, それほど大きくなったりもしない。
それから, 作成日時と更新日時は 新しいバージョンではバイナリで入ってる模様。
そもそもこの日時, 作成だか更新だか, どっちなのか不明なんだよね。(^^)
◇
さて, 画像DBである EMInk-EM10.pdb の構造を見てみよう。 コレって ほかの, たとえば 手書きアドレス帳とか, そーゆーのと同じかどうかは分かっていない。 なぜかって, ソレ動かしたことないから。でへへ。 ま, 似たようなもんだと思うんだけどさ。
コレのレコードってのは, ひとつひとつが手書き画像の情報になってて, レコード数=画像数+1 になっていたりする。
+1 っつーのは, 何か入っているらしいんだけど, まだ詳しく分かっている訳じゃない。(^^;
んで, 手書き画像レコードは? とゆーと ・・・
項目名 | サイズ | 内容 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
画像情報 | 7 Bytes |
| ||||||||||
線の情報 | 線の数 × (最低でも)7 Bytes |
| ||||||||||
終端 | 1 Byte |
|
まずその先頭に, この手書き画像に対応するもの, 手書きメモならそのメモ帳レコードの UIDと, その中でのページ番号など, 画像の全体的な情報がある。 つぎに, 一筆書きで描くことができるよーな線があり, コレが並んでいる。一筆書きの線が何本か現れた後, 一番最後に終端 ってこと。 それぞれの先頭の 1バイトは固定の値なので, ソレで識別できたりする。
一筆書きは, 開始座標から始まって, まえの座標からの相対座標がいくつも続き, 座標の数までで一筆書きは終わる。
そしてその次の 1バイトが一筆書きを表すものならば, 次の一筆書きが始まるし, 終端ならばそこまで, ってこと。
てことで, それらの項目を少しばっかり解説してみよう。んじゃ 上から順番に ・・・
- 画像番号
- えー, コレはドキュメントによると, ひとつのメモにつき最大 16画像のはずだったんで, 1.5バイトの余分な部分がある。 てことで, もしかしてビミョーに勘違いしてるかもしんない。あしからず。(^^)
- メモレコードのUID
- UIDって ホントは 3Bytesなんで, 頭 1Byteは余分。・・・ は, いいんだけど, この情報を持ってる訳だから, ここから EMXref-EM10.pdb を生成したりもできちゃうかも。
- 座標の数
- 座標の数を表している訳だから, 「1」が入ってたら 開始座標だけってことで『点』になるはず。 んで, 「3」とかだったら 開始座標と つづく相対座標が 2つ って感じだね。難しくはないよね。
- 開始座標
- 最初の 2 Bytesが X座標, あとが Y座標。んで, ビットで表すと 0b0xxxxxxx 0b0xxxxxxx て感じで, 上位 7ビットと下位7ビットに分れてるのだ。 値の範囲は, 解像度が 1016ライン/インチで, そのサイズが 5インチ × 7.1インチ。あとは勝手に計算してみよう。
- 相対座標
- 座標の数-1 個分 座標が繰り返し入っている。1つあたり 2 Bytes で, ソレは X座標, Y座標が それぞれ 1Byteずつ。 前の位置からの相対座標になっていて, 下位 7ビットは距離を, 最上位ビットで方向(符合)になる。てことで, どんなに長くても 127ドットまでな訳だよん。
他の情報源として, アプリケーションに対応するファイル名だとか, 手書き画像にテキストデータを添付できるかどーかとか, そーいった情報があるです。 はせがわ(あ)さんとこの edf2psのページれす。
○ ▼ □
Datebook
あ さて〜, 今度は, Datebook(予定表)なのら。
コレってゆーのが, 難しい使い方をしててもそーでなくても, 色々な使い方もできるよーに 構造はかなり複雑になってたりする。
コレを見れば, こんな使い方もできるのか? とか思うに違いない。 ・・・ のかも。
で, ソースファイルは libsock/datebook.c
と それから include/pi-datebook.h
だお。
まずは, 先頭の部分(↓)。よくみると項目数とバイト数が合わない ! と, 思うかもだけど, 年月日は 2バイトなのら。 それから, 開始時刻(の時と分)が 0xffffなら時間の指定はないってこと。
項目名 | 開始時刻 | 終了時刻 | 年月日 | flags | gap | ||
---|---|---|---|---|---|---|---|
時 | 分 | 時 | 分 | ||||
サイズ | 2 Bytes | 2 Bytes | 2 Bytes | 1 Byte | 1 Byte |
bit位置 | 意味 |
1******* | ? |
*1****** | alarm |
**1***** | repeat |
****1*** | except |
*****1** | desc |
***1**** | note |
******1* | ? |
*******1 | ? |
んで, この 8バイトの後に数々のオプションがくっつく。ソレらは, flagsに示されてる通りのもので, もし flagsが 0x00なら, 後ろには何も付かないってことなのさっ。
で, まずは alarm。これは 2バイト。その値はとゆーと, たとえば 0x03 0x01 だったとすると, 3時間前にアラームを鳴らす ってこと。 って, アラームを予定時間の後に鳴らしても意味ないもんね。
advance | advanceUnits |
値の数値 | 0=分, 1=時, 2=日 |
で, repeat とゆーのは繰返し, つまり定期的な予定のこと。 先頭の repeatType は None, Daily, Weekly, MonthlyByDay, MonthlyByDate, Yearly のどれか(0〜5)。 コレによって, その後の構造も多少変化する。 ・・・ んだけど, 全体で 8バイトなのは変わらない。 あ, 終了日は 2バイトね。0xffffなら 終了日がないってこと。
repeatType | ? | repeatEnd | repeatFrequency | repeatOn | repeatWeekstart | ? |
0〜5 の値 | 不明 | 終了日(年月日) | 間隔 | 不明 |
repeatの項目, repeatOnは repeatTypeが Weekly (2)の時だと, bitフィールドとして幾つかの曜日を記録することになーる。 ソレは下位から順に, 日曜・月曜・火曜 ・・ 土曜 になる訳だね。だから 例えば 0x41なら 土・日ってこと。
repeatTypeが MonthlyByDay (3)の時だと, repeatOnの値で, その月の「ある日」を曜日でアレするって意味になるのだ。 つまり, その値を 7で割ると 余りが曜日を表していて, 答えがその週を表している ・・・ ってとこ。
0:第一日曜 ...... 6:第一土曜日 7:第二日曜 ...... 13:第二土曜日 14:第三日曜 ...... 20:第三土曜日 21:第四日曜 ...... 27:第四土曜日 28:最終日曜 ...... 34:最終土曜日
repeatWeekstartは, 普通は 0で「日曜始まり」。んで 1だと「月曜始まり」。 ただし, repeatTypeが指定されている場合のみ てことらしい。情報ありがと >宇野さん
それから, except は例外を表していて, 予定だけれど予定じゃないっつーか そんな感じ ・・・ なのかな? そんな画面見たことないので分からないんだけど。(^^)
ソレが 一つしかなかったら 2 + 2 × 1 = 4
バイト, みっつあったら 2 + 2 × 3 = 8
バイト。
exceptions | その個数分 | |
exception | ・・・ | |
その数 | 年月日 | ・・・ |
2 Bytes | 2 Bytes |
残るは, descと note。両方とも文字列で, だから 0x00で終わる構造。
descriptionってゆーのは, その予定のとこに書いた説明のこと。んで, noteはコメントとして書き込んだもの。
ま, どちらも単なる文字列なので図をアレする必要はないよね。だって, 図をアレするのって大変なんだもん。 (← ぉぃ)
◆ ○ ▲
PenPen, PenPenCol
今回は手書きメモの一つ PenPen のソレをアレしてみるにょ。 でも, だからって ペンギンが登場したり, 草が生えたりする訳じゃない。
PenPen の機能は どんなのかっつーと ・・・ 手書きメモが書ける。って, まんまだね。(^^)\(☆バキッ
で, そのほかに, 4 Sectionの手書きメモを まとめ表示もできたりする。実は, 1ページ(=1レコード) は, 4 Sectionで構成されているのら。 つっても 高解像度のばやいは分かんないけど。でも, たぶんコレと同じなのかも。
そのうえ, 4ページ(つまり 16 Section)をまとめての表示も可能なのら。そーゆーののどこがアレなのかっつーと, 位置をずらすことで, 隣のマスに表示して重ね合せることもできるんだよ。 ・・・ どんな利用法があるのかは謎だけど。
地図と道順? あ, ソレ よいかも。 ただ, 別のSection表示させたとこに 手書きメモを書き込むなんて出来ないんだけど。 (←じゃ, ダメじゃん)
基本的なこの構造は, ベクトルの集合。 てことで, コレを利用しての拡大縮小機能もついていたりするんだけど, ソレは置いといて ・・・。
項目名 | 位置 | 長さ | 備考 |
---|---|---|---|
ヘッダー | 0x0000 | 13 | 日, 月, Flag × 4 (以上, 各2バイト), 年(年-1998, 1バイト) |
1 Section目 | 0x000d | 3200 | 最大 (800-1)本の線分 |
2 Section目 | 0x0c8d | 3200 | 同↑ |
3 Section目 | 0x190d | 3200 | 同↑ |
4 Section目 | 0x258d | 3200 | 同↑ |
不明 | 0x320d | 3 | 0x00, 0x00, 0x00 |
各Sectionの件数 | 0x3210 | 16 | 4バイト × 4 |
Section数? | 0x3220 | 2 | 0x04 |
「最大 約800本の線分」っつーのは, 始点(x,y) 〜 終点(x,y) の座標, コレが 1本の線(4バイト)として, 約 800本ってことなのら。 最後の 1本分(4バイトは)は空けてあるっぽい。 で, ソレが何本あるのかは「各Sectionの件数」のとこに入っていたりするのだ。
◇
ジツをゆーと, すでに PenPenのカラー版が公開されていて, コレの構造とは異なってるっぽい。 んで PenPenColは, まずその用語からして違う。 1ページを構成するものはフレームなのだ。
項目名 | 長さ | 備考 |
---|---|---|
ヘッダー | 13 | 日, 月, Flag × 4 (以上, 各2バイト), 年(年-1998, 1バイト) |
なにか | 68 | |
1 Frame目 | 7200 |
一本の線は (PenPenでは 4バイトだったけど) 6バイト。 そこには 色・線種の各 1バイトが含まれるよーになった。 Frameサイズも違うので, 線の最大数も違う。 |
2 Frame目 | 7200 | |
3 Frame目 | 7200 | |
4 Frame目 | 7200 | |
不明 | 3 | 0x00, 0x00, 0x00 |
各Frameの件数 | 16 | 4バイト × 4 |
Frame数? | 2 | 0x04 |
でも基本的には同じ構造なので, コレを扱うプログラムは共通にできるかも。
○ ○ ○
【pdbm.exe が扱うファイル】
このプログラムは, PDBファイルのメンテナンスのためのものれす。 PDBファイルをアプリケーションから直接アレするんじゃなく, コレを介することによって一元化でき, トラブルを起きにくくしていた ・・・ つもりだったけど, 現在は使用していません。 アクセスする手順が煩わしいのと, 制限が多いためれす。 てなことで, この資料(↓)は 一応念のためにあるだけで, 参考にも何もならないかも。(^^;
pdbm.exe とゆーのは σ(^^) 作の幾つかのプログラムの中から, 内部から呼び出されるもの。なーにをやってるかっつーと .pdbの更新。
.pdb をダイレクトにゴリゴリと更新していては何かと大変なんで, 衝撃(?)を緩和するためにあったりする。 ・・・ んだけど, 欠点もいろいろあったりする。
今は Rexxですべてをあれこれできるようになったので, pdbmは使わないのがよいかも。
- Rexxでの PDB 読み込み &分解
- Rexxでの PDB 組み立て &書き込み
このプログラムには 3つのファイルを指定する。元の .pdb と, 新しく作る .pdb, そしてさらに変更内容を記したファイル。 ここで公開するのは, トランザクションファイルと呼んでいる, その変更内容のファイルであーる。
構造はいたって簡単。4バイトの長さとレコード内容, これが連続しているだけ。そして, ファイルの先頭にはそーゆーIDが入っている。
"pdbTransaction" 0x1a 0x00
・・・ 16Bytes。
レコード内容の最初の部分には, uidが入ることになっていて, それを元にレコードを更新したりする。
.pdb は, コレを元に管理されているので, .pdb の更新もこの単位で行う。
同じ uidのレコードがあれば置き換え, 存在しない uidがあったら追加とゆー具合。あ, でも uid == 0 は無条件に追加とゆー意味。
そのばやい, Palmデバイスに .pdbをインストールした時に, 正式に uidが割り振られることになる。
それから, 長さフィールドには, ちょいと注意することがあって, 先頭 4bitに幾つかの情報が入ってたりする。
- 後に続くのは, レコードではなくって app_infoだよーん。と, ゆー bit
- 後に続く uidを持つレコードを削除する。と, ゆー bit
これくらいかな。他に注意することと言えば, 長さ == 0 は EOFを表していることくらい。 まぁ, 詳しくは後で公開予定の pdbm.c (ソース)とか見てくらはい。 見にくくっても我慢するよーに。
◇
構造は, (↑)でもアレしたように, そんなに大したものではない(と思う)。気を付けることは uid が 0のもの。と, ゆーよりソレを反映させた .pdbファイル。 そのままでは, その .pdbファイルの中の uid == 0 のレコードは 置き換えも削除もできないので, 早いとこ Palmデバイスにインストールして, すぐまた取り込むのがよいかも。 そのときには正式な uidが設定されているから。
◇
おっと, ウィルス退治の時間だ。んじゃ, 行きまーすっ (^^)/~ (←こら)