ラベル vax の投稿を表示しています。 すべての投稿を表示
ラベル vax の投稿を表示しています。 すべての投稿を表示

2025-05-10

外部環境で作成したコマプロをOpenVMSで動かす

Windows10上でsimh V3.8-1のVAX.EXEを用いて、OpenVMS VAX V7.2を動かしています。OpenVMS側で全て作業すれば問題ないはずですが、外部環境(Windows側とか、WSL環境とか)で作成したファイルをOpenVMS側に持ち込んで何かしようとすると、ひと手間かける必要があります。何をすれば良いのか分かってしまえば簡単なことなのですが、そこに至るまでは試行錯誤の連続でした。

 

ひとつの例として、外部環境で作成したOpenVMS用のコマンドプロシージャ(通称:コマプロ)をOpenVMSが動かすことを考えます。例えばFreeBSD環境で作成したコマプロがあるとしましょう。これをOpenVMS側に持ち込むには、いろいろな方法があるとは思いますが、ISOファイルを経由させます。FreeBSD側ではmkisofsを使ってISOファイルを作ります。これをsimhでデバイスにattachしておけば、OpenVMS側でマウントできます。ここで問題になるのは、ISOイメージの中にあるコマプロを直接実行しようとしてもエラーになることです。 


FreeBSDで作成したファイルなので、当然ながら、行末がLFになっています。このようなファイルをOpenVMSでは認識できないので、dir/fullで見ると「Record format:      Undefined, maximum 0 bytes, longest 0 bytes」となっています。そこで以下のコマンドで変換すればよいようです。

set file/attr=(RFM:STMLF) sample.com

 

 これを行えば、dir/fullで「Record format:      Stream_LF, maximum 0 bytes, longest 0 bytes」となるので、コマプロとして実行してもエラーになりません。

 

分かってしまえば簡単なことでしたが、ここに至るまでは苦労しました。Webで情報を検索しても、OpenVMSを利用している人が少ないためか、参考となる事例が見つかりませんでした。漠然としたアイディアとしては、FDLとかconvertなどを使うのではないかと考えたりして、かなり迷宮をさまよいました。最終的にGeminiにお伺いをたてたところ、ヒントが得られました。しかしGeminiの回答は、おそらくChatGPTもそうでしょうが、ハルシネーションのせいなのか、かなりもっともらしいものの微妙に誤りを内在しているものでした。役には立つのですが、盲目的な信頼をおくのは考えものかと思います。

 

2025-05-06

simhの仮想磁気テープファイルをTAR形式ファイルに変換

Microsoft Windows10上のsimh V3.8-1 VAX.EXEを用いてOpenVMS V7.2の環境を作成しています。OpenVMS側からWindows10側にファイルを持ってくる方法を考えてみました。OpenVMS側ではTU-81で磁気テープにファイルを書き出せば、実はsimhにおける仮想磁気テープファイルとしてWindows10側でアクセスできます。この方法で何でもファイルを持ってこられるわけではないと思いますが、少なくともテキストファイルならば問題ないでしょう。

 

OpenVMSがTU-81に書き込む際にはANSI X3.27で規定されたフォーマットになっているようです。ここから、最低限としてテキストファイルを取り出せればよいとします。ただし複数ファイルが格納される可能性を考慮しておきます。ファイルを一つずつ取り出しても構わないのですが、ちょっと気をきかせて、TAR形式ファイルに変換しておこうかと思います。

 

変換スクリプトはWindows10上のWSL2にインストールしてあるUbuntu環境でPythonを使用しました。いろいろと不完全ではあるのですが、仮想磁気テープファイルに格納されているファイルを取り出してTAR形式ファイルに変換するスクリプトができました。

  • ANSI X3.27のヘッダ情報を解釈すれば長いファイル名にも対応できるのですが、それは見送りました。
  • 当面はテキストファイルだけで良いので、それ以外のファイル形式は未対応としました。
  • スクリプトで大域変数を多用していて、あまり良くないのですが、改善するのは将来の課題としました。

 

作成したスクリプトは、次のようになりました。Pythonでtarfileモジュールを使うと、簡単にTAR形式ファイルを作成できて、ありがたいことです。

 

