今、悩んでいるのは、ファミコンのスクロールや、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バイト以上の変数をうまく扱えない事に起因しているのですがどうかサンプルプログラムをお願いします。
ファミコンのスクロールのサンプルプログラムをお願いします。
Re: ファミコンのスクロールのサンプルプログラムをお願いします。
サンプルプログラムをファミコンのNESASMもしくは、cc65のアセンブリのソースでお願いします。
(ファミコンの縦スクロールと横スクロールは、隠れている画面を動的に書き換えて行うのは分かるのですが、具体的なソースコードが
何となく2バイトを使えば出来るのでしょう。しかし、6502を始め、多くのコンピュータアーキテクチャがリトルエンディアンであるため
1バイトがオーバーフローやアンダーフローした場合、もう1つの変数の上位バイトを+1や-1すれば
良いのかもしれないのですがファミコンの仕様上、バグが出て分かりません。)
(また、0x2000の設定で、LDA #%10001XYYとして、STA $2000とするなら、
PPUのBGの書き換えたいアドレスの増分がXが0なら+1,Xが1なら+32をする)
8ビットの値を超えた値の計算式は、2バイトの値の場合、
上位ビットを+1しつつシフト演算すればいいのは、分かるのですが、それ以上の事が分かりません。
(論理シフトか算術シフトでも変わってくるので条件を考えてみます。)
sin,cosの計算式は、三角関数のテーブルのバイナリファイルを出力してそして
インクルード(.incbin)すればいいのは分かります。
(あとは、openglの本で出てきた内容の多角形を表示する場合のソースを改造すれば
簡単にテーブル化が出来ますが、sin関数とcos関数のテーブル化した
バイナリファイルの出力をどの言語で行えばより良いテーブル化になるか分かりません。)
(固定小数点と浮動小数点)というアルゴリズムを使えば良いのでしょうが、ネットでの書き込みを見ると人によって概念は
知っているものの、考え方に違いがみられるため、どうすれば固定小数点を行えば良いか分かりません。
(あるいは下位バイトという考え方を使えば良いかもしれないですが、
1バイトの右シフトが論理シフトなのか算術シフトなのかも検証する必要があります)
7ビットPCMは、WAVファイルを8ビットから7ビットに変換するには、最上位1ビットを右シフトしつつ、最下位ビットを次の
最上位ビットすれば良いのが分かりました。(最上位ビットをNバイトの整数で取得するならunsigned (int or long or char or long long) x;
の場合、x &= 0xFF ;でマスクして、1バイトの値以下に落とし込んでx &= 0x01 ;をして最下位ビットを取得して、xと別の変数のyという変数を
用意してxを8回左シフトしてy|=x;としてから、最上位ビットを取得するならx &= 0x80 ;で、OKだと思います。)
これらはすべて、2バイト以上の変数をうまく扱えない事に起因しているのですがどうかサンプルプログラムをお願いします。[/quote]
あるいは、c言語での8ビット環境を考慮したサンプルプログラムが欲しいです。
かなり参考になるURLがあったので、貼り付けておきます。
www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Float.html
nesasm.web.fc2.com/familybasic/
matome.naver.jp/odai/2142867349115227701/2142867639217406003
http://
をリンク先のURLの先頭につけてください。
(ファミコンの縦スクロールと横スクロールは、隠れている画面を動的に書き換えて行うのは分かるのですが、具体的なソースコードが
何となく2バイトを使えば出来るのでしょう。しかし、6502を始め、多くのコンピュータアーキテクチャがリトルエンディアンであるため
1バイトがオーバーフローやアンダーフローした場合、もう1つの変数の上位バイトを+1や-1すれば
良いのかもしれないのですがファミコンの仕様上、バグが出て分かりません。)
(また、0x2000の設定で、LDA #%10001XYYとして、STA $2000とするなら、
PPUのBGの書き換えたいアドレスの増分がXが0なら+1,Xが1なら+32をする)
8ビットの値を超えた値の計算式は、2バイトの値の場合、
上位ビットを+1しつつシフト演算すればいいのは、分かるのですが、それ以上の事が分かりません。
(論理シフトか算術シフトでも変わってくるので条件を考えてみます。)
sin,cosの計算式は、三角関数のテーブルのバイナリファイルを出力してそして
インクルード(.incbin)すればいいのは分かります。
(あとは、openglの本で出てきた内容の多角形を表示する場合のソースを改造すれば
簡単にテーブル化が出来ますが、sin関数とcos関数のテーブル化した
バイナリファイルの出力をどの言語で行えばより良いテーブル化になるか分かりません。)
(固定小数点と浮動小数点)というアルゴリズムを使えば良いのでしょうが、ネットでの書き込みを見ると人によって概念は
知っているものの、考え方に違いがみられるため、どうすれば固定小数点を行えば良いか分かりません。
(あるいは下位バイトという考え方を使えば良いかもしれないですが、
1バイトの右シフトが論理シフトなのか算術シフトなのかも検証する必要があります)
7ビットPCMは、WAVファイルを8ビットから7ビットに変換するには、最上位1ビットを右シフトしつつ、最下位ビットを次の
最上位ビットすれば良いのが分かりました。(最上位ビットをNバイトの整数で取得するならunsigned (int or long or char or long long) x;
の場合、x &= 0xFF ;でマスクして、1バイトの値以下に落とし込んでx &= 0x01 ;をして最下位ビットを取得して、xと別の変数のyという変数を
用意してxを8回左シフトしてy|=x;としてから、最上位ビットを取得するならx &= 0x80 ;で、OKだと思います。)
これらはすべて、2バイト以上の変数をうまく扱えない事に起因しているのですがどうかサンプルプログラムをお願いします。[/quote]
あるいは、c言語での8ビット環境を考慮したサンプルプログラムが欲しいです。
かなり参考になるURLがあったので、貼り付けておきます。
www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Float.html
nesasm.web.fc2.com/familybasic/
matome.naver.jp/odai/2142867349115227701/2142867639217406003
http://
をリンク先のURLの先頭につけてください。
Re: ファミコンのスクロールのサンプルプログラムをお願いします。
8ビットを表す値はかなり小さいのですが、2バイトの計算まで
あともう少し頑張れば理解できそうな領域まで達していると思います。
あともう少し努力すれば到達しそうだけども、市販のソフトを現在持っていないのに
逆アセンブルは出来ないので、ネットのサンプルソースがあれば
それをとりあえず参考にしたいと思います。
そうすれば、まだ可能性はあると思います。
あと、実は教科書によって知識がバラバラですが、
算術シフトは左シフトの場合、一般的には最上位ビットはどうなるのか教えていただきたいです。
ファミコンの場合で、すみませんが、最上位ビットだったビットはどうすれば
仮にキャリーフラグを経て上位バイトに入るのかどうかは分かる型がいればそれも教えていただきたいです。
まってください、そういえば、secとclcの命令があるからそれも使っても良いのかという事も聞きたいですが、
それを使っても良いなら解決しそうな気もします。
全ては自分の勉強不足とコンピュータの知識が無いからそんな事を言うのだと思いますが、ごめんなさい。
お願いします。
あともう少し頑張れば理解できそうな領域まで達していると思います。
あともう少し努力すれば到達しそうだけども、市販のソフトを現在持っていないのに
逆アセンブルは出来ないので、ネットのサンプルソースがあれば
それをとりあえず参考にしたいと思います。
そうすれば、まだ可能性はあると思います。
あと、実は教科書によって知識がバラバラですが、
算術シフトは左シフトの場合、一般的には最上位ビットはどうなるのか教えていただきたいです。
ファミコンの場合で、すみませんが、最上位ビットだったビットはどうすれば
仮にキャリーフラグを経て上位バイトに入るのかどうかは分かる型がいればそれも教えていただきたいです。
まってください、そういえば、secとclcの命令があるからそれも使っても良いのかという事も聞きたいですが、
それを使っても良いなら解決しそうな気もします。
全ては自分の勉強不足とコンピュータの知識が無いからそんな事を言うのだと思いますが、ごめんなさい。
お願いします。
Re: ファミコンのスクロールのサンプルプログラムをお願いします。
hp.vector.co.jp/authors/VA042397/nes/games.html
http://を先頭に付けてください。
このサイトのサンプルプログラムはある意味、自分の実力を底上げ出来る材料になりそうですが、
ソースを読めという事はそういう事だったのでしょうか。
あと、NESASMに使えるソースは基本的にはWINDOWS付属のメモ帳で見ないと、
設定を変えてutf-8などにしたら、見た目は普通ですが、文字化けとみられるため、
ソースの先頭行からエラーが発生してしまいますので、ご注意してください。
みなさん、ノーヒントでしたが、自分も見ていた方も大丈夫だと思います。
基本的にはソースを見ながら画面を2分割し、コピペせずに、目で見て写しながら
覚えて、改造しつつスクロールできるようになることが出来る予定に入っており大満足です。
http://を先頭に付けてください。
このサイトのサンプルプログラムはある意味、自分の実力を底上げ出来る材料になりそうですが、
ソースを読めという事はそういう事だったのでしょうか。
あと、NESASMに使えるソースは基本的にはWINDOWS付属のメモ帳で見ないと、
設定を変えてutf-8などにしたら、見た目は普通ですが、文字化けとみられるため、
ソースの先頭行からエラーが発生してしまいますので、ご注意してください。
みなさん、ノーヒントでしたが、自分も見ていた方も大丈夫だと思います。
基本的にはソースを見ながら画面を2分割し、コピペせずに、目で見て写しながら
覚えて、改造しつつスクロールできるようになることが出来る予定に入っており大満足です。