SfS, в SDCC нужно обязательно сохранять IX и восстанавливать его значение при выходе из любой процедуры.
Код:
void spr0_out0(const Sprite0* adr, BYTE x, BYTE y)__naked{
__asm
ld ix,#2
add ix,sp
...
jp spr0_out0
__endasm;
}
Код:
void spr0_out0(const Sprite0* adr, BYTE x, BYTE y)__naked{
__asm
push ix
ld ix,#4
add ix,sp
...
call spr0_out0
pop ix
ret
__endasm;
}
Ведь SDCC адресует локальные переменные процедуры через IX. Так сделано по нескольким причинам, в частности для упрощения рекурсии.
У меня была такая редкая труднонаходимая ошибка, которую никто не нашёл, а может и не стал искать, кому же нужна чужая минидемо когда все заняты своими мегапрожектами.
http://zx.pk.ru/showpost.php?p=480804&postcount=9
http://zx.pk.ru/showpost.php?p=555967&postcount=39
Сообщение от
Oleg N. Cher
Исправлен глюк со сбросом примера на Laser Basic. Проблема будет интересна всем, кто юзает SDCC. Это даже не глюк, допущенный случайно. Дело в том, что я после извлечения параметров функций допускал изменение регистра IX. А делать оказывается этого нельзя, ибо SDCC иногда полагается на его значение после возвращения из функции. (Как написал Филипп: “IX is a calle-saves register”).
P.S. Можно ли добавить в библиотеку libspr возможность работы со спрайтом, выходящим за край экрана (и справа, и слева, и сверху, и снизу)? Т.е. я понимаю, что можно, но есть ли желание этим заняться?