#!/usr/bin/python3
import os
import sys
import tarfile

def vol1(r):
    # print("{}".format(r[:4]))
    # print("\t" "Volume Identifier[{}]".format(r[4:10]))
    # print("\t" "Accessibillity[{}]".format(r[10]))
    # print("\t" "Owner Identifier[{}]".format(r[37:51]))
    # print("\t" "Label-Standard Version[{}]".format(r[79]))
    return

def hdr1(r):
    global FileName
    global fd
    FileName = r[4:21].strip()
    fd = open(FileName,"w")
    # print("{}".format(r[:4]))
    # print("\t" "File Identificer[{}]".format(r[4:21]))
    # print("\t" "File-Set Identificer[{}]".format(r[21:27]))
    # print("\t" "File Section Number[{}]".format(r[27:31]))
    # print("\t" "File Sequence Number[{}]".format(r[31:35]))
    # print("\t" "Generation Number[{}]".format(r[35:39]))
    # print("\t" "Generation Version Number[{}]".format(r[39:41]))
    # print("\t" "Creation Date[{}]".format(r[41:47]))
    # print("\t" "Expiration Date[{}]".format(r[47:53]))
    # print("\t" "Accessibility[{}]".format(r[53]))
    # print("\t" "Block Count[{}]".format(r[54:60]))
    # print("\t" "System Code[{}]".format(r[60:73]))
    return

def hdr2(r):
    global RF
    RF = r[4]
    # print("{}".format(r[:4]))
    # print("\t" "Record Format[{}]".format(r[4]))
    # print("\t" "Block Length[{}]".format(r[5:10]))
    # print("\t" "Record Length[{}]".format(r[10:15]))
    # print("\t" "Buffer-Offset Length[{}]".format(r[50:52]))
    return

def hdr3(r):
    # print("{}".format(r[:4]))
    # print("\t" "RMS attribute[{}]".format(r[4:68]))
    return

def hdr4(r):
    # print("{}".format(r[:4]))
    # #print("\t" "Reserved[{}]".format(r[4:79]))
    # print("\t" "Filename[{}]".format(r[5:67]))
    # print("\t" "Length[{}]".format(r[67:69]))
    return

def eof1(r):
    fd.close()
    tar.add(FileName)
    os.remove(FileName)
    # print("{}".format(r[:4]))
    # print("\t" "File Identificer[{}]".format(r[4:21]))
    # print("\t" "File-Set Identificer[{}]".format(r[21:27]))
    # print("\t" "File Section Number[{}]".format(r[27:31]))
    # print("\t" "File Sequence Number[{}]".format(r[31:35]))
    # print("\t" "Generation Number[{}]".format(r[35:39]))
    # print("\t" "Generation Version Number[{}]".format(r[39:41]))
    # print("\t" "Creation Date[{}]".format(r[41:47]))
    # print("\t" "Expiration Date[{}]".format(r[47:53]))
    # print("\t" "Accessibility[{}]".format(r[53]))
    # print("\t" "Block Count[{}]".format(r[54:60]))
    # print("\t" "System Code[{}]".format(r[60:73]))
    return

def eof2(r):
    # print("{}".format(r[:4]))
    # print("\t" "Record Format[{}]".format(r[4]))
    # print("\t" "Block Length[{}]".format(r[5:10]))
    # print("\t" "Record Length[{}]".format(r[10:15]))
    # print("\t" "Buffer-Offset Length[{}]".format(r[50:52]))
    return

def eof3(r):
    # print("{}".format(r[:4]))
    return

def eof4(r):
    # print("{}".format(r[:4]))
    return

LABELS = {
    "VOL1":vol1,
    "HDR1":hdr1,
    "HDR2":hdr2,
    "HDR3":hdr3,
    "HDR4":hdr4,
    "EOF1":eof1,
    "EOF2":eof2,
    "EOF3":eof3,
    "EOF4":eof4,
}

def fixed(d):
    return

