P/SEND2 仕様メモ
- tags
 - last modified2015-03-27
 - created2015-02-18
 
前バージョンからの変更点
- 通信に使う記号をL/Hの2パターンからL/M/Hの3パターンへ
 - 余った記号を使ってデータを圧縮
- BPE(風)とLZSS
 
 - どうせ互換性無いのでヘッダなど整理
 - 16bitカラーに変換する時にディザ処理追加
 
通信データ
記号
     MSB LSB
#00  L L L L ... &h0
#01  M M L L ... &h1
#02  H H L L ... &h2
#03  L M M L ... &h3
#04  M H M L ... &h4
#05  L H H L ... &h5
#06  M L L M ... &h6
#07  H M L M ... &h7
#08  L L M M ... &h8
#09  M M M M ... &h9
#10  H H M M ... &hA
#11  L M H M ... &hB
#12  M H H M ... &hC
#13  H L L H ... &hD
#14  M L M H ... &hE
#15  H M M H ... &hF
#16  L L H H ... 位置記号
#17  M M H H ... 置換記号
#18  H H H H ... 開始/終端器号
波形はLSBからMSBの順で作成される.
あとで見返したら,MSBとLSBの逆にすべきだったなぁ……
順序
記号    中身
#18     開始記号
#01     L/Mしきい値計測用
#10     M/Hしきい値計測用
#xx#yy  置換記号で変換する1バイト((#xx << 4) OR #yy)
(データ本体)
#18#18  終端記号
終端記号が2度続くのは,受信側のプログラムを書きやすくするため. 1度目を受け取った時点で終了して良い.
ほかは基本的にリトルエンディアンなのだけど,4bit2つをバイトに直すときは上位下位の順でデータが来るので注意.
位置記号
スライド辞書によるデータ圧縮に使用する. 8bitの境界をまたぐタイミングで現れることは無い.
位置記号の直後の2byteは,挿入すべきデータ列までの相対位置とサイズを表す. 位置は12bit(1〜4096),サイズは4bitで(3〜18)を表す.
MSB      0                        1              LSB
+------------------+-------------------------------+
|相対位置(下位8bit)|サイズ(4bit)|相対位置(上位4bit)|
+------------------+-------------------------------+
SIZE=(SRC[1]>>4)+3
POS=((SRC[1]<<8 OR SRC[0]) AND &HFFF)+1
置換記号
よく使われているバイト値に専用の記号を与えることでデータ削減する. 8bitの境界をまたぐタイミングで現れることは無い.
ヘッダ部
数値はリトルエンディアン.
offset  byte
00h     1       予約(0)
01h     1       データタイプ
                0 ... バイナリデータ
                1 ... テキストデータ(8bit/置換テーブル)
                2 ... テキストデータ(utf-16)
                3 ... イメージデータ(8bitインデックス/RGBA5551)
                4 ... イメージデータ(16bitカラー/RGBA5551)
02h     14      ファイル名.あまりは'\0'で埋める
                利用可能文字「0-9 A-Z @ - .」
10h     4       データ部サイズ
14h     4       データ部チェックサム(adler32)
xxh     n       データ部
データ部
バイナリデータ
uint8 data[]
テキストデータ(8bit/置換テーブル)
uint8   num
struct {
    uint8  src
    uint16 dst
} table[num]
uint8 data[]
テキストデータ(utf-16)
uint16 data[]
イメージデータ(8bit/インデックス16bitカラー)
uint16 width        // 画像の幅
uint16 height       // 画像の高さ
uint8  num          // パレットの色数
uint16 palette[num] // 色
uint8  pixels[]     // 画素データ
イメージデータ(16bitカラー)
uint16 width        // 画像の幅
uint16 height       // 画像の高さ
uint16 pixels[]     // 画素データ