Um. Why? I thought the whole point of the "external memory interface" (as opposed to using random IO ports to access a memory device) is that the memory appears in the AVR address space, and can be accessed via normal C code. There's a good summary accompanying the Rugged RAM expansion module: http://ruggedcircuits.com/html/megaram.html
And notes in avr-libc on how to set things up so that malloc() and friends will use it: Frequently Asked Questions
I guess your code handles the bank boundary "invisibly." But at great computational cost...