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の値を大きくすることが可能です。
