-

「DOCUMENT LIBRARIES PUBLIC HITECH-C FOR MSX」の版間の差分

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索
(ページの作成:「==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のプログラムから移植しています。