vak: (Default)
[personal profile] vak
МЭСМ-6 уже проходит несколько тестов: работают команды uj, vtm, utm, mtj, vzm, v1m, j+m, vjm, vlm, utc, wtc.

Я добавил в фазу decode автоматическое приращение счётчика команд (PC), теперь некоторые команды выполняются за один такт (vtm, utm, mtj. j+m).

Описание микроархитектуры по мере разработки постепенно образуется на странице: https://github.com/besm6/mesm6/wiki/Microarchitecture

Date: 2019-03-15 07:03 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Возможно, я неудачно выразился. Сдвиг мантиссы вправо перед выполнением операции - это, строго говоря, не нормализация, а выравнивание порядков.

А настоящая нормализация вправо бывает после выполнения операции только на 1 разряд.
Т. к. представление мантиссы - без скрытого бита, просто в дополнительном коде, то диапазон значений мантиссы - от -1 до 1-2-40. Поэтому, например, при изменении знака числа -1 (представленного как -1*20, 4020 0000 0000 0000) сначала получается псевдопредставление 1*20, которое нормализуется на 1 разряд вправо, и выходит 0.5*21 (4050 0000 0000 0000).

Date: 2019-03-15 07:20 (UTC)
x86128: (Default)
From: [personal profile] x86128
Теперь понятно. Спасибо за развернутый ответ.

Еще такой вопрос по общему алгоритму выполнения операций в АЛУ MESM6 с плавающими числами. Возможно я забегаю вперед.
Будет примерно как в IEEE754? То есть я имею ввиду порядок действий конечного автомата:
1. Защелкивание аргументов
2. Распаковка (порядки / мантиссы на регистры)
3. Отработка спец. случаев (сложение/умножение на 0, деление на 0, возможно еще что-то)
4. Выравнивание порядков
5. Отработка выхода порядков за пределы
6. Выполнение операций с мантиссой
7. Нормализация
8. Округление (регистр Y /РМР )
9. Упаковка
10. Выдача на выходной регистр АСС и РМР (Y)

Date: 2019-03-15 17:53 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Благодаря тому, что распаковка тривиальна (разве что размножить знаковые биты), распаковка и защелкивание объединены. Специальные случаи пока не отрабатываются. Для сложения, строго говоря, и не должны, поскольку результат сложения не-нуля с нулём при имеющемся алгоритме зависит от соотношения порядков нуля и ненулевого операнда.

Умножение я надеюсь делать с помощью аппаратного умножителя, поэтому распознавание нуля много тактов не сэкономит.

В остальном всё практически так и есть (кроме упаковки, которая тривиальна).

Оригинальный алгоритм деления я не буду пытаться воспроизводить, скопирую из эмулятора.