-
PACKAGES EXECUTION DOCUMENT PORT MSX
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);