スタック
スタックはたくさんのデータを格納できる箱みたいなものです。
$7E010Bから245バイト分のRAMが利用されています。

PUSHとPULL
PUSHを行うと、値のコピーをスタックの一番上に突っ込みます。
PULLを行うとスタックの一番上のデータを取り出して、その値を格納します。

A=42、X=18、Y=2Aの時に、スタック内に2つのデータが入ってたとします。
この状態でPHX (PUSH X)を行うと、Xの値である18がスタックの一番上に突っ込まれます。
続いてPHA (PHSH A)を行うと、Aの値である42がスタックの一番上に突っ込まれます。
結果、スタックの中のデータは2つ増え、一番上のデータが42になりました。
この状態でPULL Y (PLY)を行うと、一番上のデータが取り出され、その値である42がYにコピーされます。
スタックのデータは一つ減って、一番上のデータは18となりました。
一つのコード内でPUSHと使うときは、コードが終わるまでに同じ回数だけPULLを行って、
スタックの中を一番初めの状態に戻しておかないとフリーズの元になります。

どういうときに使うのか
SpriteToolのコード内ではXの値が、BlockToolのコード内ではYの値が重要な意味を持っていて、
勝手に値を書き換えたりするとエラーの元になります。
しかしながら、やはりこれらのレジスタを使いたいときがあります。
そこで、PUSHでレジスタの値を一旦スタック内にコピーしておいて、
レジスタを使った処理が終わった後にPULLを行って、レジスタの値を元にもとせばOKなわけです。

また、一部のレジスタは直接値を代入することができません。
そこで代入したい値をAに代入しておき、PUSH Aを行った後、そのレジスタに対してPULLすれば、
結果的にそのレジスタの値を書き換えたことになります。