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


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

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

[第64回]



●IRQB

IRQBは命令ではありません。
マスク可能割込みです。
Iフラグがクリアされている必要があります。
IRQBの割込みはW65C02のpinNo.4にLレベル信号を入力することで受付けられます。
IREQB信号入力によってジャンプテーブルFFFE、FFFFに書かれたアドレスにジャンプします。
ジャンプテーブルは[第62回]で説明したBRKコマンドと同じです。
BRKコマンドはいつでも実行されますがIRQBはIフラグがセットされているときには受付けられません。
IフラグはCLIコマンドでクリア、SEIコマンドでセットされます([第60回]参照)。
IRQB信号が受付けられるとCPUはその時のPC(プログラムカウンタ)とフラグレジスタをスタックに退避してアドレスFFFE、FFFFに書かれたアドレスにジャンプします。
割込み処理中はIフラグがセットされるので割込み処理中には重ねて割り込みは受付けられません。
IRQBの処理はRTI命令によって完了します。
RTIの実行によってスタックに退避されていたPCとフラグがもとに戻され割込み発生時に待たされていた処理が再開されます。
RTIは前回([第63回])を参照してください。
下はテストプログラムです。
;w65c02test39 26/8/14
;
;INT,RTI
;
        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
        inc $02
        bra loop
;end

このプログラム自体はただ実行しただけではテストになりません。
プログラムの実行中にW65C02のpin4にLレベルの信号を入力することで割込み処理が実行されます。
W65C02アセンブラでアセンブルしました。

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

0000        ;w65c02test39 26/8/14
0000        ;
0000        ;INT,RTI
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 E602       inc $02
8026 80FA       bra loop
8028        ;end

割り込みが受付けられたことが確認できるようにLED出力(アドレス0200)を行なっています。
同時に同じ値をこれも確認のためにゼロページアドレスの04にも書いています。
当初はプログラムループの中で確認のためにスタックポインタの値をXレジスタに移してそれをゼロページアドレスに書くというようにしたのですがスタックポインタの値がXレジスタに読み込まれませんでした。
そのあたりのことについては前回に書いていますので詳しくは前回を参照してください。
65c02test39.binをロードして/RUNを実行しました。

前回のNMIBプログラムと同じでブレークしないでIRQB入力を待ってループしている状態です。
IRQB信号はPIC18F45C50のRB4から出力します。
回路図は[第16回]にあります。
W65C02TESTボードに搭載しているPIC18F45K50にはPICUSBIOシステムプログラムが入っています。
BASICでI/Oポートを制御することができます。
BASICは普通にプログラムとして組むこともできますが上の画像のようにダイレクトモードを使う事もできます。
picout PORTB,$EFの入力でPORTBのbit4が立ち下がりました。
これでIRQB信号が出力されたことになります。
IRQBは信号がLレベルになっている間(Iフラグがクリアされていれば)受付けられます。
実行を終了するために/STOPを入力しました。
/cmコマンドでゼロページの値を確認しました。
アドレス$00にはテストプログラムが開始されたときのスタックポインタの値(FD)が入っているはずなのですがそこが00になっています。
割込み処理の実行中に/STOPで強制終了したときの何かのタイミングでそこが書き換わってしまったのではないかと推測しています。
アドレス$04にはプログラム開始時には55が入ります。
IRQBが実行される度にその値が+1されます。
IRQBはレベル入力ですからIRQB入力がLである期間中繰り返し受付けられます。
Iフラグは割込み処理の期間中はセットされているのですがRTIでメインルーチンに戻るときに前の状態に戻されるようです。
アドレス$04の値は16になっています。
IRQBが繰り返し受付けられて実行された結果その値になったと思います。
下はプログラムを開始してIRQBの入力を待っている状態の画像です。


picout PORTB,$EFを入力しました。
IRQB信号がLレベルの期間中割込み処理が繰り返し受付けられて実行されているのでLEDが全点灯しているように見えます。


/STOPを入力しました。
プログラムがブレイクしたのでLEDの表示が停止しました。

LEDにはブレイクしたときのカウント値が表示されています。
アドレス$04の値と同じ(16)です。

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

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