Просмотр полной версии : Как из кода получить текущее значение PC?
Кто нибудь знает способы? Правда, забыл зачем мне это надо :)
Кто нибудь знает способы? Правда, забыл зачем мне это надо :)
Во-первых имеет смысл ТОЛЬКО ДЛЯ ПОЗИЦИОННО-НЕЗАВИСИМОГО КОДА.
Зависит от возможности ли использование заранее известного статического
адреса памяти. По этому адресу загоняется POP HL : JP (HL).
делаешь CALL на RET, после этого снимаешь со стека адрес инструкции после CALL
call 82
addr dec sp
dec sp
pop hl ; hl=addr
делаешь CALL на RET, после этого снимаешь со стека адрес инструкции после CALL
call 82
addr dec sp
dec sp
pop hl ; hl=addr
Ты забыл прерывания запретить :v2_wink2:
делаешь CALL на RET
Для этото RST нужно иметь по известному адресу в памяти.
после этого снимаешь со стека адрес
...на котором возникло прерывание...
call 82
А за это вообще руки отрывать, обязательно медленно и обязтельно чтоб мучтельно.
А за это вообще руки отрывать, обязательно медленно и обязтельно чтоб мучтельно.
за что такая жестокость, только если rom сменится ?
за что такая жестокость, только если rom сменится ?
Такими выходками вы ставите железячников в большой тупик :)
код 201 может быть в знакогенераторе отыскать? его вряд-ли куда-то денут или поменяют...
Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.
Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.
Супер !!! Велеколепное решение !!! А что бы решить проблему с IM 2 и тому подобное можно сделать CALL 56 !!! Я, надеюсь, правильно вспомнил адрес BASIC'овского прерывания ??? ...
эхх молодеш
ld hl,#e9e1 ; pop hl : jp (hl)
; ld de,(#4000)
ld (#4000),hl
call #4000
;ld (#4000),de
в hl - адрес возврата
если вдруг резко понадобилось сохранить содержимое памяти
то можно добавить то что за точкой с запятой
О, вот это то самое! Спасибо всем. А где бы это можно было бы применить?
Кисо... а ты зачем просило то?
воще мона в результате прогу настроить...
на конкретный адрес
гаккон... а как вы это делаешь? проставляешь адресы переходов?
Вообще это активно юзается в плагинах RC, все плагины настраиваются на работу с адреса загрузки. С ходу еще могу вспомнить Laser Compact - распаковщик самонастраивался.
Вообще это активно юзается в плагинах RC, все плагины настраиваются на работу с адреса загрузки. С ходу еще могу вспомнить Laser Compact - распаковщик самонастраивался.
А в gens, например, не тот же принцип? Грузится по любому адресу. Потом работает только с этого адреса.
Сейчас глянул Gens - там тоже исполбзуется автонастройка на адрес запуска. Но я писал про современные утилиты (RC, LC), Gens это уже история.
Да, кстати, команду Call 82 не может заменить команда HALT? Если уж это прерывание портит стек ниже SP, то адрес прерванной им процедуры оно все равно туда положит.
Нет гарантий однако, что не снимет, например, его в регистр и чем-то ещё не загадит стек.
Нет гарантий однако, что не снимет, например, его в регистр и чем-то ещё не загадит стек.
Т.е. возвращаться из себя процедура прерывания будет не через стек?
Тогда пожалуй гарантии нет.
Но если узнавать сразу после вызова из Васика, то сдрес вызова по USR попадает в BC.
deathsoft
01.06.2006, 01:52
Зачем такие сложности, все делается также как на x86
call на pop
call label1
label1: pop hl
в hl получаем значение label1
Зачем такие сложности, все делается также как на x86
call на pop
call label1
label1: pop hl
в hl получаем значение label1
Во-первых, call - команда абсолютного перехода, а абсолютных адресов мы не знаем. :v2_tong:
Ради интереса представил себе обработчик прерываний который на стеке не оставляет адрес.
EX (SP),HL
LD (WHERE+1),HL
...(сам обработчик)
POP HL
...(тут надо стек попортить что адрес врагам не достался, HL не менять)
WHERE JP 0
Выглядит несколько нереально... но почему бы и нет?
deathsoft
01.06.2006, 11:12
Во-первых, call - команда абсолютного перехода
Да я уже понял, что чушь написал. Давно под z80 ничего не писал, поэтому забыл что в call абсолютный адрес прописывается. Привык уже к x86, где все адреса в командах перехода относительные.
Powered by vBulletin® Version 4.2.5 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot