PDA

Просмотр полной версии : Как из кода получить текущее значение PC?



jim
25.05.2006, 10:48
Кто нибудь знает способы? Правда, забыл зачем мне это надо :)

fk0
25.05.2006, 12:01
Кто нибудь знает способы? Правда, забыл зачем мне это надо :)

Во-первых имеет смысл ТОЛЬКО ДЛЯ ПОЗИЦИОННО-НЕЗАВИСИМОГО КОДА.
Зависит от возможности ли использование заранее известного статического
адреса памяти. По этому адресу загоняется POP HL : JP (HL).

goodboy
25.05.2006, 12:54
делаешь CALL на RET, после этого снимаешь со стека адрес инструкции после CALL

call 82
addr dec sp
dec sp
pop hl ; hl=addr

Titus
25.05.2006, 13:11
делаешь CALL на RET, после этого снимаешь со стека адрес инструкции после CALL

call 82
addr dec sp
dec sp
pop hl ; hl=addr

Ты забыл прерывания запретить :v2_wink2:

fk0
25.05.2006, 13:58
делаешь CALL на RET


Для этото RST нужно иметь по известному адресу в памяти.



после этого снимаешь со стека адрес


...на котором возникло прерывание...



call 82


А за это вообще руки отрывать, обязательно медленно и обязтельно чтоб мучтельно.

goodboy
25.05.2006, 16:19
А за это вообще руки отрывать, обязательно медленно и обязтельно чтоб мучтельно.
за что такая жестокость, только если rom сменится ?

ZEK
25.05.2006, 18:10
за что такая жестокость, только если rom сменится ?
Такими выходками вы ставите железячников в большой тупик :)

TomCaT
25.05.2006, 20:00
код 201 может быть в знакогенераторе отыскать? его вряд-ли куда-то денут или поменяют...

Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.

Robus
25.05.2006, 21:54
Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.

Супер !!! Велеколепное решение !!! А что бы решить проблему с IM 2 и тому подобное можно сделать CALL 56 !!! Я, надеюсь, правильно вспомнил адрес BASIC'овского прерывания ??? ...

jerri
25.05.2006, 23:31
эхх молодеш

ld hl,#e9e1 ; pop hl : jp (hl)
; ld de,(#4000)
ld (#4000),hl
call #4000
;ld (#4000),de
в hl - адрес возврата
если вдруг резко понадобилось сохранить содержимое памяти
то можно добавить то что за точкой с запятой

jim
26.05.2006, 22:10
О, вот это то самое! Спасибо всем. А где бы это можно было бы применить?

jerri
27.05.2006, 00:40
Кисо... а ты зачем просило то?

воще мона в результате прогу настроить...

на конкретный адрес

jim
27.05.2006, 08:02
гаккон... а как вы это делаешь? проставляешь адресы переходов?

Spectre
27.05.2006, 20:25
Вообще это активно юзается в плагинах RC, все плагины настраиваются на работу с адреса загрузки. С ходу еще могу вспомнить Laser Compact - распаковщик самонастраивался.

jim
27.05.2006, 21:23
Вообще это активно юзается в плагинах RC, все плагины настраиваются на работу с адреса загрузки. С ходу еще могу вспомнить Laser Compact - распаковщик самонастраивался.
А в gens, например, не тот же принцип? Грузится по любому адресу. Потом работает только с этого адреса.

Spectre
28.05.2006, 20:23
Сейчас глянул Gens - там тоже исполбзуется автонастройка на адрес запуска. Но я писал про современные утилиты (RC, LC), Gens это уже история.

fk0
29.05.2006, 11:37
Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.

Нет гарантий однако, что не снимет, например, его в регистр и чем-то ещё не загадит стек.

TomCaT
31.05.2006, 09:04
Нет гарантий однако, что не снимет, например, его в регистр и чем-то ещё не загадит стек.

Т.е. возвращаться из себя процедура прерывания будет не через стек?

Тогда пожалуй гарантии нет.

Но если узнавать сразу после вызова из Васика, то сдрес вызова по USR попадает в BC.

deathsoft
01.06.2006, 00:52
Зачем такие сложности, все делается также как на x86
call на pop

call label1
label1: pop hl
в hl получаем значение label1

Titus
01.06.2006, 03:48
Зачем такие сложности, все делается также как на x86
call на pop

call label1
label1: pop hl
в hl получаем значение label1

Во-первых, call - команда абсолютного перехода, а абсолютных адресов мы не знаем. :v2_tong:

Spectre
01.06.2006, 10:09
Ради интереса представил себе обработчик прерываний который на стеке не оставляет адрес.

EX (SP),HL
LD (WHERE+1),HL
...(сам обработчик)
POP HL
...(тут надо стек попортить что адрес врагам не достался, HL не менять)
WHERE JP 0
Выглядит несколько нереально... но почему бы и нет?

deathsoft
01.06.2006, 10:12
Во-первых, call - команда абсолютного перехода
Да я уже понял, что чушь написал. Давно под z80 ничего не писал, поэтому забыл что в call абсолютный адрес прописывается. Привык уже к x86, где все адреса в командах перехода относительные.