ファミコン開発:引数

Twitterで見かけた6502での引数について調べてみた。
それなりに重そうなのでメインループ内では使わなさそうだけど、メニューやRPGなどの処理負荷よりも効率を優先したいときには良さそうなのでメモを残しておく。

まず6502ではサブルーチンコールに引数は渡せない。よくやる方法としては、ZPなどに値を配置してサブルーチンをコールする。しかし、ZP内のどこに配置するか、自前でスタックのような管理を作るのか? といった問題もあってスマートな解決方法がない。

”nesdev inline parameters”辺りで検索すると、以下のような方法が出てきた。

jsr _mySubroutine
.addr arg1, arg2   

_mySubroutineではスタックから戻り先を取得する。引数のアドレスとして保持しつつ、戻り先アドレスを修正してスタックに戻す。

毎回同じことを繰り返すのも容量がもったいないので、それ自体を関数化してもいいかもしれない。

jsr callFunc
.addr Func              ; 実際に呼び出したい関数のアドレス
.byte 3                 ; 引数の数
.addr arg1, arg2, arg3  ; それぞれの引数のアドレス

callFunc内では、上記の処理を行ったのちにFuncへとjmpさせる。引数のアクセスもどこかの固定のメモリを使うと関数呼ぶたびに壊されちゃうな…。そこでまたスタック…とか。うん、面倒。

この記事が気に入ったらサポートをしてみませんか?