Не Байда, а Трамп-пам-па))) Шутка)
Вид для печати
Не обижайся, просто я это давно уже пережевал, по второму разу жевать - не очень интересно этим заниматься. Так что - с моей стороны это подвиг - цени :)
Давно бы уже самлопатуModelsim освоил, там на гитхабе у меня простая инструкция, на пять строчек, как проект запустить.
Update: M4 выложил, поужинаю и сделаю диаграммы.
Ну... Проекты приходят и уходят, а навык владения лопатой - остается.
Тестовый код:
ДиаграммыКод:47 040000 memlim = 40000 ; лимит тестовой памяти
353 ;_____________________________________________________________________________
354 ;
355 ; Дополнительные тесты исполнения, вызывающие ошибку шины на предвыборке
356 ;
357 001404 012705 037774 tst6: mov #memlim-4, R5 ;
358 001410 013725 001546 mov @#cmd15, (R5)+ ;
359 ;
360 001414 012737 001432 000004 mov #1$, @#trap4 ;
361 001422 013715 001532 mov @#cmd10, (R5) ;
362 001426 000165 177776 jmp -2(R5) ;
363 ;
364 001432 012737 001450 000004 1$: mov #2$, @#trap4 ;
365 001440 013715 001534 mov @#cmd11, (R5) ;
366 001444 000165 177776 jmp -2(R5) ;
367 ;
368 001450 012737 001472 000004 2$: mov #3$, @#trap4 ;
369 001456 013715 001540 mov @#cmd12, (R5) ;
370 001462 012701 040004 mov #memlim+4, R1 ;
371 001466 000165 177776 jmp -2(R5) ;
372 ;
373 001472 012700 001512 3$: mov #4$, R0 ;
374 001476 010037 000004 mov R0, @#trap4 ;
375 001502 013715 001542 mov @#cmd13, (R5) ;
376 001506 000165 177776 jmp -2(R5) ;
377 ;
378 001512 012737 001530 000004 4$: mov #5$, @#trap4 ;
379 001520 013715 001544 mov @#cmd14, (R5) ;
380 001524 000165 177776 jmp -2(R5) ;
381 ;
382 001530 000000 5$: halt ;
383 ;
384 001532 010100 cmd10: mov R1, R0 ;
385 001534 012700 001234 cmd11: mov #1234, R0 ;
386 001540 011100 cmd12: mov @R1, R0 ;
387 001542 010007 cmd13: mov R0, PC ;
388 001544 000776 cmd14: br .-2 ;
389 001546 000240 cmd15: nop ;
390 ;
Решил попробовать адресацию -(PC) (код 47). Интересный результат получился.
Бесконечный цикл не получился. Выполнилось по два раза INC R0 и INC R1, останов случился на адресе 01030, а не 01026.
- - - Добавлено - - -
Довольно интересные результаты дают команды снятия/установки признаков, некоторые команды могут и не исполнится.
Вроде бы у PDP-11 специально и употребляется восьмеричная система счисления, чтобы всё было ясно без слов. Ну так уж и быть:
1.2.Код:1000 CLR R0
1002 CLR R1
1004 CLR R2
1006 CLR R3
1010 MOV R5,R5
1012 MOV -(PC),R5
1014 INC R0
1016 INC R1
1020 INC R2
1022 INC R3
1024 HALT
Код:1000 CLR R0
1002 CLR R1
1004 CLR R2
1006 CLR R3
1010 MOV R5,R5
1012 MOV -(PC),R5
1014 NOP
1016 INC R0
1020 NOP
1022 INC R2
1024 INC R3
1026 HALT
Я думаю, что проблема с командами, использующими IR (регистр инструкций) может происходить из-за того, что в цикле IR_STB, когда BIR защелкивается в IR, при сбитом кэше может прилететь новое значение, и, таким образом, получится, что команда выполняется предыдущая, а поле IR используется от следующей команды.
Для команд:
1. SEx, CLx - это младшие 4 бита, определяющие маску флагов.
2. SOB, BRA, Bcc - поле смещения перехода
3. MARK - тоже самое.
Но для этого нужно, чтобы время памяти было такое, что BIR_STB прилетает именно в момент IR_STB. Ни раньше (тогда кэш исправится), ни позже, тогда будет просто выполнение предыдущей команды.
- - - Добавлено - - -
Ну и еще небольшая ложечка дёгтя, если мое предположение верное.
Команда BRA/Bcc тоже использует BIR, то можно предположить, что подобная накладка, когда BIR прилетает во время IR_STB, спутает все карты.
А именно, выполняться будет Bcc, до этого находящаяся в BIR, а анализироваться блоком условий будет следующая команда.
Т.е. допустим, идут две команды BRA, BEQ. Выполняться будет BRA, т.к. она уже в кэше, а условие и смещение будет от BEQ.
Большая путаница может быть, когда следующая команда не является командой перехода, но все равно совпадает с маской условий для Bcc.
Например, маска для BEQ, BLOS = x.000.x01.1xxx.xxx.xxx (условие Z=1). Но в нее попадает, например, и команда NEG.
Таким образом, если идет BRA, затем NEG, то для BRA будет условие Z=1, а смещение перехода будет взято из младшего байта NEG.
Ещё интересное наблюдение - команда MOV -(PC),R5 в регистр R5 ложит не саму себя, как должно быть, а следующую за ней команду.
А вот это очень странно, потому что вычитание 2 должно делаться из PC1, а не из PC2. А PC1 указывает на следующую команду.
Надо просить сделать тест с графиком на асинхронной модели у @Vslav'a.
Странно. По идее, эта команда должна намертво зациклить. У меня в контроллере AZ всё весело работает Или это связано с R5?Хотя нет, скорее всего при чтении из страницы ввода-вывода просто блокируются предвыборки...Как это работает в контроллере AZ
Мой AZ выдает при считывании из регистра 17777226 последовательно коды 106447, 340, 14700, 10000, 14720, 240, 14720, <очередная команда загрузчика> ... 14720, <последняя команда загрузчика>, 14707, 10000. Первый код - это команда MTPS, далее код, который пересылается в PS, далеее в R0 пересылается адрес начала загрузчика - 10000, далее первая и очередные команды загрузчика, далее в PC пересылается адрес начала загрузчика и далее начинает работать сам загрузчик.
Идея этого, так сказать, аппаратного загрузчика, была опубликована в МПСС, для ЦП М2, но работает оно и на М6, и на ВМ1, и на ВМ2, и на ВМ3, и на 11/73 - это где оно проверено.[свернуть]
Именно про -(PC) или (PC)+ тож...
По идее и в книжках одно, а по факту... :(
Возможно проблема в конвейере...
Нет. Из документации
1. 2x и 4x
OPR %R,(R)+ ; OPR %R,-(R) using SAME register as both source and destination
2. 3x и 5x
OPR %R, @(R)+ ; OPR %R, @-(R) using SAME register as both source and destination
3. 6x, 7x, 67 и 77
OPR PC, X(R) ; OPR PC, @X(R) ; OPR PC,@A; OPR PC,A
-(PC) и (PC)+ попадает только под первый сценарий, но в нем нужен вариант типа MOV PC, -(PC)
- - - Добавлено - - -
Поскольку я вожусь с ДП, у меня как раз открыты эти страницы - где отличия описываются ;)
- - - Добавлено - - -
Собственно, OPR PC,@A; OPR PC,A в сценарий можно было и не включать, ибо это частный случай 6x и 7x
В 1801ВМ3 проблемы предвыборки при исполнении команд типа OPR @PC,Rx, OPR -(PC),Rx и OPR @-(PC),Rx может и нет. Данная тема про реверс-инжиниринг и исследование чипов, входящих в УКНЦ. Вот у процессора 1801ВМ2 обнаружилась данная проблема, она обнаружилась ещё в 2013 году. Вот здесь и исследуется.
Я также не поленился и набрал на УКНЦ и запустил следующую программу:
Программа зациклилась на адресе 0157776, т.к. ячейки с адресом 0160000 не существует, то предвыборка сбрасывается и глюк не проявляется.Код:157770 005000 CLR R0
157772 005001 CLR R1
157774 010505 MOV R5,R5
157776 014705 MOV -(PC),R5
Посмотрел описание AZ, регистра 0177230 не существует, потому проблемы у вас и нет. А если бы был этот регистр и между DIN и RPLY было бы более четырёх тактов, то проблема у вас появилась бы.
Не поленился, воткнул 1201.02 (ВМ2). Так он и по К ОСТ Н (B HALT L) не останавливается. Набрал коды, 1000G и тишина, даже на ОСТ не реагирует. На УСТ реагирует. Если занести коды, заранее активировать ОСТ и запустить, то стоит на адресе 1000, хоть после 1000G, хоть после любого числа нажатий P, если же ОСТ погасить и нажать P, то больше его не остановишь. Да, в R5 14705. Загрузка с AZ идет нормально.
ВМ1 вставлять не буду.
Когда следующая ячейка существует и во время предвыборки время между DIN и RPLY составляло более четырёх тактов. Две страницы назад есть и тексты программ и скриншоты с экрана.
- - - Добавлено - - -
AFZ, пожалуйста внимательно перечитайте тему. Проблема появляется именно на 1801ВМ2 и если во время предвыборки время между DIN и RPLY было более четырёх тактов. В УКНЦ память разделяется между процессором и видеоадаптером, видеоадаптер имеет приоритет, потому и выборка медленная. А в МС1201.02 память монопольно используется 1801ВП1-013, выборка быстрая, проблема не наблюдается.
Понятно. Так детально я не вникал.
Если предположить, что кэш слетел раньше, чем начала выполняться эта команда, тогда можно логически обьяснить, что в R5 попадает не та команда.
Стоп. А ведь так и может быть. Выполняется MOV -(PC),R5, в R5 попадает правильное значение, но конвейер слетает, выполняется предвыбранная команда, а уже после нее MOV -(PC),R5, и уже на этот раз она загружает в R5 неправильное значение.
По ходу мой фикс с PC2 не работает как надо. Придется таки разбираться и патчить микрокод.
Даже не думай, почти сизифов труд)
- - - Добавлено - - -
Фикс PC2 и не поможет, т.к. не он виной, а сбой кэша.
- - - Добавлено - - -
Надо сделать тест типа ADD -(PC),R5, тогда мы хотя бы косвенно сможем понять, сколько раз эта команда выполнилась по итоговой сумме.
Посмотрел я пример @Alex_K, просчитал его теоретически по микропрограмме, и все сошлось:
Код:1012 MOV -(PC),R5
1014 INC R0
1016 INC R1
1020 INC R2
1022 INC R3
1012 MOV -(PC),R5 // PC1=1012, R5=14705 В кэше: INC R0 Запрос кэширования: MOV -(PC),R5
1012 INC R0 // R0=1 В кэше: MOV -(PC),R5 Запрос кэширования: INC R0
1014 MOV -(PC),R5 // PC1=1014, R5=5200 В кэше: INC R0 Запрос кэширования: INC R1
В кэше: INC R1 Запрос кэширования: INC R0
1014 INC R1 // R1=1 В кэше: INC R0 Запрос кэширования: INC R1
1016 INC R0 // R0=2 В кэше: INC R1 Запрос кэширования: INC R2
1020 INC R1 // R1=2 В кэше: INC R2 Запрос кэширования: INC R3
1022 INC R2 // R2=1 и т.д.
Что же касается второго примера с NOP'ами, то там непонятно, почему INC R2 не сработала, т.к. R2 в итоге = 0.
Нужны какие-то еще тесты с NOP'ами, чтобы понять что не так.
Код:1012 MOV -(PC),R5
1014 NOP
1016 INC R0
1020 NOP
1022 INC R2
1024 INC R3