# スタック操作
Note: サイクル数はマシンサイクル単位です。## ADD HL,SP
SPレジスタの値とHLレジスタの値を足す
サイクル: 2
バイト長: 1
フラグ:
Z: 不変
N: 0
H: bit11からオーバーフローした場合にセット
C: bit15からオーバーフローした場合にセット
## ADD SP,e8
e8(8bit整数)とSPレジスタの値を足す
サイクル: 4
バイト長: 2
フラグ:
Z: 0
N: 0
H: bit3からオーバーフローした場合にセット
C: bit7からオーバーフローした場合にセット
## INC SP
SPレジスタの値をインクリメント(+1)する 処理結果はSPレジスタに格納される サイクル: 2 バイト長: 1 フラグ: 不変## DEC SP
SPレジスタの値をデクリメント(-1)する 処理結果はSPレジスタに格納される サイクル: 2 バイト長: 1 フラグ: 不変## LD SP,n16
n16をSPレジスタに格納 サイクル: 3 バイト長: 3 フラグ: 不変## LD [n16],SP
SPの下位バイト(bit0-7)をアドレスn16のメモリに、上位バイト(bit8-15)をアドレス(n16+1)のメモリに格納 [n16] = SP & 0xFF, [n16+1] = (SP >> 8) サイクル: 5 バイト長: 3 フラグ: 不変## LD HL,SP+e8
e8(8bit整数)とSPレジスタの値を足したものをHLレジスタに格納
SPレジスタは不変
サイクル: 3
バイト長: 2
フラグ:
Z: 0
N: 0
H: bit3からオーバーフローした場合にセット
C: bit7からオーバーフローした場合にセット
## LD SP,HL
HLレジスタの値をSPレジスタに格納 サイクル: 2 バイト長: 1 フラグ: 不変## PUSH AF
AFレジスタの値をスタックにプッシュする
内容的には、以下のコードを実行したのと同じ
dec sp
ld [sp], a
dec sp
ld [sp], flag_Z << 7 | flag_N << 6 | flag_H << 5 | flag_C << 4
サイクル: 4
バイト長: 1
フラグ: 不変
## PUSH r16
r16の値をスタックにプッシュする
内容的には、以下のコードを実行したのと同じ
dec sp
ld [sp], HIGH(r16) ; B, D or H
dec sp
ld [sp], LOW(r16) ; C, E or L
サイクル: 4
バイト長: 1
フラグ: 不変
## POP AF
スタックの先頭から16bitの値を取り出して、AFレジスタに格納する
Fレジスタに最初の1バイト[SP]が、Aレジスタに次のバイト[SP+1]が格納される
内容的には、以下のコードを実行したのと同じ
ld f, [sp] ; フラグに影響を与える
inc sp
ld a, [sp]
inc sp
サイクル: 3
バイト長: 1
フラグ:
Z: 取り出した16bit値の7bit目
N: 取り出した16bit値の6bit目
H: 取り出した16bit値の5bit目
C: 取り出した16bit値の4bit目
## POP r16
スタックの先頭から16bitの値を取り出して、r16に格納する
下位レジスタに最初の1バイト[SP]が、上位レジスタに次のバイト[SP+1]が格納される
内容的には、以下のコードを実行したのと同じ
ld LOW(r16), [sp] ; C, E or L
inc sp
ld HIGH(r16), [sp] ; B, D or H
inc sp
サイクル: 3
バイト長: 1
フラグ: 不変