T77ファイルとは、FM-7のテープをファイルイメージ化したファイルの一つの形式です。FM-7エミュレータXM7の開発にあたり、私が独自に設計したものです。
T77フォーマットは次のような特徴があります。
- FM-7のハードウェアに密着したフォーマットであり、エミュレータへの実装が容易。
- データをbit単位で扱うため、倍速ロード等の特殊フォーマットに対応。
- 録音の切れ目を記録するため、早送り、巻き戻しができる。
ここに掲載するフォーマット仕様はVersion 0のもので、XM7 v0.72以降(V2系、V3系含む)に対応します。
FM-7のオーディオカセットインタフェースは、データの"0""1"に対してデータパルス幅を変えて記録する方式となっています。データ"1"は 2400Hz、データ"0"は1200Hzのパルスで記録されます。実際の出力では、同期をとるために"0"と"1"の混在幅をソフトウェアタイマーで制 御し、出力・判定する方式がとられています。
T77ではこの仕様に基づき、"0"または"1"の時間を逐次記録していく形式をとっています。
T77ファイル
ファイルヘッダ+単位データ+単位データ+単位データ+.....(単位データの任意個の並び)
ファイルヘッダ
16バイトのASCII文字列。"XM7 TAPE IMAGE 0"に固定。
末尾の0($30)はファイルバージョンを示す。
単位データ
2バイト(ビッグエンディアン)で形成される。
値 意味 $0000 マーカ $0001〜$7FFF "0"データ $8000 予約 $8001〜$FFFF "1"データ
マーカ
テープが停止状態から録音走行へ遷移したことを示す。データ記録に先立って起こるため通常、ファイルヘッダの直後はマーカになる。
データ
テープインタフェースからの入出力が"0"または"1"レベルになり、一定時間継続したことを示す。単位データと$7FFFとのANDをとったものが継続時間となる。なお$8000を越える継続は$7FFFに統一する。
継続時間
継続時間は、次の式で算出する。
継続時間(μs) = (単位データ and $7FFF) × 9(μs)
実際にXM7で、BIOS標準の1バイト出力を行った場合の出力フォーマット例を示します。この例ではモータを回し、$AAの1バイトデータを出力しています。
テストプログラム
ORG $1000 START EQU * LEAX MOTORON,PCR JSR [$FBFA] LEAX CTBWRT,PCR LDA #$AA STA 2,X JSR [$FBFA] LEAX MOTOROF,PCR JSR [$FBFA] RTS END START MOTORON FCB $01,$00,$FF MOTOROF FCB $01,$00,$00 CTBWRT FCB $02,$00,$00ROM BIOS内、1バイト出力ルーチン(抜粋)
Z2MHZW LDA 2,X BSR ZD0OUT LDX #11 BSR ZTIMER BSR ZD1OUT LDX #32 BSR ZTIMER BSR ZD0OUT LDX #32 BSR ZTIMER LDY #0 Z2W40 BSR ZD1OUT LSRA BCS Z2WRT1 LDX #30 BSR ZTIMER BSR ZD0OUT LDX #30 BSR ZTIMER BRA ZNEXT Z2WRT1 LDX #62 BSR ZTIMER BSR ZD0OUT LDX #61 BSR ZTIMER BRA ZNEXT ZNEXT LEAY 1,Y CMPY #8 BNE Z2W40 LDY #0 Z2W70 BSR ZD1OUT LDX #61 BSR ZTIMER BSR ZD0OUT LDX #32 BSR ZTIMER LEAY 1,Y CMPY #2 BEQ ZBYTEN LDX #37 BSR ZTIMER BRA Z2W70 ZBYTEN CLRA RTS ZD0OUT LDB #$42 STB <$00 ZD1OUT LDB #$43 STB <$00 ZTIMER LEAX -1,X CMPX #0 BNE ZTIMER RTS出力されたファイル(ダンプ)
Turbo Dump Version 4.1 Copyright (c) 1988, 1993 Borland International Display of File SAMPLE.T77 000000: 58 4D 37 20 54 41 50 45 20 49 4D 41 47 45 20 30 XM7 TAPE IMAGE 0 000010: 00 00 00 14 80 1A 00 1A 80 18 00 1A 80 30 00 30 .............0.0 000020: 80 18 00 1A 80 30 00 30 80 18 00 1A 80 30 00 30 .....0.0.....0.0 000030: 80 18 00 1A 80 30 00 31 80 2F 00 37 80 2F .....0.1./.7./ファイルの先頭はヘッダ、直後のオフセット$0010にマーカが来ます。その次がスタートビットで、オフセット$0018から4バイト単位で"$AA"のビットが表現されます。最後のオフセット$0038からはストップビットです。
上のダンプリストの結果からわかるとおり、データは大よそ200μs〜400μs程度の単位で変化していきます。これはかなり高速な値で、PCMファイルからデータ変換を試みる場合の障害となります。
たとえば典型的な44.1kHzでのサンプリングの場合、1000μsあたりに取れるサンプル数はわずか44サンプルでしかありません。一番厳しい条件で 倍速ロード、交互にデータが変わったとすると100μs(4サンプル)単位で"0"か"1"の判定を行わなければなりません。実際には途中からデータが変 化した場合を考慮して、更に少ないサンプル数で確実に判定が行え る方法をとる必要があるでしょう。
※Windows標準のWAVファイルに対して周波数解析をかけ、T77ファイルを抽出するツール「WAV2T77」がApollo氏のXM7お手伝いぺ〜じから入手できます。あわせてご覧下さい。