🐯

djgpp で pc98 用exeをコンパイルする

に公開

前回 ビルドした djgpp は、ライブラリ的に PC/AT 系用なので、PC98系で使うには、ライブラリのAT依存箇所を PC98 対応にする必要があり。

大量の改変が必要だけど、すでに先人が作られたモノがあり、lpproj 氏が配布されているライブラリ&ヘッダと、実行にあたって必要となる pc98 対応版 cwsdpmi を使わせていただきます。

てことで作業メモ。

PC98 用 djgpp フォルダ作成

  1. 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
  2. djgpp フォルダをPC98用にコピーする。前回、

    • c:\msys64\usr\local\MinGW64\djgpp2.05-gcc14.2

    にコンパイラ一式が作られていたとして、これを

    • c:\msys64\usr\local\MinGW64\djgpp2.05-gcc14.2-pc98

    のように pc98 用な名前にしてコピー。

  3. コピーしたフォルダ内の、

    • 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.

hello.c
#include <stdio.h>
int main(void) {
    printf("hello world!\n");
    return 0;
}
gcc -o hello.exe hello.c

で、実機かエミュ環境で動作確認。

cmake を使う場合は、CMAKE_TOOLCHAIN_FILE を使用。内容は PCAT 用と同じ。

djgpp-toolchain.cmake
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")
CMakeLists.txt
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 固有の機能を使った例を書ければよかったのだけど、短くソースを用意するのは面倒だったので、

https://github.com/tenk-a/cons

で作っている TUI なミニゲームのソースでも見てやってください。
(ごちゃごちゃして参考としてはアレだけれど)

Discussion