パソコン通信用インタプリタ for MS-DOS (1993年2月)
【概 要】
 このプログラムは,MS-DOS全盛時代に,パソコン通信ホストへのアクセスやアーティクルの読み書き,プログラムのダウンロードなどを自動的に実行してくれるプログラムとして開発しました.

 通信用簡易言語で書かれたコマンドファイルを読み込み,書かれた命令を逐次解釈しながら通信を自動的に実行する一種のコマンドインタプリタです.用意されているコマンド(命令)には通信処理用だけでなくファイルを取り扱うものも含まれていますのでバッチファイルとしての応用も可能でした.通信処理用のシェルプログラムという意味でCMSH.EXE(Communication Shell)と呼んでいます。

 このプログラムは,工学社発行のI/O誌平成5年4月号に掲載されました。
 以下,当時に作成しました説明書の中から特徴などを抜き書きしてみました。

【特  徴】
 CMSH.EXEの特徴は次のとおりです.
・大域変数だけでなく局所変数が使用できる.
・引数付きのサブルーチンやユーザー定義関数が記述できる.
・サブルーチンやユーザー定義関数は再帰呼出しが可能である.
・予約語や変数名などの識別子は,大文字小文字の区別がある.予約語は全て小文字に統一されている.
・構造化プログラミングが可能である.

【動作環境】
 次の機種でMS-DOSバージョン3以上にて動作可能です.
 ・PC-9801(初期のものやハイレゾタイプは除きます.EPSON互換機でも動くと思います)
 ・J3100,FMR,IBM-PC(各シリーズ機全機種について動作確認した訳ではありません)
 それぞれ実行ファイルは次のとおりです.
  CMSH_98.EXE (PC-9801用)
  CMSH_FM.EXE (FMR用)
  CMSH_AT.EXE (IBM-PC用)
  CMSH_J3.EXE (J3100用)
 お好きなものをCMSH.EXEにリネームして使用してください.

【起動方法】
 DOSプロンプトから
   >cmsh commandfile [argument ... ]
で起動します.
 command fileは,この後に述べる簡易言語文法に従って記述されたコマンドファイルであるものとします.commandfileの実行を終わると特に指定がない限りDOSに戻ります.後述しますonexitコマンドの指定によりターミナルモードとすることもできます.

 commandfileに続くargumentはcommandfileに引き渡すことができます.実行中のプログラムはESCキーを押すことにより強制停止させることもできます.commandfileは約64キロバイトまでの大きさのものが実行できます.これを越えるような場合には起動時にエラー表示を行いDOSに戻ります.

【ダウンロード】
実行ファイルcmsh.lzh(cmsh.exe + ソースファイル)
マニュアルhtml
ご利用条件html

◎ プログラムサンプル ◎

 BBS『ATLAS』への自動ログインを題材に,CMSH簡易言語文法によるプログラム例を一つ示します.
 『ATLAS』は,私が個人運営している草の根BBSのネット名です.(現在は閉局しています)
;
;   ATLAS 自動ログイン
;
;-------------------------------------------------------------------------
;   定数変数の設定
;-------------------------------------------------------------------------

    OFF = SUCCESS = SJIS = CR = 0
    ON = FAIL  = JIS = !OFF
    CRLF = 2

;-------------------------------------------------------------------------
;   ID, PASSWORD 等の設定(この部分を書き換えて利用する)
;-------------------------------------------------------------------------

    speed = 1200
    port = 1
    $mdminit = "atz\r"
    $mdmset = "atx4\r"
    $dial = "atdp 0785815610\r"
    $atlasid = "GUEST\r"
    $atlaspsw = "ATLAS\r"

;-------------------------------------------------------------------------
;   通信ポート等の設定
;-------------------------------------------------------------------------

    parameter speed, 8, 1, 0, port  ; 8bit, 1stop, non_parity
    xflow   ON                      ; XON/XOFF flow controle on
    rscsflow ON                     ; RTS/CTS flow controle on
    code    ON, SJIS                ; S controle off, Using Sjis kanji
    termcode CR, CRLF               ; terminate charactor type setting
    monitor ON                      ; display monitoring on

;-------------------------------------------------------------------------
;   モデムの準備チェック
;-------------------------------------------------------------------------

    if( getcts() == 0 ) then
        print   "モデムが準備できていません. 確認をしてください."
        while( !getcts() )      ; モデムレディになるまでループ
        endwh
    endif

;-------------------------------------------------------------------------
;   接続リトライ回数等の設定
;-------------------------------------------------------------------------

    retrys = 3                      ; リトライ回数 3 回
    retrytime = 5                   ; リトライ間隔 5 秒

;-------------------------------------------------------------------------
;   ホストへアクセス
;-------------------------------------------------------------------------

    print   "ATLASに接続します."

    while( (retrys = retrys -1) >= 0 )

        send    $mdminit            ; モデム初期化
        waittime    2
        send    $mdmset             ; モデム設定
        waittime    2
        send    $dial               ; ダイヤリング

        ; 回線接続待ち
        timeout     60
        waitstr     "BUSY", "NO CARRIER", "NO DIALTONE", "CONNECT"
        if(status == 4) then
            if(instr($status, "REL")) then
                mnp = ON
            else
                mnp = OFF
            endif
        else
            switch( status )
            case 1:
                print   "話中です."
                break
            case 2:
                print   "接続失敗です."
                break
            case 3:
                print   "NTT からのダイヤルトーンが検出できません."
                break
            default:
                print   "タイムアウトです."
            endsw
            waittime    retrytime
            continue
        endif

        ; ログイン手続き
        timeout 5
        waitstr "User ID ="
        if( status ) then
            send    $atlasid
            waitstr "PASSWORD="
            if( status  ) then
                send    $atlaspsw
                break
            endif
        endif

        print   "ログイン失敗です."
        dtr     OFF                 ; 回線強制切断
        waittime    retrytime
        dtr     ON
        continue

    endwh

    if(retrys < 0) then
        print   "規定回数リトライしましたが全て失敗です."
        exit    FAIL
    else
        print   "ログインしました."
    endif

;-------------------------------------------------------------------------
;  マニュアル操作に切換え
;-------------------------------------------------------------------------

    terminal
    exit    SUCCESS