PCでプロテクトモードに切替えるときは1Mバイト以上にあるメモリへのアクセスのため
A20アドレスラインの有効化処理が必要ですがこのボードはRAM512kB、ROM512kBともともと
1Mバイト以下にしかメモリが無いので関係ありません。
A20アドレスラインの有効化処理が必要ですがこのボードはRAM512kB、ROM512kBともともと
1Mバイト以下にしかメモリが無いので関係ありません。
動作OKです。見た目にはわかりませんがネイティブ386コードで動作していることで頼もしい感じがします。
次にプロテクトモードならではのプログラム例です
以下のコードはエラストテネスの篩(ふるい)によってNUMまでの素数を表示するプログラムです
以下のコードはエラストテネスの篩(ふるい)によって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の値を大きくすることが可能です。
これがリアルモードのCコンパイラだと64kBセグメントの壁によって
6万数千しか配列が確保できません。
しかしプロテクトモードではメモリが存在する限りNUMの値を大きくすることが可能です。