PDA

Просмотр полной версии : Extended Instructions Set (EIS): MUL, DIV, ASH, ASHC



Manwe
17.11.2018, 23:12
Как вы знаете, в процессоре ВМ1 зарезервированы коды команд для умножения, деления и произвольного сдвига, но сами эти команды не реализованы. Попытка выполнить такую команду приводит к особому прерыванию. Пользуясь этим, можно написать программу-эмулятор недостающих команд и назначить её на прерывание. Эту программу я буду называть "драйвером EIS".

Такой драйвер встроен в прошивку контроллера дисковода. Но многие пользуются контроллером жёсткого диска, а в его прошивке нет драйвера EIS.
Есть программа SETMBR, одна из функций которой - прописать в нулевую дорожку жёсткого диска установщик драйвера EIS. Но такой подход тоже не всегда удобен.

Я написал полностью новый драйвер - он понадобился для (https://zx-pk.ru/threads/29756-patchi-k-igram.html?p=986887&viewfull=1#post986887) взлома игры “Overkill”. Хотелось превзойти по скорости драйвер из SETMBR. Драйвер устанавливается небольшой программой и всё время находится в памяти контроллера жёсткого диска SMK. Пропадает после холодной перезагрузки компьютера.

66943

Во время работы я также написал тест, проверяющий всевозможные случаи использования MUL, DIV, ASH и ASHC. Оказалось, что не всё так просто, и у меня появилась вторая цель - добиться полной совместимости с более продвинутым процессором ВМ2, где эти команды реализованы аппаратно.
Тест заканчивается замером скорости выполнения команд. Каждая команда выполняется 10 раз с разными аргументами и типами адресации, после чего время выполнения (в тактах процессора) усредняется. Затем выводится итоговый рейтинг. Результат работы своего драйвера я взял за эталон, он выдаёт 100%. Драйвер из SETMBR выдаёт только 88% от этой скорости. Это на реальной БК-0011М. В эмуляторах БК на других платформах результат будет ниже (60%-67%), потому что эмуляторы не учитывают скорость отклика памяти контроллера SMK.

66944

В итоге мой драйвер получился точней и в среднем быстрей, но он занимает больше места (в памяти SMK много места). На всё ушло 10 вечеров (считая взлом игры). Возможно, самое важное - в процессе был улучшен компилятор PDPy11 (https://github.com/imachug/PDPy11): в нём появилась возможность записи 32-разрядных чисел командой .DWORD (за это спасибо Ivanq).

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

Рекомендую прописать драйвер в автозагрузку MKDOS (в текстовый файл STARTS.COM).

Отдельное спасибо:
Alex_K (https://zx-pk.ru/members/3184-alex_k.html), который на заключительном этапе выдал подробнейшее описание процессора ВМ2, что помогло исправить пару тонкостей,
S_V_B (https://zx-pk.ru/members/8684-s_v_b.html) за тесты на реальной УКНЦ,
Niol’у за предоставленную БК-0011М, которую он вот уже два месяца всё никак у меня не заберёт :)
Svinka (https://zx-pk.ru/members/8185-svinka.html) за процессор 1801ВМ1Г с аппаратным умножением.
gid (https://zx-pk.ru/members/7635-gid.html) и ivagor (https://zx-pk.ru/members/4074-ivagor.html) за найденные баги и советы по оптимизации.

Пример ошибок, обнаруженных тестом в драйвере SETMBR:

66945
66946

Manwe
23.01.2020, 16:08
Исходники вещественной арифметики от DEC:
https://www.retro11.de/ouxr/211bsd/usr/src/sys/pdp/mch_fpsim.s.html

gid
24.01.2020, 10:43
Не проходит сдаточный тест 791402.
Зацикливается при выполнении

mov #77777,R5
mul #100000,R5

nzeemin
24.01.2020, 12:07
Может вам вот это ещё пригодится - реализация некоторых математических функций на вещественной арифметике PDP-11:
https://github.com/schors/sfun

Manwe
06.02.2020, 23:57
Не проходит сдаточный тест 791402.
Зацикливается при выполнении

mov #77777,R5
mul #100000,R5
Интересно, а как это должно обрабатываться? 100000 – некорректное знаковое число: если старший бит = 1, то число отрицательное, инвертируем и прибавляем 1, чтобы получить положительное, и вновь имеем отрицательное 100000.

Lethargeek
07.02.2020, 00:54
Интересно, а как это должно обрабатываться? 100000 – некорректное знаковое число:
с чего вдруг бы? вполне корректное


если старший бит = 1, то число отрицательное, инвертируем и прибавляем 1, чтобы получить положительное, и вновь имеем отрицательное 100000.
нет, имеем положительное беззнаковое

Manwe
07.02.2020, 09:13
нет, имеем положительное беззнаковоеСогласно Wikipedia (на примере 8-битных чисел), это -128: https://ru.wikipedia.org/wiki/Дополнительный_код

gid
07.02.2020, 10:03
Интересно, а как это должно обрабатываться?
Так, чтобы не происходило зацикливания, вот ваш код:


305 CLR R1
306 CLR R0 ; R0_R1 = R4_R5 * R2
307 3: ASR R2 ; main loop
308 BEQ 6
309 BCC 5
310 4: ADD R5,R1
311 ADC R0
312 ADD R4,R0
313 5: ASL R5
314 ROL R4
315 BR 3 ; end of main loop
316 6: BCC 7
317 ADD R5,R1
318 ADC R0
319 ADD R4,R0
320
321 7: TST R0 ; high 16 bit
причина зацикливания в строке 307, команда ASR R2, потому что если на входе в R2 попадётся отрицательное число, то R2 никогда не станет 0 и условие выхода из цикла не выполнится.
Её надо заменить на CLC ROR R2. А в целях оптимизации CLC можно пропустить, т.к. при входе в цикл бит С обнуляется командой CLR R0 в строке 306, а внутри цикла команда ROL R4 в строке 314 всегда вытесняет в бит C число 0.

ivagor
07.02.2020, 11:05
Это не все, фрагмент

COM R0
NEG R1
надо дополнить чем-то вроде

bne 73
inc r0
73:
Специалисты по PDP11 скорее всего предложат более изящный вариант. Стоит более тщательно проверить библиотеку, если при поверхностном просмотре сразу видны 2 ошибки, то вполне возможно их там больше.

Lethargeek
07.02.2020, 11:54
Согласно Wikipedia (на примере 8-битных чисел), это -128: https://ru.wikipedia.org/wiki/Дополнительный_код
иии что? и оно же беззнаковое +128 (или на быкашках дополнительный код обязателен в любых обстоятельствах под угрозой четвертования?)

ivagor
07.02.2020, 12:05
В делении аналогичный фрагмент с не вполне корректным изменением знака

COM R4 ; dividend was negative
NEG R3

Manwe
07.02.2020, 12:07
Вы оба правы, внёс предложенные исправления.
Заодно подумаю над фиксом MKDOS, чтобы вектор обработки команд расширенной арифметики всегда указывал на драйвер, а не сбрасывался системой постоянно.
Какой всё же должен быть ответ и флаги при MUL #100000,R5 если в R5 число 77777 ?

ivagor
07.02.2020, 12:15
Результат умножения -32768dec*32767dec=-1073709056dec=30000100000oct=C0008000hex

gid
07.02.2020, 12:59
Какой всё же должен быть ответ и флаги
Ответ: в R5 число 100000, флаги: N и C

Manwe
07.02.2020, 13:24
Кстати, команда ASH ведь работает с 16-битным числом, а сдвиг задаётся 6-ю битами. Значит, если сдвиг больше 15 или меньше -15, то мы сразу знаем ответ? При сдвиге влево это 0, а при сдвиге вправо это SXT от аргумента.

ivagor
07.02.2020, 13:38
Еще спорный момент с флагом C при умножении.
"C: set if the result is less than -2^15 or greater than or equal to 2^15."
Как я понимаю из этого описания, нужно установить флаг если результат <-2^15 или >=2^15, т.е. текущий вариант процедуры неправильно установит флаг, если результат =-2^15. Или я неправильно понял описание (или описание не совсем корректное). Для проверки можно, например, умножить #1 на #100000

ivagor
07.02.2020, 16:53
Само умножение можно немного ускорить и сократить

...
CLR R4
mov r2,r3
xor r5,r3 ; result's sign
...
BPL 1
NEG R2
1: TST R5
BPL 2
NEG R5
2: ...
CLR R1
CLR R0 ; R0_R1 = R4_R5 * R2
br 31
3: ; main loop
BCC 5
ADD R5,R1
ADC R0
ADD R4,R0
5: ASL R5
ROL R4
31: ROR R2
bne 3 ; end of main loop
ADD R5,R1
ADC R0
ADD R4,R0
7: ...
72: TST R3 ; result's sign
bpl 0
...

Manwe
08.02.2020, 11:33
Само умножение можно немного ускорить и сократитьНе проходит тест умножение -7 на 3 и 7 на -3 - ответ получается положительный, 21.
Видимо, не надо было убирать INC R3 и DEC R3. Если их оставить, то тесты проходят.
Впрыгнуть в конец цикла, чтобы избежать лишнего BR в цикле - хорошая идея, действительно ускоряет умножение в среднем на 26 тактов. Спасибо.

Заодно ускорил ASH для сдвига вправо:

3: BIS #177760,R5 ; leave only 4 bits of negative value
ADD #20,R5 ; 16
ASL R5 ; offset
ADD R5,PC
.repeat 16.
{
ASR R4
}
CLV ; bit V should be 0 after right shift

ivagor
08.02.2020, 11:47
Не проходит тест умножение -7 на 3 и 7 на -3 - ответ получается положительный, 21.
Видимо, не надо было убирать INC R3 и DEC R3. Если их оставить, то тесты проходят.
Вы что-то пропустили при модификации процедуры. Убрав inc r3 и dec r3 (и clr r3) я
1. добавил mov r2,r3; xor r5,r3
2. поменял BEQ 0 на bpl 0
У меня -7*3=7*-3=-21, все нормально

Manwe
08.02.2020, 12:06
добавил mov r2,r3; xor r5,r3А, вот это непонятно было - что и куда.
Но в итоге по количеству команд то же самое получается? Или на одну короче?
Трюк с R2 выглядит непонятным - значение этого регистра ещё не определено, но уже используется.

ivagor
08.02.2020, 13:46
Но в итоге по количеству команд то же самое получается? Или на одну короче?
На два байта короче.

Трюк с R2 выглядит непонятным - значение этого регистра ещё не определено, но уже используется.
Да, при использовании в процедуре эмуляции эти команды надо поместить не там, где была команда CLR R3, а после MOV ARG2,R2. Пробовал на отдельной процедуре, поэтому пропустил этот момент.

- - - Добавлено - - -


Да, при использовании в процедуре эмуляции эти команды надо поместить не там, где была команда CLR R3, а после MOV ARG2,R2. Пробовал на отдельной процедуре, поэтому пропустил этот момент.
И тогда получается еще надо добавить команду тестирования R2, в итоге 2 байта обратно. Т.е. при использовании в процедуре эмуляции вариант с inc и dec все же чуть лучше (по скорости). При использовании в отдельной процедуре умножения вариант с mov и xor чуть лучше.

- - - Добавлено - - -

В делении можно чуть сократить операции со знаками.
1. DEC R2 надо заменить на INC R2, как в первой проверке.
2. MOV #240,DIV1 и MOV #5401,DIV1 можно убрать. Вместо MOV #5401,DIV1 надо добавить bis #100000,r2.
3. После POP R0 теперь нужно проверить знак, который покажет, нужно ли поменять знак остатка.
4. Потом asr r0 и во флаге C признак необходимости изменения знака частного.
Пункты 3 и 4 можно поменять местами. Ну и заготовка для команды DIV1: NOP не нужна.

- - - Добавлено - - -


Пункты 3 и 4 можно поменять местами.
Но лучше не стоит, или придется добавить еще одну команду.

Manwe
08.02.2020, 14:47
Ответ: в R5 число 100000, флаги: N и CДа, всё верно, проверил аппаратное умножение на ВМ1Г. В эмуляторе EIS теперь такой же результат.

Сейчас бьюсь с тем, что MKDOS при запуске программ подгружает Монитор от БК 0010 и, видимо, запускает какую-то из его процедур инициализации, которая перетирает 10-ый вектор. Пытаюсь отследить где это делается. Вроде как с адреса 27200 хранится Монитор и он копируется на адрес 126000. Код копирования по адресу 17670.

- - - Добавлено - - -


3. После POP R0 теперь нужно проверить знак, который покажет, нужно ли поменять знак остатка.
4. Потом asr r0 и во флаге C признак необходимости изменения знака частного.Это не понял. У меня сейчас:

POP R0 ; restore result's sign
BEQ DIV1 ; if result is positive
NEG R2
Это и есть проверка знака и по условию изменение знака частного.

ivagor
08.02.2020, 14:50
Идея в том, чтобы R2(до PUSH R2)/R0(после POP R0) хранил оба признака - в младшем бите признак необходимости изменения знака частного и в знаковом - признак необходимости изменения знака остатка. В итоге станет чуть короче и не нужен будет самомодифицирующийся код (для данной задачи).

gid
08.02.2020, 16:30
подгружает Монитор от БК 0010 и, видимо, запускает какую-то из его процедур инициализации
Инициализация системной области (EMT 14), обычно вызывают либо сразу подпрограмму по адресу 100140, (при этом затираются нулями вектора 10, 14, 20, 24), либо переходят куда нибудь внутрь подпрограммы, если нужно модифицировать инициализацию по-своему (при этом вышеуказанные вектора не затираются нулями, но могут модифицироваться по-своему).

Manwe
08.02.2020, 18:24
Инициализация системной области (EMT 14), обычно вызывают либо сразу подпрограмму по адресу 100140, (при этом затираются нулями вектора 10, 14, 20, 24), либо переходят куда нибудь внутрь подпрограммы, если нужно модифицировать инициализацию по-своему (при этом вышеуказанные вектора не затираются нулями, но могут модифицироваться по-своему).Спасибо, уже нашёл. Пропатчил, проверил на MKDOS 3.15, 3.17 и 3.18. Теперь буду ковырять ANDOS.


Идея в том, чтобы R2(до PUSH R2)/R0(после POP R0) хранил оба признака - в младшем бите признак необходимости изменения знака частного и в знаковом - признак необходимости изменения знака остатка. В итоге станет чуть короче и не нужен будет самомодифицирующийся код (для данной задачи).Получилось сократить на 4 байта. Прогнать бы полноценные тесты теперь.
http://thesands.ru/bk0010/EIS-driver-for-BK0010.zip

gid
08.02.2020, 21:29
Прогнать бы полноценные тесты теперь.
Снова не проходит сдаточный тест 791402.
ошибка в ASH:


mov #20, R5
mov #-1, R4
ash R5, R4

в результате флаги должны быть ZVC, но возвращается только Z

небольшой косяк в DIV: при выходе из эмуляции возвращается не тот приоритет, что был до входа, т.е. на входе в прерывание PSW было 0, а на выходе стало 340, и тест считает, что результат PSW неверный, у первых двух тестов деления флаги-признаки совпадают, остальные смотреть не стал, из-за неверного приоритета, все тесты на деление считаются ошибочными.

Manwe
08.02.2020, 21:40
Спасибо за тест!


Снова не проходит сдаточный тест 791402. ошибка в ASH:
в результате флаги должны быть ZVC, но возвращается только ZАх, я же там упростил если сдвиг больше чем на 15. А почему, кстати, бит V установлен? Разве второй аргумент меняет знак?
Цитирую документацию:
V – устанавливается, если во время проведения операции сдвига было зафиксировано изменение знакового разряда результата (возможно только при сдвиге влево), в противном случае очищается.


небольшой косяк в DIV: при выходе из эмуляции возвращается не тот приоритет, что был до входаСпасибо, посмотрю.

Update: поправил DIV и ASH. Обновлённый драйвер по той же ссылке: http://thesands.ru/bk0010/EIS-driver-for-BK0010.zip
А где взять эти магические тесты, чтобы мне самому тестировать и не отвлекать занятых людей почём зря? :)

CodeMaster
08.02.2020, 22:28
А где взять эти магические тесты
Где-то тут (https://zx-pk.ru/threads/24073-xxdp-i-tmos-2-na-dvk-i-uknts.html).

Vslav
08.02.2020, 23:14
А где взять эти магические тесты
Можно попробовать t402 (https://github.com/1801BM1/cpu11/tree/master/vm2/tst) - заводской тест 791402, EIS для 1801ВМ2, хорошо тестирует ASH, DIV, MUL.

ivagor
09.02.2020, 07:33
Мелочь, но все же в MUL строка
6: BCC 7
лишняя. Нулевые множители в основной цикл не попадают, значит перед нулевым R2 точно был единичный бит в младшем разряде.

Эту штуку (https://zx-pk.ru/threads/29759-extended-instructions-set-(eis)-mul-div-ash-ashc.html?p=1044879&viewfull=1#post1044879) не поправили, потому что все же эмулятор формирует флаг как на реале, или не стали проверять?

- - - Добавлено - - -

В процедуре эмуляции деления не поправили (https://zx-pk.ru/threads/29759-extended-instructions-set-(eis)-mul-div-ash-ashc.html?p=1044854&viewfull=1#post1044854).

Manwe
09.02.2020, 11:14
Еще спорный момент с флагом C при умножении.
"C: set if the result is less than -2^15 or greater than or equal to 2^15."
Как я понимаю из этого описания, нужно установить флаг если результат <-2^15 или >=2^15, т.е. текущий вариант процедуры неправильно установит флаг, если результат =-2^15. Или я неправильно понял описание (или описание не совсем корректное). Для проверки можно, например, умножить #1 на #100000Странно, мне казалось, что у меня это учитывается (результат умножения, положительный, ещё до учёта знака, в R0_R1):

7: TST R0 ; high 16 bit
BNE 71
TST R1 ; low 16 bit
BPL 72
71: INC R2 ; set bit C in PSW
72: TST R3 ; result's sign

- - - Добавлено - - -


В делении аналогичный фрагмент с не вполне корректным изменением знака

COM R4 ; dividend was negative
NEG R3 Это поправлял, но, видимо, при дальнейшей доработке взял ещё неисправленный вариант. Сейчас так:

COM R4 ; dividend was negative
NEG R3
BNE 4
INC R3
4:

- - - Добавлено - - -


Мелочь, но все же в MUL строка
6: BCC 7
лишняя. Нулевые множители в основной цикл не попадают, значит перед нулевым R2 точно был единичный бит в младшем разряде.Точно, спасибо. Убрал.
Архив обновил: http://thesands.ru/bk0010/EIS-driver-for-BK0010.zip

ivagor
09.02.2020, 11:21
у меня это учитывается
Не учитывается случай, когда результат умножения=-32768dec. По процитированному описанию в этом случае флаг C должен быть сброшен, а процедура эмуляции его в этом случае устанавливает.

Manwe
09.02.2020, 11:43
Не учитывается случай, когда результат умножения=-32768dec. По процитированному описанию в этом случае флаг C должен быть сброшен, а процедура эмуляции его в этом случае устанавливает.До выяснения знака результата (TST R3) промежуточный ответ, стало быть, равен 32768. В этом случае регистр R0 пустой, а регистр R1 в двоичном виде 1000 0000 0000 0000. Тогда инструкция TST R1 считает, что результат отрицательный (ведь установлен старший бит) и не срабатывает переход BPL 72. А значит, выполняется инструкция INC R2, после которой в R2 единица. Это как раз бит C слова состояния процессора.

ivagor
09.02.2020, 11:47
До выяснения знака результата (TST R3) промежуточный ответ, стало быть, равен 32768. В этом случае регистр R0 пустой, а регистр R1 в двоичном виде 1000 0000 0000 0000. Тогда инструкция TST R1 считает, что результат отрицательный (ведь установлен старший бит) и не срабатывает переход BPL 72. А значит, выполняется инструкция INC R2, после которой в R2 единица. Это как раз бит C слова состояния процессора.
Это я понимаю, но это не соответствует описанию. Возможно и описание не соответствует советским процессорам, но это я, к сожалению, проверить не могу.

Manwe
09.02.2020, 11:52
Это я понимаю, но это не соответствует описанию. Возможно и описание не соответствует советским процессорам, но это я, к сожалению, проверить не могу.Хм, проверил на ВМ1Г - действительно флаг C сброшен.
Интересно, как это обойти? Тупо сравнивать R1 с числом 100000, и устанавливать флаг C только если R1 строго больше (BHI)?

ivagor
09.02.2020, 11:58
Спасибо за проверку. Реализовать эту фичу можно разными способами, сам бы я скорее влез в учет знака (между 72: и 73: ). Тупой вариант - сравниваем результат (оба слова) c -32768dec, и если совпало, то сбрасываем C (в R2) обратно.

Manwe
09.02.2020, 11:58
Можно попробовать t402 (https://github.com/1801BM1/cpu11/tree/master/vm2/tst) - заводской тест 791402, EIS для 1801ВМ2, хорошо тестирует ASH, DIV, MUL.Как бы это собрать под БК? Смотрю процедуру outhex - там обращения к 177714 и 177715 - вообще не про БК ни разу :)
gid, а как Вы это тестировали? Может быть есть бинарник под БК? Независимый от операционной системы.

ivagor
09.02.2020, 12:00
c -32768dec
Удобнее, конечно, сравнить с 32768 до изменения знака, но уже в ветке изменения знака, когда известно, что результат <0.

Vslav
09.02.2020, 12:56
Как бы это собрать под БК? Смотрю процедуру outhex - там обращения к 177714 и 177715 - вообще не про БК ни разу :)
gid, а как Вы это тестировали? Может быть есть бинарник под БК? Независимый от операционной системы.
Там все особенности платформы изолированы в очень небольшом количестве функций, есть и оригинальный 402-ой тест, портировать на БК не должно быть сложно.

Manwe
09.02.2020, 13:30
Я всё надеюсь, может у gid есть уже скомпилированный вариант теста. Чтобы два раза не проделывать одну и ту же работу (тем более, что я в макро-ассемблере не разбираюсь).

gid
09.02.2020, 17:51
есть уже скомпилированный вариант теста
У меня нет готового скомпилированного теста, я использую бинарники, взятые из этих образов FODOS_TMOS (http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/FODOS_TMOS/) и немного попатченные, чтобы текст был в кои8, сразу русскими буквами, и вроде бы векторы и регистры терминала к одному виду приведены.
Нужные нам тесты в обоих образах одинаковые, адрес загрузки файла - 0, адрес запуска - 0200 (или содержимое ячейки 024).
Для вывода на экран используется терминал, у меня иногда возникает желание пропатчить тест, чтобы использовать обычный EMT 16, но немного полежу, и всё проходит. Тестирую я в очень бета версии эмулятора v4.1 (http://gid.pdp-11.ru/betatest.html), где есть эмулятор ИРПС, поэтому всё, что выводится в консоль и так видно.
Эти тесты крайне недружественны к пользователю, и чтобы понять, что это такое они выводят, нужно иметь под рукой листинг исходника теста, потому что выводится адрес возникновения ошибки и номер ошибки. По листингу находим адрес, где возникла ошибка, и выше смотрим, что эту ошибку породило. И исправляем. А в эмуляторе БК я ещё и косякии эмуляции EIS/FIS прям там же обнаруживал, пересобирал тесты и повторял цикл.
Получить листинг из исходника теста на MACRO-11 можно с помощью этого Эмулятор RT-11 (https://zx-pk.ru/threads/24755-emulyator-rt-11.html)
Вот весь набор файлов, которые я использую 71478, там правда под моё БКТурбо, но разобраться можно.

Manwe
18.09.2020, 10:56
Драйвер обновлён.
http://manwe.pdp-11.ru/Tools/EIS-driver-for-BK0010.zip
Теперь после запуска в свежих версиях систем MKDOS и ANDOS расширенная арифметика постоянно доступна для программ пользователя.
Раньше для использования расширенной арифметики каждая программа должна была вручную прописывать число 160016 по адресу 10. Сейчас такое требование осталось только на случай запуска программы из старых версий MKDOS и ANDOS, а также из других систем.

nzeemin
18.09.2020, 12:07
Manwe, возможно в реализации EIS для БК стоит сделать детектирования процессора с буквой "Г", у которого реализована инструкция MUL - чтобы она выполнялась аппаратно, а не программно.
Или она и так будет выполнена аппаратно, без изменений кода эмуляции EIS?

Manwe
18.09.2020, 13:03
Или она и так будет выполнена аппаратно, без изменений кода эмуляции EIS?Да, MUL будет выполняться аппаратно, я проверял - вставлял в БК 0011М процессор ВМ1Г. Аппаратная инструкция работает раз в 8 быстрей, чем эмуляция.

Manwe
01.10.2020, 19:07
Обновил драйвер.

Ускорено деление коротких чисел (если делимое укладывается в 16 бит).
Добавлены тесты в утилиту EIS-test.

Ссылка прежняя: http://manwe.pdp-11.ru/Tools/EIS-driver-for-BK0010.zip либо аттач в первом сообщении темы.

svinka
06.12.2020, 15:29
Нашлось еще такое с микрофиш

================================================== ==============================
Note 1.1 MUL, DIV, ASH for Falcon(+) 1 of 6
JAWS::KAISER 144 lines 25-MAR-1985 09:13
--------------------------------------------------------------------------------
+---------------+ +-----------------+
| d i g i t a l | | uNOTE # 001 |
+---------------+ +-----------------+


+----------------------------------------------------+-----------------+
| Title: MUL,DIV and ASH Instruction for the FALCON | Date: 13-APR-84 |
| and the FALCON-PLUS | |
+----------------------------------------------------+-----------------+
| Originator: Charlie Giorgetti | Page 1 of 4 |
+----------------------------------------------------+-----------------+


There is no hardware support for the EIS, FIS, or FPP instruction sets.
For FALCON SBC-11/21 applications that need the ability to perform the
EIS instructions MUL, DIV, and ASH, equivalent software routines can be
substituted. These callable routines do not do any form of error
checking. A user should be aware that extensive use of these software
routines for hardware instructions will have impact on system
performance. These routines can be incorporated into an application and
called as a subroutine. The calling sequence for the subroutines can be
set-up in a macro. The following is a list of each of the subroutines
and the macros that are used to set-up and call the software MUL, DIV,
and ASH routines.


Page 2


The following macro and subroutine can be used to perform the MUL
instruction in software:

.MACRO SMUL A,B,HI,LO

MOV A,-(SP) ; Push a multiplier onto the stack
MOV B,-(SP) ; Push the other multiplier as well
JSR PC,$MUL ; Call the MUL subroutine
MOV (SP)+,HI ; Get the most significant part of
the result
MOV (SP)+,LO ; Get the least significant part of
the result

.ENDM

$MUL:: MOV R0,-(SP) ; Save some work registers
MOV R1,-(SP)
MOV 10(SP),R1 ; Obtain the value of A from the stack
MOV #21,-(SP) ; Initialize the shift counter
CLR R0 ; Initialize the high 16-bit accumulator
10$: ROR R0 ; Perform multiplication
ROR R1
BCC 20$
ADD 10(SP),R0
CLC
20$: DEC (SP) ; Bump the shift counter
BNE 10$ ; Not done ?
TST (SP)+ ; Romove the counter from the stack
MOV R1,10(SP) ; Save the low 16-bit value on the stack
MOV R0,6(SP) ; Save the high 16-bit value on the stack
MOV (SP)+,R1 ; Restore the work registers
MOV (SP)+,R0
RTS PC ; Return


Page 3


The following macro and subroutine can be used to perform the DIV
instruction in software:

.MACRO SDIV DIVSOR,DIVHI,DIVLO,REM,QUO

MOV DIVSOR,-(SP); Push the divisor onto the stack
MOV DIVHI,-(SP) ; Push the upper 16-bits of the dividend
MOV DIVLO,-(SP) ; Push the lower 16-bits of the dividend
JSR PC,$DIV ; Call the DIV subroutine
MOV (SP)+,REM ; Get the remainder
MOV (SP)+,QUO ; Get the quotient

.ENDM

$DIV:: MOV R5,-(SP) ; Get some work registers
MOV R4,-(SP)
MOV R3,-(SP)
MOV R0,-(SP)
MOV 14.(SP),R3 ; Get the divisor from the stack
MOV 12.(SP),R4 ; Get the high 16-bits of the dividend
MOV 10.(SP),R5 ; as well as low 16-bits
CLR R0 ; Clear an accumulator
MOV #32.,-(SP) ; Shift counter
1$: ASL R5 ; Perform the division
ROL R4
ROL R0
CMP R0,R3
BLO 2$
SUB R3,R0
INC R5
2$: DEC (SP)
BNE 1$ ; Not done ?
TST (SP)+ ; Remove the counter from the stack
MOV R0,12.(SP) ; Store the remainder on the stack
MOV R5,14.(SP) ; Store the quotient as well
MOV (SP)+,R0 ; Restore the work registers
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
MOV (SP)+,(SP) ; Update the return PC
RTS PC ; Return


Page 4


The following macro and subroutine can be used to perform the ASH
instruction in software:

.MACRO SASH COUNT,VAL

MOV COUNT,-(SP) ; Push the shift count
MOV VAL,-(SP) ; Push what is to be shifted
JSR PC,$ASH ; Call the ASH subroutine
MOV (SP)+,VAL ; Get the results of the shift

.ENDM

$SASH:: MOV R0,-(SP) ; Get a couple of work registers
MOV R1,-(SP)
MOV 6(SP),R0 ; R0 = value to be shifted
MOV 8.(SP),R1 ; R1 = direction and shift count
BIC #^C<77>,R1
BEQ 20$ ; Get out if no shifting
CMP R1,#31. ; What direction is the shift
BGT 10$ ; go to the corection direction shift
5$: ASL R0
DEC R1
BNE 5$
BR 20$
10$: NEG R1
BIC #^C<77>,R1
11$: ASR R0
DEC R1
BNE 11$
20$: MOV R0,8.(SP) ; Store the shifted result on the stack
MOV (SP)+,R1 ; Restore the work registers
MOV (SP)+,R0
MOV (SP)+,(SP) ; Update the return PC
RTS PC ; Return





svinka
12.12.2020, 05:55
В регистре начального пуска выделен бит о наличии математического расширителя
Предполагалось что-то вроде DEC KE11-A(B)??
На БМК 1801? может оно все-таки есть???
Сделаем заново???

Энтузиаст изучающий Verilog мог бы такой KE11-a за вечер написать и отладить и потом в колодку для ПЗУ 24 ножки приделать

Если есть желающие я помогу.

Документация
http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/pdp11/1120/KE11-A_ExtendedArithElem.pdf

Схема электрическая принципиальная KE11-В с прошивками ПЗУ. вряд ли нужна но всетаки
http://wwcm.synology.me/pdf/KE11-B%20Arithmetic%20Unit%20Engineering%20Drawings.pdf

Эмуляция с исходниками написана в проектах simh и apout. гугулится
В последнем потому что первые компиляторы Си генерировали код только для такого арифметического расширителя

zx_
12.12.2020, 22:29
svinka, эт кааято странная хрень
на четырех битных сдвиговых регистрах, мультиплексорах и проч логики

математический сопроцессор на дискретной логике ?

Hunta
13.12.2020, 01:11
эт кааято странная хрень
Ну вообще то известная хрень. В RSX даже специальный вариант резидентной библиотеки есть, что бы (непривилегированные) задачи могли получить доступ к ней.


математический сопроцессор на дискретной логике ?
Я бы не назвал это сопроцессором. Сделано именно как устройство, то есть проц об этом "сопроцессоре" ни сном ни духом, в отличии от, скажем, 1801ВМ4, сопроцессоре плавающей точки для F11 (ака 1811) или акселераторе плавающей точки (FPA) для J11 (даже не знаю, делали у нас что то такое для 1831)

Для полноты коллекции я его под PDP2011 сделал, но толком так и не проверил - другими делами занят.

svinka
13.12.2020, 08:21
svinka, эт кааято странная хрень
на четырех битных сдвиговых регистрах, мультиплексорах и проч логики

математический сопроцессор на дискретной логике ?
ага
ведь в пройстейшем -)) самом медленном способе целочисленное умножение 16*16 бит (результат 32бит) это 16 сложений и 16 сдвигов


тама на плате реализованы микропрограммные автоматы по некоторым операциям для ускорения вычислений. через регистры в пространстве ввода-вывода. Не расширяет систему команд.

MM
13.12.2020, 22:18
https://pic.maxiol.com/thumbs/15282110482225.jpg (https://pic.maxiol.com/?v=15282110482225.jpg)

Hunta
14.12.2020, 18:33
Я так понимаю - это как раз этот самый EAE от СССР?

shattered
03.01.2026, 14:49
Обновил драйвер.

Ускорено деление коротких чисел (если делимое укладывается в 16 бит).


Можно еще ускорить -- пропустить деление совсем, если делимое меньше делителя + не считать остаток, если он не будет использоваться