PUSH: スタックにデータを格納する命令
RET: CALL元へ復帰する命令
RETはCALLから復帰するための命令ですが、戻りアドレスはスタックから取り出すので、「スタックからPOPして得られるアドレス値へジャンプする命令」と解釈することもできます。
つまり、アドレス値をPUSHしてからRETを呼び出せば、「PUSHしたアドレスにジャンプ」することができます。6502には、任意メモリに格納されたアドレスへジャンプする命令が存在しないので、6502であれば割と有用なテクニックだったといえます。
ただ、Z80のプログラムでこのテクニックを利用する意味が分からないです...Z80であれば、任意メモリに格納されたアドレスへジャンプする命令(JP (HL) など)が存在するので。
性能面についても、PUSH/RETを使うメリットはありません。
そもそも、スタックアクセスが遅いので。
例えば、アドレス nn に格納されているアドレスにジャンプしたい場合:
(PUSH/RET)
LD BC, $(nn) ... 20Hz
PUSH BC ... 11Hz
RET ... 10Hz
合計: 41Hz
(JP (HL))
LD HL, $(nn) ... 20Hz
JP (HL) ... 4Hz
合計: 24Hz
上記のように、PUSH/RETだと「17Hz」もの無駄クロックを消費してしまいます。
PUSH(スタックアクセス)がそもそも重い上に、RETも(スタックアクセスするので)重いので、PUSH/RETでは性能的な意味での恩恵が得られることは無い筈です。
なのに何故、あのゲームはZ80だと一見無意味なPUSH/RETを使っていたのか...謎が深まります。(プログラマがFCに慣れてて、Z80をあまり知らない状態で書いたとかそんなオチでしょうけど)