yutyuさん電源OFF-ON操作で、少し現象に近づきましたね。ちなみに、RPEFにアクセスブレークを設定してもブレークは掛かりません。RAMパリティが発生してもCPUがRPEFに1をライトしているわけではないので、、おそらくスタートアップルーチンを修正して使っていらっしゃると思いますけれども、ライトする前にリードしている個所があると思います。一旦ブレークすると再RUNさせても、もうRAMパリティが出なくなる可能性があるのでブレーク毎に毎回電源のOFF/ONが必要かと思います。PSデバッグ手順に不備があったの削除しました。代わりに、スタートアッププログラムの先頭にRPERFが1(RPEFによるリセット)だったら分岐するようなアセンブラコードを埋め込んで、そこにブレークポイントを設定してみてください。RAMパリティ(内部リセット)が発生したらそこに分岐するはずです。;----------------------------------------------------------------; setting the register bank RB0 as work register set;----------------------------------------------------------------MOV A,RESFCMP0 ASKZ BR $$ ;ここにブレークポイント設定SEL RB0;----------------------------------------------------------------; setting the mirror area;----------------------------------------------------------------
zzVwo2oDwKDa0TyY-0_A0225.jpg
yutyuさんブレークポイントは、> BR $$ ;ここにブレークポイント設定のある行でソースパネルの「指マーク」のところをクリックしてください。「手のひらマーク」が表示されると思います。そしたらブレークが有効になります。ここからのデバッグは、>MOV A,RESF>CMP0 A>SKZ >BR $$ ;ここにブレークポイント設定の命令群の挿入位置を少しずつ後ろの方に移動させていきながら様子を見てください。途中まではブレークするかと思いますけれども、ある個所を過ぎたところに挿入してもブレークしなくなると思います。そしたら、今までブレークしていた個所から、あたらにブレークしなくなった個所までの間に原因があると思います。
Jx5UiUkq8TOvDxN0-0_A0226.jpg
yutyuさん> 原因はスタートアップの最初からstkinit迄に含まれているということでしょうか?そうですね。ステップ実行で、あやしい部分の命令コードを1つずつ追っていきリード命令があれば、どこをリードしているかを追い詰めると良いと思います。まさか、RETの時にスタックリードでRAMのパリティエラーが出てはいないと思いますけれども、もし該当部分が無ければ、試しにCALLする前に、PUSH AX ;追加PUSH AX ;追加POP AX ;追加POP AX ;追加MOVW HL,#LOWW _@STEND ;HL <- stack end addressCALL !!_stkinitという感じで4命令を埋め込んでみてください。あとは、stkinitに渡すHLの値が妥当な値かも確認しておいたほうがいいですね。余計なところまで初期化されてしまうと大変なので。
yutyuさん>ステップ実行を実行したのですが>ブレイクポイントを設定したのにもかかわらずブレイクせず、>「_stkinit」内まで進んでしまいます。>「手のひらマーク」が表示をさせたのですが・・・ソフトブレークだとブレークポイントを設定した命令で止まりますけれどもハードウェアブレークの場合3命令くらい滑る(余分に実行する)仕様のようです。ソフトブレークとハードブレークでアイコンの形がちょっと違います。ソフトブレークは「手のひら」だけハードブレークは「手のひらに緑色のICのマークが付く」表示になります。よーーく見てみてください。左クリックではなく、右クリックにするとハードかソフトブレークかを選ぶこともできます。>PUSH AX ;追加>PUSH AX ;追加>POP AX ;追加>POP AX ;追加>MOVW HL,#LOWW _@STEND ;HL <- stack end address>CALL !!_stkinitこれの意味は、CALL命令は、呼び出し元のアドレスをスタックに退避しますけれども、アドレスは3バイト長なので、消費したスタックの4バイトのうち1バイトが使われていません(SP-1のアドレスが初期化されていない)。そのため、RETした時に初期化されていないスタックの1バイトをリードすることでRAMパリティが発生してるのではなかと想像しています。>あとは、stkinitに渡すHLの値が妥当な値かも確認して>おいたほうがいいですね。余計なところまで初期化さ>れて、しまうと大変なので。stkinitは現在のSPからHLに渡したアドレスの範囲を初期化するので、HLに変な値が入っているとSFR領域まで初期化されたり逆にスタック領域が狭すぎると、スタックが完全に初期化されないためのちのちCALL/RETした際に(前述の)SP-1のアドレス未初期化でRAMパリティが発生する可能性が残ります。(これはスタックオーバーフローなのでソフトの設計的にまずいとは思いますけども)