Обновил пост с процедурой. Работа под SDCC протестирована.
Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
Sergey, очень странный код.
Код был заточен под интерфейс Hitech C.
Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
А что делает ex (sp),hl после pop af : pop bc? Как по мне, она просто портит значение на стеке, которое располагается до аргументов и адреса возврата.
обменивает содержимое HL и ячейки по указателю в SP. На 2 такта быстрее (19), чем брать значение через POP, а потом восстанавливать указатель стэка через PUSH (10+11).
Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
Кстати, а зачем первой же командой во флаговый регистр посылается младший байт адреса возврата?
привычка. AF неудобен для снятия и хранения аргументов. Поэтому в него лучше всего сохранять адрес возврата, а аргументы снимать в "нормальные" регистровые пары.

Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
Я к тому, что вот: сделали ex (sp),hl - положили значение hl в стек, а тут прерывание приходит и его портит.
Нам это значение здесь не нужно, тем более, что оно случайно. - нам нужен был аргумент со стэка, - мы его получили.
Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
Я согласен, такое бывает редко. Но метко.
Приходя, прерывание сохранит адрес возврата в следующей ячейке а не в этой. Сначала уменьшается значение SP, а только потом записывается содержимое PC. LD -(SP),PC