MENU

86系クロスコンパイラ

86系クロスコンパイラ

LSIC-86 ver.3.5

LSIC-86はWindowsまたはUNIX上で動作するi8086のソフトウェア開発をサポートする16ビットCクロスコンパイラです。

特長

  • ANSI標準規格に準拠したコンパイラ
  • コンパイラが最適なレジスタ割り付けを実行
  • i8086の4つのメモリモデルをサポート
  • リンカはMS-DOSで実行可能なEXEファイル、またはROM化可能なバイナリ、あるいは拡張インテルHEXファイルを生成
  • ターゲットシステムのメモリマップにあわせてオブジェクトを配置可能
  • ROM化のための初期設定モジュールおよび全ライブラリ関数のソース付き

言語仕様

  • ANSI標準規格に準拠したコンパイラ(多バイト文字 、<local.h>を除く)
  • サポートするデータ型
    void char signed char int unsigned
    int
    short unsigned short long unsigned
    long float
    double long double struct union enum
  • プリプロセッサ文
    #include #if #ifdef #elif
    #define
    #undef #line #pragma # ##
  • プロトタイプ宣言
    パラメタの間違いを防ぐプロトタイプ宣言が可能です。

コンパイラ

  • 高速かつコンパクト
    コンパイラがレジスタの最適な自動割り付けを行います。作成したプログラムの実行は高速、オブジェクトコードはコンパクトです。プログラマがregister宣言をあたえなくても、どの変数をレジスタに割り当てるべきかをコンパイラが自動的に判断します。従来のi8086用Cコンパイラはせいぜい2つか3つのレジスタしか割り当てられなかったのに対し、LSI C-86は使用されている変数をax,bx,cx,dx,si,diの6つのレジスタに可能なかぎり割り当てます。さらにLSI C-86は変数の生存期間を調べ、異なる変数に同じレジスタを割り当てることもやってのけます。したがって7つ以上の変数が使われている場合でも、全部レジスタで済ませてしまうこともあります。
  • パラメタの受け渡し
    関数パラメタは可能なかぎり(最大4個)レジスタを使って渡します。そのため関数呼び出しのオーバーヘッドは非常に軽く、アセンブリ言語サブルーチンとのリンクも簡単に行えます。
  • 各種メモリモデルをサポート
    スモール(S)、プログラム(P)、データ(D)、ラージ(L)の4つのメモリモデルをサポートしています。さらにfar,nearキーワードをサポートしていますので、効率の悪いラージモデルを使わずに、スモールモデルのプログラムの中で大量のデータを使用することができます。
  • コンパイラドライバ
    使いやすいコンパイラドライバを用意しています。ソースも含まれていますので、自由にカスタマイズすることができます。
  • アセンブリ・インライン関数
    アセンブリ言語をCのソースプログラム中に記述することができます。inp(ポート入力)のような関数は、Cプログラムの中にインライン展開することができ、効率が非常に良くなります。

図1. ソースプログラム

 char    _asm_c();

#define _qq_(s) #s
#define _q_(s)  _qq_(s)

#define inp8(p)         _asm_c(“\n\tIN\tAL,” _q_(__eval__(p)))
#define outp8(p, c)     _asm_c(“\n\tOUT\t” _q_(__eval__(p)) “,AL”, (char)(c))

#define di()            _asm_c(“\n\tCLI”)
#define ei()            _asm_c(“\n\tSTI”)


void    putch(char c)
{
di();
while ((inp8(0x00) & 0x01) == 0)
;
ei();
outp8(0x01, c);
}

生成されたコー

 putch_::
PUSH    CX
MOV     CL,AL
CLI
_2:
IN      AL,0
TEST    AL,1
JE      _2
STI
MOV     AL,CL
OUT     1,AL
POP     CX
RET

アセンブラ

アセンブラはi8086/i80186/i80286およびi8087/i80287の命令をサポートしています。また、ジャンプ命令を最適化する機能があります。通常の条件ジャンプ命令で分岐できるのは-128~+127バイトの範囲ですが、この範囲外への条件ジャンプ命令は逆の条件のジャンプ+無条件ジャンプの2命令に自動的に変換します。同様に、無条件ジャンプ命令もできるだけ短い命令を生成します。

リンカ

EXEファイルはもちろん、バイナリファイルあるいは拡張インテルHEXファイルを生成します。セグメントがロードされるべきアドレスを指定することによって、ターゲットシステムのメモリマップに柔軟に対応することができます。また、MS-LINKと同等のマップファイルを生成しますので、このファイルをICEなどで利用すればシンボリックデバッグが可能です。

プロファイラ

