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


[新連載開始]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

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