まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:16bit

しばらく開発を続けていたアプリケーションがある程度動くようになってきたので公開します。

今回公開するのは doscurl です。その名前の通り「16bit の PC-DOS 環境で動く curl」を目指してオープンソースで開発していました:
2026052401
(↑ 16bit PC-DOS 環境で doscurl を何のオプションもつけずに実行(=ヘルプ表示)したところ)


doscurl を実際に利用するにはこの GitHub リポジトリをクローンして、cpp/doscurl.exe を 16bit PC-DOS にコピーするか、あるいはこのリンク先から doscurl.exe を直接ダウンロードして 16bit PC-DOS にコピーしてください。

ただし、大きな注意点があります。この doscurl を実際に使うには2つの厳しめの前提条件を満たしている必要があります:
(1)16bit PC-DOS 環境があること(Windows のコマンドプロンプト不可)
(2) (1) に mTCP を導入した TCP/IP ネットワークが有効になっていること

まず(1)の環境が手元にある、という人自体が珍しいと思っています。ただ doscurl は 16bit PC-DOS 向けにクロスコンパイルされたツールなので、実機はもちろん VM やエミュレータでもよいので 16bit PC-DOS 環境がないと doscurl は何の意味も持ちません。

次に(2)、これも(1)と同等またはそれ以上に高いハードルだと思ってます。一般的な 16bit PC-DOS 環境には TCP/IP スタックがありません。TCP/IP を使うには別途そのためのパケットドライバや TCP/IP スタックとなるライブラリ/ツールをインストールして、IP アドレスが割り振られた状態が必要になります。しかもそれだけではなく、その TCP/IP スタックは mTCP でないといけない、という条件も付いています(doscurl が mTCP スタックを前提に作られているからです)。

実機で PC-DOS 環境を持っている場合はともかく、VM やエミュレータ(DOSBox など)だとこの(2)の条件がかなり厳しいはずです。比較的多くの人が使っているであろう DOSBox はネットワーク未対応なので×、VM はインストール FDD などを持っていることが前提となるので、かなり限られた人だけが使っている PC-DOS 環境になっているはずです。

ただ、そんなあなた向けにこの(1)と(2)を同時に、それもエミュレータで解決する手順を私の過去ブログで紹介しています。ネットワーク拡張された DOSBox-X + mTCP + NE2000 パケットドライバを使って PC-DOS で TCP/IP を利用可能にするための手順です。要するにこの方法で doscurl の実行環境を用意することができます
DOSBox-X で TCP/IP を利用可能にする

※なお DOSBox-X ではなく VM で同様の環境を作った人の記事を見つけました。こちらも参考にさせていただきました:
Let's get TCP working with MS-DOS


TCP/IP の使える(mTCP 付属の ping.exe などでネットワーク疎通まで確認しておいてください)PC-DOS 環境に上述の doscurl.exe をコピーすることで PC-DOS でも curl コマンドを利用することができるようになります:
2026052402

なぜか "End: heap is corrupted!" というメッセージが表示されてしまいます。ライブラリ側の制約のようです。申し訳ないですが気にしないでください。(解決済み)


なお、doscurl の制約事項として「TLS 未対応」があります。わかりやすく言うと「https 未対応」です。16bit の TLS ライブラリがなく、自作を試みたのですがメモリ空間が全く足りずに諦めました。その代わりに「プロクシ対応」は実装済みです。例えば https://www.ibm.com/ に対して doscurl で "GET /" したい場合の手順は以下のようになります:
1. プロクシサーバーの用意

例えば Squid Proxy Server を使うなどして doscurl からアクセス可能なサーバー上にプロクシサーバーをインストールします:
例: docker run -d --name squid-proxy -p 3128:3128 ubuntu/squid:latest 2. プロクシサーバーを指定して doscurl 実行

"--proxy" オプションを付けて doscurl を実行する
例: doscurl --proxy http://(proxy server):3128 http://www.ibm.com/

現実問題として、今ドキの HTTP サーバーの多くは HTTPS サーバーなので、https には対応したかったのですが、メモリ空間の事情であきらめました。その代わり、プロクシサーバーを経由することで課題を解決できるようにはしています。


Windows 環境で 16bit PC-DOS 用アプリケーションのクロスコンパイルをする機会がありました。Watcom コンパイラのオープンソース版である Open Watcom(V2) を使ってその環境構築を実施するための一連の手順をまとめました:

2026051700


【ダウンロード】
Open Watcom 最新版はこちらからダウンロードできます:
https://github.com/open-watcom/open-watcom-v2/releases/tag/Current-build

2026051601

Open Watcom (V2) にはCコンパイラと Fortran コンパイラがあります。今回用意するのは C コンパイラなので、"open-watcom-2_0-c" で始まるファイルから自分のシステムに合ったもの(例えば Windows 11 であれば "open-watcom-2_0-c-win-x64.exe")を選んでダウンロードします。


【インストール】
ダウンロードしたファイルを実行してインストールします。ちょっと特殊なインストーラーでスクリーンショットが撮れなかったのですが、途中でインストール先ディレクトリを指定する箇所があります。私はデフォルト設定(C:\WATCOM)のままインストールしました。

インストール後、Windows 11 向けの環境変数を設定します:
環境変数
WATCOMC:\WATCOM
INCLUDE%INCLUDE%;%WATCOM%\h;%WATCOM%\h\nt
PATH%PATH%;%WATCOM%\binnt


これで Open Watcom V2 コンパイラが使えるようになりました。


【試しに WATTCP を 16bit PC-DOS 向けにクロスビルド】
実際に 16bit PC-DOS 向けのクロスビルドができるかどうかの確認をしてみます。今回は TCP/IP ライブラリである WATTCP(Watt-32) を 16bit PC-DOS 向けにクロスビルドしてみます。

以下、Windows 用の git がインストール済みであることを前提とします。インストール済みでない場合はこちらからダウンロード&インストールしておいてください。

WATTCP のソースコードは GitHub リポジトリから入手可能です。コマンドプロンプトを開き、git clone します(以下のコマンドの場合は C:\WATTCP というディレクトリ名でクローンしています):
> cd \

> git clone https://github.com/gvanem/Watt-32 WATTCP

> cd WATTCP

ビルド用の環境変数 WATT_ROOT を設定します:
> set WATT_ROOT=c:\WATTCP

Open Watcom C コンパイラ用に設定します:
> configur.bat watcom

上のコマンドで watcom_*.mak というファイルが大量に作られます。これらが Open Watcom C コンパイラ用の Makefile です。特に watcom_s.mak というのが 16bit PC-DOS 環境用の Makefile です:
2026051701

※ watcom_l.mak も "16-bit" と記載されていますが、実際作ると 32bit 用だったように見えました

この watcom_s.mak を使って 16bit PC-DOS 向けのクロスビルドを実行します:
> wmake -h -f watcom_s.mak

クロスビルドに成功すると lib\wattcpws.lib というライブラリファイルが作られます:
> cd ..\lib

> dir

2026051702

無事に 16bit WATTCP ライブラリをビルドすることができました。


このページのトップヘ