Обновить

Комментарии 6

Спасибо за статью. Всегда интересно посмотреть на чужой взгляд на давно устоявшиеся (и даже устаревшие) вещи.

Теперь немного критики. Вы так статарельно избегали погружения в устройство микропроцессоров, что незаметикли как допустили ошибку в выбранной концепции шины.

  1. Вы правильно указали, что в i8080 имеются специальные инструкции для работы с портами ввода/вывода (как и во всех последующих сериях микропроцессоров Intel, кстати). Для реализации этих инструкций на корпус микропроцессора i8080 выведен специальный сигнал DBIN, который указывает на то, с чем будет осуществляться обмен - с памятью или с I/O устройством. Это означает, что адреса устройств могут пересекаться с адресами ячеек памяти и это не создает никаких проблем для аппаратуры, так как декодер адреса учитывает этот сигнал. В выбранной Вами модели шины данного сигнала нет, а значит возникает "конфликт интересов" выражающийся в отсутствии возможности использовать младшие адреса ячеек памяти которые по номерам пересекаются с портами ввода/вывода. Скорее всего этой проблемы Вы не заметили, так как работали в основном с MOS 6502, где I/O организован через memory-mapped регистры, но с i8080 и i8086 эта проблема выплывет и Вам придется переделать шину.

  2. Выбранный Вами способ задания диапазонов устройств на шине не тольно не оптимальный, он неправильный. :) При реализации аппаратуры, блок I/O регистров конкретного устройства обычно задается в виде базового адреса и битовой маски (или префикса указывающего длину лидирующей части адреса). Это позволяет легко, одной операцией AND, вычислить тэг для определения утройства к которому производится обращение. Я думаю, Вам следовало бы сделать то же самое - сохранять в std::map карту тэгов и указателей на обьект Device. Это избавило бы от необходимости каждый раз вызывать метод find(), который итеративно бегает по массиву и бездарно потребляет процессорное время, а доступ к устройству - всего пара инструкций реального процессора.

Вообще, я настоятельно рекомендую ознакомиться с принципами реализации классических микропроцессоров, то есть слегка погрузиться в мир микроархитектуры. Вы найдете там очень много интересных и нестандартных, в то же время очень простых, решений, которые упростят Вам программирование Вашего симулятора. Еще раз спасибо.

Спасибо за такой развернутый комментарий! Приятно видеть, что кто-то нашел силы одолеть такой лонгрид :)

Я знаю про сигнал DBIN, и возможно вы не заметили, но я совершенно точно подчеркнул в тексте, что для I8080 я ввел дополнительный экземпляр шины, поэтому никакого конфликта интересов не возникает. В случае работы с памятью я обращаюсь к bus, а в случае работы с периферией (инструкции IN/OUT) я обращаюсь к dataBus. Да, это костыль, но в целом на данном этапе я считаю это решение приемлемым.

По поводу реализации маппинга адресов в шине я с вами полностью согласен. Решение сильно мозолит мне глаз, но пока я не смог найти ни времени ни сил переработать его. Сейчас оно пусть и медленнее, чем хотелось бы, зато достаточно прямолинейное чтобы его можно было понять.

Так или иначе замечания справедливые, и я обязательно обдумаю эти моменты ещё раз.

2автор - в чем нарисованы картинки для статьи?

Excalidraw. Есть интеграция с Obsidian, есть просто сайтик, и есть опция развернуть у себя локально

По литературе, скорее всего у вас уже есть, но на всякий случай моя первая и любимая книжка по Intel 8088 "Л.Дао - Программирование микропроцессора 8088". Я часами просиживал в библиотеке т.к. на руки такое сокровище не выдавали )) Совсем недавно мне любезно предоставили ссылки на тот самый русский вариант и его английский первоисточник.

А вот нет, такой книжки в моем архиве нет. Забрал, спасибо!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации