OS/2マシンにネットワークプリンターを繋ぐ2020年04月19日 16:09

一番下がPX-203、その上がEP-979A3、一番上がBJC-35vII

昨年の夏、エプソンのEP-979A3を購入しました。次の機種が出てお手ごろな価格になっていたのと、 手差しですがA3の用紙が使えることで購入に踏みきりました。

さて、わたしの所では、OS/2が現役で動いています。すでに、IBMのサポートが終了し20年になるでしょうか。 使う上でいろいろと制約があります。新しいハードウェアに対応していないし、最近のソフトウェアテクノロジーにも 対応していません。だからといってWindowsですべて賄う気にはなりません。 重いし、よくトラブルし、いらない物がてんこ盛りだし。 起動すると「すべてお任せください」なんて表示してくるけれど安心できないです。

と言う訳で、OS/2からネットワーク越しにEP-979A3を接続できないかと検討してみました。結果を先に述べると、 モノクロ印刷との制限がありますができました。考えたよりも簡単に接続できました。

プリンター・ドライバーは、OMNIJドライバーに"OMNI.Epson Generic ESC2P"があります。これを使ってみます。 EP-979A3はエプソンの製品なので、ESC/Pぐらいはサポートしているだろうと予想しました。

Windows PCとプリンタを共用を考慮するとネットワーク越しの接続になります。LANサーバーの環境では WindowsとOS/2の接続は、SambaサーバーやNetDriveなどを使う必要がありそうでやめました。残る手段はTCP/IPの 印刷サービスである"lpd"と"lpdportd"を使う方向で考えます。

方針が決まりましたので、早速、構築してみます。

まずは、TCP/IPの構成です。"TCP/IP シャドー"ホルダーの "TCP/IP 構成"ホルダーの"TCP/IP 構成(ローカル)"アイコンをクリックして"TCP/IP 構成ノート ブック"を開きます。

"自動始動"タブのベージで、"lpd"と"lpdportd"の"自動開始サービス"にチェックマークを入れ、全景セッションを 選択します。"lpdportd"には、実行時のログが取れるように"パラメーター"に"-t"を追加します。(プリンターのホスト名や IPアドレスも登録すると後で便利です。)

ここでOS/2を再起動して、"lpd"と"lpdportd"が正常に起動することと、プリンターがネットワークに接続していることを 確認します。

次に、プリンター・ドライバーのインストールです。"ftp.software.ibm.com"から、 "OMNIJP.EXE"を入手します。 "OMNIJP.EXE"を実行するとたくさんのファイルが出てきます。

"OMNI.DRV"アイコンをクリックすると、これまたたくさんの プリンターのアイコンが出てきます。

その中なら"OMNI.Epson Generic ESC2P"をデスクトップにドロップします。

それでは、プリンター・ドライバーの設定をします。

デスクトップにドラッグしたプリンタのアイコンのプロパティーを開きます。"プリンター・ドライバー"タグで "省略時のプリンター・ドライバー"が"OMNI.Epson Generic ESC2P"になっていることを確認します。 "出力ポート"タブで"出力ポート"で"\PIPE\LPD0"を選択します。


そのアイコンをダブルクリックして "\PIPE\LPD0 - 設定"パネルを開き、
  1. "プリント出力先"の"LPDサーバー"にプリンターのホスト名を
  2. "プリント出力先"の"LPDプリンター"にプリンターの装置名を
  3. "プリント・ソース"の"ホスト名"にプリンターをセットアップしているPCのホスト名を
  4. "プリント・ソース"の"ユーザー"に適当なユーザー名を
それぞれ記入し、"印刷ポート設定の表示"にチェックを入れます。印刷が安定してできるようになったらば チェックを外します。

"アイコン"タブの"タイトル"にプリンターの適当な名前を入れておきます。"ep-979a3(Generic ESP2C)"に しました。

以上で設定はすべて終わりです。

テスト印刷をします。印刷の前に、プリンターの"ジョブのアイコン表示"を開き、 "状況の変更"メニューで"保留"にしておきます。また、 "ep-979a3(Generic ESP2C) - ジョブのアイコン表示"の左肩のアイコンの"オープン"の"ポート表示"を選択すると "スプーラー - ポート表示"パネルが開き、"\PIPE\LPD0"がアイドル状態になっているのが 分かります。

まず、テキストエディターEPMから印刷します。EPMで"\AUTOEXEC.BAT"を開きそのまま、印刷してみます。 "ep-979a3(Generic ESP2C) - ジョブのアイコン表示"にスプールされたジョブが表示されます。ジョブの保留を 解除すると少し間が空き、印刷が始まります。印刷結果を見ると、印刷領域の上部が非常に狭かったので、 "プリンター・プロパティー"の"用紙サイズ"で、上下左右のマージンを1cmに設定し"プリントレイアウト"で 上マージンを30mmに、下マージンを10mmに、左右のマージンを15mmに設定し、良好な結果を得ています。

Open Watcom IDE -- Cからとアセンブラールーチンを呼び出す2018年03月02日 17:34

