djgpp で pc98 用exeをコンパイルする
前回 ビルドした djgpp は、ライブラリ的に PC/AT 系用なので、PC98系で使うには、ライブラリのAT依存箇所を PC98 対応にする必要があり。
大量の改変が必要だけど、すでに先人が作られたモノがあり、lpproj 氏が配布されているライブラリ&ヘッダと、実行にあたって必要となる pc98 対応版 cwsdpmi を使わせていただきます。
てことで作業メモ。
PC98 用 djgpp フォルダ作成
-
PC98用ライブラリ&ヘッダを djgpp v2.05 (djgpp-cvs) libc for IBM PC and NEC PC-98 series からダウンロード。
今回使ったのは- djgpp-nec98-test-20231121-libs.zip
- djgpp-nec98-test-20231121_1-headers.zip
-
djgpp フォルダをPC98用にコピーする。前回、
- c:\msys64\usr\local\MinGW64\djgpp2.05-gcc14.2
にコンパイラ一式が作られていたとして、これを
- c:\msys64\usr\local\MinGW64\djgpp2.05-gcc14.2-pc98
のように pc98 用な名前にしてコピー。
-
コピーしたフォルダ内の、
- i386-pc-msdosdjgpp/lib/
に djgpp-nec98-test-20231121-libs.zip の内容物 *.a 等全てを上書き、
- i386-pc-msdosdjgpp/headers/
に djgpp-nec98-test-20231121_1-headers.zip の内容 *.h 等全て上書き。
一応、これで pc98 用の djgpp になったはず。
実行環境の準備
pc98用 cwsdpmi として CWSDPMI r7のPC-98対応状況をすこし改善するパッチ から
- csdpmi7b_pc98fix_20230326.zip
をダウンロード。日付の新しいものを選択。
(間違って 古い方をダウンロードすると、不安定挙動に悩まされたりする:)
解凍して出来た bin フォルダを適当に変名して、pc98 エミュ環境なり実機環境なりのアクセス可能な場所にコピー。
とりあえず、A:\CWSDPMI にコピーしたとして。
set CWSDPMI=A:\CWSDPMI\CWSDPMI.EXE
を必要なときに行うか、面倒なら AUTOEXEC.BAT に追記しておく。
djgpp でビルドした exe と同じフォルダに cwsdpmi.exe を都度コピーでもいいけれど、それも面倒なので。
djgpp でのコンパイル
pc98 用という以外は通常の djgpp と同じ(以前 書いたのとほぼ同じ)
コンパイラのパス設定例.
set "MSYS_DIR=c:\msys64"
set "DJGPP_DIR=%MSYS_DIR%\usr\local\MinGW64\djgpp2.05-gcc14.2-pc98"
set "PATH=%DJGPP_DIR%\bin;%MSYS_DIR%\mingw32\bin;%MSYS_DIR%\usr\bin;%PATH%"
set "PATH=%DJGPP_DIR%\i386-pc-msdosdjgpp\bin;%PATH%"
set "GCC_EXEC_PREFIX=%DJGPP_DIR%\lib\gcc\"
定番の hello.
#include <stdio.h>
int main(void) {
printf("hello world!\n");
return 0;
}
gcc -o hello.exe hello.c
で、実機かエミュ環境で動作確認。
cmake を使う場合は、CMAKE_TOOLCHAIN_FILE を使用。内容は PCAT 用と同じ。
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR x86)
set(CMAKE_C_COMPILER i386-pc-msdosdjgpp-gcc)
set(CMAKE_CXX_COMPILER i386-pc-msdosdjgpp-g++)
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
set(CMAKE_C_COMPILER_WORKS TRUE)
set(CMAKE_CXX_COMPILER_WORKS TRUE)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_EXECUTABLE_SUFFIX ".exe")
set(CMAKE_EXECUTABLE_SUFFIX_ASM ".exe")
set(CMAKE_EXECUTABLE_SUFFIX_C ".exe")
set(CMAKE_EXECUTABLE_SUFFIX_CXX ".exe")
cmake_minimum_required(VERSION 3.24)
project(hello)
add_executable(hello hello.c)
のように cmake 用ファイルを用意して、
cmake -G "MinGW Makefiles" -DCMAKE_TOOLCHAIN_FILE=djgpp-toolchain.cmake -B bld .
cmake --build bld
のようにビルド。
PC98 固有を使った例
PC98 固有の機能を使った例を書ければよかったのだけど、短くソースを用意するのは面倒だったので、
で作っている TUI なミニゲームのソースでも見てやってください。
(ごちゃごちゃして参考としてはアレだけれど)
Discussion