bori napisał/a:Ale za to nie wymaga relokatora ;-), mozna go dowolnie przesuwac po pamieci razem z danymi
Ale za to nie będzie ci działać, jeśli pod $C0CE nie ma tego, co zakładasz, że jest (a np. w Atari 400 i 800 nie ma tam nic). Ciekaw jestem, czy w QMEG-OS jest, bo w moim ROM-ie dla 65c816 nie ma z całą pewnością.
Zastanawiam się w ogóle, jaki sens ma ta kombinacja (php / jsr $c0ce). Zakładając nawet, że pod tym adresem jest rozkaz RTI. O ile mi wiadomo, JSR odkłada na stos adres powrotny pomniejszony o jeden, a przerwanie nie. Wobec tego JSR $C0CE odłoży na stos adres ostatniego bajtu argumentu rozkazu JSR, a RTI do tegoż ostatniego bajtu powróci (bo RTS zwiększa adres o 1, ale RTI nie). Po wykonaniu JSR (na standardowym ROM-ie) zostanie wykonany nie rozkaz TSX, ale CPY #$BA (gdzie $C0 to opcod CPY #, a $BA to opcod rozkazu TSX). Zastanawiam się, co ci to daje.
Domniemywam, że owo JSR ma wstawiać na stos adres bezwzględny kodu znajdującego się za JSR. Nawet jednak, gdyby tak było (a nie jest, patrz wyżej), to RTI ten adres ze stosu zdejmuje zwiększając przy tym wartość wskaźnika stosu. A pierwsze przerwanie - które może wystąpić zawsze, a więc natychmiast po wykonaniu się RTI również - ten adres skutecznie zamazuje. Toteż późniejszymi rozkazami (tsx, lda nnn,x itd.) zdejmujesz ze stosu wyłącznie śmieci, a program idzie w maliny.