Open Watcom IDEをいじるに当たり、ただ漠といじってもつまらないので、 PC-DOS用のシェルの作成を計画しました。もちろんネタ本があります。 CQ出版社から1989年7月20日に出版された「Allen Holib著 横山和由訳 MS-DOS用Shellの実現 (On Command: Writing a Unix-Like Shell for MS-DOS)」です。 本棚の肥やしになっていたのを引っ張り出してきました。この本を購入した頃は、 まだまだ、コンパイラーなどのツールが高価で、実際の制作には、踏み切れませんでした。

内容は、丁寧にシェルの実装について、ソースリストを交えて解説してあります。 特に難しい内容ではなく、容易に著者の開発手順をたどり、シェルを作成することができそうです。 原著が書かれたのは、1986年頃で、その当時書き方で、MS-C Ver.4とMASMで記述されています。 現代のコーディングスタイルと比較して、古い書き方をしてあり、私の好みに合わない書き方です。 今回は、現代風のスタイルに合わせて書いていきます。主な変更点は、以下の通りです。

  1. 関数の宣言で、"int"型の変数を明示的に宣言していないのを 全て宣言するようにした。
  2. "unsinged int"型の宣言を "unsinged"としてあるのを、"unsinged int"と記述するようにした。
  3. register変数は、とりあえず使わない。
  4. ユーティリティーライブラリーは複数のソースファイルに分かれているが、共通の インクルードファイルにまとめてプロトタイプ宣言をしている。デバックしづらいので、一つの Cソースファイルに対応して一つのヘッダーファイルを作成しプロトタイプ宣言をするようにした。
  5. 標準関数のプロトタイプ宣言を 直接コーディングしてあるのを ヘッダファイルをインクルード するようにした。
  6. Static属性の付いた関数は、そのままではデバッグしづらいので、コンパイル時に"DEBUG"を定義してないときは、 static属性をつけてコンパイルをするように"#ifndef DEBUG"を関数の宣言に追加した。
  7. 制作にはOpen Watcom C/C++コンパイラーとWASMを使用する。
  8. 開発はOS/2で行い、デバッグはOS/2のPC-DOS窓で行う。

開発はC:ドライブに"Shell"ディレクトリを作成し、その中にコードを書くこととしました。

前準備ができたので、まずは、手始めに、Cのmain()関数から、 アセンブラーで記述した関数foo()を呼び出す練習をしました。 ソースコードは、下記の通りです。

          /* callasm.c */
          #include 
          #include "foo.h"

          int main() {
             int p;

             p = 7;
             printf("%d => %d\n",p,foo(p));
             return 0;
          }
          /* foo.h */
          extern int foo(int);
          ; foo.asm
          _text    SEGMENT BYTE PUBLIC 'CODE'
          _text    ENDS
          _data    SEGMENT WORD PUBLIC 'DATA'
          _data    ENDS
          const    SEGMENT WORD PUBLIC 'CONST'
          const    ENDS
          _bss     SEGMENT WORD PUBLIC 'BSS'
          _bss     ENDS
          dgroup   GROUP const,_bss,_DATA
                   ASSUME  CS:_text, DS:dgroup, SS:dgroup, ES:dgroup
          _text    SEGMENT
          ; ---------------------------------------------------------------------
          ;        foo(int val)
          ;        val=bp+4
          _foo     PROC NEAR
                   PUBLIC _foo
                   push bp
                   mov bp,sp
                   mov ax,[bp+4]
                   shl ax,1
                   mov sp,bp
                   pop bp
                   ret
          _foo     ENDP
          _TEXT    ENDS
                   END

Wasmは、MASM互換といわれているので、一発でうまくいくと思っていたのですが、だめでした。 ビルドしてみると、下記のようにリンケージでエラーが出ます。callasm.cで呼び出している関数foo()は、 コンパイルされると、"foo_"となるようです。

          cd C:\SHELL\SAMPLE
          wmake -f C:\SHELL\SAMPLE\callasm.mk -h -e C:\SHELL\SAMPLE\callasm.exe
          wasm FOO.ASM -i="E:\WATCOM/h" -ms -fp0 -w4 -e25
          Open Watcom Assembler Version 1.9
          Portions Copyright (c) 1992-2002 Sybase, Inc. All Rights Reserved.
          Source code is available under the Sybase Open Watcom Public License.
          See http://www.openwatcom.org/ for details.
          FOO.ASM: 27 lines, 0 warnings, 0 errors
          wcc callasm.c -i="E:\WATCOM/h" -w4 -e25 -zp2 -od -fp2 -fpi87 -bt=dos -fo=.obj -ms
          Open Watcom C16 Optimizing Compiler Version 1.9
          Portions Copyright (c) 1984-2002 Sybase, Inc. All Rights Reserved.
          Source code is available under the Sybase Open Watcom Public License.
          See http://www.openwatcom.org/ for details.
          callasm.c: 11 lines, included 773, 0 warnings, 0 errors
          Code size: 60
          wlink name callasm d all sys dos op m op maxe=25 op q op symf @callasm.lk1
          Error! E2028: foo_ is an undefined reference
          file callasm.obj(C:\SHELL\SAMPLE\callasm.c): undefined symbol foo_
          Error(E42): Last command making (C:\SHELL\SAMPLE\callasm.exe) returned a bad status
          Error(E02): Make execution terminated
          Execution complete
