Z80でIM1割り込みモードを使いたいです。
割り込みモードでは、1 プロセッサはメモリ内の 38h アドレスにジャンプし (そうですか?)、割り込みを続行します。コードでこれを指定するにはどうすればよいですか? 私は以下について読みました:
defs [,] ds [,] この疑似命令は、バイトのブロックをコード セグメントに挿入します。
サンプルソースコードが必要です。
敬具
ラファウ R.
まず、目の前にZ80がありません。
org を使用して、指定されたアドレスで「関数」を「手動で」見つけます。したがって、IM1 ハンドラーを作成するには、次のようにします。
org 0x38
; IM1 handler
ld a, 100 ; ... whatever
ret
また、通常の開始アドレスはわかりませんが、元の Z80 はロケーション 0 から開始されています。この場合は、コードの非常に早い段階で 0x38 ハンドラを過ぎて JMP する必要があります。(再生できるのは 56 バイトだけです)
ハッピーコーディング!
IM 1 では、保留中の割り込み (オペコードの終了前の最後のサイクルの立ち上がりエッジでサンプリングされます。NMI とは異なり、IRQ ラインがサンプリングされるだけです) を検出すると、IFF1 と 2 がクリアされ、anRST 38h
が実行されます。したがって、PC が 0x38 になり、割り込みが無効になり、古いプログラム カウンターがスタックの一番上にあることになります。割り込みに応答するために必要なことは何でも実行してから、OR を実行しますEI, RET
( EI, RETI
2 つの IFF フラグは割り込み確認後に同じ値を持つため、ここでは違いはありません)。
Z80 では、PC は電源投入時またはリセット時に 0 に設定されるため、メモリのその端にあるコードを既にある程度制御している可能性があります。正確な構文はアセンブラによって異なりますが、おそらく次のようなものが必要です。
org 0
; setup initial state here, probably JP somewhere at the end
; possibly squeeze in another routine if you've the space
org 0x38
; respond to interrupt
EI
RET
あなたが0hから始めていないときに何をすべきかを考え出しました:
org 1800h
START: ;Do the start, but It can't take more than 38 instructions
LD SP, 0x2000 ;Initialize SP!
JP MAIN ;Continue to rest of the program
ds 0x1838-$,0 ;Allocate block of memory for interrupt handler
INT:
;interrupt sub
LD E, 0
LD A, E
OUT (066), A
EI
RETI
ds 0x1840-$,0 ;Alloc space for the rest of program.
MAIN:
;Rest of program here
このようにする限り、プロセッサは JP 01838h 命令をアドレス 038h に配置します。したがって、ハンドラーは正しいです。また、スタック ポインタを初期化することを忘れないでください。そうしないと、割り込みハンドラからプログラムに戻ることができなくなります。