T77フォーマット仕様

目次


はじめに

T77ファイルとは、FM-7のテープをファイルイメージ化したファイルの一つの形式です。FM-7エミュレータXM7の開発にあたり、私が独自に設計したものです。

T77フォーマットは次のような特徴があります。


ここに掲載するフォーマット仕様はVersion 0のもので、XM7 v0.72以降(V2系、V3系含む)に対応します。

フォーマット仕様(Version 0)

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)

1バイトセーブ例

実際に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,$00
ROM 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からはストップビットです。

PCMファイルからのコンバート

上のダンプリストの結果からわかるとおり、データは大よそ200μs〜400μs程度の単位で変化していきます。これはかなり高速な値で、PCMファイルからデータ変換を試みる場合の障害となります。

たとえば典型的な44.1kHzでのサンプリングの場合、1000μsあたりに取れるサンプル数はわずか44サンプルでしかありません。一番厳しい条件で 倍速ロード、交互にデータが変わったとすると100μs(4サンプル)単位で"0"か"1"の判定を行わなければなりません。実際には途中からデータが変 化した場合を考慮して、更に少ないサンプル数で確実に判定が行え る方法をとる必要があるでしょう。

※Windows標準のWAVファイルに対して周波数解析をかけ、T77ファイルを抽出するツール「WAV2T77」がApollo氏のXM7お手伝いぺ〜じから入手できます。あわせてご覧下さい。


$39
yasushi@tanaka.ネット