def variable(d):
    i = 0
    while i < len(d):
        try:
            l = int(d[i:i+4])
        except ValueError:
            break
        # print("{} {:04d} {:04d} {}".format(FileName, i, l, d[i+4:i+l]))
        fd.writelines(d[i+4:i+l])
        fd.write("\n")
        i = i + l

def spanned(d):
    return

RECORDS = {
    "F":fixed,
    "D":variable,
    "S":spanned,
}
RF = ""

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).decode()
    len1 = int.from_bytes(f.read(4),'little')

    label = data[:4]
    if label in LABELS:
        LABELS[label](data)
    else:
        #print(TapeMark, len0, data[:4], data[4:16])
        # print("DATA({})".format(len0))
        RECORDS[RF](data)

    return 0 if len0 != len1 else len0

def readblock(f):
    while True:
        if readrecord(f) == 0: break

TapeMark = 0
FileName = ""
fd = 0
tar = 0

tar = tarfile.open("tap2tar.tar.gz","w:gz")
with open(sys.argv[1],"rb") as f:
    while True:
        try:
            readblock(f)
        except EOFError:
            break
tar.close()
#[EOF]

2025-03-26

「FH2$W_RECATTR」の構造がわからない

simh V3.8-1のvax.exeを使ってOpenVMS  VAX V7.2を動かしています。OpenVMS側にあるファイルをWindows側に持ってくるため、simhの仮想磁気テープのファイルを使用する方法を考えています。他にも方法はあると思いますが、技術的興味から、しばらくはこの方法を追求してみようと思っています。

 

OpenVMS側で作成した磁気テープはANSI X3.27 Level 3に準拠した構造になるようです。マニュアル『Guide to OpenVMS File Applications』の「1.3.1. ANSI-Labeled Magnetic Tape」に情報があります。その「1.3.1.6.3. HDR3 Label」では「These attributes are converted from 32 bytes of binary values to 64 bytes of ASCII ...」のような記述があります。さて、この32バイトの情報は、具体的にはどのようなものなのか調べているのですが、核心の情報にたどり着けていません。

 

ODS2を操作する何かのプログラムの一部らしき箇所に「struct RECATTR」という構造体がありました。この中の要素を数えると、32バイト分ありましたので、多分これがそうなのかもしれません。しかしプログラムのソースファイルに書かれているということは、何か出典となる情報に基づいていると思われますが、それが何なのか見つからないのです。

手元に『VMS File System Internals』(ISBN 0-13-931783-X)があるので調べてみると、「Figure 2-2: Format of the Header Area」の中に「FH2$W_RECATTR (32 bytes)」という箇所を見つけました。多分これのことだろうと思うのですが、32バイトの詳細構造がわかりません。

 

同書の「2.4.1 Directory Structure」では、「The last word of the directory file's record attributes area (FAT$W_VERSIONS) is ...」のような記述があるところを見ると、何か構造があって然るべきなのですが、その構造を記した情報にたどり着けません。

 

この構造がわからなくても、OpenVMS→Windowsの情報転送には困らない感触があるので、わからないならわからないで構わないとは思います。しかし何かに書かれているのであれば、それを知りたいところです。

2025-03-22

OpenVMSのRMS attributesにおける「32 bytes of binary values」って何?

simh V3.8-1のvax.exeを使ってOpenVMS VAX V7.2の環境を整えようとしています。ひとまずOSを入れることはできています。今後の作業を考えると、OpenVMS側からWindows側にファイルを持っていく方式を考えておこうと思っています。TU-81で磁気テープを使おうと思いますが、実際には仮想環境なので、現実にはsimhの仮想磁気テープのファイルを扱うことになります。磁気テープはANSI X3.27形式が使われているようなので、その構造を理解しようと思います。

 

OpenVMSにおける磁気テープの構造は『Guide to OpenVMS File Applications』に詳しい情報があります。ここで「1.3.1.6.3. HDR3 Label」には、次のような記述があります。

The RMS attributes describe the record format of a file. These attributes are converted from 32 bytes of binary values to 64 bytes of ASCII representations of their hexadecimal equivalents for storage in the HDR3 label.

 