というわけで、foo.asm内の"_foo"を"foo_"に編集し再ビルドしました。
          ; foo.asm
          _text    SEGMENT BYTE PUBLIC 'CODE'
          _text    ENDS
          _data    SEGMENT WORD PUBLIC 'DATA'
          _data    ENDS
          const    SEGMENT WORD PUBLIC 'CONST'
          const    ENDS
          _bss     SEGMENT WORD PUBLIC 'BSS'
          _bss     ENDS
          dgroup   GROUP const,_bss,_DATA
                   ASSUME  CS:_text, DS:dgroup, SS:dgroup, ES:dgroup
          _text    SEGMENT
          ; ---------------------------------------------------------------------
          ;        foo(int val)
          ;        val=bp+4
          foo_     PROC NEAR
                   PUBLIC foo_
                   push bp
                   mov bp,sp
                   mov ax,[bp+4]
                   shl ax,1
                   mov sp,bp
                   pop bp
                   ret
          foo_     ENDP
          _TEXT    ENDS
                   END

再ビルドしてみると、エラーはなくなりました。

          cd C:\SHELL\SAMPLE
          wmake -f C:\SHELL\SAMPLE\callasm.mk -h -e C:\SHELL\SAMPLE\callasm.exe
          wasm FOO.ASM -i="E:\WATCOM/h" -ms -fp0 -w4 -e25
          Open Watcom Assembler Version 1.9
          Portions Copyright (c) 1992-2002 Sybase, Inc. All Rights Reserved.
          Source code is available under the Sybase Open Watcom Public License.
          See http://www.openwatcom.org/ for details.
          FOO.ASM: 27 lines, 0 warnings, 0 errors
          wlink name callasm d all sys dos op m op maxe=25 op q op symf @callasm.lk1
          Execution complete

テストです。

          C:\SHELL\SAMPLE>callasm
          7 => 3522

アセンブラールーチン"foo"は、受け取った引数を左に1bitシフトする事で受け取った引数を2倍して値を返します。 結果は、"14"になるはずですが、そうなっていません。確認のため、 "callasm.c"のコンパイル結果を見るためにコンパイルリストをコンパイラーに吐かせようとしましたが、"wcc"のオプションに 該当するものが見当たらいません。調べてみると"Open Watcom Assembler"Wikiの"Disassembler"の項目に、 以下の記述を見つけました。

          The assembler does not have listing facilities; instead the use of
          wdis for generating listings is recommended.

この指示に従い、callasm.objを"wdis"で、逆アセンブルしてみました。

          Module: C:\SHELL\SAMPLE\callasm.c
          GROUP: 'DGROUP' CONST,CONST2,_DATA

          Segment: _TEXT BYTE USE16 0000003C bytes
          0000                          main_:
          0000    B8 18 00                  mov         ax,0x0018 
          0003    E8 00 00                  call        __STK 
          0006    53                        push        bx 
          0007    51                        push        cx 
          0008    52                        push        dx 
          0009    56                        push        si 
          000A    57                        push        di 
          000B    55                        push        bp 
          000C    89 E5                     mov         bp,sp 
          000E    81 EC 04 00               sub         sp,0x0004 
          0012    C7 46 FE 07 00            mov         word ptr -0x2[bp],0x0007 
          0017    8B 46 FE                  mov         ax,word ptr -0x2[bp] 
          001A    E8 00 00                  call        foo_ 
          001D    50                        push        ax 
          001E    FF 76 FE                  push        word ptr -0x2[bp] 
          0021    B8 00 00                  mov         ax,offset DGROUP:L$1 
          0024    50                        push        ax 
          0025    E8 00 00                  call        printf_ 
          0028    83 C4 06                  add         sp,0x0006 
          002B    C7 46 FC 00 00            mov         word ptr -0x4[bp],0x0000 
          0030    8B 46 FC                  mov         ax,word ptr -0x4[bp] 
          0033    89 EC                     mov         sp,bp 
          0035    5D                        pop         bp 
          0036    5F                        pop         di 
          0037    5E                        pop         si 
          0038    5A                        pop         dx 
          0039    59                        pop         cx 
          003A    5B                        pop         bx 
          003B    C3                        ret         

          Routine Size: 60 bytes,    Routine Base: _TEXT + 0000

          No disassembly errors

          Segment: CONST WORD USE16 0000000A bytes
          0000                          L$1:
          0000    25 64 20 3D 3E 20 25 64 0A 00                   %d => %d..

          Segment: CONST2 WORD USE16 00000000 bytes

          Segment: _DATA WORD USE16 00000000 bytes

