投稿日: Mar 22, 2017 6:43:38 AM
何気にハマっていました。
あまりに奇っ怪な動きをするので原因特定も難航し…。
症状としては、動作中にまったくいじっていないレジスタの内容が変わるとか突然内容が反転するなど、なにしろアセンブルコードをいじる度に症状が変わるので頭を抱えていました。
とりあえずPCとSPとそのたレジスタの内容を確認しつつ、おかしくなる瞬間を探るしかなく。
その結果、条件付きジャンプとCALL命令で起きてることがわかり。
バグの内容としては上記のとおり。
原因は
条件つきジャンプ : 条件が整わなかった場合次のステートへ移行する、その際 JP命令のOPCode1バイト含めアドレスが2バイトあるので3バイト先にPCが進んでいないと行けないのに、JP命令の次のバイト、つまりアドレスをOpCodeとして実行していた。
CALL : CALLも条件付きジャンプとおおよそ一緒、戻り先のアドレスをPUSHする際、CALLの後ろ2バイトにあるアドレスをパスしていなかった。
解決してよかった。
現在とてもいい感じに動いてます。
(でも条件つきRETの実装わすれが発覚したのでコーディングしないと)
厳密に測っていませんので厳密な処理をしたい場合どうかと思いますが。
NOPを1万回呼び出すサブルーチンを使ってオシロで目測()した結果、大体0.4秒です。
その他のCALLだのJP命令だのあれこれ実行されての結果なのでNOP自体というわけじゃないですが、NOP一回呼び出しておおよそ0.04msくらい。
です。 大雑把ですけど。
27 wait: push af 28 ld a,100 29 waitloop: call wait2 30 dec a 31 jp nz,waitloop 32 pop af 33 ret 34 35 wait2: push af 36 ld a,100 37 wait2loop: nop 38 dec a 39 jp nz,wait2loop 40 pop af 41 ret
計測(用で作った訳ではないけど)で使ってるwaitのサブルーチン。 Lチカするための待ち時間作りたかっただけなのでこんなもん? って。
CALL wait で呼び出して大体0.4秒くらい。