CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

GCCプログラミング(5)

PCでプロテクトモードに切替えるときは1Mバイト以上にあるメモリへのアクセスのため
A20アドレスラインの有効化処理が必要ですがこのボードはRAM512kB、ROM512kBともともと
1Mバイト以下にしかメモリが無いので関係ありません。

早速ビルドして実行。
イメージ 1

画面はソースエディタ→DOS窓コンパイル→ターミナルへバイナリ転送して実行の様子

動作OKです。見た目にはわかりませんがネイティブ386コードで動作していることで頼もしい感じがします。

次にプロテクトモードならではのプログラム例です
以下のコードはエラストテネスの篩(ふるい)によってNUMまでの素数を表示するプログラムです
#define NUM 500000
char tbl[NUM];

int main(void)
{
  unsigned long i,m,sum;
  char str[32];
	
  m=NUM;
  putstr("Prime numbers.\n\r");
  sieve(tbl,m);
  sum=0;
  for(i=2;i<=m;i++){
    if(isprime(tbl,i)){
      sum++;
      sprintf(str,"%ld\n\r",i);
      putstr(str);
    }
  }
  putstr("End.\n\r");
  while(1){
  }
}

void sieve(unsigned char *tbl,unsigned long num)
{
  unsigned long i,j;
  for(i=0;i<=num;i++)
    tbl[i]=1;
  for(i=2;i<=num/2;i++){
    if(tbl[i] == 1){
      for(j=i+i;j<=num;j+=i){
        tbl[i]=0;
      }
    }
  }
}

int isprime(unsigned char *tbl,unsigned long num)
{
  return tbl[num];
}

ここでは始めに上限値NUMまでのフラグを配列で確保していますが
これがリアルモードのCコンパイラだと64kBセグメントの壁によって
6万数千しか配列が確保できません。
しかしプロテクトモードではメモリが存在する限りNUMの値を大きくすることが可能です。

今回の場合SRAMが512kBの中にテキストコードとデータが共存するので
NUM=50万でやってみました
これも楽勝で動作・・・と思っていたのですが、思わぬトラブルに見舞われました