DOSBoxメモ (5) Bochs HDDイメージからようやくブート

もはや話はDOSBox(-X)から離れてBochsになっていますが,DOSBoxからの流れということで,メインのタイトルは “DOSBoxメモ” のまま行きます.

表題の通りBochsにて,やっとHDDイメージからのブートができるようになりました.

動いてみると,BochsはいわゆるDOS/V機を忠実に再現しようと,ハードに対応した設定を細かくしていくので,昔からDOS/V機をいじっている人間にはわかりやすいかもと思いました.

ここで一旦寄り道をして,Bochsで仕立てたHDDイメージ “drivec.img” でDOSBox-Xがブートするかやってみます.

DOSBox-Xが自前のDOSでbootしてから,

mount e /path/to/images/folder
imgmount c e:drivec.img
boot -l c

で,あっさりブートしました.

やはりこれまでDOSBox(-X)でいろいろやってきたHDDのイメージ作成がうまく行ってなかったということが明らかになりました.

方向としては,Bochsでこれからも続けますが,ちゃんと仕立てたHDDイメージは使い回せる事が確認できたのも大きな収穫です.

DOSBoxメモ (4) HDDイメージづくり難航

今は,DOSBOX本家のWikiIMGMOUNTのページを参考に色々やっています.珍しく熟読して,ほとんどこのページに書いてあることをしています.

動作環境はmacOSのDOSBox-Xです.

これまでディスクイメージをqemu-imgで用意したり,ddコマンドで用意しましたが,うまくいかないのでこのWikiに書いてあるとおり,bximageコマンドを試してみようと思いました.このコマンドはBochsというまた別のPCエミュレーターの付属ユーティリティーです.

これも1Slackware流儀で,システムをいじる前にrootになってます.

port install bochs

であっさりインストールできて動きました.

Bochsは「ソフトがなければただの箱」というタイプで,起動可能なメディアを繋がない状態ではDOSBox(-x)のように組み込みのDOSからbootするようなことはありません.

このままBochs使えばいいじゃないかとも一瞬思いましたが,設定方法がまた全然違う流儀で,頭を切り替えるのが嫌なので,ツールだけ利用することにします.

それで,bximageを使って40MBのHDDイメージをこさえて,DOSBox-Xの2番目のドライブとしてマウントして,FreedosのlegacyなFDDとCD-ROMもマウントしてセットアップをすると正常に終了しますが,なんかディスクのサイズが40MBでないし,実際そのできがったはずのHDDイメージからのbootもできません.

書けばそれだけですが,色々試行錯誤して結局作ったディスクイメージからbootできないところで終わります.

流儀の違うBochsを試すことにするかな.その前提としてSlackware ARMで動くかにかかってきます.

Bochsのインストール

  • Slackware AArch64 current 成功
  • Slackware ARM (32bit) 15.0 成功
  • Manjaro AMD64 パッケージがない (ArchLinuxにも)
  • Debian 確認中

いずれも,それぞれのdistroの公式パッケージツール/buildツールを使用2Slackwareはsbopkg.して,flatpakのようなものは使っていません.

DOSBoxメモ (3) DOSBox-X on macOS

ちょっと長期戦になりそうなので,コンソールの切り替えをしないで,調べ物やその他PCでの作業をしながらDOSB0x(-X)をいじれるよう,macOS版のインストールを試みました.

MacでGNUなどのソフトを動かすのにMacPortsを使っています.

port install dosbox

とすると1Slackwareの流儀で,システムをいじる前にrootになっていますので,毎回 “sudo” はしません.

Error: dosbox cannot be installed for the configured build_arch 'x86_64' because it only supports the arch(s) 'i386 ppc'.
Error: Follow https://guide.macports.org/#project.tickets if you believe there
is a bug.
Error: Processing of port dosbox failed

と,エラーになります.インテルCPUの32bitのmacOSは何年も前に廃れたのでbuildスクリプトが間違っているはずですが,どうしようもないです.ダメ元で,

port install dosbox-x

としたら,buildできて動きました.Flatpakは使わなくていいようです.

ちなみに,dosemuは “Error: Port dosemu not found” です.

これでしばらくああでもないこうでもないとやってみます.

Enscriptのトラブルの解決法(冗長)

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

解決策

Slackware1確認したのは,Slackware ARM (32bit) 15.0のみですが,たぶん,AMD64でも大丈夫だと思います.においては “Courier New” のTrue Typeフォント(TTF)をインストールするだけ2後の検証でTrue Typeフォントのインストールは不要であることがわかりました.

もう少し厳密に言えば,enscriptに与えるフォント名を “Courier”, “Courier-Bold” などから, “Courier-New”, “Courier-New-Bold” などに変更する必要があります3むしろ,こちらが必要です.