HDR3にはRMS attributesが格納されており、その32バイトのバイナリ値が64文字のASCII文字列として表現されているというのです。つまり1バイトが2文字ですから、いわゆる「16進ダンプ」のような見た目なのでしょう。それは良いのですが、「RMS attributes」というの何でしょうか。

 

「RMS attributesのことなら、もう既にご存知かと思いますが」と言うかのような感じです。しかし私は何のことかわからないので、調べてみなければなりません。おそらく何かのマニュアルに詳しく記述されていると思います。それを探し出そうと思います。

simhのvax.exe上で動作させるOpenVMS VAXにおける仮想磁気テープのファイル構造

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]

2025-03-18

OpenVMS VAXに接続する端末エミュレータのためのキーマップ設定におけるTera TermとRLogin

simh V3.8-1のvax.exeを使ってOpenVMS VAX V7.2をインストールしました。まだOSを入れただけですが、simhではDZデバイスをTCP/IPで接続できるので、端末エミュレータからログインできるようになりました。端末エミュレータとして、昔はTera Termを利用していたのですが、ずいぶん前からRLoginに移行しています。端末エミュレータを使い分けるのは面倒なので、できればRLoginを使いたいとは思いますが、ひとまずTera TermとRLoginで使い勝手を検討します。

 

まずログインするだけであれば、Tera TermでもRLoginでも、いずれも可能でした。ただし注意が必要なのは、ログイン先がOpenVMSだということです。Tera TermもRLoginもVT端末の動作を再現しようとしており、VT端末のエスケープシーケンスにも対応しているようなのですが、キーボードの扱いがどうなっているのか、気になります。

 

そもそも、DECのVT端末でつかわれているLK201キーボードと、PCの109キーボードとでは、違う点があります。

  1. ファンクションキーは、LK201では20個ありますが、109キーボードでは12個しかありません。
  2. 109キーボードのテンキーにおける「+」キーは、LK201では「-」と「,」として別のキーになっています。
  3. カーソルキーの上部にある6個のキーの役割が、LK201と109キーボードでは、配置が異なります。

 

Windows上で動作する端末エミュレータは、109キーボードを使いますが、VT端末として操作するためにはLK201と同等の操作ができる必要があります。このためには、上述した違いを吸収するために、キーマップ設定をおこなわなければなりません。

 

端末エミュレータで実現できるか否かを確認するまえに、どのようなキーマップ設定とするか方針を決めておきます。

  1. LK201のファンクションキーは20個あり、109キーボードの12個では数が足りません。そこで、F1~F10を使うことにして、F11~F20は、Shift+(F1~F10)で実現することとします。
  2. 109キーボードのF11とF12が余りますが、これはLK201のF15とF16に割り当てます。OpenVMSではF15を「Help」として、F16を「Do」として使っています。これらは使用頻度が高いので、押しやすいようにF11とF12を使います。
  3. カーソルキーの上部にある6個のキーは、LK201と109キーボードで配置が異なります。例えば、「Ins」と「Del」が109キーボードでは左端にありますが、LK201では「Insert」と「Remove」は右上にあります。ここで考えるのは、109キーボードの刻印を無視してLK201の配置に合わせるのか、LK201の配置を無視して109キーボードの刻印に合わせるのかという選択です。もし日常的にLK201を利用しているのであれば、身体が配置を覚えているでしょうから、LK201の配置に合わせたほうが良いでしょう。しかしキーの刻印を参照しながら操作するのであれば109キーの刻印に合わせた方が良いことになります。私自身は、LK201を使用する機会はありませんので、109キーボードの刻印を見ながら操作することになると思うので、キーボードの刻印に合わせてエスケープシーケンスが送出されるように設定します。
  4. 109キーボードのテンキーには「+」しかありませんが、LK201では「-」と「,」の2つのキーがあります。これを実現するため、テンキーの「+」は「,」に割り当てることとして、Ctrl+「+」を「-」にしました。

 

このような方針を実現できるように、端末エミュレータのキーマップ設定をおこないます。設定ができているか否かは、OpenVMSの「EVE(EDIT/EVE)」や「EDT(EDIT/EDT)」で確かめます。

 

