Как вы знаете, в процессоре ВМ1 зарезервированы коды команд для умножения, деления и произвольного сдвига, но сами эти команды не реализованы. Попытка выполнить такую команду приводит к особому прерыванию. Пользуясь этим, можно написать программу-эмулятор недостающих команд и назначить её на прерывание. Эту программу я буду называть "драйвером EIS".
Такой драйвер встроен в прошивку контроллера дисковода. Но многие пользуются контроллером жёсткого диска, а в его прошивке нет драйвера EIS.
Есть программа SETMBR, одна из функций которой - прописать в нулевую дорожку жёсткого диска установщик драйвера EIS. Но такой подход тоже не всегда удобен.
Я написал полностью новый драйвер - он понадобился для взлома игры “Overkill”. Хотелось превзойти по скорости драйвер из SETMBR. Драйвер устанавливается небольшой программой и всё время находится в памяти контроллера жёсткого диска SMK. Пропадает после холодной перезагрузки компьютера.
Во время работы я также написал тест, проверяющий всевозможные случаи использования MUL, DIV, ASH и ASHC. Оказалось, что не всё так просто, и у меня появилась вторая цель - добиться полной совместимости с более продвинутым процессором ВМ2, где эти команды реализованы аппаратно.
Тест заканчивается замером скорости выполнения команд. Каждая команда выполняется 10 раз с разными аргументами и типами адресации, после чего время выполнения (в тактах процессора) усредняется. Затем выводится итоговый рейтинг. Результат работы своего драйвера я взял за эталон, он выдаёт 100%. Драйвер из SETMBR выдаёт только 88% от этой скорости. Это на реальной БК-0011М. В эмуляторах БК на других платформах результат будет ниже (60%-67%), потому что эмуляторы не учитывают скорость отклика памяти контроллера SMK.
В итоге мой драйвер получился точней и в среднем быстрей, но он занимает больше места (в памяти SMK много места). На всё ушло 10 вечеров (считая взлом игры). Возможно, самое важное - в процессе был улучшен компилятор PDPy11: в нём появилась возможность записи 32-разрядных чисел командой .DWORD (за это спасибо Ivanq).
EIS-driver-for-BK0010.zip
В архиве установщик драйвера, исходники и тест с бенчмарком. В исходниках много комментариев, всё должно быть понятно. Если найдёте ошибки, предложите хитрые тесты или придумаете как увеличить скорость и уменьшить размер без потери скорости - предлагайте, вносите исправления в исходники - буду рад!
Рекомендую прописать драйвер в автозагрузку MKDOS (в текстовый файл STARTS.COM).
Отдельное спасибо:
Alex_K, который на заключительном этапе выдал подробнейшее описание процессора ВМ2, что помогло исправить пару тонкостей,
S_V_B за тесты на реальной УКНЦ,
Niol’у за предоставленную БК-0011М, которую он вот уже два месяца всё никак у меня не заберёт
Svinka за процессор 1801ВМ1Г с аппаратным умножением.
gid и ivagor за найденные баги и советы по оптимизации.
Пример ошибок, обнаруженных тестом в драйвере SETMBR: