[新連載開始]W65C02マイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
私としてはW65C02をさわるのは全く初めてです。何から何まで未経験です。さてどうなりますでしょうか。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第65回]
●WAI
WAIは割込み信号(IRQB)の入力を待つ間CPUをスタンバイモードにするための命令です。
前回のテストプログラムでは割込み信号の入力を待つ間BRA命令でループして待っていましたがその間はCPUが普通の命令を実行しているので電力を消費します。
またその間の命令によってはフラグやレジスタ、メモリなどが変化することも考えられます。
WAI命令の実行によってCPUは低消費電力のスリープモードになります。
スリープモードの解除にはNMIB、IRQB、RESETのいずれかの入力が必要になります。
WAI命令が実行されてCPUがスタンバイモード(スリープモード)になっていることを知らせるためにRDY(pin2)がLになります。
Googleで検索した結果によりますとWAI命令が実行されてスタンバイモードになっているときにIフラグがセットされている状態(割込み禁止状態)でIRQB信号が入力されると割込み処理は行なわれずスタンバイモードのみが解除されてWAiの次の命令から実行が再開されるとのことです。
下はWAI命令のマシン語コード、バイト数です。
クロックはNMIB、IRQB、RESETが入力されるまでの間のクロック数になります。
| ニーモニック | マシン語コード | アセンブラ書式 | バイト数 | クロック数 |
| WAI | CB | WAI | 1 | − |
テストプログラムは前回のIRQBのプログラムのLOOP部分にWAI命令を追加して作りました。
;w65c02test40 26/8/14
;
;INT,RTI,WAI
;
org $8000
;
lda #$10
sta $fffe
lda #$80
sta $ffff
ldx #$fd
txs
cli
bra start
;
int:
iny
sty $04
sty $0200
rti
;
start:
stx $00;sp
lda #$55;for test
sta $04;=led
sta $0200;led
ldy #$55;for test
loop:
nop
nop
wai
inc $02
bra loop
;end
|
W65C02アセンブラでアセンブルしました。

下はアセンブルした結果作成されたアセンブルリストです。
0000 ;w65c02test40 26/8/14 0000 ; 0000 ;INT,RTI,WAI 0000 ; 8000 org $8000 8000 ; 8000 A910 lda #$10 8002 8DFEFF sta $fffe 8005 A980 lda #$80 8007 8DFFFF sta $ffff 800A A2FD ldx #$fd 800C 9A txs 800D 58 cli 800E 8007 bra start 8010 ; 8010 int: 8010 C8 iny 8011 8404 sty $04 8013 8C0002 sty $0200 8016 40 rti 8017 ; 8017 start: 8017 8600 stx $00;sp 8019 A955 lda #$55;for test 801B 8504 sta $04;=led 801D 8D0002 sta $0200;led 8020 A055 ldy #$55;for test 8022 loop: 8022 EA nop 8023 EA nop 8024 CB wai 8025 E602 inc $02 8027 80F9 bra loop 8029 ;end |
動作確認を簡単に行なうためにBASICプログラムを作って実行しました。
65c02test40.binをロードしました。

/runでW65C02を起動しました。
RAMにロードした65c02test40.binが実行されました。
ここまでは今までのテストと同じです。
W65C02TESTボードに搭載しているPIC18F45K50にはPICUSBIOシステムプログラムが入っています。
BASICでI/Oポートを制御することができます。
picout PORTB,$EFでPORTBのbit4が立ち下がります。
PORTBのbit4はW65C02のIRQB(pin4)に接続されています。
IフラグがクリアされていればIRQBがLになっている間割り込みが受付けられます。
picout PORTB,$FFでPORTBのbit4がHになります。
goto 10で上の2命令を繰り返します。
BASICは実に簡単でかつ便利です。
行番号10〜30はPIC18F45K50に実装されているBASICインタプリタ用のプログラムです。
RAMの$8000にロードしたプログラムはW65C02のプログラムです。
/RUNコマンドを実行することでW65C02のRESETが解除されてW65C02が$8000のプログラムの実行を開始します。
その状態の時にPIC18F45K50はフリーになります。
W65C02がプログラムを実行しているときでもそれと関係なくPICUSBIOのBASICプログラムを実行することができます。
W65C02テストボードには相互に独立して動作するW65C02というCPUとPIC18F45K50というCPUの2つのCPUが存在しているのです。
このことによってW65C02のデバッグが可能になります。
/RUNコマンドではW65c02がRAMのプログラムを実行しますがRUNコマンドではPIC18F45K50に搭載しているBASICインタプリタが起動します。
BASICインタプリタプログラムを中止するには[Ctrl][B]を入力します。
上の画面の説明です。
[Ctrl][B]を入力しました。
これでBASICインタプリタプログラムが終了しキー入力ができるようになります。
まだW65C02のプログラムは動いています。
/RUNでW65C02が$8000のプログラムの実行を開始した後でW65C02がプログラム中のSTP命令を実行するとW65C02はプログラムの実行を停止しスタンバイモードになります。
STP命令を実行するまではW65C02はプログラムの実行を続けます。
その状態のときにはPIC18F45K50は/CMや/DMなどでRAMの値を確認することができません。
/STOPコマンドはW65C02をリセットしそこでそのままスタンバイ状態にします。
/STOPコマンドでW65C02を停止させました。
/CMコマンドでゼロページを確認しました。
アドレス$04は08になっています。
前回のテストと同じで割込みプログラムの実行中$04の値は+1され続けられます。
08は実行を中止したときの値です。
アドレス$00にはテストプログラムが開始されたときのスタックポインタの値FDが入っています。
下はBASICプログラムの実行によってIRQBが繰り返しON/OFFされIRQBがLの間インクリメントされる値が連続してLEDに表示されている状態の画像です。
IRQB信号の入力を待っている間はWAI命令が実行されるのでその間はRDY(pin2)がLになります。
それとIRQB信号(pin4)をオシロスコープで観測しています。

オシロスコープの画像です。

上側(CH1)がIRQBで下側(CH2)がRDYです。
BASICインタプリタは速度が遅いのでIRQBが一度Lになる間にW65C02の割込みプログラムが連続して受け付けられて連続して実行されます。
割込みプログラムが終了した直後に次の割込みが受け付けられるので上の画像ではその間はRDYはHのままになります。
IRQBがHの期間はWAIが実行されたままになるのでその間はRDYがLになります。
W65C02マイコンボードの製作[第65回]
2026.9.5 upload
前へ
次へ
ホームページトップへ戻る