Tera Termの場合は「KEYBOARD.CNF」というファイルに対応関係を記述するようです。EVEやEDTで確かめましたが、問題なさそうです。

 

RLoginは、設定画面を使います。Tera Termとはキーマップの考え方が違うようで、Microsoft Windowsの仮想キーコードを使って割り当てをおこなうようです。ところが、この方式だとVT端末と同等の挙動を実現できませんでした。LK201はテンキーの上部にPF1~PF4が割り当てられており、特にPF1は「GOLD」として使われます。ところが109キーボードでは「NUMLOCK」なので、例えばテンキーの「7」は、NUMLOCKの状態によって「7」だったり「Home」だったり変化します。このため仮想キーコードも「PAD7」と「HOME」となり、特に「HOME」の場合は、カーソルキー上部にある「Home」と区別することができません。

 

普段は、Tera Termではなく、RLoginを使用しているので、OpenVMSもRLoginにしたかったのですが、そうもいかないようです。OpenVMSを操作するときだけはTera Termにするしかないのかなと思います。

2025-03-10

simhのDZデバイスでOpenVMS VAX V7.2に接続

simh V3.8-1のvax.exeを使用してOpenVMS VAX V7.2の環境を構築しています。今のところは、OS本体を入れてだけです。今後は様々な環境構築をしていくつもりですが、そのためにも、作業しやすくするために端末環境を整えておこうと思います。

 

vax.exeから起動したままでは、OSからはLA36として認識されています。これはDEC Writer IIとして知られているもので、VT100のような端末よりも旧い、キーボードとプリンターが一体化したようなものです。当然ながらスクリーンエディタは使用できませんので、ファイルを編集するにはラインエディタを使うことになります。さすがに操作性が悪いので、なんとかしたいところです。

 simh V3.8-1のvax.exeには、DZデバイスが用意されています。これはDZV11 Terminal Multiplexerというもので、本物のVAXであれば複数の端末をぶら下げることができるはずです。simhでは「ATTACH DZ <port>」とすることで、TELNET接続を受け付けることができます。<port>は何でもよいようですが、「23」にしておけば、通常のTELNETポートになります。

 

この状態で、Tera Term V5.4.0から繋いでみました。繋ぐだけなら問題ないのですが、オプションを適切に設定する必要があります。昨今はUTF-8が主流なので、デフォルトではエンコーディングが「UTF-8」になっています。しかしこのままでは、ログイン後にエディタを起動すると、エスケープシーケンスが正しく解釈されないようです。どうやらエスケープシーケンスをUTF-8として解釈しようとして失敗しているようでした。そこでエンコーディングを「EUC」にします。これでうまくいったようです。「sh term/full」の結果は、以下のようになりました。

Terminal: _TTA0:      Device_Type: VT300_Series  Owner: SYSTEM

   Input:    9600     LFfill:  0      Width:  80      Parity: None
   Output:   9600     CRfill:  0      Page:   24

Terminal Characteristics:
   Interactive        Echo               Type_ahead         No Escape
   No Hostsync        TTsync             Lowercase          Tab
   Wrap               Scope              No Remote          Eightbit
   Broadcast          No Readsync        No Form            Fulldup
   No Modem           No Local_echo      Autobaud           No Hangup
   No Brdcstmbx       No DMA             No Altypeahd       Set_speed
   No Commsync        Line Editing       Overstrike editing No Fallback
   No Dialup          No Secure server   No Disconnect      No Pasthru
   No Syspassword     SIXEL Graphics     Soft Characters    Printer port
   Numeric Keypad     ANSI_CRT           No Regis           No Block_mode
   Advanced_video     Edit_mode          DEC_CRT            DEC_CRT2
   DEC_CRT3           No DEC_CRT4        No DEC_CRT5        No Ansi_Color
   VMS Style Input

 

