Всем привет!
Есть у меня такая задача: надо определить текущий исполняемый адрес (что-то типа LD HL,PC). Но не все так просто - мне заранее неизвестен контекст, в котором исполняется мой код, а именно:
- на каком такте кадра вызван код;
- разрешены ли прерывания;
- что загружено в какие адреса RAM, какая страница ROM включена и что в ней находится;
- способ вызова моего кода (отметается возможность достать из стека адрес возврата и почитать адрес вызова).
Классический способ (call #007c: dec sp: dec sp: pop hl) несовместим со всеми указанными проблемами. Чуть более правильный код di: call #007c: dec sp: dec sp: pop hl :ei решает только первую проблему. Определение режима препываний и разрешение их (если были разрешены) решает еще и вторую проблему. А вот решение третьей проблемы мне не ведомо - по адресу #007c ret быть не обязан, как и по любому другому адресу.
Видится 2 не самых удобных способа решения проблемы:
- обязать вызывающий код передавать в одном из регистров адрес вызова (или заносить его в некоторую ячейку в теле вызываемого кода);
- обязать вызывающий код делать дополнительную инициализацию при включенном ROM BASIC 48.
Оба способа мне не нравятся. Знает ли кто-нибудь способ определения текущего адреса в любых условиях без дополнительных ограничений для вызывающего кода?