|
|
|
| /* Русский Вариант */ |
| « Здесь немного другие правила | Чуть-чуть пообщительнее » |
Наш хороший товарищ Г.Р.Г. поделился несколькими забавными историями, которые с ним случились за десятилетия работы в отрасли. Двери небезопасности, Загадка высоких результатов тестирования и Двенадцать в одной строке, все они среди моих любимых. Сегодня Г.Р.Г. перенесет нас своей занятной историей в старые добрые времена 8080...
Не так давно для микрокомпьютеров на базе 8080 существовала, в общем-то, всего одна операционная система: CP/M. Она была не таким уж отстоем – она могла хранить файлы, загружать в память код, исполнять этот загруженный код – ну в самом-то деле, чего еще можно требовать от операционной системы? Впрочем, выход процессора 8086 выявил небольшую проблему: CP/M (и все чудесные приложения под неё) не могли работать. Разные архитектуры процессоров, а вы разве не знали? Тут на меня снизошла благодать и меня осенило! Почему бы не сделать эмулятор 8080 для 8086! Он мог бы загрузить CP/M и запускать все её распрекрасные приложения!
В те времена «распрекрасные приложения под CP/M» подразумевали WordStar (ух ё!) и DataStar (ё-моё!) Ну ладно, была еще практически совершенная операционная система для 8086 под названием CTOS. И эта операционная система по тем временам была довольно продвинутой, с такими возможностями как редактор, копирование/вырезание и вставка, бесконечные отмены, прозрачная поддержка локальных сетей, интерфейсы программ на базе форм, и еще кучей всего. Загрузиться в CP/M – операционную систему с такими широкими возможностями как хранение файлов и исполнение кода – все равно, что прицепить к Кадиллаку распылитель навоза.
Но вы разве не знали, без CP/M вы не получите ни одной из тех феерических программ для неё. Впрочем, после всего вышеперечисленного упомянутые программы могли казаться феерическими, только в сравнении с малеваньем на тротуаре при помощи обгоревшей палки. Однако все казалось, были ослеплены превосходством WordStar для CP/M, поэтому я стал писать эмулятор 8080.
Главной была скорость, так как 8080 работал на разных частотах (от 1 до 4 Мгц), а 8086 работал на фиксированных 4 Мгц. Кроме того 8086 был основан на микрокоде, это означало, что ему требовалось добрых полдюжины тактов на исполнение многих инструкций. 8080 требовался один или два. Задумка была в том, что этот недостаток покроет навороченный 14 Мб жесткий диск, за счет того, что нивелирует неторопливость дискет для CP/M.
Неделя за неделей, хак за хаком, и вот я, наконец, заставил эмулятор работать! Ну, почти. CP/M начинала грузиться, но через пять секунд впадала в кому. Неплохо, но пирожка с полки за это не взять. Излазив свой код строка за строкой, я никак не мог выяснить, в чем дело. Я решил, что причина проблемы крылась в регистре флагов процессора.
Пошаговое исполнение ассемблерного кода не предвещало ничего кроме мигреней. Лучшим способом решить проблему, как мне тогда подумалось, было, создание файла журнала, в который бы записывалась каждая эмулируемая инструкция и состояние регистров на этот момент. Мой необъятный жесткий диск запросто мог хранить такой файл. Так как всяких роскошеств типа printf() не было, я самостоятельно написал код, который бы выдавал строку за строкой в таком виде:
PC: 0100 MOV AL,(HL) A: E3 B: 00 C:07 D:A5 HL:0400 FL:04После нескольких раундов тестирования я был готов загрузить CP/M. Несколько минут спустя стало понятно, что у меня возникли некоторые затруднения. Эмулятор упал, оставив после себя сообщение «Диск заполнен», бешено крутящийся жесткий диск и ни единого сообщения загружающейся CP/M. До того как я написал код журналирования первое сообщение загрузки выскакивало за секунды.
Мне потребовалось несколько минут, чтобы осознать это, но часы, проведенные за написанием журналирования инструкций, были потрачены впустую. Оно просто физически не могло работать. Догадываетесь почему?
Как выяснилось, у меня и близко не было требуемых мощности процессора и места на диске. Форматирование шестнадцатеричного дампа единственной инструкции 8080 занимает, по меньшей мере, несколько сотен инструкций и требует как минимум 60 байт на диске. Каким бы медленным ни был 8080, он заполнял 14 Мб диск за четверть секунды симулированного времени работы процессора. Если бы я таки заставил все это работать (конечно же, перезаписывая старые инструкции), я бы все равно не прожил так долго, чтобы застать загрузку CP/M.
Потребовалось еще несколько недель, но я, наконец, заставил CP/M загрузиться. Через минуту она меня достала, и я снова вернулся к CTOS. К счастью я смог сбагрить свой эмулятор 8080 ребятам с CTOS, а уж они нашли где-то ему какое-то применение.
Оригинал:http://worsethanfailure.com/Articles/Emulating_the_8080.aspx
Перевод:Евгений Виговский
| « Здесь немного другие правила | Чуть-чуть пообщительнее » |