simh V3.8-1のvax.exeを利用してOpenVMS VAXを動かしています。OpenVMSからWindowsにファイルを送るために、simhの仮想磁気テープのファイルを使おうと思います。OpenVMS側は、磁気テープをANSI X3.27 Level 3に準拠した構造にしているそうです。ANSI X3.27の構造には詳しくありませんが、仕様書をネットで見つけましたので、調べてみようと思います。
ファイル構造を調べるため、OpenVMS側でファイルをテープに格納してみて、そのファイルがWindows側でどのように見えるかを確かめてみようと思います。そのファイルの16進ダンプは、次のようになりました。
00000000 50 00 00 00 56 4F 4C 31 53 49 4D 48 20 20 20 20 P...VOL1SIMH
00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00000020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00000030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00000040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
00000050 20 20 20 33 50 00 00 00 50 00 00 00 48 44 52 31 3P...P...HDR1
00000060 54 45 53 54 31 2E 54 58 54 20 20 20 20 20 20 20 TEST1.TXT
(以下略)
ANSI X3.27の仕様書によれば、「VOL1」とか「HDR1」というのが、規定されている構造を示す文字列のようです。それでは、その前にある「50 00 00 00」というのは何でしょうか。当初、これもANSI X3.27の規格で定められている情報かと思ったのですが、そうではなさそうです。
ネットで情報を探ってみると「SIMHで古代UNIXを再現(2)」を見つけました。この中に「SIMHのテープフォーマットは、SIMH Magtape Representation and Handlingに解説があります。」という記述があります。この「SIMH Magtape Representation and Handling」を確認してみると、SIMHの都合により、実データの前後に「Leading Length」と「Trailing Length」が入るようです。これが「50 00 00 00」なのでしょう。
ひとまず、SIMH側が挿入する情報の構造は判明しました。この段階で、仮想磁気テープのファイルをアクセスしてみるプログラムを組んでみました。これを拡張すれば、ANSI X3.27の構造を表示するプログラムになると思います。
#!/usr/bin/python3
def readrecord(f):
global TapeMark
len0 = int.from_bytes(f.read(4),'little')
if len0 == 0:
TapeMark += 1
if TapeMark >= 2: raise EOFError
return 0
TapeMark = 0
data = f.read(len0)
len1 = int.from_bytes(f.read(4),'little')
print(TapeMark, len0, data[:4], data[4:16])
return 0 if len0 != len1 else len0
def readblock(f):
while True:
if readrecord(f) == 0: break
TapeMark = 0
with open("test-tu81.tap","rb") as f:
while True:
try:
readblock(f)
except EOFError:
break
#[EOF]
0 件のコメント:
コメントを投稿