ファミコンのスクロールのサンプルプログラムをお願いします。
Posted: 2016年10月22日(土) 15:36
今、悩んでいるのは、ファミコンのスクロールや、8ビットの
0~255を超えた場合の16ビットの計算式や、sin,cosの計算式や固定少数の計算式や、
小数の掛け算を整数でのやり方や、7ビットPCMの再生が非同期と同期させながらの再生方法
が分からず困っています。これらはすべて2バイトと1バイトの違いによるものです。
それぞれのサンプルプログラムをファミコンのNESASMもしくは、cc65のアセンブリのソースでお願いします。
それぞれのある意味ヒントになりうるソースは持ち合わせていますが、それを提供した貰った
3年経った今でも応用が利かず分かりません。
ファミコンの縦スクロールと横スクロールは、隠れている画面を動的に書き換えて行うのは分かるのですが、具体的なソースコードが
何となく2バイトを使えば出来るのでしょう。しかし、1バイトがオーバーフローやオーバーフローしたら+1や-1すれば
良いのかもしれないのですがファミコンの仕様上、バグが出て分かりません。
8ビットの値を超えた値の計算式は、2バイトの値の場合、
上位ビットを+1しつつシフト演算すればいいのは分かるのですが、それ以上の事が分かりません。
sin,cosの計算式は、テーブルをバイナリファイルでインクルードすればいいのは分かります。
しかし、sin,cosの拡大した場合や、256以上の超えた場合や、小数を扱う場合、
2バイト以上変数を使えば良いのは分かるのですがオーバーフローしたり、アンダーフローしてしまうため、
キャリーフラグを使う事までは分かるのですが、ローテートとシフト演算のどちらを使えばいいか分かりません。
なんとなくローテートとシフト演算を交互に使えば良い気もしますが、
キャリーフラグをどう媒介させれば良いのか詳細が分かりません。
小数の掛け算を整数でやる場合、誤差が出るので、その誤差をどう修正すれば良いか分かりません。
具体的には、1.5倍する場合、Nを整数の変数とすると、N*1+N/2とすれば求まる気がしますが、Nを3とすると
3*1+3/2=3+1=4と、4.5と比べて0.5の誤差が出てしまいます。
その場合、0.5の誤差は固定少数をどう扱えば誤差は収まるのかが分かりません。
その際は固定少数点というアルゴリズムを使えば良いのでしょうが、ネットでの書き込みを見ると人によって概念は
知っているものの、考え方に違いがみられるため、どうすれば固定小数点を行えば良いか分かりません。
7ビットPCMは、WAVファイルを8ビットから7ビットに変換するには、最上位1ビットを右シフトしつつ、最下位ビットを次の
最上位ビットすれば良いのが分かりました。しかし、なぜかサンプルプログラムで同期で再生しようとすると、一部が
ピーガーガーと機械語の音になってしまいうまく再生されないのと非同期の再生の仕方が分かりません。
ただ、メインループの中でのサブルーチンの中である変数をインクリメントしつつ、メインループを動かせば良いのは
分かります。がそれ以上となると分かりません。
これらはすべて、2バイト以上の変数をうまく扱えない事に起因しているのですがどうかサンプルプログラムをお願いします。
0~255を超えた場合の16ビットの計算式や、sin,cosの計算式や固定少数の計算式や、
小数の掛け算を整数でのやり方や、7ビットPCMの再生が非同期と同期させながらの再生方法
が分からず困っています。これらはすべて2バイトと1バイトの違いによるものです。
それぞれのサンプルプログラムをファミコンのNESASMもしくは、cc65のアセンブリのソースでお願いします。
それぞれのある意味ヒントになりうるソースは持ち合わせていますが、それを提供した貰った
3年経った今でも応用が利かず分かりません。
ファミコンの縦スクロールと横スクロールは、隠れている画面を動的に書き換えて行うのは分かるのですが、具体的なソースコードが
何となく2バイトを使えば出来るのでしょう。しかし、1バイトがオーバーフローやオーバーフローしたら+1や-1すれば
良いのかもしれないのですがファミコンの仕様上、バグが出て分かりません。
8ビットの値を超えた値の計算式は、2バイトの値の場合、
上位ビットを+1しつつシフト演算すればいいのは分かるのですが、それ以上の事が分かりません。
sin,cosの計算式は、テーブルをバイナリファイルでインクルードすればいいのは分かります。
しかし、sin,cosの拡大した場合や、256以上の超えた場合や、小数を扱う場合、
2バイト以上変数を使えば良いのは分かるのですがオーバーフローしたり、アンダーフローしてしまうため、
キャリーフラグを使う事までは分かるのですが、ローテートとシフト演算のどちらを使えばいいか分かりません。
なんとなくローテートとシフト演算を交互に使えば良い気もしますが、
キャリーフラグをどう媒介させれば良いのか詳細が分かりません。
小数の掛け算を整数でやる場合、誤差が出るので、その誤差をどう修正すれば良いか分かりません。
具体的には、1.5倍する場合、Nを整数の変数とすると、N*1+N/2とすれば求まる気がしますが、Nを3とすると
3*1+3/2=3+1=4と、4.5と比べて0.5の誤差が出てしまいます。
その場合、0.5の誤差は固定少数をどう扱えば誤差は収まるのかが分かりません。
その際は固定少数点というアルゴリズムを使えば良いのでしょうが、ネットでの書き込みを見ると人によって概念は
知っているものの、考え方に違いがみられるため、どうすれば固定小数点を行えば良いか分かりません。
7ビットPCMは、WAVファイルを8ビットから7ビットに変換するには、最上位1ビットを右シフトしつつ、最下位ビットを次の
最上位ビットすれば良いのが分かりました。しかし、なぜかサンプルプログラムで同期で再生しようとすると、一部が
ピーガーガーと機械語の音になってしまいうまく再生されないのと非同期の再生の仕方が分かりません。
ただ、メインループの中でのサブルーチンの中である変数をインクリメントしつつ、メインループを動かせば良いのは
分かります。がそれ以上となると分かりません。
これらはすべて、2バイト以上の変数をうまく扱えない事に起因しているのですがどうかサンプルプログラムをお願いします。