これを見ると、"0017"行目から"001A"行目で、"ax"レジスタに引数の値を入れて、 "foo_"を呼び出しているのが分かります。想定外でした。関数の引数は、基本スタックに 積む物だと思っていたのですが、Open Watcom C/C++では違うようです。困りました。アセンブラールーチンを 書き換えたくはありませんので、コンパイラーのオプションスイッチで、切り抜ける方法を探ってみたところ、 該当しそうなオプションスイッチがありました。

          -ecc          set default calling convention to __cdecl
          -ecd          set default calling convention to __stdcall
          -ecf          set default calling convention to __fastcall
          -ecp          set default calling convention to __pascal
          -ecr          set default calling convention to __fortran
          -ecs          set default calling convention to __syscall
          -ecw          set default calling convention to __watcall (default)

OS/2のシステム関数を呼び出すときには、関数に"CDECL"とつけていたように記憶しています。"-ecc"が 怪しいです。まずは、foo.asm中の"foo_"を"_foo"に戻し、"-ecc"をつけて再ビルドしてみました。

          cd C:\SHELL\SAMPLE
          wmake -f C:\SHELL\SAMPLE\callasm.mk -h -e C:\SHELL\SAMPLE\callasm.exe
          wasm FOO.ASM -i="E:\WATCOM/h" -ms -fp0 -w4 -e25
          Open Watcom Assembler Version 1.9
          Portions Copyright (c) 1992-2002 Sybase, Inc. All Rights Reserved.
          Source code is available under the Sybase Open Watcom Public License.
          See http://www.openwatcom.org/ for details.
          FOO.ASM: 27 lines, 0 warnings, 0 errors
          wcc callasm.c -i="E:\WATCOM/h" -w4 -e25 -zp2 -ecc -od -fp2 -fpi87 -bt=dos -fo=.obj -ms
          Open Watcom C16 Optimizing Compiler Version 1.9
          Portions Copyright (c) 1984-2002 Sybase, Inc. All Rights Reserved.
          Source code is available under the Sybase Open Watcom Public License.
          See http://www.openwatcom.org/ for details.
          callasm.c: 11 lines, included 773, 0 warnings, 0 errors
          Code size: 63
          wlink name callasm d all sys dos op m op maxe=25 op q op symf @callasm.lk1
          Execution complete

callasm.objを逆アセンブルした結果は、以下のようになり、関数のパラメーターはスタックに積んで 渡すようになりました。

Module: C:\SHELL\SAMPLE\callasm.c
GROUP: 'DGROUP' CONST,CONST2,_DATA

Segment: _TEXT BYTE USE16 0000003F bytes
0000                          main_:
0000    B8 18 00                  mov         ax,0x0018 
0003    E8 00 00                  call        __STK 
0006    53                        push        bx 
0007    51                        push        cx 
0008    52                        push        dx 
0009    56                        push        si 
000A    57                        push        di 
000B    55                        push        bp 
000C    89 E5                     mov         bp,sp 
000E    81 EC 04 00               sub         sp,0x0004 
0012    C7 46 FE 07 00            mov         word ptr -0x2[bp],0x0007 
0017    FF 76 FE                  push        word ptr -0x2[bp] 
001A    E8 00 00                  call        _foo 
001D    83 C4 02                  add         sp,0x0002 
0020    50                        push        ax 
0021    FF 76 FE                  push        word ptr -0x2[bp] 
0024    B8 00 00                  mov         ax,offset DGROUP:L$1 
0027    50                        push        ax 
0028    E8 00 00                  call        printf_ 
002B    83 C4 06                  add         sp,0x0006 
002E    C7 46 FC 00 00            mov         word ptr -0x4[bp],0x0000 
0033    8B 46 FC                  mov         ax,word ptr -0x4[bp] 
0036    89 EC                     mov         sp,bp 
0038    5D                        pop         bp 
0039    5F                        pop         di 
003A    5E                        pop         si 
003B    5A                        pop         dx 
003C    59                        pop         cx 
003D    5B                        pop         bx 
003E    C3                        ret         

Routine Size: 63 bytes,    Routine Base: _TEXT + 0000

No disassembly errors

Segment: CONST WORD USE16 0000000A bytes
0000                          L$1:
0000    25 64 20 3D 3E 20 25 64 0A 00                   %d => %d..

Segment: CONST2 WORD USE16 00000000 bytes

Segment: _DATA WORD USE16 00000000 bytes

テストです。

          C:\SHELL\SAMPLE>callasm
          7 => 14

成功です。これで、Cからアセンブラールーチンを呼び出す手順を確認できました。一山、越えました。

食わず嫌い2018年02月20日 16:47

最近の作業環境

統合開発環境(IDE)は、苦手です。

今までは、手によくなじんだテキストエディタ用、コンパイル用、デバッグ用そしてツール用の 4つのWindowを開け、ビルド用のバッチファイルを用意して、作業してきました。 実際、Ratforのポーティング作業では、IDEを全く使いませんでした。

これはこれで十分なのですが、時代の流れに逆らうことも なかろうと、このところはOpen WatcomのIDEを使って作業をしています。 まあ、何か改善される事があれば儲けもの程度の感覚です。

