ЗОДАЧА для 580ВМ80:)

8-битные микроконтроллеры и микропроцессоры от Intel и их клоны, а также компьютеры на них построенные

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

ЗОДАЧА для 580ВМ80:)

Post by Lavr »

ЗОДАЧА для 580ВМ80 :wink:

Я озадачился этой зодачей довольно давно, и со временем стал склоняться
к мысли, что совсем строго её не решить, но вдруг у кого-то есть иное мнение...
Собственно, сам вопрос возник, когда я читал статью в одном из номеров
журала "Радиолюбитель" - "Пишем перемещаемые программы".
В двух словах речь там шла о том, что программу для 580ВМ80 можно сделать
перемещаемой, если ввести в её структуру таблицу, по сути, "релокейшинов",
фактически как в ЕХЕ файлах ДОС, и при старте программы корректировать
адреса переходов.
Вот в связи с этим и сформировался вопрос:
если программа загружена, получает управление и при этом
- операционная система неизвестна;
- карта распределения памяти неизвестна;
- наличие стандартных функций или вызовов также неизвестно

существует ли возможность определить текущий адрес точки в памяти,
в которой программой получено управление?


На мой взгляд, для Z80 эту задачу решить можно благодаря относительным переходам, а для 580ВМ80 - я затруднился.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Единственная возможность получить содержимое PC - это достать его из стека после команды CALL. К сожалению, эта команда обращается только по фиксированному адресу и если неизвестно абсолютно ничего, то вряд-ли что получится (хотя в таком случае программа должна быть бессмысленной, ведь всё равно она ни вывести ничего не сможет, ни ввести). Однако если известно, что по какому-то адресу есть свободная память (память дисплея, например), то можно записать туда POP H / PCHL, и обратиться туда командой CALL.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:программа должна быть бессмысленной
Программа не была бессмысленной - это был отладчик SID
от любой системы он хотел только ПП вывода на экран и
ввода с клавиатуры. Мог работать с кодами Z80 и i8080
в нужных мнемокодах, системные вызовы группировались в
нем в конце программы и могли корректироваться, в зависимости
от рабочей системы. Была у меня идея сделать его перемещаемым,
он ещё и написан был удачно - блочно, и называть его бессмысленным
было бы как раз бессмысленно и опрометчиво.
b2m wrote:Однако если известно, что по какому-то адресу есть свободная память (память дисплея, например), то можно записать туда POP H / PCHL, и обратиться туда командой CALL.
А если поискать во всей памяти код С9 или вписать его где-то самому.
Память не обязана быть известной - можно считать и проверить ячейку
на модификацию - и так найти ОЗУ.
Вариантов на самом деле больше, чем кажется с разбегу, но окончательно
у меня решение не сложлось.
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Lavr wrote:А если поискать во всей памяти код С9 или вписать его где-то самому.
Поискать можно, только вот нету в ВМ80 относительного перехода, чтобы цикл организовать, да и что ты будешь делать с найденным адресом, как к нему обратишься :) А вписать я выше и советовал, только если использовать RET, то после команды CALL нужно больше команд использовать - dcx sp / dcx sp / pop h.
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Ну "есть много разного на свете, брат Горацио..."
В частности, в стеке можно выполнить какую-то программу,
загнав её через PUSH... и обратившись LXI H,0; DAD SP; PCHL
Я над этой темой много думал в разное время - не осилил.
Поэтому в очередной раз вспомнив, решил выложить здесь.
Вдруг тут кто умнее... так что у меня нет смысла спрашивать ответ.
User avatar
Shaos
Admin
Posts: 24006
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

перемщаемая программа - это уже было в Радио
однако загрузчик при этом должен сидеть в известных адресах
если ты и загрузчик хочешь сделать перемещаемым - то это наверное не полетит...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Shaos wrote:это наверное не полетит...
наверное - это не аргумент.
У меня всегда шага не хватает до полёта.
Это как в теории игр - все склоняются к мысли, что у шахмат ничейная матрица, но строго никто не доказал. :wink:
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

Просканить все 64кб и найти свою сигнатуру - займет пару-тройку секунд ;)
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

shoorick wrote:Просканить все 64кб и найти свою сигнатуру - займет пару-тройку секунд ;)
При условии наличия относительного перехода. :3
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

HardWareMan wrote:shoorick писал(а):
Просканить все 64кб и найти свою сигнатуру - займет пару-тройку секунд
При условии наличия относительного перехода. :3
А свежая мысль у Шурика!!!
Сканер можно написать в стеке - там адреса известны и можно обойтись абсолютными переходами.
Lavr wrote:В частности, в стеке можно выполнить какую-то программу,
загнав её через PUSH... и обратившись LXI H,0; DAD SP; PCHL
Last edited by Lavr on 02 Feb 2011 17:33, edited 1 time in total.
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

HardWareMan wrote:
shoorick wrote:Просканить все 64кб и найти свою сигнатуру - займет пару-тройку секунд ;)
При условии наличия относительного перехода. :3
а гдеш его взяць-то в ИК80? :roll:
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Lavr wrote:Сканер можно написать в стеке - там адреса известны и можно обойтись абсолютными переходами.
Логично, стек то к началу растет. После занесения туда сканера вершина будет как раз на начале кода, а при вызове PCHL - в [HL] этот самый адрес. Далее, сканим память и возвращаемся по известной точке входа в свою прожку (перед самой точкой входа сделать сигнатуру). Вполне осуществимо, если только в стек не пихать тонны кода. :3 И да, пихатель должен быть линейный. :3
shoorick wrote:а гдеш его взяць-то в ИК80? :roll:
Именно, КЭП, именно...
User avatar
shoorick
Doomed
Posts: 487
Joined: 05 Nov 2007 05:08
Location: Украина

Post by shoorick »

HardWareMan wrote:
shoorick wrote:а гдеш его взяць-то в ИК80? :roll:
Именно, КЭП, именно...
дык, адреса ж в стеке известны, понятное дело, возврата по RET оттеда не будет :)
b2m
Devil
Posts: 907
Joined: 26 May 2003 06:57

Post by b2m »

Господа, а что это мы к стеку привязались? Где гарантия, что то случайное значение в регистре SP после запуска программы будет указывать на ОЗУ? Ведь в условии задачи сказано, что ничего не известно!
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
User avatar
Lavr
Supreme God
Posts: 16680
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

b2m wrote:Господа, а что это мы к стеку привязались? Где гарантия, что то случайное значение в регистре SP после запуска программы будет указывать на ОЗУ? Ведь в условии задачи сказано, что ничего не известно!
Кто-то из классиков, кажется Ньютон, сказал:"Природа сложна, но не злонамеренна."
Смотрим в условие:
если программа загружена, получает управление
ОС или тест-мониторная система программу как-то загружали, значит есть надежда, что стек выставлен вменяемо.
Конечно, если стек смотрит в ПЗУ или в отсутствие памяти - то всё бестолку. Но тогда это действительно дикое устройство, хотя... я такое реально как-то лицезрел.
Это был музыкальный автомобильный клаксон - 580ВМ80, ПЗУ два мощных транзистора и динамик. Блин - классика минимализма,
ни стека, а значит - нет CALL... только таблицы тонов, джампы и вывод звука по EI-DI.

PS. Ну что - добьем зодачку? А то у меня ещё одна затейливая есть... :wink:

PPS. Шурик кинул-таки незамутнённый взгляд на зодачу! А ведь я сам сто раз такое делал - в ИБМ чтоб не сажать резидент дважды, сканируешь ОЗУ на его сигнатуру. А вот вернуться от ИБМ к 580ВМ80 - не случилось.