🦩

VM上で動かしているFreeDOSの出力をホスト側にコピーしたい

2021/10/17に公開

やりたいこと

FreeDOSVirtualbox上で動かして勉強して(遊んで)います。

少し不便なのが、出力されたテキストをコピーできないことです。
例えばですが、起動直後は以下のように出力されるのですが、
この出力(テキスト)をコピーできない。

これをコピーする方法をこれから記載します。

FreeDOSのVirtualBoxへのインストールについては以下が参考になります。
http://wiki.freedos.org/wiki/index.php/VirtualBox

qemuを使う

qemuを使います。
今回はhttps://qemu.weilnetz.de/w64/qemu-w64-setup-20210825.exeを使用しました。

イメージファイルの変換

Virtualboxでは*.vhdというフォーマットのイメージファイルを使用していました。
VBoxManage.exeを使用して、*.imgのフォーマットに変換します。
コマンドは以下。

VBoxManage.exe clonehd FreeDOS1.vhd freedos.img --format RAW

Windows Terminalのインストール

Windows Terminalをインストールします。

qemuの起動

以下のようにして、qemuを起動します。ポイントは-nographicを指定することです。
公式のドキュメントはこのあたりでしょうか。

qemu-system-i386.exe -nographic -m 32 freedos.img -boot order=c

これでFreeDOSの出力がTerminal上に出ます。

普通に選択出来ます。
(普通に画面のスクロールも出来ます。)

まとめ

Virtualboxが使い慣れているので
なんとか、Virtualboxだけで済ます方法を探してみましたが、
なかなかいい方法が見つかりませんでした。
qemuの-nographicオプションが使えることがわかり、今回この記事を書いてみました。
bochsも使ってみたのですが、
こちらでもFreeDOSの出力をテキストでコピーは出来たのですが、
画面のスクロールが出来ませんでした(やり方があるのかも知れませんがわかりませんでした)

おまけ

Helloを出力するだけのcプログラムを
i16gcc
-vオプションをつけてビルドしたときのログをいかに書きます(コピペ)。

C:\>more hello.c
#include <stdio.h>

int main(void)
{
  printf("hello\n");
  return 0;
}

C:\>i16gcc -v -o hello.com hello.c
Using built-in specs.
COLLECT_GCC=c:/gcc/devel/i16gnu/bin/i16gcc.exe
Target: ia16-elf
Configured with: ../gcc-ia16/configure --host=i586-pc-msdosdjgpp --target=ia16-e
lf --program-prefix=i16 --with-gcc-major-version-only --prefix=/home/user/.local
/build-ia16/prefix-djgpp --datadir=/home/user/.local/build-ia16/prefix-djgpp/ia1
6-elf --infodir=/home/user/.local/build-ia16/prefix-djgpp/ia16-elf/info --locale
dir=/home/user/.local/build-ia16/prefix-djgpp/ia16-elf/locale --enable-libssp --
disable-libquadmath --disable-nls --disable-plugin --disable-lto --enable-langua
ges=c --with-gmp=/home/user/.local/build-ia16/prefix-djgpp-prereqs --with-mpfr=/
home/user/.local/build-ia16/prefix-djgpp-prereqs --with-mpc=/home/user/.local/bu
ild-ia16/prefix-djgpp-prereqs --with-isl=/home/user/.local/build-ia16/prefix-djg
pp-prereqs
Thread model: single
gcc version 6.3.0 (GCC)
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.com'
 c:/gcc/devel/i16gnu/bin/../libexec/gcc/ia16-elf/6/cc1.exe -quiet -v -iprefix c:
/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/ hello.c -quiet -dumpbase hello.c -a
uxbase hello -version -o c:/gcc/devel/djgpp/tmp/ccWAmkKl.s
GNU C11 (GCC) version 6.3.0 (ia16-elf)
        compiled by GNU C version 7.2.0, GMP version 6.1.2, MPFR version 3.1.5,
MPC version 1.0.3, isl version 0.15
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
ignoring duplicate directory "c:/gcc/devel/i16gnu/lib/gcc/../../lib/gcc/ia16-elf
/6/include"
ignoring duplicate directory "c:/gcc/devel/i16gnu/lib/gcc/../../lib/gcc/ia16-elf
/6/include-fixed"
ignoring duplicate directory "c:/gcc/devel/i16gnu/lib/gcc/../../lib/gcc/ia16-elf
/6/../../../../ia16-elf/sys-include"
ignoring duplicate directory "c:/gcc/devel/i16gnu/lib/gcc/../../lib/gcc/ia16-elf
/6/../../../../ia16-elf/include"
#include "..." search starts here:
#include <...> search starts here:
 c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/include
 c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/include-fixed
 c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../../ia16-elf/sys-include
 c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../../ia16-elf/include
End of search list.
GNU C11 (GCC) version 6.3.0 (ia16-elf)
        compiled by GNU C version 7.2.0, GMP version 6.1.2, MPFR version 3.1.5,
MPC version 1.0.3, isl version 0.15
GGC heuristics: --param ggc-min-expand=30 --param ggc-min-heapsize=4096
Compiler executable checksum: f1b48dea6d1e973dcf146c614a797f6c
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.com'
 c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../../ia16-elf/bin/as.exe -
o c:/gcc/devel/djgpp/tmp/ccBXvHtt.o c:/gcc/devel/djgpp/tmp/ccWAmkKl.s
COMPILER_PATH=c:/gcc/devel/i16gnu/bin/../libexec/gcc/ia16-elf/6/;c:/gcc/devel/i1
6gnu/bin/../libexec/gcc/;c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../
../ia16-elf/bin/
LIBRARY_PATH=c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/;c:/gcc/devel/i16gnu/
bin/../lib/gcc/;c:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../../ia16-e
lf/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.com'
 c:/gcc/devel/i16gnu/bin/../libexec/gcc/ia16-elf/6/collect2.exe -o hello.com -Lc
:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6 -Lc:/gcc/devel/i16gnu/bin/../lib/gc
c -Lc:/gcc/devel/i16gnu/bin/../lib/gcc/ia16-elf/6/../../../../ia16-elf/lib c:/gc
c/devel/djgpp/tmp/ccBXvHtt.o -lgcc --script c:/gcc/devel/i16gnu/bin/../lib/gcc/i
a16-elf/6/../../../../ia16-elf/lib/dos-mtsl.ld -lgcc
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.com'
C:\>hello.com
hello

Discussion