モニタユニットを汎用のキーボードと7セグメントLED表示として使いたいのですが
どのようにすればよいでしょうか。
Z-VisionやRM-80でトレース中に割り込み信号を入れても
割り込みプログラムに処理が移りません。なぜですか。
Z-VisionやRM80を使っている最中にマシン語モニタに戻す方法はありますか。
Z-Visionが起動しないことがあるのですがどんなことが考えられますか。
ひとつのROMでどうしていくつものモニタプログラムが使えるのですか。
FX-Z80に搭載されているメモリーのスピードは,ROM,RAMともに100ns以下で,モニタプログラムはノーウェイトで実行されています。
しかし,実際にノーウェイトで実行させるためには48ns以下のメモリーを使用する必要があります。(計算方法は川崎マイクロエレクトロニクス株式会社発行の「KL5C80A16CFPハードウェアマニュアル」と「アプリケーションノート」をご覧ください。川崎マイクロエレクトロニクスのホームページからもダウンロードできます。)
ところで,メモリーはある程度スピードの余裕を持たせて製造されているようで,FX-Z80に実装されているメモリーでも問題なく動作します。もちろんこのような使用方法はメーカーでも保証範囲外であり,外部条件やロット,メーカーの組み合わせによっては動作しないこともありえます。特に製品に組み込む場合は無視できません。
FX-Z80は試作用,また学習用という製品の性格上,オーバースペックになりますがあえてノーウェイトで出荷しています。しかし,これはすべての条件で動作するという保証を弊社において行っているものではありません。
それで,スペック内に収めるためにはメモリーアクセスに1ウェイト挿入するようにしてください。(SCR4で設定します。この場合は148ns以下のメモリーが使用可能です。)
I/Oについては,内部I/Oのみであれば1ウェイト挿入(もっとも早いタイミング)で問題なく動作します。外部にI/Oを増設するときはアクセススピードに応じてウェイトを増やしてください。(SCR4で設定します。)
FX−Z80に登載されているKL5C80A16CFPの割り込みコントローラは、モード2割り込みに対応しています。ここでは特に割り込みベクタの設定方法を中心に初期設定の方法について説明します。また、タイマ/カウンタのCh0で1秒毎に割り込みをかけ、その度に2進数で+1し、その様子をマシン語モニタの7セグメントLEDに表示するプログラムを載せています。リストも併せてご覧下さい。
モード2割り込みを使うには、まずメモリに予め割り込みベクタテーブルと呼ばれる領域を作っておきます(リストでは8800h番地から881Fh番地)。ここには割り込みが発生したときにジャンプしたいプログラムのスタートアドレスを割り込み要因別にセットしておきます。
次に割り込みベクタテーブルの先頭アドレス(8800h)をCPUと割り込みコントローラにセットします。CPUに対してはIレジスタに先頭アドレスの上位8ビット(88h)をセットします(リスト@)。割り込みコントローラに対してはIVRに先頭アドレスの下位8ビット(00h)をセットします。
では次に割り込みが発生したときにどの様に割り込みベクタが作られるか見てみましょう。このプログラムではタイマ/カウンタCh0が割り込みをかけてきますから、IR12が割り込み要求元となります。割り込みが発生するとCPUは割り込みコントローラからIVRにセットした8ビットデータを受け取ります。このうち上位3ビットは予めセットしたデータですが、下位5ビットは割り込み要求元により次のように変化します。
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
初期設定でセットした値 | 割り込み要求元に応じて下記のように出力 | 0固定 | |||||
IVR7 | IVR6 | IVR5 | 0 | ||||
IR15のとき→ | 1 | 1 | 1 | 1 | |||
IR14のとき→ | 1 | 1 | 1 | 0 | |||
IR13のとき→ | 1 | 1 | 0 | 1 | |||
IR12のとき→ | 1 | 1 | 0 | 0 | |||
〜 |
|||||||
IR0のとき→ | 0 | 0 | 0 | 0 |
このプログラムではIVRには00hをセットしているのでbit7-5は‘000’、IR12が割り込み要求元なのでbit4-1は‘1100’、bit0は‘0’固定で最終的には18h(00011000b)を割り込みコントローラから受け取ります。
次にCPUはIレジスタの値を上位8ビット、割り込みコントローラから受け取った値を下位8ビットとする16ビットの値、このプログラムでは8818hをアドレスとし、このアドレスにセットされている2バイトデータをリードします(8022h)。そして、この値をアドレスとしてそこにジャンプします。このプログラムでは8022h番地から割り込みプログラムが記されています。
さて次の割り込みを受け付けるためには、割り込み処理が終了した事を割り込みコントローラに知らせる必要があります。割り込みコントローラはCPUがRETIを実行したか常に監視し、実行されると割り込み処理が終了したと判断します。それで、割り込み処理の最後は必ずRETIにします。
割り込みコントローラの初期設定ではそのほかにもセットするデータがあります。それについては次の表をご覧下さい。併せて、割り込み要求元と、割り込みコントローラのポートアドレスについても示します。
割り込み要求元 |
|
IR15 | 外部入力(P23) |
IR14 | 外部入力(P22) |
IR13 | タイマ/カウンタ(Ch1) |
IR12 | タイマ/カウンタ(Ch0) |
IR11 | SIO ブレーク検出/エラー検出(Ch0) |
IR10 | SIO RxRdy(Ch0) |
IR9 | SIO TxRdy(Ch0) |
IR8 | クロック同期シリアルI/O(Ch0) |
IR7 | DMA(Ch0) |
IR6 | DMA(Ch1) |
IR5 | SIO ブレーク検出/エラー検出(Ch1),外部入力(P21) |
IR4 | SIO RxRdy(Ch1) |
IR3 | SIO TxRdy(Ch1) |
IR2 | クロック同期シリアルI/O(Ch1),外部入力(P20) |
IR1 | タイマ/カウンタ(Ch3),外部入力(P21) |
IR0 | タイマ/カウンタ(Ch2),外部入力(P20) |
ポートアドレス | アウト | イン | |
IVRライト前 | IVRライト後 | ||
34h | LERL | PGRL | ISRL |
35h | LERH | PGRH | ISRH |
36h | IMRL | IMRL | |
37h | IVR | IMRH | IMRH |
ハードリセット後,最初にLERL,LERHを,次にIVRを,その後,PGRL,PGRH,IMRL,IMRHを設定します。LERL,LERH,IVRはハードリセットがない限り再設定できません。 |
◆ISR(In Service Register) |
|||||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 割り込み中のビットが1になります。 | |
ISRH | ISR15 | ISR14 | ISR13 | ISR12 | ISR11 | ISR10 | ISR9 | ISR8 | |
ISRL | ISR7 | ISR6 | ISR5 | ISR4 | ISR3 | ISR2 | ISR1 | ISR0 |
◆IVR(Interrupt Vector Register) |
|||||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 割り込み時にCPUに送るデータ。 D4〜D1は割り込み時にIR15からIR1に応じて自動的に設定されます。 |
|
IVR | IVR7 | IVR6 | IVR5 | D4 | D3 | D2 | D1 | 0 |
◆LER(Level/Edge Register) |
|||||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 割り込み要求を入力をレベル入力にするかエッジ入力にするか設定します。(0-Level/1-Edge) | |
LERH | LER15 | LER14 | LER13 | LER12 | LER11 | LER10 | LER9 | LER8 | |
LERL | LER7 | LER6 | LER5 | LER4 | LER3 | LER2 | LER1 | LER0 |
◆PGR(Priority Group Register) |
|||||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | ここで1にセットしたものの中で割り込みレベルの大きなものから優先して割り込みを受け付けます。 | |
PGRH | PGR15 | PGR14 | PGR13 | PGR12 | PGR11 | PGR10 | PGR9 | PGR8 | |
PGRL | PGR7 | PGR6 | PGR5 | PGR4 | PGR3 | PGR2 | PGR1 | PGR0 |
◆IMR(Interrupt Mask Register) |
|||||||||
bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | 割り込み入力をマスクします。 (0-マスクしない/1-マスクする) |
|
IMRH | IMR15 | IMR14 | IMR13 | IMR12 | IMR11 | IMR10 | IMR9 | IMR8 | |
IMRL | IMR7 | IMR6 | IMR5 | IMR4 | IMR3 | IMR2 | IMR1 | IMR0 |
基本的な方法についてはマシン語モニタの「マシン語モニタ操作説明書」の付録に記載されていますのでそちらをご覧ください。TK-Z80と大きく異なる点は,RAMに表示データをセットするだけでは表示されずサブルーチンを定期的にCALLしつづける必要がある,というところです。また,キーデータと表示データはシリアルで入出力する必要があります。
Z-VisionやRM-80のトレースは,次に実行する命令の,さらに次に実行する命令を‘INT30H’に置き換えることで,1命令実行したあとでデバッガに処理を移しています。例として次のプログラムをトレースする場合を考えます。
LD | A,30h | ;(1)ここまでトレースしてきた |
LD | B,16h | ;(2)次にこの命令を実行する |
ADD | A,B | ;(3) |
(1)で止まっているときに割り込み信号を入れると,リモートデバッガ内はDIになっているので割り込みは一時保留になります。リモートデバッガからトレースでアプリケーションに処理が移るときに,これまでアプリケーションでEIであればEIに戻すので,それ以降,割り込みを受け付けることになります。つまり,(2)の命令を実行する前に割り込みを受け付けます。
さて,(1)で止まっているときに割り込み信号を入れ,そしてトレースを行うと,(3)を‘INT30H’に置き換えてからアプリケーションに処理を移すので,割り込み処理と(2)の命令を実行してからデバッガに処理が移ります。というわけで,トレースでは割り込みプログラムに処理を移すことができません。
対応策は,割り込みプログラムのデバッグは,割り込みプログラムの先頭にブレークをはって実行し(Goコマンド),一度ブレークをかけてからトレースすることで行います。
これらの質問については,次の資料をダウンロードしてください。(mon_chng.pdf)
汎用サブルーチンの資料をダウンロードしてください(sub.pdf)。また,FX-Z80のROMの内容についてはソースリストを参照してください。(モニタプログラムのダウンロード)
Copyright (c) 2000-2024 ToyoLinx Co.,Ltd.