今、ファミコンのアセンブラにはまっているのですが、
ファミコンは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; }