-

PACKAGES EXECUTION DOCUMENT PORT MSX

提供: HI-TECH C for CP/M Fan WIKI(JP)
移動先: 案内検索

HITECH-1.PMA


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-1.PMAの内容を記述しています。

以下の4つのファイルの解説・コメント部分を編集し、章を追加しています。

READ.ME
C.C
EXEC.H
STDIO.H.

詳細な使用方法についてはCP/M版のマニュアルを合わせて参照してください。

READ.ME

概要

このHITECH-1.PMAには以下のものが含まれています。

  • CP/M用HI-TECH-Cコンパイラ
  • Perre GielenによるMSX移植版プログラム
C.COM
C.C
EXEC.H
STDIO.H.

(私の知る限り、これ以外のファイルはCP/M版と全く同じです。100%保証はできませんが。)

RMt.

オリジナルのreame

The HI-TECH Z80 CP/M C compiler V3.09は、私的、商用利用等のいかなる使用に関しても無料で、このままの形で提供されるものです。保証や製品サポートは提供されず、また含まれてもいません。

このソフトウェアの著作権がHI-TECHソフトウェアにあることを認めることで あなたはこのソフトウェアをあなたの望むように使用することができます。

追加のC.COMと同梱のREAD.ME

Hitech-C for MSX

このアーカイブはほぼ完全なANSI準拠であるCP/M及びMSX-DOS用コンパイラ、HI-TECH C用のCコマンドを含んでいます。(CP/Mの)標準ライブラリのEXECUTEとGETENVルーチンはMSXでは動かず、元のC.COMがクラッシュします。私はこのプログラムを対応させてコマンドラインで開始できるバッチファイルを作るようにしました(つまり、MSX-DOSのバッチプロセッサということです)。これによる影響は、コマンドラインが128バイトを超えられなくなることです。これによりオブジェクトファイルが.OBJの代わりに.Oで終わるようにファイルネームを短縮します。全てのプログラムに入っている必要があるオブジェクトヘッダファイルCRTCPM.OBJはCRT.Oにリネームしました。C.COMのソースの中でこれらを見ることができます。

また、EXEC.Hは既に対応しています。これはコマンドライン経由でスタートさせるためのいくつかの変数を含んでいます。STDIO.HにはDOSVER変数が追加されています。 MSX-DOS1で実行するときには0、MSX-DOS2で実行するときにはDOSバージョンをBCDコードで渡します(例えばDOS2.2はDOSVERに0x22を渡します)

HI-TECH Cはこれだけでは終わりません。標準ライブラリはMSXに適応したルーチンがさらに含まれています。先に進む前に言っておきたいのですが、いずれにせよHI-TECH Cは良いもので、いうまでもなくASCII-C【訳注:MSX-C】に代わる無料(!)の代替物です。HI-TECH CはLONGが何の問題もなく扱え、より「大きな」プロフェッショナル用のCコンパイラとの互換性において、ASCII-C【訳注:MSX-C】よりも進んでいます。

その他に必要なもの:

HITECH-2.PMA 標準ライブラリと浮動小数点ライブラリのソース

HITECH-3.PMA 英語版のドキュメント

(注: HITECH-4.PMA 暫定的にMSXに対応させたルーチンとその他便利なプログラムが含まれています)


C.C

About

Copyright (C) 1984-1987 HI-TECH SOFTWARE

Pierre GielenによるMSXDOS対応

  • EXECLルーチンの置き換え(Cがバッチファイルを生成するようになりました)
  • 実行しないでバッチを生成する-Qスイッチを追加
  • 一行により多くのコマンドを許容するため、オブジェクトファイルを.Oに、一時ファイルを.Tに変更(注:crt.oはcrtcpm.objと同じ)。ライブラリは.LIBに戻す。
  • コンピューターがロックしてしまうので、GETENVのコールをコメントアウトしました(まだ標準ライブラリで変更する必要があります???)

HI-TECH CはほぼANSI C準拠ですが、'#pragma nonrec'ディレクティブは認識しません。

HI-TECH Softwareは個人使用のためにこのソフトウェアをコピーする許可を与えてくれました。

MSXDOS版Cコマンド

C [-C] [-O] [-I] [-F] [-U] [-D] [-S] [-X] [-P] [-Q] [-W] [-M] files {-Llib}

