今、ファミコンのアセンブラにはまっているのですが、
ファミコンは8ビットCPUで掛け算と割り算の命令がありません。
そこで、まずは、C言語だけでアルゴリズムを考えようとしたのですが、
なかなか上手くいきませんでした。
上手くいかないのは、int型で小数を扱うには、どうすればいいかという事が分かりません。
とりあえず、100倍して、答えを100で割るという手段を用いているのですが、
ファミコンのアセンブラに移植した場合、
例えば170.52という値だと(まあ、こんな値は普段使いませんが…)、17052という値に
なりオーバーフローしてしまいます。どうすればいいでしょうか?何か良い案があればお願いします。
ファミコンのアセンブラの開発環境はnesasmで、C言語の開発環境は、BCCDeveloperとVC++6.0です。
WindowsXPです。
ソースは以下の通りです。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int mul(int a,int b)
{
int sum=0;
for(int i=0;i<b;i++)
sum+=a;
return sum;
}
int div01(int a,int b)
{
int sum=a;
int count=0;
while((sum-=b)>=0)
{
count++;
}
return count;
}
typedef struct Div{
int num1;
int num2;
}Div;
int main()
{
int i,j;
float k,l;
Div D[81]={ {1,1},{2,1},{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},{9,1},
{2,2},{4,2},{6,2},{8,2},{10,2},{12,2},{14,2},{16,2},{18,2},
{3,3},{6,3},{9,3},{12,3},{15,3},{18,3},{21,3},{24,3},{27,3},
{4,4},{8,4},{12,4},{16,4},{20,4},{24,4},{28,4},{32,4},{36,4},
{5,5},{10,5},{15,5},{20,5},{25,5},{30,5},{35,5},{40,5},{45,5},
{6,6},{12,6},{18,6},{24,6},{30,6},{36,6},{42,6},{48,6},{54,6},
{7,7},{14,7},{21,7},{28,7},{35,7},{42,7},{49,7},{56,7},{63,7},
{8,8},{16,8},{24,8},{32,8},{40,8},{48,8},{56,8},{64,8},{72,8},
{9,9},{18,9},{27,9},{36,9},{45,9},{54,9},{63,9},{72,9},{81,9}
};
srand(time(NULL));
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
printf("%d×%dは%dです。:",i,j,mul(i,j));
for(k=0.0;k<=1.0;k+=0.1)
{
for(l=0.0;l<=1.0;l+=0.1)
{
printf("%.4f×%.4fは%.4fです。:",k,l,mul(k*100,l*100)/100.0/100.0);
}
}
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
int n1=rand()%81;
printf("%d÷%dは%dです。:",
D[n1].num1,D[n1].num2,div01(D[n1].num1,D[n1].num2));
}
}
for(k=1;k<=9;k+=1)
{
for(l=1;l<=9;l+=1)
{
float a=rand()%10/10.0;
float b=rand()%10/10.0;
printf("%.4f÷%.4fは%dです。:",a,b,div01(a*100,b*100));
}
}
return 0;
}