set Test "POP AF"

本当に悩んで考えて、どうしてもわからなかったから、出てくるわけないだろと思って、テストコードそのままぐぐったら出てきた。
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なのでジャンプでテスト失敗