Manuke Station : Project X88000 : T88Format

T88Format

T88テープイメージファイルフォーマット Ver. 1.0
1998-08-22 by Manuke

説明

◎文中の決め事

・フォーマットの説明時に、[]で囲まれた部分は省略可能であることを示します。
・T88での数値は、すべてリトルエンディアン(低位バイト→高位バイト順)で表されます。
・T88では1/4800秒が時間の単位として使われています。本文中では、この単位を1tickと表現します。

◎概要

T88はタグ形式の可変長ファイルフォーマットです。
先頭にファイルヘッダ、それに複数個のタグが続く形式です。

ファイルヘッダ,タグ1[,タグ2[,タグ3...]]

◎ファイルヘッダ

ファイルヘッダは、そのファイルがT88形式であることを示す23+1byteの文字列です。
(文字列23byte+終端00H)

"PC-8801 Tape Image(T88)"

◎タグ

タグは可変長のデータ構造です。
タグには必ず種別、およびデータ長の情報が含まれています。

ID(2byte整数),データ長(2byte整数)[,データ(指定の長さ)]

※(データ長にはIDおよびデータ長自身の長さは含まれません)

タグ形式は、ファイル構造に変化があった場合にも下位互換を確保しやすいデータ形式です。
これを実現するために、T88ファイルを処理するプログラムは、未知のIDを持つタグを見つけた場合にそれを読み飛ばす処理を加えておく必要があります。

・終了タグ(ID:0000H,データ長:0byte)

ファイルの終端を示すタグです。T88ファイルの最後に必ず付加されます。
終了タグは付随するデータを持ちません。

例:

00 00 00 00

・バージョンタグ(ID:0001H,データ長:2byte)

T88ファイルのバージョンを示すタグです。
バージョンタグは次のデータを持ちます。

バージョン番号(2byte整数)

上位バイトがメジャーバージョン、下位バイトがマイナーバージョンを示します。
現在のバージョンは0100Hです。

例:

01 00 02 00 00 01

・ブランクタグ(ID:0100H,データ長:8byte)

・スペースタグ(ID:0102H,データ長:8byte)

・マークタグ(ID:0103H,データ長:8byte)

テープ上のデータがないエリアを表すタグです。
ブランクタグはキャリアを検出できないエリアを表します。
スペースタグは、1200Hzのキャリア(0を表現)を検出したエリアを表します。
マークタグは、2400Hzのキャリア(1を表現)を検出したエリアを表します。
これらのタグは、いずれも次のデータを持ちます。

エリア開始時間(4byte整数),エリア長さ(4byte整数)

エリア開始時間、エリア長さはtick単位です。

例:
(エリア開始時間3秒目(14400tick)、エリア長さ2秒(9600tick)のとき)

<ブランクタグ>

00 01 08 00 40 38 00 00 80 25 00 00

<スペースタグ>

02 01 08 00 40 38 00 00 80 25 00 00

<マークタグ>

03 01 08 00 40 38 00 00 80 25 00 00

・データタグ(ID:0101H,データ長:12byte+実データバイト数)

テープ上に記録された実データのエリアを表すタグです。
データタグは以下の情報に加え、実データのバイト列を持ちます。

エリア開始時間(4byte整数),エリア長さ(4byte整数),
 実データバイト数(2byte整数),実データ種別(2byte整数)

エリア開始時間、エリア長さはtick単位です。
また、エリア長さは通常、以下の値と等しくなります。

1200baud : 実データバイト数×44
600baud : 実データバイト数×88

実データバイト数は必ず32768以下の値を取ります。
32768より多いデータのタグを作成する場合、複数の連続したデータタグに分割する必要があります。

実データ種別は以下の情報を示します。
※通常00CCH(600baud)か01CCH(1200baud)のいずれかの値を取ります。
(ビット2~7は8251USARTのモードインストラクションと同じ意味です)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
x x x x x x x BD S2 S1 EP PEN L2 L1 x x
x : 未定義(作成時には0を代入しておくこと)
L1,L2 : データビット長
PEN : パリティイネーブル
EP : パリティ指定
S1,S2 : ストップビット長
BD : ボーレート(0:600baud,1:1200baud)

例:
(エリア開始時間5秒目(24000tick)、実データ"ABCDEF"、1200baudのとき)

01 01 12 00 C0 5D 00 00 08 01 00 00 06 00 CC 01 41 42 43 44 45 46

◎実例

ここで示すダンプリストは、次のプログラムを1200baudで保存した場合のものです。

10 PRINT "HELLO"
(SAVE "HELLO"で保存)

0000 50 43 2D 38 38 30 31 20 54 61 70 65 20 49 6D 61 PC-8801 Tape Ima
0010 67 65 28 54 38 38 29 00 01 00 02 00 00 01 02 01 ge(T88).........
0020 08 00 00 00 00 00 F8 1E 00 00 03 01 08 00 F8 1E ................
0030 00 00 28 05 00 00 01 01 1C 00 20 24 00 00 C0 02 ..(....... $....
0040 00 00 10 00 CC 01 D3 D3 D3 D3 D3 D3 D3 D3 D3 D3 ................
0050 48 45 4C 4C 4F 00 03 01 08 00 E0 26 00 00 5C 02 HELLO......&..\.
0060 00 00 01 01 25 00 3C 29 00 00 4C 04 00 00 19 00 ....%.<)..L.....
0070 CC 01 0F 00 0A 00 91 20 22 48 45 4C 4C 4F 22 00 ....... "HELLO".
0080 00 00 00 00 00 00 00 00 00 00 00 03 01 08 00 88 ................
0090 2D 00 00 7C 0F 00 00 02 01 08 00 04 3D 00 00 20 -..|........=..
00A0 24 00 00 00 00 00 00 $......

: ファイルヘッダ
: バージョンタグ
: スペースタグ
: マークタグ
: データタグ
: データタグ内の実データ
: 終了タグ