Mnie się wydaje, że to co Fox mówi to jest zło i niedobro. MEMORY_CopyFromCart i MEMORY_CopyToCart służą do przerzucania pamięci między komputerem a cartridgem, a bajty na $D5xx w komputerze nie są pamięcią - adresy $D0xx-$D7xx są przecież mapowane w obszar $5000-$57FF i teraz zależnie od tego czy mamy tam ROM to pokaże się tam SELF-TEST, a jeśli jest włączony MapRAM to może tam się pokazać też RAM który jest w tym obszarze (o ile konfiguracja PORTB mówi żeby tę pamięć podłączyć). Więc jedyne co tak możesz zrobić to ustawić zawartość pamięci, ale odczyt pamięci w MEMORY_HwGetByte (memory.c) i tak do tego nie sięgnie, bo ten obszar kierowany jest to CARTRIDGE_GetByte.
Wygląda mi ten kod Twój dobrze, ale zwróć uwagę że w CARTRIDGE_GetByte masz
return GetByte(&CARTRIDGE_main, addr, no_side_effects) & GetByte(&CARTRIDGE_piggyback, addr, no_side_effects);
więc może masz jakiś przelotowy drugi cart zamapowany który zwraca coś na $D5xx. Albo może masz jakieś urządzenie włączone?
Albo coś zapisuje Ci $D5xx i przemapowuje bank? Próbowałeś ustawiać breakpointa na zapis do $D5xx?
b WRITE>=D500
b WRITE<=D5FF
Edit: Ale fiksacja :) Cart Ci działa poprawnie, a tylko listowanie kodu za pomocą D(isassembly) przy domyślnym adresie listuje Ci kod spod złego adresu :) Pooglądaj co się dzieje w monitor.c.