ПРОФЕССИОНАЛЬНЫЙ ПОДХОД
Когда-то мы, как бы невзначай, подкинули читателям идею переделки програмпы MEMORY EDITOR для обеспечения ее релоцируемости. Мы и сами не ожидали, что эта мысль вызовет целую лавину писем (некоторые из них были опубликованы), после чего посчитали, что тема эта исчерпана. Оказалось - нет! Творческая мысль не зациклилась на конкретной программе, а расправив могучие крылья, взлетела ввысь. Предлагаем сегодня вниманию наших читателей две работы на тему перемещаемости программ.
Первая - ориентирована на соз
Определение базового адреса релоцируемой программы
(С) Сергей Рюмик,
г.Чернигов-34, 1995.
Хочу поделиться своими исследованиями .
Возможно, кому-то это уменьшит на пару байтов головную боль. В ZX-РЕВЮ неоднократно приводился прием для определения базового адреса релоцируемых (перемещаемых) программ. Он заключается в следующем:
CD 7С 00 CALL #007С
ЗВ DEC SP
ЗВ DEC SP
El POP HL
Подпрограмма #007С содержит один RET, после чего отложенное значение базового адреса снимается со стека в регистр HL.
Этот прием широко применялся еще в знаменитом пакете процедур SUPERCODE (CP Software, 1983).
Однако, если бы в ПЗУ "Спект-рума" нашлась последовательность байтов:
ADR El POP HL
Е9 JP (HL)
то для определения базового адреса можно было бы обойтись всего тремя байтами: CALL ADR. Действидание несложных кодовых блоков, не требующих составления таблицы адресов. Цель - определение базового адреса, который определяет адрес загрузки и старца кодового блока.
Вторая - предназначена тем, кто разрабатывает более сложные программы, в которых одним базовым адресом не обойтись - нужна адресная таблица.
Авторы этих материалов сделали мощный прорыв в создании релоци-руемых программ. С удовольствием предлагаем читателям эти замечательные работы.
тельно, в этом случае по команде POP HL в регистровую пару HL запишется адрес возврата, то есть базовый адрес, а затем на него же и передастся управление по команде безусловного перехода DP (HL).
После просмотра ПЗУ "Спектрум 48м была обнаружена искомая область :
#1FC3 CD 30 25 CALL #2530 #1FC6 El POP HL
#1FC7 C8 RET Z
#1FC8 E9 DP (HL)
Подпрограмма #2530 содержит проверку BIT 7,(IY+1).
Ложку дегтя в стройную систему подбросила команда RET Z, так некстати вклинившаяся между POP HL и OP (HL). За это для гарантированного определения базового адреса придется заплатить двумя лишними байтами, однозначно сбрасывающими флаг Z.
Итого: 5 байтов в процедуре. А можно ли еще меньше? Можно, что и показано в таблице (см. на следующей странице).
Примечания к таблице.
1. Для точки входа #1FC5 первый байт интерпретируется как команда DEC Н.
2. Для процедуры 3 при запуске из Бейсика содержимое аккумулятора А изменяется в зависимости от адреса запуска.
3. Для процедуры 4 при запуске из Бейсика в ячейке (IY+1) - это переменная FLAGS 23611 (#5СЗВ) -бит 7 при выполнении программы всегда установлен в "Iй.
ПРОФЕССИОНАЛЬНЫЙ ПОДХОД
N |
Процедура определения базового адреса |
Длина |
Базовый адрес |
Используемые регистры |
Ограничения |
1 |
ADR CD7C00 CALL #007С ЗВ DEC SP ЗВ DEC SP El POP HL |
6
байтов |
HL=ADR+3 |
HL |
нет |
2 |
ADR 2600 LD H.#00 CDC51F CALL #1FC5 или
ADR AF XOR A 3D DEC A CDC61F CALL #1FC6 |
5
байтов 5
байтов |
HL-ADR+5 HL=ADR+5 |
HL A, HL |
нет нет |
3 |
ADR 3D DEC A
CDC61F CALL #1FC6 или
ADR 3C INC A
CDC61F CALL #1FC6 |
4
байта 4
байта |
HL»ADR+4 HL=ADR+4 |
A, HL A, HL |
А<>#01 AO#FF |
4 |
ADR CDC31F CALL #1FC3 или
ADR CDC51F CALL #1FC5 |
3 байта 3 байта |
HL=ADR+3 HL=ADR+3 |
HL, IY HL |
BIT 7,
(IY+1)>0 Н<>#01 |
5 |
ADR C5 PUSH ВС El POP HL или
ADR 60 LD H,B 69 LD L,C |
2
байта 2
байта |
HL-ADR HL=ADR |
ВС, HL ВС, HL |
При запуске из Бейсика. |
6 |
ADR при запуске кодовых программ из Бейсика в регистровой паре ВС передается адрес запуска |
— |
BC=ADR |
ВС |
При запуске из Бейсика. |