PDA

Просмотр полной версии : Инструкция CLR



litwr
30.03.2016, 15:07
На Motorola 68000 эта инструкция для памяти делается через цикл чтения-модификации-записи (RMW), т.е. очень медленно, двойным обращением к памяти. А как с этим у К1801ВМ1? У старших моторолл эту проблему сняли. Процессоры Motorola очень похожи на процессоры DEC.

Alex_K
30.03.2016, 21:30
На Motorola 68000 эта инструкция для памяти делается через цикл чтения-модификации-записи (RMW), т.е. очень медленно, двойным обращением к памяти. А как с этим у К1801ВМ1? У старших моторолл эту проблему сняли. Процессоры Motorola очень похожи на процессоры DEC.
У 1801ВМ1 аналогично. В 1801ВМ2 словная команда CLR уже делает только запись, а байтовая CLRB чтение-модификацию-запись.

Manwe
27.09.2018, 23:55
да, лучше заранее записать 0 в регистр и дальше делать MOV - он выполняется быстрее, чем CLR.

CLR
28.09.2018, 13:06
он выполняется быстрее, чем CLR.

:(

AFZ
15.11.2018, 15:00
У 1801ВМ1 аналогично. ИМХО, используется общая микропрограмма, типа для inc/dec/com/neg и пр. В ней три действия: добыть исходный операнд в операционный регистр, не отдавая шину, сделать с ним что-то, согласно коду операции, результат запихнуть назад, все это в цикле шины "Ввод-пауза-вывод". Ну, и CLR туда запихнули - тоже ведь одноадресная команда! Просто действие с операционным регистром будет "очистить". Зато какая экономия микрокода!..

Vslav
15.11.2018, 15:38
ИМХО, используется общая микропрограмма, типа для inc/dec/com/neg и пр.
Это уже не ИМХО, это установленный факт :)

S_V_B
15.11.2018, 16:41
У ВМ2 тоже или исправили?

Vslav
15.11.2018, 17:06
У ВМ2 тоже или исправили?
Смотря какой ВМ2, похоже их минимум две версии микропрограммы гуляет.

Alex_K
15.11.2018, 23:38
Смотря какой ВМ2, похоже их минимум две версии микропрограммы гуляет.
А вот отсюда можно поподробнее.

Vslav
15.11.2018, 23:56
А вот отсюда можно поподробнее.
Ну как подробнее... В Сети точно есть фотографии двух разных топологий ВМ2. Встречалась информация что в разных экземплярах ВМ2 по-разному отрабатываются циклы ввода вывода (не помню, возможно что и для CLR), при этом никто, естественно на кристалл не смотрел, но на баг все-таки осмысленное поведение непохоже. Я реверсил более новую версию ВМ с тегом ТР4 и двумя генераторами подложки, в его схеме хватает мелких разночтений со схемой от "Технического описания 1801ВМ2". В сумме это дает, на мой взгляд немалую вероятность что микропрограмму ВМ2 тоже "пропатчили". Конечно, окончательный ответ может дать только вскрытие старой версии ВМ2 и прямое сравнение кристалла с новой версией.

Manwe
16.11.2018, 00:25
Я реверсил более новую версию ВМВопрос к гуру: как ВМ2 обрабатывает инструкции EIS с нечётными регистрами? Изначально они (кроме ASH) задуманы для работами с парами чётный & нечётный регистр. Но возможно подать аргументом нечётный. В сети об этом информация неполная даже для PDP-11. А хочется сделать правильный эмулятор расширенной арифметики для БК. Чтобы с УКНЦ, ДВК и СОЮЗ-НЕОН одинаково работало.
Такие вот интересные случаи бывают с нечётными регистрами:
ASHC #-n,R1 должно работать как рулонный сдвиг, но вот вопрос: с участием бита C или без?
MUL #n,R1 выставляется ли бит V если результат не умещается в 16 бит (по логике должен, но поверхностный эксперимент S_V_B на УКНЦ показал, что нет)?
DIV #n,R1 вообще не нашёл описания как это работает

Alex_K
16.11.2018, 00:45
как ВМ2 обрабатывает инструкции EIS с нечётными регистрами?
Когда-то я выкладывал описание 1801ВМ2 - здесь (https://zx-pk.ru/threads/6257-emulyator-uknts.html?p=422640#post422640). Там подробно описаны алгоритмы исполнения команд.

Manwe
16.11.2018, 11:57
Когда-то я выкладывал описание 1801ВМ2 - здесь (https://zx-pk.ru/threads/6257-emulyator-uknts.html?p=422640#post422640). Там подробно описаны алгоритмы исполнения команд.Спасибо, очень интересно - нигде не встречал такого описания команды DIV:

Если в качестве R используется нечётный регистр, то старшая часть 32-разрядного делимого будет повторять его младшую часть, т.е. фактически выполняется операция ((R << 16) or R) и после завершения операции деления сохранится только частное.В моей процедуре, эмулирующей DIV, почти так и получалось, только в ответ записывался остаток, а не частное (потому что общий код с ASCH, где при выводе ответа в приоритете младшие 16 бит). Исправил.



Содержимое регистров R и R or 1 копируется в 32-разрядную переменную и сдвигается влево или вправо на количество позиций, определяемое счётчиком сдвига.
Заодно описание команды ASHC для нечётного регистра помогло понять туманную и нечёткую фразу их другого описания "Если номер регистра - приемника нечетный, правый сдвиг становится вращением". Опять же, в моей процедуре так получается само собой, но "вращение" из описания заставило задуматься о бите C.

Manwe
16.11.2018, 18:37
Когда-то я выкладывал описание 1801ВМ2 - здесь (https://zx-pk.ru/threads/6257-emulyator-uknts.html?p=422640#post422640). Там подробно описаны алгоритмы исполнения команд.Одну вещь не очень понял: как вычисляется адрес в командах
METKA1: CLR X(PC)
METKA2: CLR @X(PC)
Каков адрес очищаемой ячейки памяти? METKA+X+2 или METKA+X+4 ?
То есть в момент вычисления адреса PC всё ещё указывает на аргумент, или уже на следующую команду?

S_V_B
16.11.2018, 20:28
Как дела с Last Mission?
Везде конечно не успеешь.. можно жить и без нечетных регистров..
я сделал вывод спрайтов ASH.. все работает..

Alex_K
16.11.2018, 22:28
Одну вещь не очень понял: как вычисляется адрес в командах
METKA1: CLR X(PC)
METKA2: CLR @X(PC)
Каков адрес очищаемой ячейки памяти? METKA+X+2 или METKA+X+4 ?
То есть в момент вычисления адреса PC всё ещё указывает на аргумент, или уже на следующую команду?
Во время вычисления адреса PC будет указывать уже на следующую команду. Поэтому METKA+X+4.