MZ-80 パソコン開発物語

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

全返信表示

返信: 353件

BASIC 割り込み処理

MZ80レプリカ製作

[ nag*sa_*ei ]

2010/4/2(金) 午後 4:34

顔アイコン

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

BASIC 割り込み処理

MZ80レプリカ製作

[ nag*sa_*ei ]

2010/4/2(金) 午後 4:18

顔アイコン

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

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

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

どうですか・・

BASIC 割り込み処理

MZ80レプリカ製作

[ かの ]

2010/4/2(金) 午後 0:55

顔アイコン

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

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

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

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

200 test1: print "set interrupt-bit 1"

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

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

BASIC 割り込み処理

MZ80レプリカ製作

[ nag*sa_*ei ]

2010/4/1(木) 午後 7:03

顔アイコン

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

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

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

BASIC 割り込み処理

MZ80レプリカ製作

[ かの ]

2010/4/1(木) 午後 6:17

顔アイコン

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

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

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

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

BASIC言語 追加版

MZ80レプリカ製作

[ かの ]

2010/3/28(日) 午後 8:48

顔アイコン

すみません。「現行の」の間違いです。^_^;

BASIC言語 追加版

MZ80レプリカ製作

[ かの ]

2010/3/28(日) 午後 8:48

顔アイコン

中西御大

原稿の処理内容、外部要因割り込みの可能性について、よくわかりました。楽しみがまたひとつ増えました。

BASIC言語 追加版

MZ80レプリカ製作

[ nag*sa_*ei ]

2010/3/27(土) 午後 9:34

顔アイコン

500文字制限の為 後続します

外部要因割り込みは、I2Cからの割り込みでやりたいと思っています。I2C intrrupt信号線(?)を準備し、I2Cスレイブからの読み出し要求を実行する。今のRS232Cの割り込みと同様に・・・

BASIC処理ソフトは、プログラムのインストラクション間に緊急・別のインストラクションを挟み込み実行させるのが可能な構造です。
今もソフト割り込みで使っています。gosubインストラクションは、メモリの許す限り多重コールが可能ですし・・・。

BASIC言語 追加版

MZ80レプリカ製作

[ nag*sa_*ei ]

2010/3/27(土) 午後 9:32

顔アイコン

コメントありがとう。

MZBASICは、ハード面で3レベルの多重割り込み処理をしています。
最優先はWAVE再生データ要求(11.025KHz毎)、第二優先は、時間・タイマー関係(2KHz毎)、第三は、WAVEデータブロック(512bytes)をSDからの読み出し要求(約50msec毎)になっています。

従って、最も厳しい状況は、ファイル処理でSDにデータを書き込んでいる時に、上記3要求が重なった場合に起こります。

これ以外に、ターミナルからの入力処理は、RS232Cハード割り込みで、バッファーに溜め込み、CR,LF受信した時、受信文を実行しているインストラクションの間に、BASICソフト割り込みとして、構文解釈処理をしています。
従って for next, goto で無限ループに入っても、ターミナルのESCキーでbreakを送信すると、無限ループから脱出します。

BASIC言語 追加版

MZ80レプリカ製作

[ かの ]

2010/3/27(土) 午後 7:48

顔アイコン

中西御大

非常に特徴のあるBASICになってきて、ワクワクしています。この言語仕様の中で割り込みを自然に処理しようというチャレンジに期待しています。

ON INTERRUPT(割り込み要因) GOTO(or GOSUB) 行番号

みたいな言語仕様の拡張は可能でしょうか。リアルタイム性を保証しにくいインタプリタ系言語では難しいですか?

[PR]お得情報

ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!

その他のキャンペーン


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

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

みんなの更新記事