ついでにRLogin V2.30.2.1でも試してみます。こちらでもオプションを適切に変呼する必要がありました。Tera Termの経験をもとにエンコーディングを「EUC」にしてみましたが、それだけでは駄目でした。さらにエスケープシーケンス「8454」を「Reset(C1制御文字を処理する)」に変更します。当初は「Set(C1制御文字を無視する)」になっていたので、うまくいかなかったようです。「sh term/full」 の結果は、以下のようになりました。

 Terminal: _TTA1:      Device_Type: VT500_Series  Owner: _TTA1:
                                              Username: SYSTEM

   Input:    9600     LFfill:  0      Width:  80      Parity: None
   Output:   9600     CRfill:  0      Page:   24      

Terminal Characteristics:
   Interactive        Echo               Type_ahead         No Escape
   No Hostsync        TTsync             Lowercase          Tab
   Wrap               Scope              No Remote          Eightbit
   Broadcast          No Readsync        No Form            Fulldup
   No Modem           No Local_echo      Autobaud           No Hangup
   No Brdcstmbx       No DMA             No Altypeahd       Set_speed
   No Commsync        Line Editing       Overstrike editing No Fallback
   No Dialup          No Secure server   No Disconnect      No Pasthru
   No Syspassword     SIXEL Graphics     Soft Characters    Printer port
   Numeric Keypad     ANSI_CRT           Regis              No Block_mode
   Advanced_video     Edit_mode          DEC_CRT            DEC_CRT2
   DEC_CRT3           DEC_CRT4           DEC_CRT5           Ansi_Color
   VMS Style Input

 

双方を詳しく調べたわけではありませんが、Device_Typeが、Tera TermではVT300_Seriesなのに対して、RLoginではVT500_Seriesになっています。

 

ひとまずTera TermやRLoginから接続できるようになりました。これならDEC Writer IIよりも快適になるでしょう。しかし次の難問は、キーボード自体にあります。DEC LK201は、PCのキーボードとは違いがあります。しかも、エディタを使う上で、それが影響するのです。この問題をTera TermやRLoginで如何に解決するかが、課題になります。

2025-03-08

OpenVMS VAX V7.2インストール時にDECnet Phase IVを入れるか否か

simh V3.8-1のMicrosoft Windows用vax.exeを使用してOpenVMS VAXの環境を作ろうとしています。OS本体のインストールはできているのですが、simh側設定やOpenVMS側のインストールオプションなどをどのようにするか考えているところです。最終的な目標は、OpenVMS VAXの動作環境を作ってみることであって、そこで何か実用的な用途を期待しているわけではありません。

 

OpenVMS VAX V7.2をインストールする最中にオプション要素をインストールするか否かを選択しなければなりません。例えばDECwindowの要否を選択するのですが、GUI環境は無くて良いだろうと判断しています。その他には、DECnet-PlusやDECnet Phase IVの要否も選択しなければなりません。DECnetはPlusもPhase IVも不要という判断も考えられます。

 

そもそもDECnetを有効としたところで、通信相手が存在しないのです。20年ほど前であれば、LinuxにもDECnetのためのコードが入っていたそうですが、もう10年以上前に除去されてしまったそうです。DECnetの通信相手がいないなら、DECnetオプションは入れなくても良いとも考えられます。

 

そういうわけで、DECnet-PlusもDECnet Phase IVも不要としてOSをインストールしてみました。ところがOSを使ってみると予期しないエラーが出るのです。網羅的に確認したわけではないのですが、「license list」というコマンドを打つと次のようなエラーが出ます。

 %SMG-F-UNDTERNOS, undefined terminal - couldn't access system terminal table

 

試しにDECnet Phaase IVを有効にしてOSをインストールしてみて、同じコマンドを打ってみたら、エラーもなく正常に処理されました。これだけでは、OSインストール時にDECnetを有効とするか否かが原因だとは即断できませんが、DECnet-PlusもDECnet Phase IVも入れずにOpenVMS VAX V7.2をインストール完了させると、何やら不具合が出そうな予感がします。

 

DECnetは通信相手がいないので、正直なところインストールしたくありませんが、入れないと良くないことが置きそうなので、DECnet Phase IVを保険として入れておこうかと思います。

2025-02-24

SIMH CLASSICのvax.exeはEthernet対応と非対応がある