Wiki編集者からのコメント

HI-TECH C for CP/Mのマニュアルも併せて参照してください。

EXEC.H

EXECフォーマットの定義

#define	EXITIT	0x80
#define	EXEC	0x81
#define	IGN_ERR	0x82
#define	DEF_ERR	0x83
#define	SKP_ERR	0x84
#define	TRAP	0x85
#define	IF_ERR	0x86
#define	IF_NERR	0x87
#define	ECHO	0x88
#define	PRINT	0x89
#define	RM_FILE	0x8A
#define	RM_EXIT	0x8B
#define keybuf 0xfbf0				/* MSX */
#define putpnt (*(unsigned int *)0xf3f8)	/* MSX */
#define getpnt (*(unsigned int *)0xf3fa)	/* MSX */


STDIO.H

#define DOSVER (*(char *)0xf313)	/* MSX: 0=DOS1 */

#if	z80
#define	BUFSIZ		512
#define	_NFILE		8
#else	z80
#define	BUFSIZ		1024
#define	_NFILE		20
#endif	z80

#ifndef FILE
#define	uchar	unsigned char 

extern	struct	_iobuf {
	char *		_ptr;
	int		_cnt;
	char *		_base;
	uchar		_flag;
	char		_file;
} _iob[_NFILE];

#endif	FILE

#define	_IOREAD		01
#define	_IOWRT		02
#define	_IORW		03
#define	_IONBF		04
#define	_IOMYBUF	010
#define	_IOEOF		020
#define	_IOERR		040
#define	_IOSTRG		0100
#define	_IOBINARY	0200

#ifndef	NULL
#define	NULL	((void *)0)
#endif	NULL

#define	FILE		struct _iobuf
#define	EOF		(-1)

#define	stdin		(&_iob[0])
#define	stdout		(&_iob[1])
#define	stderr		(&_iob[2])
#define	getchar()	getc(stdin)
#define	putchar(x)	putc(x,stdout)


'\r'、'\n'と'\032'を扱えるようにするため、getc()とputc()はCP/Mの関数である必要があります。少なくともファイルの長さを知っている以外はMSDOSと同じです。

#if	UNIX
#define	getc(p)		(--(p)->_cnt>=0?(unsigned)*(p)->_ptr++:_filbuf(p))
#define	putc(x,p)	(--(p)->_cnt>=0?((unsigned)(*(p)->_ptr++=x)):_flsbuf((unsigned)(x),p))
#else	UNIX
#define	getc(p)		fgetc(p)
#define	putc(x,p)	fputc(x,p)
#endif	UNIX

#define	feof(p)		(((p)->_flag&_IOEOF)!=0)
#define	ferror(p)	(((p)->_flag&_IOERR)!=0)
#define	fileno(p)	((uchar)p->_file)
#define	clrerr(p)	p->_flag &= ~_IOERR
#define	clreof(p)	p->_flag &= ~_IOEOF

#define	L_tmpnam	34		/* max length of temporary names */

extern int	fclose(FILE *);
extern int	fflush(FILE *);
extern int	fgetc(FILE *);
extern int	ungetc(int, FILE *);
extern int	fputc(int, FILE *);
extern int	getw(FILE *);
extern int	putw(int, FILE *);
extern char *	gets(char *);
extern int	puts(char *);
extern int	fputs(char *, FILE *);
extern int	fread(void *, unsigned, unsigned, FILE *);
extern int	fwrite(void *, unsigned, unsigned, FILE *);
extern int	fseek(FILE *, long, int);
extern int	rewind(FILE *);
extern int	setbuf(FILE *, char *);
extern int	printf(char *, ...);
extern int	fprintf(FILE *, char *, ...);
extern int	sprintf(char *, char *, ...);
extern int	scanf(char *, ...);
extern int	fscanf(FILE *, char *, ...);
extern int	sscanf(char *, char *, ...);
extern int	remove(char *);
extern FILE *	fopen(char *, char *);
extern FILE *	freopen(char *, char *, FILE *);
extern FILE *	fdopen(int, char *);
extern long	ftell(FILE *);
extern char *	fgets(char *, int, FILE *);
extern char *	_bufallo(void);