2014年9月16日火曜日

BDS C の制限

>BDS C の使い方 - 目次

  • コメントは /* ~ */ 型式のみ
  • 変数の型は、char, short, int, unsigned のみ
    • unsigned short とか unsigned int と書かず、unsigned とだけ書く
    • char は符号無しのみで signed char に相当するものは無い
    • longfloat は使えませんが、代わりに long の演算ライブラリが付属している。float は無し。
  • 関数名は8文字までで、大文字小文字の区別はされない
    • C で書いた関数なら、8文字以上使うとエラーが出ますが、アセンブラで書いた関数の場合エラーが出ませんので 「func_aaa2 を呼び出そうとして func_aaa1 を呼び出してしまう」ということが起こるので注意
  • 変数名も8文字までですが、大文字小文字の区別はする
  • 配列は二次元まで
  • sizeof 演算子で配列の大きさを得られない
  • sizeof(int) のように、sizeof 演算子に型指定子を直接与えることが出来ない(変数名を与えなければいけない)
  • typedef が無い
  • 関数宣言時に引数の型を括弧内に書けない
  • 関数のプロトタイプ宣言ができない
このくらいの制限に気をつければ、プログラムを書くのに困らないんじゃないでしょうか。現代の C言語と比べると制限が多いですが、アセンブラで書くのと比べれば天国ですよね。


サンプル

/*
    BDS C の制限
*/

#include <stdio.h>

main ()
{
    /* char a=10; のように宣言時に初期化出来ない */
    char c;
    short s;
    int i;
    unsigned u;
    char array[20];

    c=0xFF;
    s=0xFFFF;
    i=0xFFFF;
    u=0xFFFF;

    printf("char        SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof c,c,c,c);
    printf("int         SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof i,i,i,i);
    printf("short       SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof s,s,s,s);
    printf("unsigned    SIZE:%d 0x%04x = %%d:%5d %%u:%5u\n",sizeof u,u,u,u);
    printf("array[20]   SIZE:%d\n\n",sizeof array);

    if(0<c) puts("char = unsigned\n");
    else puts("char = signed\n");

    if(0<s) puts("short = unsigned\n");
    else puts("short = signed\n");

    if(0<i) puts("int = unsigned\n");
    else puts("int = signed\n");

    if(0<u) puts("unsigned = unsigned\n");
    else puts("unsigned = signed\n");

    printf("\n%d %d",func1(20,5),func2(20,5));
}

int func1(a, b)     /* int func1(int a, int b) とは書けない */
int a,b;
{
    return a+b;
}

int func2(a, b)
{
    return a-b;
}

実行結果

>cpm cc test\limit
BD Software C Compiler v1.60  (part I)
  41K elbowroom
BD Software C Compiler v1.60 (part II)
  39K to spare
>cpm clink test\limit
BD Software C Linker   v1.60

Last code address: 113B
Externals start at 113C, occupy 0006 bytes, last byte at 1141
Top of memory: FDFF
Stack space: ECBE
Writing output...
  51K link space remaining
>cpm test\limit
char            SIZE:1  0x00FF = %d:  255 %u:  255
int             SIZE:2  0xFFFF = %d:   -1 %u:65535
short           SIZE:2  0xFFFF = %d:   -1 %u:65535
unsigned        SIZE:2  0xFFFF = %d:   -1 %u:65535
array[20]       SIZE:2

char = unsigned
short = signed
int = signed
unsigned = unsigned

25 15
>

>BDS C の使い方 - 目次