Hobbyist OpenVMS VAXをsimh VAXで動かしてみようとして、いろいろと調査しています。まずsimhですが、simh自体は依然よりありましたが、最近はOpen SIMHというものがあります。その経緯は「Announcing the Open SIMH project」に書かれているとおりですが、これが存在するために従来のsimhはSimH "Classic"と呼ばれるようになりました。

 

新しい方を使ってみたい気もしますが、今回は従来版を使います。その主たる理由は、Windows用のバイナリが提供されているからです。FreeBSDやLinuxなどをホスト環境にするなら、最新版のソースを自分でビルドするのは簡単です。しかしWindowsをホスト環境として使おうと思っており、コンパイラなどは入っていないので、既にビルドされたバイナリを利用しようと考えています。公式サイトに置いてあるので、それを使うつもりです。

 

当初はSIMH 3.9-0のvax.exeを使うつもりでした。しかしネット上で見つかる情報を参考にしても、どうも挙動が異なります。特にネットワークデバイスを扱おうとするとエラーになります。

VAX simulator V3.9-0
sim> show xq
XQ, address=20001920-2000192F*, vector=250, MAC=08:00:2B:AA:BB:CC, type=DELQA-T,mode=DELQA, poll=100, not attached
sim> show version
VAX simulator V3.9-0 [64b data, 64b addresses, no Ethernet]
sim>


何が悪いのか不明でしたが、公式サイトにあるドキュメントを読んでも、解決に至りません。特に「SIMH FAQ」では次のように書かれています。ここで記されているように、「The pre-compiled binaries」は「Ethernet support」が有効なのです。ただしWinPCAPが入っているのが前提ですが、Wiresharkを利用していることもあり、インストール済です。

 2.2 How do I install SIMH with Ethernet support on Windows?
The pre-compiled binaries will provide Ethernet support depending on whether or not the WinPCAP package has been installed on the host computer. (以下略)

 

なかなか解決できなかったので、SimH Classicの古いバージョンのバイナリで試してみようと考えました。公式サイトを核にすると、ビルド済バイナリは、2種類あるようです。

simhv38-1-exe-ether.zip    2009-02-08 11:08     763K     
simhv38-1-exe.zip    2009-02-08 11:07     2.6M     

ファイル名に「-ether」がついている方のバイナリを利用してみたら、うまくいくようです。

VAX simulator V3.8-1
sim> show xq
XQ, address=20001920-2000192F, no vector, MAC=08:00:2B:AA:BB:CC, type=DELQA, poll=100, not attached
sim> show version
VAX simulator V3.8-1 [64b data, 64b addresses, Ethernet support]
sim>

 

「show version」で出力を見れば、Ethernetサポートの有無は一目瞭然なのですが、「show xq」の出力だけを見ていると、Ethernetサポート無しでも、サポートされているかのような出力が出てくるので、なかなか気づけませんでした。

 

またSimH ClassicはV3.12-5が最新ですが、ビルド済バイナリが公式サイトに置かれていません。しかもV3.9-0には「-ether」の付いたファイルも置かれていないのです。そうなると、自前でビルドしないなら、Ethernetサポート済なのは、V3.8-1となります。

2025-02-23

OpenVMS Hobbyというサイトを発見

simhを利用して、Hobbyist OpenVMS VAX V7.2かV7.3をインストールしてみるため、参考資料をネット上で探しています。そうすると「OpenVMS Hobby」というサイトを見つけました。2022年頃に生まれたようです。

 

このサイトの「The Purpose of This Site」には、以下のように記されています。

 I have created this site because while I have found lots of information and tutorials covering all of the above, it required a lot of searching, it uncovered a lot of out-of-date and misleading or contradictory information, and I had to go through a lot of trial and error to figure out exactly what worked and what didn’t. While I don’t deny that was all fun, I decided to provide a site where — at the very least — all of the information and research and working examples I have gone through can be shared with anyone else wanting to go through the same journey.

 

これを読んで、誰でも同じことを考えるのだと思いました。私も同様に、情報をネット上で探していると、雑多な情報に混乱することがあります。全く情報が見つからないよりはマシですが、自分にとって必要な情報を選び出していくことになります。その過程を楽しんでいるのは間違いないですが、楽しくも苦しい道のりです。

 

