[新連載開始]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
前へ
次へ
ホームページトップへ戻る