フリーのCourier Newフォントの取得

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM432bit版. 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

以上でこれまで通り,enscriptとps2pdfで正しい印刷イメージができます.

動作確認できたdistro

上記は,Slackware ARM (32bit) 15.0ですが,Slackware AArch64 currentでも確認できました.

その後,Raspberry Pi OS (64bit) + KDE Plasma Desktopの環境でも試してみました.Debian系で Courier New のTrue Typeフォントをインストールする正攻法は,

apt install ttf-mscorefonts-installer

のようです.これで,Slackware同様にenscriptに与えるフォント名を “Courier-New”, “Courier-New-Bold” などとすることで,正常なPDFができるようになりました.

Enscriptとの格闘(見当外れ)

→ 正しい見解

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript (PS=Postscript形式の出力)により印刷イメージのPSを生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをPDF化すると,どうしても等幅フォントCourierが文字抜けします.全部が出ないわけでなく,ざっと見て大文字だけかと思えばそうでもなく,また数字は “1” 以外全部抜けているようです.

試しにCourierをTimesに変えてみると,全部文字が出ます1等幅でないので,表はぐしゃぐしゃですが😅のでフォントに依存した問題のようです.残念ながらEnscriptに備えられたフォントの中で等幅のものはCourierしかないので,別の等幅フォントをインストールして動くかな,というのが,ここまでの経緯と現在の考えです.

Courierはデータを等幅で印刷するのに非常に優れています.これに代わる等幅フォントがないかとネットでいろいろ調べましたが,少なくとも筆者の趣味に合うものはありませんでした.

そこで,あとの作業が混乱しそうな気もしますが,フリーで出回っている “Courier New” を追加インストールしてみることにしました.Enscriptに大昔, “Monaco” を追加インストールした経験があるはずですが,なんの記録も残っていませんので,ゼロからの出発となります.

想定している手順

  1. フリーのCourier New のTrue Typeのフォント(TTF)をネットで探し出す(たぶん “Courier New.TTF”)
  2. TTFからAFMを作成(事前の調べではLinux用のツールは見つかりませんでしたが,オンラインで変換するサイトが複数あるようです)
  3. Courier New.TTFを正しい方法でホストにインストールする
  4. AFMを/usr/share/enscript/afmに追加し,font.mapを編集する
  5. 自作Perlスクリプトを編集して,これまで “Courier” と指定していたところを “CourierNew” と指定するようにする.
  6. 祈ってパールスクリプトの出力をenscriptにかける
  7. ps2pdf (Ghostscriptの付属品)でPDFに変換して,文字抜けがなければめでたしめでたし

実践

フリーのCourier New

あちこちにありますが,Fonts Geekというサイトから,Courier NewとCourier New Boldをダウンロードしました(ついでにMonacoも).

Linuxのホストへのインストール

Slackware ARM232bit版. 15.0のホストにTrue Typeフォントをインストールする手順を探してインストールします./usr/share/fonts/TTFにコピーしてから,テーブルファイルをupdateするコマンドを実行するような方法だと思いましたが,そのとおりでした.

ダウンロードしたフォントのファイル名は, “Courier New Bold.ttf”などスペースが入っていますが, “Courier-New-Bold.ttf” のように,スペースをハイフンに変えました.また, “Regular” は削除しました.

Updateには,mkfontdirmkfontscaleコマンドを使います.

AFMファイルの作成

AFMは, “Adobe Font Metrics” というらしいです.Enscriptにはこのファイルが必要です.

事前の調査では変換ツールが見つかりませんでしたが,改めて調べると,ttf2afmというツールがSlackware ARM 15.0のホストにインストール済みでした3pdfTeXの一部とman pageに書いてありますが,TeX系はインストールしたつもりはないので出所については詳しくわかりません😅

出力のファイル名については,/usr/share/enscript/afm内の例に習って,例えば “Courier-New-Bold.ttf” に対応するafmは "cnb.afm" としました.

AFMファイルのインストールとmapの修正

さて,AFMファイルができたので,/usr/share/enscript/afmにコピーします.

同じディレクトリーにあるfont.mapの内容に習って追加したAFMファイルを記述します.

祈って実行

自作のPerlスクリプトで,これまで “Courier” としていたところを “Courier-New” と置き換えて実行し,出力ファイルをenscriptで処理してみます.

成功!

うまくいきました.ただし,Monacoに関してはライセンス上の成約からフォントを組み込めないとかメッセージが出ましたが,出力に全く問題ないので良しとします.

PSファイルは,Ghostscript付属のps2pdfでPDF化しています.