このサイトの情報は、とても参考になると思います。ただし、私の場合は若干環境が異なるので、完全に真似できるわけではなさそうです。

  1. OpenSimh V4を利用しているようだが、simh V3.9を使う。このため、エミュレートするのは、VAX 8600ではなく、MicroVAX 3900になる。
  2. インストールするのは、OpenVMS VAX V7.1ではなく、Hobbyist OpenVMS V7.2かV7.3になる。
  3. ホスト環境はLinuxのようだが、Microsoft Windows 10を使う。

Hobbyist OpenVMS VAXのISOイメージをbitsaves.orgで発見

simh VAXを利用してOpenVMS VAXをインストールしてみるために、手持ちのCD-ROMからISOファイルを生成するために、試行錯誤しました。ひとまずISOファイルはできたので、もはや済んだ話ではありますが、ネット上にISOファイルが存在していたのを発見しました。

 

DECの資料を探すために、以前からbitsavers.orgを利用しています。膨大な資料が置かれているので、隅々まで見ているわけではなかったので、見落としていたのかもしれません。「OVMS_7.2_Hobbyist」というディレクトリには、Hobbyist OpenVMS VAX V7.2のISOファイルが圧縮されて置いてありました。また別のディレクトリにもHobbyist OpenVMS VAX V7.3のISOファイル(圧縮済)がありました。


自分で態々苦労してISOファイルを生成する必要はなかったのかもしれません。試行錯誤して、いろいろと経験できたのは、それはそれで成果だったのかもしれません。

2025-02-21

OpenVMS Hobbyist VAXのCD-ROMをファイルに書き出す

もう四半世紀ほど前、OpenVMS Hobbyist ProgramからOpenVMS VAX V7.2とV7.3のCD-ROMを入手しました。また時期は異なりますが、VAXstation 3100/M76なども入手しました。しかしこのワークステーションにはCD-ROMドライブが付いていなかったので、インストールすることはできませんでした。その後にOpenVMS Hobbyist Programは廃止されてしまい、VAX用のPAKを入手する手段が断たれてしまいました。

 

OpenVMS VAX用のPAKは、真偽のほどは不明ですが、HPなのかVSIが知りませんが正規に購入することができるようです。ただし気軽に購入できるような価格ではないようです。しかしながら、PAKがなくてもインストールしてみるくらいはできるはずです。インストールした後も使い続ける気があるなら、PAKを入れる必要がありますが、技術的興味でインストールしてみるだけであれば、PAK無しでもなんとかなるでしょう。

 

 2004年1月22日付の「Running VAX/VMS Under Linux Using SIMH」という記事を参考に、ちょっと試してみようと思います。この記事が書かれたのは20年ほど前なので、同じ手順で実行できるとは限りません。また記事は、Linux上のsimhを利用しているようですが、私はWindows上のsimhを使おうと思います。これらの環境が異なることで何かに躓くかもしれませんが、それを解決するのも技術的関心の一環です。

 

 記事の中では、CD-ROMの内容をファイルに書き出してsimhから参照するような手順になっています。ddコマンドでファイルに書き出していますので、私の場合も同様に行ってみました。手元にはFreeBSD/amd64 14.2-RELEASE-p1の環境があるので、これを使うつもりでした。ところがCD-ROMをアクセスできず、この操作がエラーになってしまいます。

 

次に、Windows10上のWSL2を利用してみようかと考えました。WSL2では Ubuntu 24.04.2 LTSを使っています。ところで、WSL2上のUbuntuでは、Windows PC本体のCDドライブをどのようにしてアクセスしたら良いのでしょうか。少なくとも/dev/cdromのようなデバイスファイルはありませんでした。ネットを検索してみると「mount -t drvfs D: /mnt/D」とすれば良いという情報がありましたが、エラーになってしまいます。

 

最後の手段として、Windows10上にインストールしてあった「HxD Version 2.5.0.0 (x86-64)」を使ってみました。これを使えば、管理者モードとして起動する必要がありましたが、CD-ROMの内容をファイルに書き出すことができました。