正直な所、IDEを使うメリットは、よく分かりません。強いていえば、沢山あるコンパイラーのオプションスイッチを 覚えなくでもよくなったことでしょうか。使い込めば、応用が利くのでしょうが。

さしあたり、 IDEを使い慣れるのが目的ですので、IDEの深みにはまらぬように、用心、用心です。

moveコマンド2017年12月02日 14:58

PC-DOS 2000、OS/2、Windowsには、ファイルを別のディレクトリーに移動す� moveコマンドがあります。同じ名称なのですが、それぞれに個性があります。

まず、PC-DOS 2000では、

A:\>move /?
ディレクトリー間でファイルを移動します。またはディレクトリー名を変更します。

ファイルを移動するには:
MOVE [/Y | /-Y] [ドライブ1:][パス1]ファイル名1[,...] [ドライブ2:][パス2]

ディレクトリー名を変更するには:
MOVE [ドライブ:][パス]ディレクトリー名1 ディレクトリー名2

  /Y        既存のファイルを置き換える場合に確認を取ります。
  /-Y       既存のファイルを置き換える場合に確認を取りません。
            /Y スイッチは環境変数 COPYCMD=/Y を使ってもセットできます。

  [ドライブ1:][パス1]ファイル名1  移動したいファイルの場所と名前を指定します。

  [ドライブ2:][パス2]         移動する先のディレクトリーを指定します。
                           一個のファイルを移動する場合,ファイル名を指定すると
                           移動時にファイル名が変更されます。

  [ドライブ:][パス]ディレクトリー名1  変更したいディレクトリーの名前を指定します。
  ディレクトリー名2                新しいディレクトリーの名前を指定します。
です。移動先に既存のファイルがある時には、確認のメッセージがでます。 実際には、
A:>dir \foo
 ドライブ A にはボリューム・ラベルがありません
 ボリューム・シリアル番号は 9BEB-2015 です
 ディレクトリーは  A:\FOO

.                   17-12-02    8:33
..                  17-12-02    8:33
FILE1    TXT           8 17-12-02    8:59
FILE2    TXT           8 17-12-02    9:00
        4 個                16 バイトのファイルがあります
                       711,680 バイトが使用可能です

A:>dir \bar
 ドライブ A にはボリューム・ラベルがありません
 ボリューム・シリアル番号は 9BEB-2015 です
 ディレクトリーは  A:\BAR

.                   17-12-02    8:33
..                  17-12-02    8:33
FILE2    TXT           8 17-12-02    8:33
        3 個                 8 バイトのファイルがあります
                       711,680 バイトが使用可能です

A:>move \foo\*.* \bar
既存のファイル a:\bar\file2.txt を置き換えますか (Yes/No/All)?n
a:\foo\file1.txt => a:\bar\file1.txt [OK]

A:>dir \foo
 ドライブ A にはボリューム・ラベルがありません
 ボリューム・シリアル番号は 9BEB-2015 です
 ディレクトリーは  A:\FOO

.                   17-12-02    8:33
..                  17-12-02    8:33
FILE2    TXT           8 17-12-02    9:06
        3 個                 8 バイトのファイルがあります
                       710,656 バイトが使用可能です

A:>dir \bar
 ドライブ A にはボリューム・ラベルがありません
 ボリューム・シリアル番号は 9BEB-2015 です
 ディレクトリーは  A:\BAR

.                   17-12-02    8:33
..                  17-12-02    8:33
FILE1    TXT           8 17-12-02    9:06
FILE2    TXT           8 17-12-02    9:00
        4 個                16 バイトのファイルがあります
                       710,656 バイトが使用可能です

の様に、FILE1.TXTだけが移動します。

OS/2では、

[A:\]move /?
MOVE コマンドを使用して、1つのサブディレクトリーから同一
ドライブの別のディレクトリーにファイルを移動します。

構文:   MOVE [drive] [path1]filename1 [path2] [filename2]

ここで:
 [drive] [path]filename1   移動するファイルを指定します。
   [path] [filename2]        新しいファイル名と場所を指定します。

[A:\]

OS/2では、ディレクトリー名の変更はRENAMEコマンドを使用します。

実際には、

[A:\]dir foo bar

 ドライブ A のボリューム・ラベルはありません。
 ボリューム・シリアル番号は 9BEB:2015
 ディレクトリーはディレクトリーは A:\foo

.                 17-12-02   8:33
..                17-12-02   8:33
FILE1    TXT        8  17-12-02   8:46
FILE2    TXT        8  17-12-02   8:33
         4 ファイル         16 バイト使用

 ディレクトリーは A:\bar

.                 17-12-02   8:33
..                17-12-02   8:33
FILE2    TXT        8  17-12-02   8:34
         3 ファイル          8 バイト使用
                                 715776 バイト空き

[A:\]move foo\*.* bar
A:\foo\FILE1.TXT
SYS1083: ファイル名が重複しているか、ファイルが見つから
ないか、またはファイルが使用中です。
        1 個のファイルを移動しました。

