Z−80アセンブラ 1996.04.24 熊谷(和) 1.Z−80アセンブラの命令 1.1 ロード命令 この資料は学生配布用に作成したものであり、無断転用等 を禁じます。 参考とする場合は出典を明記するなど、文献の取り扱い方 法に準じて下さい。 ご意見・ご要望は熊谷:ckuma@cc.sendai-ct.ac.jp まで。 1)数値 ①A ← 20H LD ②B ← F3H LD A,20H 2)ASCIIコード ①C ← '+' LD ②D ← '5' LD C,'+' = LD C,2BH D,'5' = LD D,35H B,0F3H 3)レジスタ間のデータ転送 ①B ← A LD B,A 4)メモリとのデータ転送(直接アドレス) ①A ← (0200H) LD A,(0200H) ②(9103H) ← A LD (9103H),A 5)16ビットのロード命令 ①DE ← 201FH LD DE,201FH ○練習問題1 ①E ← 9FH ②B ← 'Y' ③A ←→ B :内容交換 ④(8501H) ←→ (862AH) :内容交換、8ビットで ⑤(5101H,5100H) ←→ (5111H,5110H) :内容交換、16ビットで 1.2 アドレス 1)間接アドレス ①A ← (1A00H) LD BC,1A00H LD A,(BC) BC:ポインタ - 1 - 2)インデックスレジスタ ①A ← (1332H) LD IX,1300H LD A,(IX+32H) (IX+d)という使い方が特徴的 3)記号アドレス ①(ADRS) ← A LD (ADRS),A ADRS:記号アドレス名(ラベル) ○ラベルの条件 ①使用できる文字は、英数字といくつかの特殊記号($、?など) ②最初の文字は、英字であること ③文字の長さは、6文字以内であること ④レジスタ名、フラグ名、命令コード(LDなど)等の、命令に必要な記号は禁止 4)主な擬似命令 EQU ORG DB DW DS END ; :数値定義(ラベル) :プログラム開始番地 :1バイト定数書き込み :2バイト 〃 :メモリ領域確保(ROMでは関係ない) :プログラム終了 :コメントを示す ○練習問題2 ①ラベルADRS1の示すアドレスをクリア(0を代入)せよ。 ②3000Hに0ABHが入っている。次のプログラムを実行すると、Aレジスタには何が 入るか。 WDATA EQU 3000H LD A,(WDATA) 1.3 算術演算命令、論理演算命令 1)INC、DEC カウンタとして使用する場合に用いる。 a)8ビット ①B ← B+1 INC ②C ← C−1 DEC B C 演算の結果セットされるフラグを利用する。 - 2 - b)16ビット ①DE ← DE+1 INC DE ②BC ← BC−1 DEC BC 16ビットの場合は、桁上げ、桁借りは自動的。フラグに影響を与えないことに注意。 2)加算 a)8ビット加算 ①A ← A+B ADD A,B ②A ← A+20H ADD A,20H いずれも、加算結果が0FFHを越える場合は、キャリーフラグ(CY)が1にセットされ る。 CYを見れば、0FFHを越えたかどうかが分かる。 b)16ビット加算 ①0863H+05C4H ⅰ)8ビット単位 答をペアレジスタBCに格納する。 ステップ1:下位8ビットの加算 63 + C4 ①27 ↑ 桁上がり ステップ2:上位8ビットの加算 08 05 + 1 ←桁上がり 0E 答:0E27H ⅱ)16ビット単位 答をペアレジスタHLに格納する。 HL ← HL+DE LD HL,0863H LD DE,05C4H ADD HL,DE - 3 - LD ADD LD A,63H A,0C4H C,A LD ADC LD A,08H A,05H B,A ○練習問題3 ①A ← 3FH+0A5H ②A ← B+(501AH) ③(2100H) ← (2000H)+(2001H) ④HL ← BC+DE :8ビット単位 ⑤(5101H,5100H) ← (5001H,5000H)+(5011H,5010H) :16ビット単位 ○例題1 32ビット加算のプログラムを考えよ。 第1項のメモリ領域 P1∼P1+3 第2項のメモリ領域 P2∼P2+3 答のメモリ領域 ANS∼ANS+3 ただし、いずれも上位アドレスが上位バイトに対応するものとする。 解答) LD LD ADD LD LD LD ADC LD HL,(P1) DE,(P2) HL,DE (ANS),HL HL,(P1+2) DE,(P2+2) HL,DE (ANS+2),HL ;H <-(P1+1),L <-(P1) ;D <-(P2+1),E <-(P2) ;(ANS+1)<- H,(ANS)<- L ;LD命令ではCYは影響を受けないことに注意 3)減算 a)8ビット減算 ①A ← A−B SUB B (SUB A,Bではないことに注意) ②A ← A−20H−CY SBC A,20H いずれも、減算結果が00Hを下回る(マイナスになる)場合は、キャリーフラグ(CY) が1にセットされる。 CYを見れば、00Hを下回ったかどうかが分かる。 b)16ビット減算 ①0863H−05C4H ⅰ)8ビット単位 答をペアレジスタBCに格納する。 ステップ1:下位8ビットの減算 桁借り ↓ ①63 − C4 9F - 4 - LD SUB LD A,63H 0C4H C,A ステップ2:上位8ビットの減算 08 05 − 1 ←桁借り 02 LD SBC LD A,08H A,05H B,A 答:029FH ⅱ)16ビット単位 答をペアレジスタHLに格納する。 HL ← HL−DE LD HL,0863H LD DE,05C4H SBC HL,DE SUB HL,DEは無い。 ○練習問題4 32ビット減算のプログラムを考えよ。 第1項のメモリ領域 P1∼P1+3 第2項のメモリ領域 P2∼P2+3 答のメモリ領域 ANS∼ANS+3 ただし、いずれも上位アドレスが上位バイトに対応するものとする。 4)論理演算命令 a)否定 − ①A ← A CPL A=01011101B=5DH ↓CPL A=10100010B=0A2H すべてのビットが反転する。 b)論理和 ①A ← A∨B OR B A=10100101B=0A5H OR B=01001001B=49H ↓ A=11101101B=0EDH 各ビット毎にOR。 - 5 - c)論理積 ①A ← A∧0FH (A・0FH) AND 0FH A=10100101B=0A5H AND 00001111B=0FH ↓ A=00000101B=05H 各ビット毎にAND。 特定のビット(複数可)の状態を取り出すのに便利(マスクという)。 d)排他的論理和 ①A ← A+A ○ XOR (A∨A) − A A=10100101B=0A5H XOR A=10100101B=0A5H ↓ A=00000000B=00H LD A,0より速いので、Aレジスタをクリアするのによく利用される。 e)OR、ANDによるビット操作 ①Aのビット0、ビット2 → 1 OR 05H (05H=00000101B) ②Aのビット4、ビット6 → 0 AND 0AFH (0AFH=10101111B) OR :セット AND:リセット ○練習問題5 以下を計算せよ。 ①37H ②37H∨4BH ③0A5H∨32H ④0F6H∧94H ⑤0B2H○3AH + - 6 - 1.4 フラグ 1)フラグレジスタの構成 7 6 S Z 5 4 3 H サインフラグ ゼロフラグ ハーフキャリーフラグ 2 1 0 P/V N CY キャリーフラグ 加減算フラグ パリティ/オーバーフローフラグ 6つのフラグのうち、判定条件に使えるものはS、Z、P/V、CYの4つである。あとの 2つは内部で使用するためのもの。 2)キャリーフラグ(CY) 算術演算、桁移動命令に関係。 桁上がり、桁借りが生じると1になる。 主な使用方法は以下の通り。 ①2バイト以上の算術演算 ②桁移動動作の結果判定 ③符号無の2つの数の大小比較 ○練習問題6 キャリーフラグに影響を与える算術演算命令、論理演算命令を挙げよ。 3)パリティ/オーバーフローフラグ(P/V) a)パリティフラグ(P) 外部装置からの受信が正しいかどうかのチェックに使用。 パリティチェック・・・偶パリティ、奇パリティ(どちらかに決めておくこと) ①パリティチェック AND A (ORも可、XORはデータが壊れる) 8ビット中1のビットの数が偶数 P=1(偶パリティ) 〃 奇数 P=0(奇パリティ) b)オーバーフローフラグ(V) 符号付数値の算術演算に使用。 演算結果が−128∼+127の範囲を越えた時に1になる。 オーバーフローフラグは、符号付き数値の計算に使用するもの。符号付き数値は、2の補数 表現を利用しており、最上位ビットは符号として扱われるので、オーバーフローフラグは、 実質7ビット分の値の計算に使われる。キャリーフラグは符号無し数値の計算に使用するこ とに注意。符号無し数値の範囲は0∼255。 - 7 - 4)ゼロフラグ(Z) 算術演算、ビットテスト命令などに関係。 演算などの命令の結果が0の時に1になる。 ①A ← A−B SUB A≠Bの時 A=Bの時 B Z=0 Z=1 ②B ← B+1 INC B B:0FFH → 00Hの時 ③Aのビット3をテスト BIT 3,A ビット3=0 ビット3≠0 − Z ← b Z=1 Z=1 Z=0 5)サインフラグ(S) 算術演算などの命令に関係。 演算結果が負になった時に1になる。 2の補数表現では、最上位ビットが1であれば負、0であれば正なので、サインフラグには 最上位ビットの値がそのまま入ることになる。 ○例題2 12510+410の計算をした時、各フラグの状態はどうなるか。 解答) 125+4=129 ≦255(桁上がり無し) >127(オーバーフロー) ≠0(ゼロでない) =10000001B(最上位ビット1) したがって CY=0、P/V=1、Z=0、S=1 となる。 ○練習問題7 3210+(−3210)を計算した時、各フラグの状態はどうなるか。 ヒント:−3210(符号付き) → 22410(符号無し) 6)比較命令 ①AとBの比較 SUB CP B B (A ← A−B) 2つの数の比較には2つの方法があるが、SUBではAレジスタの内容が変化するので、内 容を保持したいときにCPを使用する。CPでは、演算結果は残らず、フラグのみが影響を 受ける。 - 8 - AレジスタとBレジスタ(どちらも符号付き数値)を比較した場合、フラグの状態から結果 を判定 Z=1の時 A=B Z=0の時 A≠B S=0の時 A>B → S=1の時 A<B ただし、P/V=1(オーバーフロー)の時 S=0の時 A<B S=1の時 A>B 1.5 ジャンプ命令 1)プログラムの分岐 一般のプログラムでは、直線的なものはまれであり、判断や飛び越し、あるいはループが含 まれるのが普通である。このようなプログラムの分岐に使用する命令がジャンプ命令である。 ジャンプ命令には、判断をする場合に使われる条件付きジャンプ命令と、飛び越しなどに使 われる無条件ジャンプ命令がある。また、ループ制御用の特別な命令DJNZがある。 2)条件付きジャンプ命令 a)条件付きジャンプ命令の形式 JP cc,nn cc:条件、nn:ジャンプ先 条件が成り立つ場合に、nn番地へジャンプする。 b)条件の種類 cc NZ Z NC C PO PE P M 意味 Z=0 Z=1 CY=0 CY=1 P/V=0 P/V=1 S=0 S=1 ①A≧23H(符号無し) → ラベルERRORへジャンプ ADD A,0DDH ;100H−23H=0DDH JP C,ERROR (S、P/Vは使えないことに注意) ②A<23H(符号付き) → ラベルERRORへジャンプ ⅰ.ADD A,5CH ;7FH−23H=5CH JP PO,ERROR ⅱ.CP 23H JP PE,ERROR JP M,ERROR (CYは使えないことに注意) - 9 - ③Aのビット5=1 → ラベルHITへジャンプ BIT 5,A JP NZ,HIT ○例題3 2つの8ビット数値(符号無し)の和を計算し、答をペアレジスタDEに格納せよ。 解答) ;8BIT DATA NO KASAN ; DATA1 EQU 83H DATA2 EQU 49H START: ORG 100H LD D,0 LD A,DATA1 LD B,DATA2 ADD A,B JP NC,NOCY INC D NOCY: LD E,A END START ;CLEAR ;LD D,1 も可 ○練習問題8 3つの8ビット数値(符号無し)の和を計算し、答をペアレジスタDEに格納せよ。 3)無条件ジャンプ命令 無条件ジャンプ命令の形式 JP dd dd:ジャンプ先(nn,(HL),(IX),(IY)) 4)相対アドレスジャンプ命令 これまでのジャンプ命令では、2バイトの値を使って、実際にジャンプすべき番地を指定し た。相対アドレスジャンプでは、1バイトの値を使って、ジャンプ先までの増分値を指定す る。この方法は、メモリを節約できるという特徴があるが、ジャンプ先の範囲が1バイトの 増分以内(−128∼+127)、判断条件に使えるフラグがZとCYのみという制約があ る。 また、ループ制御用の特別なジャンプ命令も用意されている。この命令はBレジスタをカウ ンタとして用いており、Bレジスタの内容の数だけループするようになっている。 相対アドレスジャンプ命令の形式 無条件:JR e 条件付:JR t,e ループ:DJNZ e e:偏位置(ディスプレイスメント) t:条件(C、NC、Z、NZ) - 10 - ○例題4 例題3のデータの数を64個とした時のプログラムを作成せよ。ただし、加算するデータは 5000Hから格納されているものとする。 解答) ;8BIT DATA NO KASAN NO.2 ; A_DT EQU 5000H START: ORG 100H LD HL,A_DT LD B,40H LD D,0 XOR A LOOP: ADD A,(HL) INC HL JP NC,NOCY INC D NOCY: DEC B JP NZ,LOOP LD E,A END START ;DATA ADDRESS ;NUMBERS OF DATA ;CLEAR ;NEXT DATA A_DTは、DB命令を用いて、5000Hから具体的な値を記述してもよい。 ○練習問題9 例題4のプログラムを、JR命令とDJNZ命令を用いて書き直せ。 1.6 その他の命令 1)ブロック転送命令(LDI、LDIR、LDD、LDDR) メモリ内のデータを別の場所へコピーする命令。ニーモニックの最後に'R'の付いているも のはリピート命令である。 2)サーチ命令(CPI、CPIR、CPD、CPDR) メモリ内のデータの中から特定のデータをサーチする命令。'R'はリピート。 3)アキュムレータ操作命令(DAA、CPL、NEG) DAA:Aレジスタの値に対し、BCD補正を行う。 CPL:否定の論理演算 − NEG:2の補数計算(A ← A+1、−A) 4)CPUコントロール命令(CCF、SCF、NOP、HALT、DI、EI、IM n) CCF:キャリーフラグの反転(CY ← CY) SCF:キャリーフラグセット(キャリーフラグリセットは、SCF → CCF で行う) NOP:無動作(時間調整、アドレス調整用) HALT:CPU停止(割り込み信号で再動作) DI :割り込み禁止 EI :割り込み許可 IM n:割り込みモード設定 - 11 - 5)ローテイト命令(RLCA、RLA、RRCA、RRA、RLC s、RL s、RRC RR s) s:r、(HL)、(IX+d)、(IY+d)で、算術命令の's'とは異なる。 レジスタまたはメモリの内容を1ビット循環させる命令。 6)シフト命令(SLA、SRA、SRL) 1ビットの桁移動を行う命令。 7)BCDのローテイト命令(RLD、RRD) 4ビット単位のローテート命令。 8)ビット操作命令(BIT、SET、RES) BIT:特定のビットのテスト SET:特定のビットのセット( → 1) RES:特定のビットのリセット( → 0) 9)入出力命令(IN、INI、INIR、IND、INDR、OUT、OUTI、OTIR、 OUTD、OTDR) IN*:I/Oポートからの入力 OUT*、OT*:I/Oポートへの出力 10)スタック操作命令(PUSH、POP) PUSH:スタックへの退避 POP:スタックからの復帰 →以下次章で説明 11)エクスチェンジ命令(EX、EXX) EX :レジスタなどの内容の交換 EXX:主レジスタと副レジスタの交換(AとFはEX命令で行う) 12)コール命令(CALL) サブルーチンをコールする。戻り番地はスタックに自動的に退避される。 13)リターン命令(RET、RETI、RETN) RET:サブルーチンからのリターン RETI:マスク可能割り込みからのリターン RETN:マスク不能割り込みからのリターン - 12 - s、 ○練習問題10 いずれも、プログラム開始番地は100Hとする。 1)Aレジスタの値(符号付き)がBレジスタの値より小さい場合に、ラベルERRORへジャン プするプログラムを作れ。 ヒント:Bレジスタの値が負の時は、減算するとより大きな値となるので、+側でオーバー フローする場合がある。(P/V=1でS=1の場合、A>B) 2)外部装置(I/Oアドレス:80H)からASCIIデータを入力し、受け取った数値を16 進数に変換するプログラムを作れ。 '0'∼'9'(30H∼39H) → 00H∼09H ラベルNEXTへジャンプ 'A'∼'F'(41H∼46H) → 0AH∼0FH 上記以外 → ラベルERRORへジャンプ 3)メモリの5000H∼503FHにあるデータ(40H個)を50C0H∼50FFHに転送 するプログラムを5種類作れ。5種類のプログラムのそれぞれの条件は以下の通りである。 ①インデックスレジスタ使用 ②LDI命令使用 ③LDIR命令使用 ④LDD命令使用 ⑤LDDR命令使用 - 13 - 2.プログラミングテクニック 2.1 スタック操作とエクスチェンジ操作 数が限定されている汎用レジスタを効率よく使うためには、レジスタの内容をメモリに一時退避し たり、レジスタ間でデータ交換を行ったりすることが必要になる。 1)スタック操作 スタックは、メモリ上でデータを出し入れする所を一点に限定することにより、プログラミ ングを簡略化し、さらに間接アドレスであることから、プログラムの自由度を上げるための ものである。スタックの主な利用法を以下に示す。 ⅰ.レジスタの内容の退避(PUSH、CALL) ⅱ.サブルーチンへの引数の受け渡し ⅱの用法は、特に上位言語とのリンクなどで利用されている。 スタックは、後に入れた内容が先に出てくる構造(LIFO:Last In First Out)になっ ているので注意が必要である。 ①スタックポインタを8000Hにセット LD SP,8000H プログラムの初めの方で行われる命令であり、この場合の8000Hをスタックの底と呼ぶ。 データの格納は7FFFHを先頭に前の方に向かって行われる。メモリの最後をスタックに する場合がほとんどで、最後尾を明示するために、 LD SP,7FFFH の様にするこ ともある。 ②BCレジスタの内容をスタックに退避 PUSH BC この時、SPの内容は SP−2 になっている。 ③DE ←→ HL:スタック使用 PUSH DE PUSH HL POP DE POP HL 2)エクスチェンジ操作 メモリを使わないでレジスタ間のデータ交換をする方法がエクスチェンジ命令である。 また、Z−80CPUにはレジスタが2組あり、それぞれ主レジスタ、補助レジスタと呼ば れる。この2つのレジスタセットは全く同じものであるが、両方同時に使うことはできない。 エクスチェンジの主な利用法を以下に示す。 ⅰ.レジスタ間のデータ交換 ⅱ.レジスタの内容の退避 このうちよく使われるのがⅱの用法で、レジスタ8個の内容を退避するのにわずか2つの命 令で済み、非常に高速であるため、割り込み処理で利用される。 - 14 - 2.2 サブルーチン 1)プログラムカウンタ(PC) これまで触れてこなかったが、Z−80CPUでは、プログラムを逐次処理するのにプログ ラムカウンタ(PC)という考えを利用している。 CPUは、PCの指し示す番地のデータを読み込み、その内容に従って決められた動作をす る様になっている。また、データを読み込むと同時に、自動的にPCの値を1だけ増加させ るので、命令を次々と処理できるわけである。 従って、ジャンプ命令は、PCにジャンプ先の番地をロードする動作を行っていることにな る。 JP nn = PC ← nn 2)CALL命令とRET命令 ジャンプ命令はジャンプしっぱなしであり、PCの元の値は消えてしまう。サブルーチンを 利用するには、元の実行位置に戻る必要があり、そのための命令がCALL命令とRET命 令である。 CALL命令の動作 CALL nn = スタック ← PC、 PC ← nn RET命令の動作 RET = PC ← スタック PCの内容はスタックを利用して退避されることになる。スタックは、データを出し入れす る所を限定しており、場所を明示しなくともよいので、サブルーチンを使うときに大変都合 がよい。 3)サブルーチン使用上の注意 ①実行するCALL命令とRET命令の数を同じにする ②サブルーチン内で実行するPUSH命令とPOP命令の数に注意する ○例題5 Z−80CPUでは、Tステート数にクロック周期(クロック周波数の逆数)をかけたもの が実行時間になる。 LDIR命令を利用して、0.04秒程度までの時間待ち用サブルーチンWAITを作れ。 クロック周波数は4MHz、サブルーチンへの引き数の受け渡しはペアレジスタBCを使う ものとする。ただし、利用できるメモリは0A100H∼0BFFFHの間とする。 解答) 利用できるメモリのバイト数は 0C000H−0A100H=1F00Hバイト=7936バイト であるから、7936バイトブロック転送に要する時間は、LDIR命令を使う場合、 (21×7935+16)/(4×106)=0.0417(s) となるので、要求される時間に間に合う。 - 15 - START: ; WAIT: ORG LD LD CALL HALT 100H SP,0BFFFH BC,076DH WAIT PUSH PUSH LD LD LDIR POP POP RET END HL DE HL,0A100H DE,0A101H DE HL ;FOR 0.01s ;17 ;11 ;11 ;10 ;10 ;(BC-1)*21+16 ;10 ;10 ;10 START 0.01(s) Tステート数=40,000 40,000−17−11×2−10×5−16=39,895 39,895/21≒1,900 1,900+1=1,901バイト=076DHバイト ○練習問題11 例題5を利用して、1秒間の時間待ちサブルーチンWAIT1を作れ。 ヒント:サブルーチンを2段にする。 2.3 割り込み 1)割り込み処理とは ワンボードマイコンを使う場合、外部とのやり取りが重要であることは間違いない。ところ が一般に、外部装置あるいは装置全体をワンボードマイコンに合わせて設計することは少な く、装置に合わせてワンボードマイコンを選ぶことの方が多い。従って、外部装置の動作速 度がワンボードマイコンの処理速度と合わないこともでてくる。 外部装置の動作速度はマイコンと較べて一般に遅いので、入出力動作を外部装置に合わせて いると無駄な時間を費やすことになってしまう。そこで、外部装置の動作速度に関係なく、 プログラムを効率的に処理する方法として考え出されたのが割り込み方式である。 割り込み方式では、割り込み信号が来ると割り込み処理ルーチンに動作を移し、処理が終わ ればまた元のプログラムを実行する。また、要求に対して直ちに必要な処理を行えるので、 より迅速な処理が可能である。 割り込み処理には以下の種類がある。 ①マスク不能割り込み(NMI) ②マスク可能割り込み(INT) モード0、1、2 - 16 - 2)マスク不能割り込み(NMI) Z−80CPUのNMI端子に信号が入力されると実行される。 処理開始番地 0066H(固定) リターン命令 RETN NMIでは、マスク可能割り込みは自動的に禁止状態になり、RETNで元の状態に戻る。 3)マスク可能割り込み(INT) CPUのINT端子に信号が入力されると実行される。 INTは、プログラム中で割り込みの許可禁止が制御できる。 EI:割り込み許可 DI:割り込み禁止 INTではモード0からモード2まで3つの処理モードがある。 電源投入時は、割り込み禁止、モード0の状態になる。 a)モード0 IM 0 で設定できる。 モード0では、割り込み信号を発生した外部装置は、CPUからのデータ要求に対して命令 語を1つ送らなければならない。CPUは受け取った命令を実行するので、送られる命令は RST命令かCALL命令となる。 1バイト命令のためよう使われるRST命令の形式は以下の通りである。 RST p p:00、08、10、18、20、28、30、38H 処理開始番地(RST命令使用時) 0000H、0008H、・・・、0038H(8種類) リターン命令(INTすべてに共通) RETI INT命令では、割り込みが実行されると自動的に割り込み禁止状態になるが、RETI命 令を実行しても割り込み許可状態にならないので、RETI命令の前にEI命令を入れる必 要がある。 b)モード1 IM 1 で設定できる。 モード1の割り込みは、最も簡単な割り込みであり、INT端子に信号が入力されただけで 実行される。 処理開始番地 0038H(固定) - 17 - c)モード2 IM 2 で設定できる。 モード0やモード1では割り込み処理の種類が少ないが、モード2では最大128種類の処 理が可能である。処理開始番地は任意に設定でき、途中で設定し直すことも可能である。 ⅰ.外部装置とのやり取り ①INT信号 ②外部装置より1バイトデータの読み込み(割り込みベクタ) ⅱ.割り込み処理の開始番地 割り込み処理ルーチンの開始番地テーブル(割り込みテーブル)を使用する。 ①Iレジスタ+割り込みベクタでテーブル上の番地を指示 ②指示されたテーブル上の番地のデータが示す番地から割り込み処理を開始する したがって、割り込み処理の開始番地は、2回の間接アドレスで指示されることになる。 ○例題6 モード1のマスク可能割り込みを使って、8FHのI/Oポートからデータを受け取るプロ グラムを作れ。受け取ったデータはメモリ上のラベルINBUF(8000H)から格納す るものとし、INBUFの内容は以下の通りとする。 (スタックポインタは0BFFFHとする。) INBUF:1 − データ受信、0 − データ無し、 INBUF+1:受信データ 解答) INBUF START: LOOP: EQU ORG JP ORG JP ORG LD IM EI LD CP JP XOR LD LD ; ;処理ルーチン JP DT_IN: EX IN LD LD LD EX EI RETI ; END 8000H 0H 100H 0038H DT_IN 100H SP,0BFFFH 1 A,(INBUF) 0 Z,LOOP A (INBUF),A A,(INBUF+1) LOOP AF,AF' A,(8FH) (INBUF+1),A A,1 (INBUF),A AF,AF' ;FLAG CLEAR ;GET DATA ;DATA IN ;FLAG SET START - 18 -
© Copyright 2024 Paperzz