djgpp というのは D.J.Delorie さんが GNU の gcc を始めとしたな開発環境をまとめて MS-DOS(PC-DOS) 上に移植されたフリーな開発環境です。オリジナルはもちろん PC-AT 上の DOS で動作するように作成されています。
このパッケージは djgpp v2.03 の libc.a を PC-AT 継承機の DOS/V 環境や PC-9800 Series にも対応させるためのパッチ集です。ソースとバイナリの両方の差分を含んでいます。
djgpp v2 のスタートアップは元から PC-98 の判別だけはしており、さらに v2.02 からは conio に DOS/V 環境用コードも含まれるようになりましたが、いずれも不完全なものと言わざるを得ません。
このパッチを当てたライブラリで再構築すれば、直接依存コードを書いていない限り PC-AT 継承機でも PC-9800 でも動作するバイナリを生成するようになるはずです(...たぶん(^^;;) ただし、これは「日本語対応にするものではありません」ので、その点は御注意ください。
オリジナルの djgpp については、本家本元の DJ Delorie 氏の http://www.delorie.com/djgpp/ を見てください。また、djgpp オリジナルの配布物は全世界の simtelnet にミラーされているはずですのでネットワーク的に近い所から入手してください。
djgpp v2 のインストールは簡単です。配布されているアーカイブを好みに合わせて選んで全て同じフォルダに展開し、環境変数 DJGPP と PATH を正しく設定するだけです。(以下 A:\DJGPP を仮定し、SET DJGPP=A:/DJGPP/DJGPP.ENV)
ただし、ソースも展開する場合 NEC MS-DOS 6.2 以前では clock.* というファイルを作成出来ないので、適宜 RENCLOCK を使用して CLOCK デバイスをリネームするか Win95 下で作業してください。
DPMI サーバとして CWSDPMI を使用する場合は CWSPARAM.EXE を実行して、swap file を使用しないようにするか、実在するドライブへ指定するか設定する必要があるかもしれません。
選択ファイル例 v2\DJDEV203.ZIP v2\DKLSR203.ZIP v2gnu\BNU210.ZIP v2gnu\BSN128B.ZIP v2gnu\DIF272B.ZIP v2gnu\FIL316B.ZIP v2gnu\GCC2952B.ZIP v2gnu\GPP2952B.ZIP v2gnu\GREP24B.ZIP v2gnu\GZP124AB.ZIP v2gnu\LGP2952B.ZIP v2gnu\MAK3791B.ZIP v2gnu\PAT253B.ZIP v2gnu\SED202B.ZIP v2misc\CSDPMI5B.ZIP
dj2xx98xx.ldf を A:\DJGPP\LIB\ へコピーし、ldf で差分を当てる。なお、オリジナルは保存しておいてください。(ldf は Vector にあります)。
上記の例のファイルをソースを含めすべて展開してインストールした後、"patch -p0 -b < (your path)dj203980.dif" 等として差分を適用し、適宜 make してください。
正常に処理されれば A:\DJGPP\LIB\LIBC.A が作成されるはずです。事前にオリジナルの libc.a のバックアップを取るべきでしょう。
djgpp libc のソース中には clock.c というものが存在しています。しかし、NEC MS-DOS 6.2 以前には CLOCK デバイスというものが存在するために clock.* というファイルは作成できません。libc を make する際にこの制限は問題となります。
そこで、CLOCK デバイスを CLOCK$ に名前を変更してやることでこの問題を解決するプログラムを作成しました。RENCLOCK.LZH としてソースごと添付してあります。デバイスドライバ、コマンドラインいずれでも実行できる COM/DEVICE 型プログラムです。
- 詳細
- 各ファイルにできるだけ説明を書くようにしていますので、詳細はソースを読んでください。
- オリジナルの保存
- PC-AT 英語モードでは、パッチの影響をできるだけ受けないように配慮したつもりです。
- __crt0_mtype
- スタートアップの crt1.c で int __crt0_mtype に機種を格納し、後の動作は全てこれで分岐されています。
- 実行ファイルのサイズ
- オリジナルライブラリに比べ Hello World でも 3KB 程度大きくなってしまいます。
- src\libc\bios\*.c
- PC-AT BIOS をエミュレートしようとしていますが、いずれも完全ではありません。また、DISK BIOS についてはあまりにも恐ろしいのと意味がないのとでエミュレートせずにトラップだけしています。
- src\libc\crt0\crt1.c
- PC-9800 の認識はオリジナルの (FFFF:0003 == FD80) としていますが、かなり不安です。PC-H98 の認識もそれでできるのでしょうか?
- src\libc\dos\dos\delay.c
- タイムスタンパがない機種では水平周波数を利用した方法を用いますが、Windows 下ではかなり誤差が出ます。
- src\libc\pc_hw\co80\*.c
- すべての TVRAM アクセスを含む関数をトラップしています。いくらか未実装の関数もあります。
- src\libc\pc_hw\kb\*.c
- おおよそ完全に移植できています。
- src\libc\pc_hw\timer\*.c
- clock() と uclock() は、タイムスタンパを使用できない機種では精度がまるで足りません。
- src\libc\pc_hw\sound\*.c
- おおよそ完全に移植できています。
- その他
- PC-AT の BIOS 呼び出しや DOS 共通域の参照などを排除しました。
- src\libc\crt0\crt1.c
- 恐らく PC-DOS/V でも判定できるでしょう。
- src\libc\pc_hw\co80\*.c
- conio.c は DOS/V への対応がなされていましたが、SC*.c は対応されていなかったので、対応させました。
パッケージ一式(RENCLOCK含む)は GNU Library General Public License に従い配布されています。
djgpp v2.03 libc patch for PC-AT/PC-9800 Copyright (C) 1997-1999, SAKAMOTO Takahiro <-----@mfp.gr.jp> This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- 謝辞
- 今回私が作成したパッチはほぼ全て私が書き直したものですが、以前に存在したソースが無ければ完成し得なかった部分も多くあります。tantan氏 わたるさん 高野商店さん にはこの場を借りてお礼申し上げます。