[A:\]dir foo bar

 ドライブ A のボリューム・ラベルはありません。
  ボリューム・シリアル番号は 9BEB:2015
   ディレクトリーは A:\foo

.                 17-12-02   8:33
..                17-12-02   8:33
FILE2    TXT        8  17-12-02   8:33
         3 ファイル          8 バイト使用

 ディレクトリーは A:\bar

.                 17-12-02   8:33
..                17-12-02   8:33
FILE2    TXT        8  17-12-02   8:34
FILE1    TXT        8  17-12-02   8:46
         4 ファイル         16 バイト使用
                                 715776 バイト空き

と移動先に同じファイル名のファイルがある場合はエラーになり、 ファイルは移動できません。

Windowsでさらに様子が違います。

move /?
ファイルを移動およびファイルとディレクトリ名を変更します。

複数のファイルを移動するには:
MOVE [/Y | /-Y] [ドライブ:][パス]ファイル名1[,...] 受け側

ディレクトリ名を変更するには:
MOVE [/Y | /-Y] [ドライブ:][パス]ディレクトリ名1 ディレクトリ名2

  [ドライブ:][パス]ファイル名1
                          移動するファイルの場所と名前を指定します。
  受け側                  ファイルの新しい場所を指定します。移動先はドライブ
                          文字とコロン、ディレクトリ名、または組み合わせから成
                          ります。1 つのファイルだけを移動する場合で、その
                          ファイルを移動するときに名前を変更する場合、
                          ファイル名を指定できます。
  [ドライブ:][パス]ディレクトリ名1
                          変更するディレクトリ名を指定します。
  ディレクトリ名2         新しいディレクトリ名を指定します。
  /Y                      移動先の既存のファイルを上書きする前に確認の
                          メッセージを表示しません。
  /-Y                     移動先の既存のファイルを上書きする前に確認の
                          メッセージを表示します。

環境変数 COPYCMD にスイッチ /Y を設定できます。これは、コマンド ラインの /-Y
で無効になります。既定では、MOVE コマンドがバッチ スクリプトから実行され
ていない場合、上書きを確認します。

コマンドラインから直接使う場合とバッチファイルで使用するでは、 動作が違ってきます。

実際には、

A:\>dir \foo \bar
 ドライブ A のボリューム ラベルがありません。
 ボリューム シリアル番号は 9BEB-2015 です

 A:\foo のディレクトリ

2017/12/02  08:33              .
2017/12/02  08:33              ..
2017/12/02  09:06                 8 FILE2.TXT
2017/12/02  09:16                 8 FILE1.TXT
               2 個のファイル                  16 バイト

 A:\bar のディレクトリ

2017/12/02  08:33              .
2017/12/02  08:33              ..
2017/12/02  09:00                 8 FILE2.TXT
               1 個のファイル                   8 バイト
               2 個のディレクトリ         709,632 バイトの空き領域

A:\>move \foo\*.* \bar
A:\bar\FILE2.TXT を上書きしますか? (Yes/No/All):n
A:\foo\FILE1.TXT
        1 個のファイルを移動しました。

A:\>dir \foo \bar
 ドライブ A のボリューム ラベルがありません。
 ボリューム シリアル番号は 9BEB-2015 です

 A:\foo のディレクトリ

2017/12/02  08:33              .
2017/12/02  08:33              ..
2017/12/02  09:06                 8 FILE2.TXT
2017/12/02  09:16                 8 FILE1.TXT
               2 個のファイル                  16 バイト

 A:\bar のディレクトリ

2017/12/02  08:33              .
2017/12/02  08:33              ..
2017/12/02  09:00                 8 FILE2.TXT
               1 個のファイル                   8 バイト
               2 個のディレクトリ         709,632 バイトの空き領域

A:\type movefile.bat
move \foo\*.* \bar

A:\>movefile
A:\>move \foo\*.* \bar
A:\foo\FILE2.TXT
A:\foo\FILE1.TXT
        2 個のファイルを移動しました。
と、コマンドラインから使用した場合とバッチファイル内で使用した場合では動作が 異なっているのが確認できました。

さて、この三者、同じ名前のコマンドでも違いがあり要注意です。 

REXXの練習2017年11月15日 09:04

最近は、OS/2 Warpにはまってます。もちろん、Open WATCOMもインストールしてあります。 この、Open WATCOMにはインストーラーが付属していません。環境変数設定のREADMEがあるぐらいで、 ZIPファイルを展開したあとは、自力で環境整備をする必要があります。マニュアル類もファイルがあるだけで、 ファイル名から内容を想像しながら探す羽目になるでしょうから、REXXの練習をかねて、 マニュアルのオブジェクトを作成するプログラムを作ってみました。

まずは、フォルダーオブジェクトを作成する、CreateFolder.CMDです。

/* CreateFolder.CMD */
Call RxFuncADD "SysLoadFuncs","RexxUtil","SysLoadFuncs"
Call SysLoadFuncs
Options EXMOD