プロファイラはプログラムの実行をモニタするためのツールです。これは計数型プロファイラで、プログラムのどの文を何回実行したかをカウントします。その結果、プログラムのどの部分が実行されたのかが一目瞭然となりますので、条件判定の論理のミスなどを容易に発見することができます。また、実行回数の多い関数を最適化すればプログラム全体の効率を上げることができますが、プロファイラはその指標をあたえてくれます。

ライブラリ

ANSI標準規格で定義された関数のうち、多バイト文字関数とを除く、すべての関数を用意しています。 さらにUNIXで用意されている関数や、MS-DOSとのインタフェース関数など、数多くの関数を用意しています。ライブラリ関数すべてのソースを公開しています。

関数一覧表

 FP_OFF           FP_SEG           MK_FP

_clear87         _control87       _dos_allocmem    _dos_close       _dos_creat
_dos_creatnew    _dos_findfirst   _dos_findnext    _dos_freemem     _dos_getdate
_dos_getdiskfree _dos_getdrive    _dos_getfileattr _dos_getftime    _dos_gettime
_dos_getvect     _dos_keep        _dos_open        _dos_read        _dos_setblock
_dos_setdate     _dos_setdrive    _dos_setfileattr _dos_setftime    _dos_settime
_dos_setvect     _dos_write       _fpreset         _harderr         _hardresume
_hardretn        _lrotl           _lrotr           _matherr         _nullcheck
_rotl            _rotr            _status87        _tolower         _toupper


abort            abs              access           acos             asctime
asin             assert           atan             atan2            atexit
atof             atoi             atol             bdos             bsearch
btom             calloc           ceil             cgets            chdir
chkctype         chmod            chsize           clearerr         clock
close            cos              cosh             cprintf          cputs
creat            cscanf           ctime            ctype            daylight
di               difftime         div              dosexterr        dup
dup2             ecvt             ei               eof              exec
execl            execle           execlp           execlpe          execv
execve           execvp           execvpe          exit             exp
fabs             far_memccpy      far_memchr       far_memcmp       far_memcpy
far_memicmp      far_memmove      far_memset       far_movmem       far_setmem
far_stpcpy       far_strcat       far_strchr       far_strcmp       far_strcmpi
far_strcpy       far_strcspn      far_strdup       far_stricmp      far_strlen
far_strlwr       far_strncat      far_strncmp      far_strncmpi     far_strncpy
far_strnicmp     far_strnset      far_strpbrk      far_strrchr      far_strrev
far_strset       far_strspn       far_strstr       far_strtok       far_strupr
farcalloc        farcoreleft      farfree          farmallo         farrealloc
farstr           fclose           fcloseall        fcvt             fdopen
fdreopen         feof             ferror           fflush           fgetc
fgetchar         fgetpos          fgets            filelength       fileno
floor            flushall         fmod             fopen            fprintf
fputc            fputchar         fputs            fread            free
freopen          frexp            fscanf           fseek            fsetbin
fsetpos          fsettext         fstat            ftell            ftime
ftruncate        fwrite           gcvt             getc             getch
getchar          getche           getcwd           getenv           getpid
gets             getw             gftime           gmtime           hantozen
inp              inp8             inp8w            inpw             int86
int86x           int86y           intdos           intdosx          intdosy
isalkana         isalnmkana       isalnum          isalpha          isascii
isatty           iscntrl          iscsym           iscsymf          isdigit
isgraph          isgrkana         iskana           iskanji          iskanji2
iskmoji          iskpun           islower          ispnkana         isprint
isprkana         ispunct          isspace          isupper          isxdigit
itoa             jisalpha         jisdigit         jishira          jiskata
jiskigou         jisl0            jisl1            jisl2            jislower
jisspace         jistojms         jistoms          jisupper         jiszen
jmstojis         jstradv          jstrchr          jstrcmp          jstrlen
jstrmatch        jstrncat         jstrncmp         jstrncpy         jstrrchr
jstrrev          jstrskip         jstrstr          jstrtok          jtohira
jtokata          jtolower         jtoupper         kbhit            labs
ldexp            ldiv             localtime        log              log10
longjmp          lseek            ltoa             malloc           matherr
max              memccpy          memchr           memcmp           memcpy
memicmp          memmove          memset           min              mkdir
mktemp           mktime           modf             movedata         movemem
mstojis          mtob             nthctype         onexit           open
outp             outp8            outp8w           outpw            perror
pow              printf           putc             putch            putchar
putenv           puts             putw             qsort            raise
rand             read             realloc          remove           rename
rewind           rmdir            rmtmp            sbrk             scanf
segread          setbuf           setjmp           setmem           setvbuf
signal           sin              sinh             spawn            spawnl
spawnle          spawnlp          spawnlpe         spawnv           spawnve
spawnvp          spawnvpe         sprintf          sqrt             srand
sscanf           stackavail       stat             stime            stpcpy
strcat           strchr           strcmp           strcmpi          strcpy
strcspn          strdup           strerror         strftime         stricmp
strlen           strlwr           strncat          strncmp          strncmpi
strncpy          strnicmp         strnset          strpbrk          strrchr
strrev           strset           strspn           strstr           strtod
strtok           strtol           strtoul          strupr           swab
system           tan              tanh             tell             tempnam
time             timezone         tmpfile          tmpnam           toascii
tolower          toupper          truncate         tzname           tzset
ultoa            umask            ungetc           ungetch          unlink
utime            va_arg           va_end           va_list          va_start
vfprintf         vprintf          vsprintf         write            xprintf
xscanf          

