MZ-80 パソコン開発物語

今だから話せる、パソコン開発記録を連載します。 感想をコメントに残して頂けたら 嬉しい・・。

全体表示

[ リスト ]

BASIC 割り込み処理

イメージ 1

BASICインタープリタで、割り込み処理をさせる。

外部ハードから、例えば IRQ端子の割り込みで、フラグを立て、
実行しているプログラムにソフト割り込みをかける。

一応 動作していますので、説明します。listをご覧下さい。
110行で、割り込み時のサブルーティンを宣言する。
200行は、実験のため、test1(フラグを立てるINSTRUCTION)を作成し、
強制的に、割り込みフラグを立てる。
結果は、1000行に制御を移し、また 2000行をコールして200行に戻って、print文を実行している。
割り込みの実行感度は、次のINSTRUCTIONに入る前に 割り込み処理をしていると言う事。

念の為、割り込みフラグを立てる200行を廃止すると、何事もなく終了している。

BASICインタープリタの中身は、よく聞かれますので、割り込み宣言(上の110行)の処理を記載します。
"interrupt"の単語解釈で、記載の void DefINTR_COMMAND( void)が呼ばれます。
2重宣言でないかのチェック、”gosub”単語の存在、行ナンバーの確認、行ナンバーテキストの存在、
場所の確認で、データを保管 以上です。

割り込みが有った時、void INTR_GOSUB_Command( void)を実行すると言う事です。

多くの INSTRUCTIONは、処理ツールがそろっていますので、目的に向かって処理ツールを並べる・・
と言った感じで・・出来ています。

閉じる コメント(6)

顔アイコン

ほんとにやっちゃうし…。^_^;

Test1を理解するのにちょっと苦労しました。最初は「これはラベルかな?」と勘違いしてしまったのでした。

Test1は、割り込み処理をテストするために仮に追加したインストラクションですね。この中で待機していて、割り込みが入ると行番号1000を呼び出し、その中で行番号2000をネストして呼び出して、元の行のTest1の次のPrintインストラクションに戻るんですね。

すごーい。BASICレベルでハードウェア割り込みを処理できると、制御の実験がやりやすいですね。

2010/4/1(木) 午後 6:17 [ かの ]

顔アイコン

早速のコメント ありがとう。
Test1のコマンド 説明不足でした。
コメントで『この中で待機していて』・・BASICは待機はしません。
常に、次々とINSTRUCTIONを実行しています。

test1は次の通りです。
void test1_Command(void){
ProgramContr |= IRQinterrupt;
}
test1と言う 構文解釈で呼び出されます。
プログラム制御レジスタの割り込みフラグをセットする簡単な
INSTRUCTION です。

実行しているINSTRUCTION間で、ProgramContrの割り込みフラグを
見て割り込みgosubを実行します。

2010/4/1(木) 午後 7:03 [ nag*sa_*ei ]

顔アイコン

御大、ちょっとお待ちを。

> BASICは待機はしません。
> 常に、次々とINSTRUCTIONを実行しています。

はい、おっしゃるとおりです。とすると、

ということならわかるんですが、

200 test1: print "set interrupt-bit 1"

という記述ですと、test1がプログラム制御レジスタの割り込みフラグをセットして抜けてくるだけの動作なので、割り込みが発生していない場合は、すぐにつぎのprint文に入ってしまわないですか?

ワタクシ、なにか勘違いをしておりますでしょうか。^_^;

2010/4/2(金) 午後 0:55 [ かの ]

顔アイコン

> test1がプログラム制御レジスタの割り込みフラグをセットして抜けてくるだけの動作なので、割り込みが発生していない場合は、すぐにつぎのprint文に入ってしまわないですか?
その通り、割り込みフラグが立っていないと、次のINSTRUCTIONを実行します。しかしtest1はフラグをセット==即ち割り込みが発生です。

割り込みが発生しない場合は、シミュレーションtest1は、無しという事で 200行は下記の通りになります。
200 : print "set interrupt-bit 1"と同じ意味になります。

test1で割り込みフラグを立てた為、200行は、等価的に下記 テキスト文になった動作をします。
200 test1:gosub 1000: print "set interrupt-bit 1"

どうですか・・

2010/4/2(金) 午後 4:18 [ nag*sa_*ei ]

顔アイコン

test1は、割り込みフラグを立てる為に作ったシミュレーションINSTRUCTIONで、実際はハード改造をして、IRQ割り込みルーティン内に
ProgramContr |= IRQinterrupt; // interrupt falg set
を記述しますので、BASIC実行中に、割り込みフラグが立てば、実行命令の間にgosub 1000: が挿入されると言う事になります。

2010/4/2(金) 午後 4:34 [ nag*sa_*ei ]

顔アイコン

了解です。やっと納得いきました。ちゃんと読まないと> 自分。

2010/4/3(土) 午前 11:18 [ かの ]


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事