ubuntuでつくるDOSアプリ
- 2025/03/07 11:21
- カテゴリー:備忘録, マニアックなおはなし
実は,先日からubuntuの導入に四苦八苦しておりました。
今どきのLinuxだからなんの苦労もなく,イメージをダウンロードしてUSBメモリに書き込んでブートすれば1時間後には使えるようになってるだろうと思っていたので,四苦八苦していると「なにをやってるんだ私は???」と思う事もしばしばでした。
といいつつ四苦八苦した理由は簡単で,古い古いMacBookAirをターゲットマシンにしたからです。MacBookAirのLate2010という今から15年の前マシンです。当時円高が進んで,10万円を割るというので,11インチという小ささを生かした,メールなどの生活マシンとして買いました。
メインメモリは長持ちさせたいという理由で4GBにしましたし,キーボードもUSです。今も思うのですが,大きさといい重さといい,キーボードの感触といい,このマシンはとても使い心地がいいです。
そんなですから,電池は交換してありますし,SSDも240GBにしてあります。しかし,OSのサポートが早々に打ち切られたことと,CPUパワーの不足もあって,現在はM1のMacBookAirです。(これも買ってから5年もたつのか・・・)
しばらく死蔵していたのですが,先日PC-386BookLがらみのある事情から,ubuntuを入れて再出発させることを思い立ち,行動を起こしたと言うわけです。
そのある事情というのが,PC-386BookLのメモリへの不安です。
高速のディスクコピーのツールには,EMSを使うものがあります。ところが,EMSを使うとどうもデータが化けるらしく,コピーが正しく行われないのです。
同種のディスクコピーツールを使っても同じ結果が出ますので,メモリが自作である私の場合,メモリテストを行わないと心配です。
もちろん,プロテクトメモリとして実装してありますし,プロテクトメモリとしてのメモリチェックは何度も行ってエラーがないことはわかっていますが,仮想EMSドライバなど相性もあると思いますし,特定の条件下で出るエラーかも知れません。とにかくDOSで標準化された方法で,EMSへのアクセスが正しく行えているかは調べておく必要があるでしょう。
で,そんなツールがないものかと探してみたら,ありました。
https://github.com/pc98user/EMStest
バイナリがないので自分でコンパイルすることになりますが,コンパイルに,見慣れないia16-gcc-elfを使っています。ん?なんじゃこりゃ?
MS-DOSのアプリですのでDOS上のコンパイラ(MS-CとかTurboCとかLSI-Cとか)でコンパイルする物と思っていたら,gccというじゃありませんか。gccって8086に対応してた?もし8086のコードが吐けてもDOSでの実行形式にするためのライブラリは?
なんでも,少し前からLinux上でMS-DOSのクロス開発を行うための,16ビットコードを吐くgccやらライブラリやらの環境整備が行われて,数年前にDOSで動作するアプリケーションをLinuxで作るのが流行ったらしいのです。
そんな面白い事があったのかと不勉強を恥じたわけですが,私の場合Linux環境から作る必要があるので,まずはこのソースをMS-CやTurboCに移植することを試みました。
しかし挫折。全然コンパイルが通りません。さすがに30年も昔のコンパイラですので,エラーが連発しますし,なんとかねじ伏せても,実装すると暴走します。今さらTurboCを勉強しなおすのも面倒なので,これを機会にLinux環境を常備することにしたわけです。
そこで白羽の矢が立ったのが,眠っていたMacBookAir2010です。古いとは言えメジャーなマシンでしたし,遅いとは言えLinuxならそれなりに動くでしょう。
ということで,イメージをダウンロードします。選んだのはubuntu-desktopです。計量のLubuntuなんかも考えましたが,最初はとにかく普通の物を選んでおくことにしました。
バージョンは一番安定していて長くサポートされることを期待して24.04.2LTSにします。これをUSBメモリに書き込み,MacBokAirから起動します。
・・・上手くいきません。
起動にすごく時間がかかる(USB2.0であることを差し引いてもものすごく遅い)上に,画面が真っ黒です。ごく希にインストーラが起動するのですが,これをインストールを行っても,再起動するとやはり画面が真っ暗です。話になりません。
のちにこれは,GPUのドライバが問題である事がわかりますが,この時はそんなこともわかりませんので,1つバージョンを落として22.04.5LTSにしました。
これだと起動も正常,インストールも進み,再起動も可能でした,(画面の右端にチラチラとゴミが出ていますが)
とまあ,ここまで実は丸2日かかっています。いろいろな種類のイメージのダウンロードには結構な時間がかかるし,インストールが終わるまで1時間ほどかかりますから,大変でした。
22.04.5LTSで正常の画面が出たのは,GPUのドライバがnouveauドライバというオープンなものを使っていて,これがMacBookAir2010のGPUであるGeForce320Mを正常に動かすことが出来るからみたいです。24.04.2LTSではこれが未対応のようで,画面が真っ暗になったり崩れた表示になってしまうようでした。
とにかく世界中でMacBookAir2010にubuntuを入れている人はいるだろうから,ここからコツコツやっていこうと腹をくくったのですが,プロプライエタリなドライバ(nvidia-driver-470)を入れてみると,表示のゴミはなくなったかわりに,輝度の調整が出来なくなり,輝度最大に固定されてしまいました。
さすがにこれはつらいので対策を探しましたが,見つかったXorg.confの修正を行っても解決しません。ならばとnVidiaの公式でLinuxに対応したドライバのバージョンを特定してみました。するとnvidia-340というのが該当するというのでインストールを試みるも,すでに公式には存在せず入手は不可能です。
ただ,他の方が残してくれているのでリポジトリに追加してインストールしましたが,なんと再起動後に画面が真っ暗になり,ubuntuのインストールからやり直しです。
ここまでまた丸2日。他の環境設定もやりつつだったので,インストールのやり直しはかなり痛い手戻りになりました。
結局GPUのドライバはいろいろなバージョンを試し,いろいろな設定を試しましたが解決せず,失敗した時のダメージが大きすぎるので断念し,nouveauドライバでいくことにしました。
まあ,輝度調整が出来ないドライバというのも手だと思いましたが,つまりACPIでバックライトの制御が出来ない事を意味しているので,省電力設定でバックライトを消したりできませんから,やっぱり実用は無理があると思います。
ついでに24.02LTSでもドライバの入れ替えなどで試行錯誤を行いましたが,こちらも問題は解決せず。とにかく正常に画面が出ませんので手探りでやるしかなく,あきらめました。
ということは,このMacBookAir24.04.2LTSへの移行は出来なくて,従って2027年移行は使えなくなりますということです。あと2年か・・・Linuxにも見放されるといよいよ厳しいです。
さて,環境設定を進めていきます。WiFiも標準のままで問題なく動作しているのでBroadcomのプロプライエタリなドライバを入れる必要はありません。(いれるとサスペンドからの復帰に失敗するという話もあります)
キーボードのレイアウトを変更したり,.bashrcを書き換えたり,mozcの再コンパイル(初期状態が直接入力になっていて,初期状態をひらがな入力にするには設定を変えて再コンパイルしなければなりません)したりと,なかなかに手間のかかる作業をひととおり終えてみると,そこには普段使い可能なマシンが完成していたのでした。
WEBのブラウザもサクサクとはいいませんが実用レベル,メールもOK。日本語入力も快適に出来ますし,コピーやペーストのショートカットも,タッチパッドのジェスチャによるワークスペースの切り替えも問題なく動いています。
もともとのキーボードの心地よさもあって,ターミナルでのCUI作業は快適で,なにも我慢を強いられません。絶対的な速度の遅さに我慢が強いられる場合もありますし,その割には電池の減りが早いので,M1のMacBookAir2020の進化に改めて感動するのですが,それでも片手でひらひらと持ち運べるMacBookAir2010の身軽さに比べて,ずっしりと重いMacBookAir2020は,AppleがモバイルマシンとしてiPadを割り当てたことを再認識させられます。
さて,ここまでくるのに5日。えらい時間がかかりました。
では,投書の目的のEMStestをコンパイルしてみましょう。実は,ia16-gcc-elfをインストールして指示通りにコンパイルをしただけだと,全然コンパイルできなかったのです。
見つかった記事はHello World!で問題なく実機で実効できたよ,というネタに過ぎず,今回のエラーであるdos.hがありません,なんていう問題の解決方法は,なかなか見つかりませんでした。
ということで,当たり前過ぎて誰も解説しなかっただけの,おそらく初めての日本語によるコンパイルの手順です。
(1)リポジトリを追加し,アップデート
sudo add-apt-repository ppa:tkchia/build-ia16
sudo apt-get update
(2)gcc-ia16-elfをインストール
sudo apt-get install gcc-ia16-elf
(3)nasmをインストール
sudo apt-get install nasm
(4)ライブラリをインストール
sudo apt-get install libi86-ia16-elf
(5)ソースを展開し,コンパイル
ia16-elf-gcc emstest.c emslib.c -li86 -o emstest.com
(6)フロッピーに書き出し,実機に転送し実行
今回はバイナリのサイズが30kB未満ということで,tinyモデルで十分です。そこで実行ファイルはemstest.comとして作成しました。
で,これを実機に転送するわけですが,USBフロッピーディスクドライブをMacBookAir2010に接続すると,さくっと認識されて使えるようになりました。書き込みには管理者権限が必要なのでCUIでsudo cp~としないといけませんが,こんなに簡単に使えて,ubuntuは大したものです。
ドキドキしながらPC-386BookLで実行。
なんら問題なく実行されて,テストが進んでいきます。結局EMSとして使える1616kBは,全エリアエラーを出すことなく,テストをパスしました。
・・・大変でしたが,emstestを実行するためにDOSのコンパイラに移植を試みたところから考えると,3週間ほどかかってしまいました。
ubuntuでDOSのアプリが最新のCで作る事が出来る(MS-CやTurboCのコメントが//ではなく/*でないとエラーになることを知ってめまいがしました)というのもいいし,HelloWorld!どころではないEMSのアクセスという結構難しい物がきちんと動作していることも興味深いです。
そのためにubuntuを整備したことも収穫でしたし,その結果レシピを見るのにキッチンに置いておける小さくて,水がかかったりして壊れても困らないマシンとして,古いMacBookAir2010を用意出来たことも大きいです。
そして,想像以上にubuntuが使い物になること,日常的な作業はこれでなんなくこなせるだろうということがわかった上に,UXも最新のものを取り入れようと貪欲であることも好感触で,もうちょっとしっかりubuntuを使い込んでいこうと思いました。
あ,今偶然見つけたんですが,ia16-gcc-elfって,DOSのバイナリもあったんですね・・・動くんかなあ。