В дальнейшем у нас так и шло - при появлении новых видов оборудования программирование под него сначала шло в таком ручном режиме, но постепенно выявляли закономерности, которые и перекладывались в код, все больше автоматизирующий перепрограммирование одних и тех же программ. А через некоторое время появились вычислители, способные брать данные сразу из памяти и туда же их возвращать - и снова было перепрограммирование - теперь основной код задавал в регистрах только начальные адреса векторов - с данными и с маской условий, количество элементов, а также адрес, куда надо помещать результат - и вычислитель сам все забирал, вычислял, помещал в память и выдавал прерывание "все готово". Причем адреса надо было указывать физические, а не виртуальные - первые вычислители не работали с виртуальной памятью, соответственно, и операционке надо было следить, чтобы ненароком не отсвопить эти блоки из памяти на жесткий диск - а это снова дополнительное программирование - на этот раз - закрепление участков памяти. Но это было делом будущего.
Так вот - разработчикам надоело проверять библиотеки на наличие операций умножения-деления и они добавили новый блок на отдельной плате, врезались проводами в схему, а плата первый месяц вообще лежала сверху на бумажке - для изоляции от металлического каркаса корпуса. Потом привели в более приличный вид - просверлили отверстия, прикрутили плату внутри корпуса и наконец закрыли его крышкой.
А месяц держали потому, что дорабатывали счетчик команд. В этом процессоре наращивание счетчика до следующей команды, а также обработка переходов выполнялись на том же сумматоре, что и обычные вычисления. То есть если в опкоде первый бит был нулем - это означало короткую команду длиной два байта - значит, после ее выполнения надо будет нарастить счетчик команд на два, а если один-ноль - это была длинная команда, и наращивать требовалось на три байта. Само значение инкремента - два или три - определялось логической схемкой на три элемента - тут никакой сложности не было, но затем, после того как выполнится сама команда, схема управления переключала входные шины сумматора с блока регистров общего назначения на блок системных регистров, выдавала на шину значение из регистра счетчика команд и вычисленную константу, складывала их и результат помещала обратно в регистр счетчика команд.
То есть по сути для выполнения одной команды требовалось выполнить две - ну, за исключением команд перехода - там счетчик команд складывался со смещением и результат помещался в счетчик команд. Работа шла почти в два раза медленнее. Вот это узкое место и расшили добавлением отдельного сумматора - теперь выполнение операций в АЛУ и вычисление адреса следующей команды шло параллельно - обработка команд АЛУ и загрузка-выгрузка регистров ускорились в два раза, а выполнение программ - минимум в полтора - все-таки некоторое количество команд было переходами. Загрузка-выгрузка также ускорились потому что теперь для инкремента счетчика команд не требовалась шина РОН-АЛУ, тогда как ранее сначала по ней шли данные в или из регистров, и только затем - вычисление адреса следующей команды. Причем этот сумматор использовался из той же схемы, что и новый блок умножения-деления - его и делали-то на сдвиговом регистре и на том самом сумматоре - если в очередном разряде множителя стоит единица - множимое и сдвинутый множитель суммируются, а если ноль - множитель просто сдвигается - мы такие схемки, помнится, рисовали в институте на третьем курсе. Работало почти так же, как и в программной реализации умножения, выигрыш был в отсутствии затрат времени на дешифрацию команд сдвига, проверки бита на ноль, суммирования с переполнением, проверки на ноль всего множителя и перехода в начало цикла, если он не ноль - все это делалось теперь аппаратно и скорость умножения многократно возросла даже при отсутствии матричного умножения. Да и деление стало работать тоже быстрее. Вот на этом сумматоре и сделали программный счетчик - при этом если выполнялась операция умножения или деления, то выигрыша от такого переноса не было, но сами эти операции были медленными, так что не страшно. А вот для остальных операций вычисление адреса и выполнялось параллельно с самой операцией.