P/SEND2 仕様メモ

  • tags
    • petitcom
  • 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[]     // 画素データ