Class = "WPFolder"
SetupCommon = "OPEN=ICON;"
SetupCommon = SetupCommon || "ICONVIEW=NORMAL;"
SetupCommon = SetupCommon || "MINWIN=VIEWER;"
SetupCommon = SetupCommon || "TEMPLATE=NO;"
Objmode = "Update"
Parse Linein ParentObject MyObject Title
Do While (ParentObject \= "" & MyObject \= "" & Title \= "")
    Location = "<" || ParentObject || ">"
    SetupString = SetupCommon || "OBJECTID=<" || MyObject || ">;"
    Ret = SysCreateObject(Class,Title,Location,SetupString,Objmode)
    If Ret = 1 Then
        Say Title "Folder is created successfully"
    Else
        Say Title "Folder creation failed *" Ret
    Parse Linein ParentObject MyObject Title
End
Call SysDropFuncs
Exit

入力ファイルは下記のように、 親になるオブジェクト名、自身のオブジェクト名、フォルダーのタイトルを書いておきます。

WP_DESKTOP WP_WATCOM_FOLDER Open WATCOM
WP_WATCOM_FOLDER WP_WATCOM_C_FOLDER Open WATCOM C/C++ Documents
WP_WATCOM_FOLDER WP_WATCOM_F77_FOLDER Open WATCOM Fortran 77 Documents

これを

       E:WATCOM>CreateFolder < watcom.txt
などとすると、デスクトップ上に"Open WATCOM"フォルダーが作られ、その中に、 "Open WATCOM C/C++ Documents"フォルダーと"Open WATCOM Fortran 77 Documents"フォルダーが できます。

ドキュメントフォルダーに、マニュアルを登録するプログラムは、下記のようになりました。

/* CreateDocsObject.CMD */
Call RxFuncADD "SysLoadFuncs","RexxUtil","SysLoadFuncs"
Call SysLoadFuncs
Options EXMOD

/* Create INF File Object */
Class = "WPProgram"
SetupCommon = "OPEN=ICON;"
SetupCommon = SetupCommon || "EXENAME=D:\OS2\VIEW.EXE;"
SetupCommon = SetupCommon || "ICONVIEW=NORMAL;"
SetupCommon = SetupCommon || "MINWIN=VIEWER;"
SetupCommon = SetupCommon || "TEMPLATE=NO;"
Objmode = "Update"
Parse Linein ParentObject InfFileName ObjectTitle
Do While ParentObject \= "" & InfFileName \= "" & ObjectTitle \= ""
    ParentObject = "<" || ParentObject || ">"
    SetupString = SetupCommon || "PARAMETERS=" || InfFileName || ";"
    Ret = SysCreateObject(Class,ObjectTitle,ParentObject,SetupString,Objmode)
    If Ret = 1 Then
        Say ObjectTitle "Object is created successfully"
    Else
        Say ObjectTitle "Object creation failed *" Ret
    Parse Linein ParentObject InfFileName ObjectTitle
End
Call SysDropFuncs
Exit
これに、登録先のフォルダーオブジェクト名、ドキュメントのファイル名、タイトルを 書き連ねた、下記のようなファイルを読み込ませます
WP_WATCOM_C_FOLDER E:\watcom\c\binp\help\cguide.inf C/C++ User's Guide
WP_WATCOM_C_FOLDER E:\watcom\c\binp\help\clib.inf C Library Reference
                     :
                  途中省略
                     :
WP_WATCOM_C_FOLDER E:\watcom\c\binp\help\wpperrs.inf C++ Diagnostic Message
WP_WATCOM_C_FOLDER E:\watcom\c\binp\help\wprof.inf Profiler
WP_WATCOM_F77_FOLDER E:\watcom\f77\binp\help\clib.inf C Library Refernce
WF_WATCOM_F77_FOLDER E:\watcom\f77\binp\help\cw.inf CauseWay User's Guide
                     :
                  途中省略
                     :
WP_WATCOM_F77_FOLDER E:\watcom\f77\binp\help\wd.inf Debugger Guide
WP_WATCOM_F77_FOLDER E:\watcom\f77\binp\help\wprof.inf Profiler
これに、
       E:WATCOM>CreateFolder < watcomdocs.txt

とすると、"Open WATCOM C/C++ Documents"フォルダーと"Open WATCOM Fortran 77 Documents"フォルダー それぞれに、ドキュメントのオブジェクトが作成されます。

OS/2 Warp Server for e-businessの立ち上げ2017年05月22日 17:48

長いこと眠らせておいたPCに、OS/2 Warp Server for e-businessのセットアップをしました。 H/Wの不具合やら勘違いなどで、結構時間がかかりました。最終的に家庭内超私的FTPサーバーとして、 動いています。

最終的なH/W構成は、以下の通り。いずれもこの10年間に入手したものばかりです。

  • Mother Board: AOpen i855GMEm-LFS
  • CPU: Intel Pentiumn M 2GHz
  • Memry: 2GB
  • Storages
    • E-IDE Primary
      • Master: Seagate製 30GB
      • Slave: Seagate製 40GB
    • E-IDE Secondary
      • Master: LG製 GSA-H44N DVDRAM Drive
      • Slave: (空き)
  • Removable Media: 3.5Inch 2HD FDD
  • Display Adpter: nVIDIA RIVA128 (RAM:4MB)
  • Network: RealTek RTL8139 Ethernet Adapter
  • Sound: (なし)
  • Printer: (なし)

