本当に悩んで考えて、どうしてもわからなかったから、出てくるわけないだろと思って、テストコードそのままぐぐったら出てきた。
gb-test-rom-emulation-issues
つまりFの下位4ビットは何か値が書き込まれても無視するということ。
set_test 5,"POP AF" ld bc,$1200 - push bc pop af push af pop de ld a,c and $F0 cp e jp nz,test_failed inc b inc c jr nz,-
以下、自分の実装。どうやってもこれで正解だろうと思ってた。命令に間違えがあるのかと必死で見直してたのに、レジスタが突っぱねてるなんて、まったく考えもしなかった。どうせどっかに書いてあって見落としていたのだろうけど。無念。非常に悔しい。
- BC = $1200
- loop 1回目
- BC == $1200
- AF = $1200
- DE = $1200
- A = C
- A = A & $F0; 上位4ビットだけ取り出す
- A - E; $0 - $0; Zero = 1
- jp test_failed if Zero == 0; Zero = 1なのでジャンプしない。
- B++; $13
- C++; $01
- jp loop
- loop 2回目
- BC == $1301
- AF = $1301
- DE = $1301
- A = C; A = $01
- A = A & $F0; A = $01 & $F0. A = 0
- A - E; $0 - $1 = $FF. Zero = 0
- jp test_failed if Zero == 0; Zero = 0なのでジャンプでテスト失敗