ROM化

ROM化のための初期設定モジュールのソースが含まれています。これをターゲットシステム用に修正することによって、どのようなシステムにも対応することができます。また、アセンブラとのリンクが簡単に行え、割り込み処理もCで記述できます。さらに、オブジェクト効率がよく、ROMプログラムもほとんどCで記述できます。

性能

図1-a,bは、ベンチマークプログラムのソースとオブジェクトです。すべての変数がレジスタに割り当てられ、まだdiレジスタが余っていることにご注目ください。ソースの左端の数字はプロファイラによる実行回数です。

図1-a ベンチマークプログラムのソースリスト

         #include <stdio.h>

#define SIZE  8190
#define TRUE  1
#define FALSE 0

char flags[SIZE + 1];


1 void main()
1 {
1        int k, i, prime, count, iter;
1
1        printf("100 iterations\n");
1        for (iter = 1; iter <= 100; iter++) {
100               count = 0;
100               for (i = 0; i <= SIZE; i++)
819100                       flags[i] = TRUE;
100               for (i = 0; i <= SIZE; i++)
819100                       if (flags[i]) {
189900                             prime = i + i + 3;
189900                             for (k = i + prime; k <= SIZE; k += prime)
1499900                                       flags[k] = FALSE;
189900                               count++;
819100                       }
100        }
1        printf("%d primes\n", count);
1 } zentohan

図1-b ベンチマークプログラムのオブジェクトコード

 CGROUP  GROUP   TEXT
DGROUP  GROUP   DATA,BSS

TEXT    CSEG
DATA    DSEG
BSS     DSEG
flags_:         RS      8191

DATA    DSEG
Z6      DB      ‘100 iterarions’, 10,0
Z25:    DB      ‘%d primes’,10,0

TEXT    CSEG


main_::
PUSH    CX
PUSH    DX
PUSH    SI
MOV     AX,Z6
PUSH    AX
CALL    printf_
ADD     SP,2
MOV     DX,1
JMP     _1
_2:
XOR     CX,CX
XOR     BX,BX
JMP     _6
_7:
MOV     [flags_+BX].B,1
INC     BX
_6:
CMP     BX,8190
JNG     _7
XOR     SI,SI
JMP     _11
_12:
CMP     [flags_+SI].B,0
        JE      _17
MOV     AX,SI
ADD     AX,SI
ADD     AX,3
MOV     BX,SI
ADD     BX,AX
JMP     _18
_19:
MOV     [flags_+BX].B,0
ADD     BX,AX
_18:
CMP     BX,8190
JNG     _19
INC     CX
_17:
INC     SI
_11:
CMP     SI,8190
JNG     _12
INC     DX
_1:
CMP     DX,100
JNG     _2
PUSH    CX
MOV     AX,Z25
PUSH    AX
CALL    printf_
ADD     SP,4
POP     SI
POP     DX
POP     CX
RET


EXTRN   printf_
END

コンパイル処理の流れ

※Windows Vista以降では日本語表示および日本語入力はできません。

動作環境

ソフトウェア名対応OS
LSI C-86 Ver3.5 (Windowsパック)Windows XP Professional, Windows Vista※1 Business (32ビット) / Ultimate (32ビット)
LSI C-86 Ver3.5 (Solarisパック)Solaris 2.x for SPARC (SunOS 5.4, SunOS 5.5.1, SunOS 5.6, libc 1以上)
LSI C-86 Ver3.5 (FreeBSD/Linuxパック)FreeBSD/i386 (2.2.6-RELEASE, libc3), Linux (x86版, libc5.2.18)

※1.Windows Vistaでは日本語表示および日本語入力はできません。
●CD-ROMドライブ必須 ●libcバージョンは弊社で確認したものです。

商品一覧

