2026.9.6
前へ
次へ
ホームページトップへ戻る


[新連載開始]W65C02マイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第66回]



●/BP,/RT

前回のWAI命令でW65C02の全命令の説明が終りました。
今まで説明を書き続ける裏では過去記事を整理しながらW65C02命令説明書を作成してきています。
ざっくり言いますと今まで書いて来たのは準備作業です。
これから本格的な作業に進んでいきます。
そのための新たな試作基板もすでに作成済みです。
実は日付で言うとお盆休み明けぐらいから新たなフェーズに向けての作業に入っています。
本当は作業の進捗に合わせてHP記事として最新の情報をUPしていくとよかったのですが。
とにかくあれこれ整理しながら書いていくというのはなかなかに手間がかかる作業です。
ついHPを書くのではなくて実際のプログラム作成作業のほうを優先してしまいます。
気が付くと何も書かずに(そう。ノートさえも書かずに!)実作業だけが進んでしまっています。
あとできっとわからなくなるからしっかりHPを作成しつつ進むべきなのですけれど。
で今回もノートのメモ書きを頼りに書くはめになってしまいました。

/BPはブレークポイント設定コマンドです。
/RTはブレーク後にユーザープログラムに戻るためのリターンコマンドです。
Z80や8080でコードFF(RST7)を利用して使われている機能です。
RAMに書かれたプログラムに対して使います。
W65C02ではBRK命令を使います。
BRK命令は[第62回]で説明しました。
今回の説明で使うつもりのプログラムは8月19日には出来ていました。
もう二週間以上も前です。
BRKについての説明回を書いてからにしようと思っているうちに他の作業にも手をつけたりしていたものですから記事を書くのが遅くなってしまいました。
相変わらず過去を振り返りつつ思い出しながら書いています。

BRK命令はソフトウェア割込み命令です。
W65C02はBRK命令を実行するとそのときのPCとフラグレジスタの値をスタックに保存してFFFE、FFFFにあらかじめ書いておいた割込み処理プログラムの先頭アドレスにジャンプします。
下はブレークプログラム(ソースプログラム)です。
;from w65c02test45 26/8/16 8/17 8/18 8/19
;
;BRK for /BP
;
        org $ff80       
;
        ldx $fc;sp
        txs
        lda $fb;adrsH
        pha
        lda $fa;adrsL
        pha
        lda $f9;F
        pha
        lda $f6;A
        bra start
;
;ff90
braek:
        sta $f6;A
        stx $f7;X
        sty $f8;Y
        pla;flag
        sta $f9;Flag
        pla;adrsL
        dec
        dec
        sta $fa;return adrsL
        pla;H
        sta $fb;H
        lda $fd;saved code
        sta ($fe);code rewrite
        tsx
        stx $fc;sp
        stp;
;
;/bp entry
start:
        ldx $f7
        ldy $f8
        rti
;end

W65C02アセンブラでアセンブルしました。
下はアセンブルした結果作成されたアセンブルリストです。

0000        ;from w65c02test45 26/8/16 8/17 8/18 8/19
0000        ;
0000        ;BRK for /BP
0000        ;
FF80            org $ff80       
FF80        ;
FF80 A6FC       ldx $fc;sp
FF82 9A         txs
FF83 A5FB       lda $fb;adrsH
FF85 48         pha
FF86 A5FA       lda $fa;adrsL
FF88 48         pha
FF89 A5F9       lda $f9;F
FF8B 48         pha
FF8C A5F6       lda $f6;A
FF8E 8019       bra start
FF90        ;
FF90        ;ff90
FF90        braek:
FF90 85F6       sta $f6;A
FF92 86F7       stx $f7;X
FF94 84F8       sty $f8;Y
FF96 68         pla;flag
FF97 85F9       sta $f9;Flag
FF99 68         pla;adrsL
FF9A 3A         dec
FF9B 3A         dec
FF9C 85FA       sta $fa;return adrsL
FF9E 68         pla;H
FF9F 85FB       sta $fb;H
FFA1 A5FD       lda $fd;saved code
FFA3 92FE       sta ($fe);code rewrite
FFA5 BA         tsx
FFA6 86FC       stx $fc;sp
FFA8 DB         stp;
FFA9        ;
FFA9        ;/bp entry
FFA9        start:
FFA9 A6F7       ldx $f7
FFAB A4F8       ldy $f8
FFAD 40         rti
FFAE        ;end

実はこれだけではブレークプログラムとしては機能しません。
機能するためにはPIC18F45K50の側での準備作業が必要です。
ノートのメモを見ると完全に機能するところまで2日ほどかけて試行錯誤しています。
その過程もここに書くとよいのかもしれませんが冗長になってしまいます。
ですので出来上がったものをお見せすることにします。
まずはブレークプログラムの説明です。

ブレークしたときとそこからまたユーザープログラムに戻るときのために必要な値を保存するワークエリアが必要です。
どこでもよいのですが機能的に考えてゼロページに置くのがよいでしょう。
一番後ろの$FF〜$F6に置くことにしました。
FF:breakadrs H  /BRKで指定するブレークアドレス(上位バイト)
FE:breakadrs L  /BRKで指定するブレークアドレス(下位バイト)
FD:CODE  そのアドレスの命令コードを保存
FC:SP  スタックポインタ保存
FB:returnadrs H  /RTで戻るユーザープログラムアドレス(上位バイト)
FA:returnadrs L  /RTで戻るユーザープログラムアドレス(下位バイト)
F9:flag  フラグレジスタ保存
F8:Y  Yレジスタ保存
F7:X  Xレジスタ保存
F6:A  Aレジスタ保存

プログラムは2つのパートに分かれています。
FF80〜FF8F+FFA9〜FFADが/RTで実行されるパートです。
試行錯誤の過程で2つに分かれてしまいました。
ですのでちょっとわかりにくくなってしまいました。
FF90〜FFA8がブレーク処理プログラムです。

ここにはありませんがWindows側プログラム(PIC18F45K50の側)で/BP XXXX(ブレークさせたいユーザーアドレス)を実行するとアドレスXXXXの命令コードがブレークコード(00)に書き換えられます。
そうしておいてユーザープログラムを/RUNでスタートするとW65C02はコード00のところでブレークしてFF90のブレーク処理プログラムを実行します。
ブレークアドレスへのジャンプテーブル(FFFE、FFFF)にはあらかじめシステムによってFF90が書かれています。
ブレークするとそのときのA、X、Y、P(フラグ)とアドレスをワークレジスタに保存するとともに/RT実行時のためにスタックにもUPします。
最後に00に書き換えられていたユーザープログラムの命令コードを元の位置に戻してシステムに戻ります。
/RTはその逆の処理になります。

説明の途中ですが本日は時間がなくなってしまいました。
続きは次回にいたします。

W65C02マイコンボードの製作[第66回]
2026.9.6 upload

前へ
次へ
ホームページトップへ戻る