当初、DVDRAM DriveをSlaveに設定していたところ、 不可解な現象に悩まされました(詳細は後述)。

OS/2のインストールは、このバージョンからCD-ROMから起動できるように なりましたので、早速、"インストール"CD-ROMをDVDRAMドライブに入れて 電源を入れると、一見順調に起動するのですが、指示に従いCD-ROMを"ServerPak"に入れ替えて 動き出すと、エラーメッセージを表示しインストールプロセスが停止してしまいます。

原因をつかみたくても、皆目訳がわからない状態なので、インストール用ディスケット 3枚を 作って従来通りのインストール手順を踏むことにしました。 ついでに、IDEDASDをVer.5.02に置き換えて、"Config.sys"を書き換えました。

IDEDASDの置き換え手順は下記のとおりです。

  1. IDEDASD.EXEを適当なディレクトリーに展開。
  2. インストール用ディスケット 1のコピーを作成。(D1)
  3. D1から"README.INS"を削除。
  4. 展開したIDEDASDのファイルから、"IBM1S506.ADD"と"IBMIDECD.FLT"をD1にコピー。
  5. "DASD32.DMD"を"OS2DASD.DMD"としてD1にコピー。
  6. D1にある"Config.sys"を編集。
    • 第一行目に"SET COPYFROMFLOPPY=1"を追加。
    • 動作確認のため、"IBM1S506.ADD"に"/V"オプションを追加しロード時にメッセージを表示。
                SET COPYFROMFLOPPY=1
                          :
                basedev=ibm1s506.add /V
                          :
      

このインストール用ディスケットを使って導入を開始します。

導入開始時点では、すべてのデバイスドライバは、ディスケットから読み取られます。 "IBM1S506.ADD"がロードされた時点で表示されるメッセージを確認すると、 正常にHDDやDVDRAMドライブが検出されていることが確認できました。

一度目のリブート後作業を進めようとすると、CD-ROMを入れるようメッセージが表示されました。 不思議に思い、再度、リブートして"IBM1S506.ADD"のメッセージを確認すると、 DVDRAMドライブを今度は検出しました。しかし、作業を進めリブートを繰り返していくと、 DVDRAMドライブを検出しないことが多々見受けられました。

"IBM1S506.ADD"以外にもSCSI用デバイスドライバがロードされますが、これらがH/Wの 誤検出をしてるのかと考え、"Config.sys"のSCSI用デバイスドライバをロードする部分をREM化して みましたが、状況は変わりません。

"Config.sys"の変更点は以下の通りです。

                    :
          REM basedev=aha152x.add
          REM basedev=aha154x.add
          REM basedev=aha164x.add
          REM basedev=aha174x.add
          REM basedev=aic7770.add
          REM basedev=aic7870.add
          REM basedev=aic78u2.add
          REM basedev=dpt20xx.add
          REM basedev=flashpt.add
          REM basedev=ql10os2.add
          REM basedev=ql40os2.add
          REM basedev=ql510.add
                    :

となると、悪いのはDVDRAMドライブではないかと、代替え品をと考え、手持ちのCD-ROMドライブを あてがってみたのですが、なにぶん、長期保存品につき不良品になっていました。 残るは、DVDRAMドライブを設定をMASTERにすることぐらいです。先に変更した"Config.sys"を元に 戻し、ついでに"OS2CDROM.DMD"に"/V"オプションをつけロード時にメッセージが表示されるようにしました。

                    :
          device=\os2cdrom.dmd /V
                    :

今度は、リブート後もDVDRAMドライブが確実に検出されるようになり、インストール作業が順調に 進み、完了することができました。

ほかのマシンでは、他社のDVDROMドライブだがSLAVEの設定で問題なく動作しているので、DVDRAMに 問題があり、動作が不安定になったものと思われます。

次に、Display Adpterを"On Board VGA"から"nVIDIA RIVA128"に変更しました。

最終的に、以下のFIXをあてて、導入作業を完了としました。

導入順に示します。FIXは"ftp.boulder.ibm.com"から入手しました。

  • Base Operating System
    1. IC24998.EXE
    2. JFS0905.ZIP
    3. XRJE001
    4. JFS1009.ZIP
    5. XRJE002
  • TCP/IP
    1. IC22633
    2. IC27255
    3. IC27869
    4. UN_2101
  • MPTS
    1. WR_8650

FIXを導入するに当たり、下記のツールを使っています。VFDiskは"hobbes.nmsu.edu"から、 その他は"ftp.boulder.ibm.com"から入手できます。

  • VFDisk -- 仮想ディスケットドライバー
  • Loaddskf -- ディスケット作成ツール
  • CSJ144 -- コレクティブサービスツール