Dopisuję się do ostatniej wersji...
Dosyć oczywista optymalizacja - zamiana rejestrów X z Y oraz zmiana adresacji z absolutnej na pośrednią postindeksowaną na stronie zerowej:
loop jsr get
beq stop
lsr @
tax
q0 jsr get
q1 sta $dead
inc q1+1
bne *+5
inc q1+2dex
_bpl bmi loop
bcs q0
bcc q1get iny
bne *+4
inc src+1
lda (src),y
stop rts
Zysk 2 bajtów przy wariancie na stronie zerowej oraz 1 przy poza.
To nie było moje ostatnie słowo...
Jest jeszcze bardziej pociśnięta wersja, ale ostrzegam, że jest to już HARDCORE:
loop brk
nop
tax
beq exit
lsr @
tax
q0 brk
nop
q1 sta $dead
inc q1+1
bne *+5
inc q1+2dex
_bpl bmi loop
bcs q0
bcc q1 !get iny
bne *+4
inc adr+1
lda (src),y
rti
Trzeba się tylko "upewnić", że pod $fffe są odpowiednie wartości oraz zezwolić na przerwania niemaskowalne ($d20e ???), ale to raczej nie problem. Zysk jest 1 bajtowy. Exit oznacza adres powrotu, a procedure wywołujemy przez jmp loop.
35 bajtów poza stroną zerową, 33 na zerowej.