OpenWatcom で DOS のプログラムを作成する

 ちょっと DOS のバッチファイルの中で、ランダムな時間スリープする必要があり、OpenWatcom で作ってみました。

 以下のようなプログラムです。

/* rand_s.c*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char *argv[]) {
    int seed, max, s;
    char *p;

    seed = time(NULL);
    max = 30;
    if( argc == 2 || argc == 3) {
        p = argv[argc - 1];
        while( p && *p ) seed += *p++;
        if( argc == 3 )
            max = atoi(argv[1]);
    }

    srand(seed);
    s = rand() % max;
    printf("sleep %d sec\n", s);
    sleep(s);
    return 0;
}

 現在時刻と引数で指定した文字列を種に乱数 (0~29) を発生させ、その時間だけ sleep するプログラムです。

 OpenWatcom 用の環境変数 (PATH, WATCOM, INCLUDE) を設定して以下のようにコンパイルします。

$ wcl -q rand_s.c -bcl=dos

 ここで生成される実行形式は、DOS の 16 bit 形式です。64 bit の Windows OS では実行できません。32 bit の Windows10 で実行したところ、NTVDM を追加する必要がありました。

 また、ここで生成した実行形式は、実行中にコマンドプロンプトが英語モードになりました。

 とりあえず、目的としたことは実現できたので、問題はありません。

 Raspberry Pi(ARM) なので OpenWatcom を使いましたが、x86 なマシンであれば、Microsoft が無償で公開している Visual Studio Community を使ったほうが良いと思います。

OpenWatcom

Posted by sirius