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