-
「DOCUMENT LIBRARIES PUBLIC HITECH-C FOR MSX」の版間の差分
(ページの作成:「==Wiki編集者からの注== 本ドキュメントはPierre Gielen氏による「最初のMSX移植版HI-TECH C」の概略を 通読できるように編集された...」) |
(相違点なし)
|
2017年11月11日 (土) 22:54時点における最新版
Wiki編集者からの注
本ドキュメントはPierre Gielen氏による「最初のMSX移植版HI-TECH C」の概略を 通読できるように編集されたものです。MSX移植版と本家CP/M版との差異についての説明しています。
Pierre Gielen氏によるMSXへの移植はHITECH-1.PMAとHITECH-4.PMAに収録されています。 HITECH-1.PMA 基本アーカイブのMSX対応版 HITECH-4.PMA 暫定的にMSXに対応させたルーチンとその他便利なプログラム
本ドキュメントはHITECH-4.PMAの内容を記述しています。
HITECH-4.PMAは以下のアーカイブが含まれています。
- DHRY
- FRACT-C
- GETCH
- GETCWD
- GETENV
- HTC2OVL
- LIBG1193
- MAKE1193
- STAT
- TIME
- TOLOWER
Tools
MAKE1193
MAKE - 分割されたソースファイルを管理します。
使用法
MK [-f file] [-a] [-n] [-d] [name] ...
- f
- デフォルトのmakefileの代わりに'file'を使用します。
- a
- 全てのモジュールを古いものとみなします(全部を再コンパイルします)
- n
- リコンパイルをしません。リコンパイルのステップのみを列挙するだけです。
- d
- デバッグです (print tree, file info)
- name
- リコンパイルするモジュール名です。
'secret' オプション (人の手では使用されません):
- -ofile
- 'file'で書き出しファイルを指定します。
作者
Landon M. Dyer, Atari Inc.
Libraries
GETCH
コンソール関数の高速化MSXDOSバージョンです。 (conio.hで定義されています。)
char getch(void); char getche(void); void putch(int); void ungetch(int); int kbhit(void);
新規に関数を追加しました。
void cursor(int); [ 1 = on, 0 = off ]
HI-TECH Cの標準ライブラリであるlibc.libをアップデートするために、このファイルを使用してください。オブジェクトファイルのgetch.objは手動で最適化されたバージョンで、libc.libに挿入されるようになっています??
GETCWD
このアーカイブにはHI-TECH C用の二つのルーチンが含まれています。GETCWDはカレントドライブとディレクトリ(DOS1の場合はドライブのみ)を文字列で取得します。CHDIRは引数sで与えられたディレクトリに移動します(DOS2のみ)
CHDIR(現在のワーキングディレクトリをセットします)MSXDOS版HI-TECH C標準ライブラリ(setuidの代替物)はPierre Gielenによるフリーウェアです。10/1993
GETCWD(カレントワーキングディレクトリを取得します)MSXDOS版HI-TECH C標準ライブラリ(getuidの代替物)はPierre Gielenによるフリーウェアです。10/1993
TSTCHD int chdir(s)のテストです
TSTCWD char * getcwd(d)のテストです。
GETENV
このアーカイブにはMSXDOS2版HI-TECH C用GETENVが含まれています。 環境変数の文字列を取得します。PG/93
MSXDOS版HI-TECH C標準ライブラリの環境変数を取得します。 Pierre Gielenによるフリーウェアです。10/1993
TESTENV char * getenv(s)のテストです。
STAT
int stat(char * s, struct stat * b);
ファイル更新日時とファイルアクセス日時で構造体statを埋めます。
Pierre GielenによりMSXDOS用に改修されました。10/93
MSXDOS用の新しいstatとconvtime関数のテストです。
TIME
TIME.CはANSI標準規格のtime()関数をMSXDOSのHI-TECH用にしたものです。これは00:00:00 1/1/1970から符号なしlong型整数(UNIXタイムフォーマット)で返します。ADDLIB.BATを使って、HI-TECH C標準ライブラリのLIBC.LIBをこのバージョンにアップデートしてください。
Pierre Gielen, 10/93
TIME.C
MSXDOS版HI-TECH C用のtime()関数はUNIXフォーマット、つまり、00:00:00, 1/1/1970 (符号なしlong)からの秒数で時間を返します。
例:
time(&t); printf("Time/Date is %s\n",ctime(&t));
インストール:
C -S TIME ZAS -N -oTIME.OBJ TIME.AS LIBR R LIBC.LIB TIME.OBJ
Pierre Gielen, 10/93
これはPierre GielenによるMSX用のフリーウェアです。10/1993
TESTTIME.C
time()関数のテストです。
TOLOWER
改良版のtoupper,tolowerです。 strupr, strlwrも追加しています。 PGN 12/93
TOLOWER.AS
HI-TECH C用の大文字を扱う関数です。 パブリックドメインです。pgn 12/93
- char toloswer(char)
- 文字を小文字にします。
- char * strlwr(char *)
- 文字列を小文字にします。
TOUPPER.AS
HI-TECH C用の大文字を扱う関数です。 パブリックドメインです。
- char toupper(char)
- 文字を大文字にします。
- char * strupr(char *)
- 文字列を大文字にします。
HTC2OVL
Pierre Gielenによる解説
MSX版HI-TECH C用オーバーレイ
このライブラリはHI-TECH Cがオーバーレイファイルといっしょに動くようにするためのすべてが含まれています。そのため理論上はサイズ無制限にプログラムが書き出せるようになります。
これらのルーチンはRon Murray(nmurrayr@ccurtin.edu.au)によってCP/M用に開発されました。私はOVLOADER.Cを修正してMSXDOS上でZ80アセンブラがより良いパフォーマンスを出せるようにルーチンを書きました。オーバーレイ全体はスピードアップを図るため??1ブロックにロードされます。今のところ重要な点は、MSXDOS2では自分自身を見つけられてしまう点です???MSXDOS1ではすべてのオーバーレイがデフォルトドライブにある必要があります。PROGRAM環境変数にメインプログラムまでの完全なパスを保存するMSXDOS2ではその必要はありません。ローダーコードはこれをオーバーレイがある場所を探し出すために使用します。別のディレクトリから開始されるデバッガプログラム上でこれを実行した場合、問題が出るのは明らかです。そのためB:\ASMUTL\MSXDEBUG H:\TEST\OVLTEST.COMは動きません。なぜならローダーがH:\TEST\.の代わりにB:\ASMUTL\に対してオーバーレイを探しに行ってしまうからです。デバッグする際に心に留めておいて欲しいのですが、デバッガはプログラムと同じディレクトリに置いてください。これに関しては他の方法がありません。
Ron Murrayによるオリジナルドキュメント
- HI-TECH C用オーバーレイ
以下はHI-TECH Cで使うためにオーバーレイを作る手順です。コンパイルとリンクが面倒なのですが、プログラムが使用するTPAをより小さくできます。そのため、大きなプログラムが作成できます。唯一の欠点は、ディスクからオーバーレイをロードする時に時間がかかってしまうということです。
1.ソースファイル作成 オーバーレイは以下のようにしてメインプログラムから呼び出せます
[value = ]ovloader(filename,argument);
<filename>は(拡張子.ovrを除いた)オーバーレイのファイル名が入る文字列で、<argument>は機能に対する単体の引数です。オーバーレイの結果をオプション的にC関数の中で値にアサインすることもできます。
メインプログラム内においてオーバーレイは関数やグローバルシンボルなどを参照しますが、それ以外の場合は、メイン関数のmain()の代わりにovmain()が呼ばれなければいけないことを例外として、普通のCプログラムに見えます。
2.リンクとオーバーレイの作成
メイン関数は一番初めにリンクされなければいけません。確実にovloader.cとovbgn.asのモジュールを(この順に)同様にリンクして、シンボルテーブルを生成するよう(-Fオプションで)コンパイラを呼び出すようにしてください。
一旦ここまで終わったら、SYMTOASプログラムを.SYMファイルに(SYMTOAS TEST.SYMのようにして)実行すると、MAIN.ASという名前で、アセンブラソースのメイン部分からのアドレスを含む、ファイルが生成されます。
その後、ZASをこのファイルに実行(ZAS MAIN.AS)するとMAIN.OBJという名前でファイルが生成されます。これに対してオーバーレイをリンクする必要があるでしょう。
その後のステップのために_必要に応じたovbgnのアドレスをMAIN.ASで検証する必要があります。説明のために、これを01234hと仮定します。
.OBJファイルを得るためにオーバーレイを-Cオプションでコンパイルしてください。エラーが出るのでリンカは呼び出さないでください。ここまで済んだらリンカに渡す???小さなアスキーファイル(wordstarなどで)を作ります。このファイルのフォーマットは以下のようになってないといけません(注:小文字でなければいけません)
-c01234h -ptext=01234h,data -otest1.ovr test1.obj <other modules as reqd> \ main.obj libc.lib
(オーバーレイをtest1.ovr、ソースファイルをtest1.cと仮定しています)。他のモジュールも同様にリンクされるかもしれません。"\"を使用しているのは、入力内容を次の行に続けるためです。もちろん'01234h'はMAIN.ASから得た_ovbgnの実際の値に入れ替えないといけません。 このファイルをTEST.LINKとします。これでオーバーレイをリンクする準備が整いましたので、以下のコマンドを実行してください。
LINK <TEST.LNK
これがいろいろと動くと??終了します。オーバーレイのソースを変更するためだけに、リンクやメインセグメントへのロードを繰り返してはいけません。毎回同じmain.objファイルがオーバーレイを再リンクしてしまいます??TEST.LNKファイルは同様に同じままにしておかなければいけませんが、メインプログラムファイルの変更が必要な時には変更するのだと憶えておきましょう??
OVBGN.ASファイルはオーバーレイの最大値を設定するのと同じ内容を含んでいます。 現在は5000h (20k)を設定します。これはほとんどの用途で十分と思われますが、あなたのオーバーレイが小さい場合はより低い値になるでしょう。オーバーレイを-Mxxxx.MAPオプションで.LNKファイルにリンクした場合、オーバーレイのマップが生成されます。これで最大のオーバーレイファイルのサイズを変更する必要があるか検証できます。
面倒な手順ですが、これによりHI-TECH Cで動くオーバーレイが生成できます。このコンパイラはZ80用の小さくて、速いコードを生成しているようですので、持っておく価値があるでしょう。
Ron Murray, 25/8/88
LIBG1193
LIBG1193\CALL
私はASCII C(MSX-C)互換のHI-TECH C用グラフィック・/MSXBIOSに取り組んでいます。このアーカイブはそのテストバージョンです。グラフィックプログラムの資料をもっておらず、まじめにグラフィックに取り組んでこなかったため、これらのルーチンを十分にテストできません。これがあなたの助けを必要とする理由です。もし、ルーチンにミスがあったら、どこの何が悪いか教えてください。
Pierre Gielen
(注:Pierre Gielenはインターネットアクセス手段がありません。もし彼に連絡したいのでしたら以下にメールを書くのが一番かもしれません。
rmuit@et.tudelft.nl (Roderik Muit) wiebe@stack.urc.tue.nl (Wiebe Weikamp)
RMt.)
GLIB.H
HI-TECH C用ASCII-C (MSX-C)互換グラフィックライブラリ
#ifndef uint #define uint unsigned int #endif #ifndef uchar #define uchar unsigned char #endif #define c_dpage (*(uchar *)0xfaf5) /* 見えているページ */ #define c_apage (*(uchar *)0xfaf6) /* アクティブページ */ #define c_fore (*(uchar *)0xf3e9) /* フォアグラウンドカラー */ #define c_back (*(uchar *)0xf3ea) /* バックグラウンドカラー */ #define c_bord (*(uchar *)0xf3eb) /* ボーダーカラー */ #define c_lastx (*(uint*)0xfcb7) /* カーソルのx座標 */ #define c_lasty (*(uint*)0xfcb9) /* カーソルのy座標 */ #define c_screen (*(uchar *)0xfcaf) /* スクリーン番号 */ #define c_sprite (*(uchar *)0xf3e0 & 3) /* スプライト数 */ #define c_xmax (gtxmax()) /* x座標の最大値 */ #define c_ymax (gtymax()) /* y座標の最大値 */ #define PSET (uchar)0 #define AND (uchar)1 #define OR (uchar)2 #define XOR (uchar)3 #define PRESET (uchar)4 #define TPSET (uchar)8 #define TAND (uchar)9 #define TOR (uchar)10 #define TXOR (uchar)11 #define TPRESET (uchar)12 void screen(uchar); /* MSXのスクリーンモードを設定 */ void ginit(void); /* VDPのIOポート(0x98)を取得する */ void interlace(uchar); /* インターレースモードを設定 */ uint gtxmax(void); /* グラフィック面のx座標最大値 */ uint gtymax(void); /* グラフィック面のy座標最大値 */ void setrd(uint); /* アドレスからの読み込みをVDPにセットアップする */ uchar invdp(void); /* 現在のVDPアドレスから1バイト取得する */ void setwrt(uint); /* アドレスからVDPへの書き込みをセットアップする */ void outvdp(uchar); /* 現在のVDPアドレスを1バイト送る */ uchar vpeek(uint); /* アドレスのVPEEKを実行 */ void vpoke(uint,uchar); /* vpoke(adr,value */VPOKE(アドレス、値) */ void filvrm(uint,uint,uchar); /* データを埋める(アドレス、長さ、データバイト) void ldirmv(char *,uint,uint); /* VRAMからRAMへロード(ロード先、ロード元、長さ) */ void ldirvm(uint,char *,uint); /* VRAMからRAMへロード(ロード先、ロード元、長さ) */ void wrtvdp(uchar,uchar); /* VDP書き込み(レジスタ、値) */ uchar rdvdp(uchar); /* VDP読み込み(レジスタ) */ uchar rdvsts(uchar); /* VDPステータスレジスタ読み込み(レジスタ) */ void color(uchar,uchar,uchar); /* 色指定(フォアグランド、バックグランド、ボーダー) */ void iniplt(void); /* パレット初期化 */ void rstplt(void); /* パレットリセット */ uint getplt(uchar); /* パレット取得(色)=l=RB,h=G */ void setplt(uchar,uint); /* パレット設定(色、GRBデータ) */ void pset(uint,uint,uchar,uchar); /* PSET(x、y、色、ロジカルオペレーション) void line(uint,uint,uint,uint,uchar,uchar); /* 線を描画(x座標1、y座標1、x座標2、y座標2、色、ロジカルオペレーション) */ void boxline(uint,uint,uint,uint,uchar,uchar); /* ボックスを秒か(x座標1、y座標1、x座標2、y座標2、色、ロジカルオペレーション) */ void boxfill(uint,uint,uint,uint,uchar,uchar); /* 塗りつぶしボックスを描画(x座標1、y座標1、x座標2、y座標2、色、ロジカルオペレーション) */ void circle(uint,uint,uint,uchar,int,int,uint);/* 円を描画(x座標、y座標、半径、色、開始角度、終了角度、比率) */ void paint(uint,uint,uchar,uchar); /* ペイントします(x座標,y座標,色,背景色) */ uchar point(uint,uint); /* /color=point(x,y) */ void inispr(uchar); /* スプライトを設定します(サイズ) */ uint calpat(uchar); /* スプライトパターンを計算します */ uint calatr(uchar); /* スプライトアトリビュートを計算します */ void sprite(uchar,char *); /* スプライトを設定(num,data*) */ void colspr(uchar,char *); /* スプライトの色を設定(num,color*) */ void putspr(uchar,uint,uint,uchar,uchar); /* スプライトを設置(num,x,y,color,pattern void cpyv2v(uint,uint,uint,uint,uchar,uint,uint,uchar,uchar); /* VRAMからVRAMにコピー(sx1,sy1,sx2,sy2,sp,dx,dy,dp,logop) */ void cpyv2m(uint,uint,uint,uint,uchar,char *); /* VRAMからRAMにコピー(sx1,sy1,sx2,sy2,sp,destadres) */ void cpym2v(char *,uchar,uint,uint,uchar,uchar); /* RAMからVRAMにコピー(srcadres,direction,dx,dy,dp,logop) */ void totext(void); /* テキストモード設定 */ void grpprt(char,char); /* グラフィックスクリーンに文字を表示 */ void knjprt(uint,char,char); /* 漢字表示((char (uint),ロジカルオペレーション、モード)) */ void glocate(uint,uint); /* グラフィックの位置(x、y) */ void setpg(uchar,uchar); /* ページの設定(ディスプレイ、アクティブ) */ uint vramsize(void); /* VRAMサイズの取得(16,64,128) */
Samples/Demos
DHRY
DHRY\README
DHRYはdhrystoneベンチマークプログラムで、MSX用HI-TECH Cのためにコンパイルされました。これは新しいtime()関数をテストするため、もしくはHI-TECH OPTIMプログラムを呼び出す-Oコンパイルスイッチをつける効果のデモのために使ってください。これは(動く!)速度最適化を行っています。 Pierre Gielen, 10/1993
FRACT-C
- FRACT.C
- スクリーン5または7にフラクタルを描きます。LIBG.LIBを使用するHI-TECH C用テストプログラムです。
コンパイル:
c -lg -lf fract
BASICのプログラムから移植しています。