Lethargeek, до меня дошло как командами "условного" pdp32 выполнять код для "условного" pdp16. Делается три блока:
1) "pdp16" в котором лежит код и данные эмулируемой системы.
2) "pdp32" из которого осуществляется выборка кода pdp32
3) "emu32" в котором будет жить "переводчик"
Каждому слову(16бит) в блоке pdp16(или байту если команды могут начинаться с нечётных адресов) будет соответствовать слово(32бита) в блоке pdp32. Изначально слова в блоке pdp32 обнулены и попытка их выполнения вызывает исключение, по которому будет вызван переводчик из блока emu32. Переводчик смотрит какая команда pdp16 должна была быть выполнена, помещает её эквивалент в блок pdp32 и возвращается из исключения. Далее будет выполнен эквивалент требуемой команды, после чего будет предпринята попытка выполнения следующей.
Для поддержки самомодифицирующегося кода при записи байта/слова в блок pdp16 соответствующее слово из блока pdp32 будет обнуляться, и если исполнение дойдёт до такой команды, то снова будет вызван переводчик. Или можно прицепить ко всем связанным ячейкам(слово pdp16 - слово pdp32) признак "был доступ"(еще одна область памяти), устанавливающийся при записи слова в блок pdp16 и сбрасываются при записи соответствующего слова в блок pdp32(переводчиком), ну а при выполнении исключение будет вызываться в зависимости от даннного признака.
Если некоторые команды pdp16 не имеют простых эквивалентов среди команд pdp32, то на её место просто ставится вызов подпрограммы. Если ситуация совсем запущенная и мы хотим эмулировать что-то сильно непохожее на pdp32, то либо везде ставим вызовы подпрограмм или на каждый байт/слово просто выделяем больше(2,4,8) слов в блоке pdp32, чтобы в такой блок влезал эквивалент большинства эмулируемых команд.
При наличии нормального механизма виртуальной памяти для блока pdp32 нужно будет зарезервировать адреса, а выделять память только для тех страниц, код из которых реально исполняется. Ну а когда памяти становится маловато, страницы блока pdp16 можно выгружать, а перевод из блока pdp32 просто грохнуть, поскольку потом мы его легко восстановим.




Ответить с цитированием