Пікірлер
@koziroshasaki7339
@koziroshasaki7339 5 сағат бұрын
1フレームあたりの cpu.bus.gpu.ly == 144 のターンが多すぎるんじゃないでしょうか? 1フレームで1回の呼び出しになってないように思います。
@pluswing
@pluswing 5 сағат бұрын
お、、確認しますね! ありがとうございます!
@mm839
@mm839 7 сағат бұрын
17:50 画面表示
@user-zy1ce7tn7m
@user-zy1ce7tn7m 18 сағат бұрын
おぉ、ついに画面でましたね。 画面の色が反転してるので、たぶんパレットの定義が真逆になってますね。
@pluswing
@pluswing 6 сағат бұрын
ありがとうございます! 指摘の通り、パレット定義逆でした!
@user-ug8dg5ij3i
@user-ug8dg5ij3i 19 сағат бұрын
やっぱり描画処理で正しく表示されたときの感動がありますよね。 おめでとうございます。
@pluswing
@pluswing 6 сағат бұрын
ありがとうございます!
@cocoatech
@cocoatech 21 сағат бұрын
15:50 0x60 が 0x06 に変わっちゃってます
@pluswing
@pluswing 6 сағат бұрын
指摘ありがとうございます! 修正します!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 4 күн бұрын
おぉ!?なんか出ましたね!(モノクロなはずがカラフルなドットが出ている‥)
@user-zy1ce7tn7m
@user-zy1ce7tn7m 4 күн бұрын
違うかもしれませんが、ppu.rs:251 の「x」は「x * 3」じゃないとおかしいかも? 1ドットのRGBで3バイト使うので。 そして、「y * 160」も「y * 480」かな?
@user-zy1ce7tn7m
@user-zy1ce7tn7m 4 күн бұрын
5:40 021Cで止まっていますが、このアドレスの命令は「RET NC」です、条件に満たさない場合、今の実装ですとPCにバイト数が足されず、PCが変化しないので止まってしまいます。 (C NZ Z)も同様に条件に満たさない場合は止まってしまいます。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 4 күн бұрын
is_add_pcでRETは除外されているので。
@pluswing
@pluswing 4 күн бұрын
なるほど!バグを作ってしまいましたね。。 修正します!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 5 күн бұрын
JR命令はJP命令の相対ジャンプ版みたいなものです。 この命令は現在のPCからオフセット符号付き8ビット(-128~127)を加えてジャンプできる命令になります。  ジャンプ条件は5種類あって、「無条件 NZ Z NC C」です。 条件が成立した場合の、PCの値は、”現在のPCの値”に「”命令のバイト数”と”次のバイトを符号付き8ビットとして読んだもの”」を足します。  「PC = PC + 2 + i8」  ただし、実装では命令のバイト数は後から足される仕様なので、「PC = PC + i8」で良いです。 条件が不成立の場合は、PCには命令のバイト数だけを足します。
@pluswing
@pluswing 5 күн бұрын
ありがとうございます! コメント今気づいたのですが、JR命令は無事そのように実装できたかと。
@cocoatech
@cocoatech 5 күн бұрын
前回実装したRST命令は、CALLと同等なのでリターンアドレスをプッシュしておかなきゃいけないと思います。 それと、オーバーフローの心配をされてしますが、それに対処するのが wrapping_add (sub) なので、場合分けのコードは不要かと思います。 u16の場合、0x0000 に wrapping_sub(1) したら 0xFFFF になって、0xFFFF に wrapping_add(1) したら 0x0000 になります。
@pluswing
@pluswing 5 күн бұрын
コメントありがとうございます! 今コメントもらってたの気づきました! 次回の動画で確認します! 確かに。wrapping_subを何のために使ってるのか。ってことですよね。。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 5 күн бұрын
「テストロムの0xFF01についての説明」 0xFF01には、一文字ずつアスキーコード(8bit)が書かれます、なので一文字書かれる度にログに出力する必要があります。 従って、ログの処理はwrite_byteに書いた方が良いです。 例えば「cpu_instrs」という文字列をテストロムが出力する場合、 1、まず、”c”(文字コード:0x63) が0xFF01に書き込まれます。 2、それをログで出力します、出力の際、0x63の後ろに終端文字0x00を付ける必要があります。{0x63 0x00}(終端文字がないと多分落ちます)  残りの文字も同様に一文字ずつ書き込まれるので、同様にログに出力します。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 5 күн бұрын
動画で見る限りでは、現状おかしな文字コードを書き込んでいるので、JR命令あたりが原因かなと思います。
@pluswing
@pluswing 5 күн бұрын
お、cが出てました! これは良い兆候? 修正してみます!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 7 күн бұрын
JR命令も怪しいです (未実装?)
@user-zy1ce7tn7m
@user-zy1ce7tn7m 7 күн бұрын
26:00 ファミコンの方のソースを開いてますね。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 7 күн бұрын
このテストロムはPPU未実装でも使えるように、結果が0xFF01にアスキーコードで出力されるようです。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 7 күн бұрын
こちらはLDH命令(0B90のE0 01)でFF00 + 01のアドレスに書かれるので、LDH命令の実装が必要です。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 11 күн бұрын
アドレス「066B」の命令は0x0200へジャンプする命令ですが。。そのまま「066E」に進んでるので、ジャンプできていないみたいです。
@pluswing
@pluswing 11 күн бұрын
コメントありがとうございます! あら、、ダメダメですね。 確認してみます!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 9 күн бұрын
@@pluswing あ、すみません、ジャンプ命令はPCをセットした後に-3してるので、printの表示がずれているだけですね。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 9 күн бұрын
CALL命令がおかしいみたいで、今の実装ですと「元のPCの値にread_next_wordから3を引いた値を”加算”」になっています。 read_next_wordから3を引いた値をPCへ”代入”が正しいと思われます。
@pluswing
@pluswing 9 күн бұрын
@user-zy1ce7tn7m コメントありがとうございます! 色々調べていただいて大変助かります! ただ、execute()の後にログを出してたのがそもそも間違えだったらしく。。 PCが実行後の値で表示されてしまっていました。 execute()前にログを出すように修正した結果が以下で、これがこの動画内と同じく、繰り返し表示される状態です。 JP命令はこれ見る限りちゃんと動いてそう。(それ以上のことはわからない) 3FFD ==> 0xC3 JP a16 (0x066E) 066E ==> 0x57 LD D, A 066F ==> 0xFA LD A, [a16] (0xD65E) 0672 ==> 0x6F LD L, A 0673 ==> 0xFA LD A, [a16] (0xD65F) 0676 ==> 0x67 LD H, A 0677 ==> 0xF9 LD SP, HL 0678 ==> 0x7A LD A, D 0679 ==> 0xC1 POP BC 067A ==> 0xCD CALL a16 (0x06FD)
@user-zy1ce7tn7m
@user-zy1ce7tn7m 9 күн бұрын
@@pluswing なるほど~。そして、067AのCALL命令で、06FDではなく0D74に飛んでいると。 0D74 = 067A + (06FD-3)
@benjamindeharo314
@benjamindeharo314 13 күн бұрын
この後、別のエミュレーターを作る予定はありますか?
@pluswing
@pluswing 13 күн бұрын
今のところは無いですね。 スーファミ以降はこれよりかなり複雑なので、手も足も出なそうです。
@benjamindeharo314
@benjamindeharo314 13 күн бұрын
@@pluswing マスターシステムとPCエンジンも難しすぎ? あなたには1978年アーケードのスペースインベーダーが簡単でしょう。
@pluswing
@pluswing 13 күн бұрын
@@benjamindeharo314 マスターシステムはz80系っぽいので、作れそうではありますね。ただこのゲーム機で遊んだことがないんですよね。。 やっぱり昔遊んだゲームが自分の作ったエミュレーターで動くというのが醍醐味なので。
@benjamindeharo314
@benjamindeharo314 13 күн бұрын
@@pluswing 昔遊んでいたゲームを自分で作ったエミュレータで遊ぶのは、きっと素晴らしい気分でしょうね。 おっしゃる通り、好きなことをすればいいのです。 マスターシステムに興味がないのであれば、わざわざエミュレーターを作る必要はありません。
@benjamindeharo314
@benjamindeharo314 14 күн бұрын
14:45 let addr = addr + ((bank - 1) * 0x4000) 本当か? let addr = addr + ((bank - 1) + 0x4000) これじゃない?
@pluswing
@pluswing 13 күн бұрын
コメントありがとうございます! bankには、0,1,2... のような整数が入ります。 その整数*0x4000をオフセットとしてメモリアクセスする必要があるため、 bank=1: offset=0x0000 (元のaddrが0x4000 以上なのは確定なのでoffsetする必要なし) bank=2: offset=0x4000 bank=3: offset=0x8000 としたいので、* 0x4000 であってるはずです。
@benjamindeharo314
@benjamindeharo314 13 күн бұрын
@@pluswing はあ!なるほど。 ご説明ありがとうございます。
@koziroshasaki7339
@koziroshasaki7339 18 күн бұрын
0000h~0068h は RST命令や割込処理時の実行コードが書かれてます
@pluswing
@pluswing 18 күн бұрын
おおーなるほど。RST命令のパラメタがそれっぽいアドレスですね! ありがとうございます!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 19 күн бұрын
パレットですが、ピクセルの2ビットをインデックスとして、0xFF47レジスタのパレットを使うみたいです。
@pluswing
@pluswing 19 күн бұрын
情報ありがとうございます! 0xFF47レジスタ確認します!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 19 күн бұрын
背景は横256ドットなので以下のようにもできます。 256バイトの配列を用意して、横256ドット分をこの配列にいれる。 unsigned char line_buffer[256]; 画面に横160ドット分を描画するときに、この配列からデータを持ってくる。 配列のアドレスは「(PPU_SCX + i) & 0xFF」で計算。  0xFFでANDすることで255を超えたら反対にループされます。 //PPU_SCXはFF43hのレジスタです。 for(int i = 0; i < 160 ; i++){ LCD[(LY * 160) + i] = line_buffer[(PPU_SCX + i) & 0xFF]; }
@user-zy1ce7tn7m
@user-zy1ce7tn7m 27 күн бұрын
「Emulating the Gameboy.」で検索して出てくるページも参考になりそうです
@user-zy1ce7tn7m
@user-zy1ce7tn7m 27 күн бұрын
ページの右にあるメニューから見れます
@pluswing
@pluswing 27 күн бұрын
ありがとうございます! みてみます!
@pluswing
@pluswing 29 күн бұрын
動画内で見つけられなかったドキュメント、こちらですー github.com/akatsuki105/gb-docs-ja
@user-zy1ce7tn7m
@user-zy1ce7tn7m Ай бұрын
4:43 この方のGithubにドキュメントがありましたよ
@pluswing
@pluswing Ай бұрын
お、これは朗報!! 情報ありがとうございます! 確認してみます!
@pluswing
@pluswing 29 күн бұрын
これですね!見つけました!! github.com/akatsuki105/gb-docs-ja
@cherryblossom1880
@cherryblossom1880 Ай бұрын
let mask =1 << 7 -plexel_indexになってますがおそらくドキュメントでは括弧が付いてました。
@pluswing
@pluswing Ай бұрын
おお、ありがとうございます。 修正します!
@netastone7699
@netastone7699 Ай бұрын
どうせならBandai Playdiaのエミュレータを作って下さい。GBエミュはもうあるのでね
@datsuryoku
@datsuryoku Ай бұрын
お大事にして下さい。
@user-sy6xn7nq7s
@user-sy6xn7nq7s Ай бұрын
継承が非常に理解しにくい
@Arsche
@Arsche 2 ай бұрын
Swift で、言うところのprotocol ってやつですかね
@Arsche
@Arsche 2 ай бұрын
おれ、HyperCard世代な人なんですけど、SwiftUIで倉庫番、作ろうとしてる。 もし、これが出来たら、ドラクエ作れるなあって、気もする
@cocoatech
@cocoatech 2 ай бұрын
18:00 INC r8 と INC (HL) ではゼロフラグは計算結果が0なら立ちます。 INC C のテストが通っちゃってるのがおかしいんですけど、今の実装では加算は16ビットで計算して、代入する時だけ8ビットにしているため、元の値が 0xFF のとき加算後の value が 0x100 になって、それを update_flags に渡しているのでゼロフラグが立たなくなってるものと思います。
@pluswing
@pluswing 2 ай бұрын
おお、確かに。 ありがとうございます! 修正します!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
11:00 wordだと、Aレジスタを読み書きする命令で問題が出そうです。オペコードの0xEAと0xFAです。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
オペコードの0x08はスタックポインタを書き込むのでwordです。
@pluswing
@pluswing 2 ай бұрын
ありがとうございます! 場合によって変わるんですね。 確認します!
@jojo-fz9cb
@jojo-fz9cb 2 ай бұрын
hogeを使うやつって基本的に気配りができない。 sampleと書けばhogeって何ですかと聞かれる可能性が0になるのに、そのことに気がついてない。
@user-eq2dh7fm1m
@user-eq2dh7fm1m 2 ай бұрын
米軍のなんかの在庫が、どっかで使い切ったタイミングってことで(´・ω・`)
@pluswing
@pluswing 2 ай бұрын
コメントありがとうございます。 そういう事情もあってずっと作ってたんですね。
@user-wf6be7oo8g
@user-wf6be7oo8g 2 ай бұрын
なんか、コマンドみたいなめっちゃ長い文の意味や説明、なにのことを書いてあるのかとかの動画って作れますか、?忙しいとかなら大丈夫です! もう作ってあったらなんて調べたらでてくるか教えてください!
@pluswing
@pluswing 2 ай бұрын
コメントありがとうございます。 curlコマンドのことですかね?動画はないですが、curl "--data-urlencode" とかで検索すると分かると思いますよ。 わからないことあれば気軽にコメントください!
@ourtube543
@ourtube543 2 ай бұрын
よくRustやJavascript系やGo言語書いたりと言語をすぐに変れるの凄いです😃今すぐにJavascriptの関数の定義とかTypescriptのジェネリクスとかすぐに書けますか?笑 Rustではあまり見ないけどconstが基本ですよ?w
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
z80(GBもたぶん)は内部の演算器が4ビットで、2回に分けて計算しているみたいです。 1回目:下位4ビット同士を計算します。  5ビット目への桁上りがハーフキャリー 2回目:上位4ビット同士の計算をします、1回目での桁上りも考慮します。  2回目の5ビット目への桁上りがキャリーフラグ 出力 = 1回目 | 2回目 << 4
@cocoatech
@cocoatech 2 ай бұрын
ハーフキャリーを設定で、引く前の下位4ビットと、引いた後の下位4ビットを比べていますが、引く前の下位4ビットと引く数(DECなら1)の下位4ビットを比べないといけないと思います。 それと、indirect HL の update_flags の引数が違っているっぽいです。
@pluswing
@pluswing 2 ай бұрын
ありがとうございます! 確認します!
@cocoatech
@cocoatech 2 ай бұрын
少し前の実装ですが、ADC A, E とかのテストで、assert_eq! でAレジスタの値をチェックすべきところで、Aレジスタへの代入になってます。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
ハーフキャリー(CP命令) (SUB命令も同じです。) 足し算が引き算になって、0未満かの判定に変わっただけです。 half.carry = (left & 0x0F) - (right & 0x0F) < 0; SBC命令ではキャリーも引きます。 half.carry = (left & 0x0F) - (right & 0x0F) - carry < 0; 違いとしては、足し算か引き算か、キャリーも一緒に計算するか、判定が(x > 15)か(x < 0)の違いです。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
バリエーション 足し算 (ADD、INC) half.carry = (left & 0x0F) + (right & 0x0F) > 0x0F; 足し算+キャリー(ADC) half.carry = (left & 0x0F) + (right & 0x0F) + carry > 0x0F; 引き算 (SUB、DEC、CP) half.carry = (left & 0x0F) - (right & 0x0F) < 0; 引き算-キャリー(SBC) half.carry = (left & 0x0F) - (right & 0x0F) - carry < 0;
@pluswing
@pluswing 2 ай бұрын
ありがとうございます!助かります!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
12:09 8ビットレジスタのインデックスの並び的にAが最後の7番目なので、その並び順になります。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
BCDEHLは16ビットレジスタとしても使われるので、Aは一番後ろにあったほうが回路的に都合が良いからなのかと思われます。
@pluswing
@pluswing 2 ай бұрын
なるほど!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
多分? 新Aレジスタ = 旧Aレジスタ + ソース値 + キャリー; キャリーF = 新Aレジスタ & 0x100; //9ビット目が立っているか? ハーフキャリーF = (旧Aレジスタ & 0x0F + ソース値 & 0x0F + キャリー) & 0x10; //5ビット目が立っているか?
@user-zy1ce7tn7m
@user-zy1ce7tn7m 2 ай бұрын
ビットで判定でフラグを出すと、引き算命令でも同じ処理が使えます。 (マイナス結果の時には上位は全て1で埋まるので)
@cocoatech
@cocoatech 2 ай бұрын
12:03 オペランドを取ってくる処理の共通化について 何回か前の回のコメントで指摘されていましたけど、オペランドのレジスタとかは命令コードのビットパターンに埋め込まれています。 たとえば、今回の ADC のような8ビット演算命令はビット0〜2がそれです。 その3ビットを渡して source_value を返すような関数を作ればよいと思います。 今の実装では instruction は命令コードを持っていませんけど、ブログラムカウンタの場所に命令コードがあるので取ってくることはできそうです。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
コメントしました(見えなかったら、新しい順にしてみてください、なぜか評価順だと表示されないので)
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
オペコード表に、誤りを発見しました。 1、「LD (C),A」と「LD A,(C)」の命令は2バイトになっていますが1バイトが正しいです。 2、「JP (HL)」は表記間違いで、正しくは「JP HL」となります。 単純にPC=HLするだけです。(HLが示す番地にジャンプ。) 3、CB系のSRA命令(0x28~0x2F)のフラグが「Z 0 0 0」となっていますが「Z 0 0 C」が正しいです。
@pluswing
@pluswing 3 ай бұрын
ありがとうございます! オペコード表の間違いはさすがに気付けなかったので、助かります。 (コメント、新しい順に並び変えたら見えました。なんで見えないのがたまにあるんでしょうね。謎です。)
@amroray7604
@amroray7604 3 ай бұрын
外部拡張音源知らないのね。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
インデックス値に対応する表はCPU Instruction Setの最初の方にあります
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
LD命令以外でもインデックス値が使われている命令があるので見てみてください 例えばオペコードの0x80~0xBFはBlock 2: 8-bit arithmeticになります。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
CPU Instruction SetのBlock 0~Block 3の数字はオペコードの上位2ビットに当てはまります
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
HLIとHLDですが、Iはインクリメント、Dはデクリメントを意味していて、ロード後にHLレジスタをインクリメントまたはデクリメントするという動作になります。
@pluswing
@pluswing 3 ай бұрын
おおー そういうことでしたか。 了解です!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
オペコードの0x40から0x7FのLD命令は多いように見えますが実はレジスタの組み合わせなので オペコードのbit0~bit2がロード元のインデックス値、bit3~bit5がロード先インデックス値になります。 ロード元とロード先のインデックス値が両方6のときはHALT命令になります。
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
Pan DocsのCPU Instruction SetのBlock 1をご参照ください
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
ちなみにオペコードを8進数表記でみると一桁目がロード元インデックス、2桁目がロード先インデックスで分かりやすかったりします。
@pluswing
@pluswing 3 ай бұрын
コメントありがとうございます! なるほど!そういう風になってるんですね。 貴重な情報ありがとうございます。 助かります!
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
ハーフキャリーフラグ  x=(value1 & 0x0F + value2 & 0x0F) & 0x10 キャリーフラグ  x=(value1 & 0xFF + value2 & 0xFF) & 0x100 xがtrueならフラグがオンになります
@user-zy1ce7tn7m
@user-zy1ce7tn7m 3 ай бұрын
SP=0xFFFF r8=0xFF (-1) の場合 キャリーフラグは255+255=510でオンになります ハーフキャリーフラグは15+15=30でオンになります
@pluswing
@pluswing 3 ай бұрын
ありがとうございます! マイナス値でも、フラグの条件は変わらずでいいんですね。助かりました!
@sub.roughandcheap
@sub.roughandcheap 3 ай бұрын
タイトルからして、なんだか「臭う」タイトルなので、コメント欄を見てみると、やはり「臭った」通りの内容だったようで・・ せめてオブジェクト志向と関数志向の違いを具体的に示してくれと思う。 モデルの中にロジック放り込むようなオブジェクト指向はオブジェクト指向じゃないしね。
@xiaofengguo5333
@xiaofengguo5333 3 ай бұрын
お客様 突然のご連絡失礼いたします。プロのAmazon販売者奈子と申します。 弊社は客様の『生活の質』の向上に一生懸命に努めるブランドです。 すべての製品が安全で安定していることを確実にするために、厳密なテストプロセスを実施しています。世界中に輸出されています。お客様の満足度は最優先です。 拝見したところ、お客様はRaspberry Pi・PCの電子機器に興味を持っています。 現在、弊社はRaspberry Pi 5キット用の新製品を発表した。25,000円以上の価値がある商品なので、Raspberry Pi 4GBキットの内容:Raspberry Pi 5 4GBボード*1(技適マーク付き)/アクティブクーラー*1/PD電源アダプター*1/64GB MicroSDカード/Pi 5用黒色ABSケース*1/Micro HDMIケーブル*2/ドライバー*1/カードリーダー*2など、豊富な付属品が含まれています。 この製品は非常にプロフェッショナルなものなので、プロフェッショナルの方々にAmazonレビューをお願いしたいと思います。もしよろしければ、弊社の製品を購入し、製品の使用感を書いてみませんか。もちろん、製品は無料で提供されます。 弊社の商品を日本に宣伝したいと思っておりますので、KZfaqで商品レビュー動画と提携関係を作りたいと思っております。KZfaqの動画とアマゾンでレビューできれば、製品は無料です! 動画が撮れないなら場合は、ブログの日記とアマゾンでレビューできればも良かったですね.ブログ記事とアマゾンレビューを書くことに興味があれば、製品は無料です! ご興味がありましたら、ぜひこちら[email protected]連絡してください! なお、ご不明な点がございましたら、ご要望に応じて、提携の形をご相談いたします。 ご返事頂ければ幸いです、よろしくお願い申し上げます。 早川 奈子