商品名型名商品コード価格
LSI C-86 Ver.3.5(Windowsパック)基本パッケージ
【供給メディア:CD-R】
LSIC86-10-ST494018306181748,000円(税別)
LSI C-86 Ver.3.5(Windowsパック)
追加1ライセンス*2
LSIC86-10-1L494018302200919,000円(税別)
LSI C-86 Ver.3.5(Solarisパック)基本パッケージ
【供給メディア:CD-R】
LSIC86-20-ST494018308281248,000円(税別)
LSI C-86 Ver.3.5(Solarisパック)追加1ライセンス*2LSIC86-20-1L494018308300019,000円(税別)
LSI C-86 Ver.3.5(FreeBSD/Linuxパック)基本パッケージ
【供給メディア:CD-R】
LSIC86-30-ST494018308481648,000円(税別)
LSI C-86 Ver.3.5(FreeBSD/Linuxパック)
追加1ライセンス*2
LSIC86-30-1L494018308500419,000円(税別)
LSI C-86 Ver.3.5追加ユーザーズマニュアルLSIC86-10-UM49401830230069,800円(税別)

※2.基本パッケージ1本をご購入いただくと、商品別に追加ライセンスの購入ができます。追加ライセンスは追加1ライセンスをご用意しておりますので、ご使用になるコンピュータの台数に合わせて必要なライセンス数をご購入いただけます。

スクールパック

商品名型名商品構成価格
(Windows)スクールパック
基本10ライセンス
LSIC86SP-10-STマスターディスク(1枚)
供給メディア:CD-R、
ライセンスキー(10ユーザー分)、
ユーザーズマニュアル(1冊)
各150,000円(税別)
(Solaris)スクールパック
基本10ライセンス
LSIC86SP-20-1L
(FreeBSD/Linux)スクールパック
基本10ライセンス
LSIC86SP-30-ST
(Windows)スクールパック
追加1ライセンス*3
LSIC86SP-10-1Lライセンスキー(1ユーザー分)各15,000円(税別)
(Solaris)スクールパック
追加1ライセンス*3
LSIC86SP-20-1L
(FreeBSD/Linux)スクールパック
追加1ライセンス*3
LSIC86SP-30-1L
スクールパック
追加ユーザーズマニュアル
LSIC86SP-10-UMユーザーズマニュアル(1冊)5,000円
  • Windowsスクールパックの基本10ライセンス、Solarisスクールパックの基本10ライセンス、FreeBSD/Linuxパックの基本10ライセンスは、それぞれ別商品になりますので、予めご了承ください。
  • ご注文頂く基本10ライセンス、追加1ライセンスおよび追加ユーザーズマニュアルは、ひとつのパッケージに同朋されます。
  • 基本10ライセンスをご購入いただくと、商品別に追加ライセンスの購入ができます。追加ライセンスは追加1ライセンスをご用意しておりますのでご使用になるコンピュータの台数に合わせて、必要なライセンス数をご購入いただけます。

商品構成

  • コンパイラドライバ(lcc86)
  • プリプロセッサ(cpp)
  • コンパイラ(cf/cg86)
  • アセンブラ(r86)
  • リンカ(lld)
  • ライブラリ
  • ライブラリのソースコード(Cおよびアセンブリ言語)
  • ROM化トレーニングプログラム
  • UNIXライクなプログラム保守ツール(kmmake)
  • lcc86,cpp,kmmakeなどツールのソースコード
  • 日本語マニュアル
  • 登録カード

LSI C-86 Ver.3.5の(Windowsパック)基本パッケージ、(Solarisパック)基本パッケージ、(FreeBSD/Linuxパック)基本パッケージは 、それぞれ別商品になりますので予めご了承ください。
本コンパイラを使用して作成されたプログラムの販売については、コンパイラ自身をその中に含んでいない限りロイヤリティ(使用料)は一切不要です。

ご質問はお問い合わせフォームよりお問合せください。

販売代理店

株式会社キョードー〒101-0021 東京都千代田区外神田1-10-11 東京ラジオデパート2F
TEL.(03)3257-0202(代) FAX.(03)3257-0250
http://www.kydsem.co.jp/
東栄電気株式会社〒101-0041 東京都千代田区神田須田町2-2 須田町藤和ビル
TEL.(03)3252-4291(代) FAX.(03)3254-1006
http://www.toei-dk.co.jp/
ソフトバンク株式会社各支店までお問い合せください。
https://www.softbank.jp/
ダイワボウ情報システム株式会社各支店までお問い合せください。
http://www.pc-daiwabo.co.jp/
TD SYNNEX株式会社各支店までお問い合せください。
https://jp.tdsynnex.com/
日本電計株式会社各支店までお問い合せください。
http://www.n-denkei.co.jp/
株式会社システナ各支店までお問い合せください。
http://www.systena.co.jp/

諸注意

  • ご使用の際は商品添付の説明書をよくお読みのうえ、正しくお使いください。
  • 仕様および外観などは性能向上のため予告なしに変更することがあります。
  • 本製品(ソフトウェアを含む)は日本仕様であり、弊社では海外でのサービスおよび技術サポートなどは行っておりません。
  • LSI Cはエル・エス・アイ ジャパン株式会社の登録商標です。そのほか、商品名は一般に各開発メーカーの登録商標または商標です。