PDA

Просмотр полной версии : Тесты ВМ1



nzeemin
15.12.2009, 17:39
Судя по поиску, тут этого ещё не пробегало. Для эмуляции БК будет крайне полезно.
http://bk0010.org/forum/?id=3716&page=

? anonymous - 11.12.2009 22:58
А тесты 791401, 791404 и 791323 проходят?

? anonymous - 11.12.2009 23:39
Первые два - из комплекта сдаточных тестов ВМ1, тест инструкций процессора и тест прерываний, третий - расширенный тест ОЗУ. Они обругают, если что-то не так съемулировано. Загружаются с адреса 0, диагностику выводят на учительскую машину через блок ИРПС. ИРПС эмулировать не сложно, там 4 регистра, перемычкой их адрес задается 0176560..0176567 для школьного бейсика и 0177560..0177567 для школьного фокала, последний вариант - стандартные адреса терминала в pdp11, на этих адресах и следует добавить эмуляцию с выводом в соседнее, например, окно, или в файл. В *560м регистре имеются два бита, 6й и 7й. 7 бит *560го регистра устанавливается, если во входной регистр *562 поступил новый байт, а если перед приемом байтов установить в 1 6й бит *560го регистра, то произойдет прерывание с вектором, адрес которого читается из регистра *566. *562й регистр - буфер приемника, оттуда считывается последний принятый байт, по записи регистр ничего не делает. В регистре *564 имеются тоже два бита, 6й и 7й, с тем же назначением, что и у приемника, 7й бит устанавливается в 0, когда процессор пишет байт в буфер передатчика, *566, и устанавливается в 1, когда заканчивается передача, т.е. когда буфер готов к приему следующего байта. Если при установке 7го бита был установлен 6й, то по готовности передатчика возникает прерывание с вектором, на 4 бОльшим, чем считываемое из регистра *566 значение. Регистр *566 - по записи - буфер передатчика, по чтению - регистр вектора прерывания, при установке адресов 0176560..0176567 вектор считывается 0360, приемник прерывает работу по 0360му вектору, а передатчик - по 0364му, при установке адресов 0177560..0177567 - адрес вектора 060 для приемника и 064 для передатчика.
По команде процессора reset все биты в регистрах приемника обнуляются, а в регистре передатчика устанавливается бит 7 - готовности к передаче.

nzeemin
16.12.2009, 16:56
Необходимое дополнение от Alex_K:

Эти тесты запускаются по значению вектора по сбою питания (24 вектор).
У всех тестов получается стартовый адрес равен 0200, значение PSW равно нулю.

Alex_K
16.12.2009, 21:27
Уважаемые владельцы реальных БК-0010-01, выполните в Бейсике такую программку:


10 DATA &O010046,&O012700
20 DATA &O000520,&O010020
30 DATA &O016715,&O000004
40 DATA &O012600,&O000207
100 RESTORE
110 FOR I%=&O500 TO &O516 STEP 2
120 READ A%
130 POKE I%,A%
140 NEXT I%
150 DEF USR0=&O500
160 A%=USR0(0%)
170 PRINT OCT$(A%)

Хотелось бы узнать, какой результат получается - 520 или 522.
Сама программка:


000500: MOV R0,-(SP)
000502: MOV #520,R0
000506: MOV R0,(R0)+
000510: MOV 520,@R5
000514: MOV (SP)+,R0
000516: RETURN
000520: .BLKW 1

PDP-11
18.12.2009, 21:20
Хотелось бы узнать, какой результат получается - 520 или 522.

520

nzeemin
19.12.2009, 16:57
Проходя по шагам тест 791401, исправил работу команд MARK, MFPS и RTT.
Теперь тест выдает:
<00>
<0e>k prohod
<0e>k prohod
<0e>k prohod
...и так далее в цикле.
(В угловых скобках записаны коды неотображаемых символов.)

Alex_K
19.12.2009, 18:00
Кстати, все эти тесты входят в состав ТМОС. Дискета с тестами (http://mix.wol.bz/sys/ftmo_dsk.zip) и краткая инструкция (http://grands.land.ru/docs/test0505.htm) к ним находятся на сайте Grand (http://grands.land.ru/).
В прикрепленном файле загрузочный образ для УКНЦ.
ВНИМАНИЕ!!! Перед запуском FTMON обязательно нужно выключить таймер!
После загрузки на ошибку "Invalid command" не надо обращать внимание - просто нет программы DATIME.SAV, она в принципе и не нужна.

nzeemin
19.12.2009, 23:01
В прикрепленном файле загрузочный образ для УКНЦ.
ВНИМАНИЕ!!! Перед запуском FTMON обязательно нужно выключить таймер!

Алексей, у тебя на реальной машинке этот диск работает?
На эмуляторе как ни пробовал -- выпадает при загрузке теста в память:

.FTMON
,L 791401
*** СТОП ***

Alex_K
19.12.2009, 23:18
Алексей, у тебя на реальной машинке этот диск работает?
На эмуляторе как ни пробовал -- выпадает при загрузке теста в память:

.FTMON
,L 791401
*** СТОП ***

Он и должен выпадать, в инструкции сказано, что после загрузки по команде L надо запустить тест с адреса 200, либо выйти на командную строку по адресу 30124.
Запускать тесты лучше командой R для бесконечного прохода или O для однократного прохода. Бесконечный проход можно прервать клавишей СТОП и запуститься с адреса 30124 для выхода в командную строку.

Кстати тест 791403 (команды FIS) на реальной УКНЦ, также как и на эмуляторе, вываливается по зависанию в пультовый монитор. Этот тест предназначен для платы МС 1201.2 с ПЗУ 1801РЕ2-055, там эмулятор FIS немного по другому сделан.

---------- Post added at 23:18 ---------- Previous post was at 23:09 ----------

Еще небольшое дополнение по эмулятору УКНЦ: где-то ошибка при эмуляции канала 2, поэтому после выпадения в СТОП и запуска по новому адресу происходит снова выпадение в СТОП по адресу 64. Это срабатывает прерывание от клавиатуры, хотя не должно быть. По всей видимости канал 0 дает запрос на прерывание, но они запрещены, после чтения регистра данных запрос должен сброситься, но он не сбрасывается.
Исходя из этого лучше в debug-консоли для ЦП набрать команду g200 и запустить тест командой O. Я их таким образом и гонял. Есть ошибки в эмуляции команд ASH и ASHC.

nzeemin
19.12.2009, 23:28
Еще небольшое дополнение по эмулятору УКНЦ: где-то ошибка при эмуляции канала 2, поэтому после выпадения в СТОП и запуска по новому адресу происходит снова выпадение в СТОП по адресу 64. Это срабатывает прерывание от клавиатуры, хотя не должно быть. По всей видимости канал 0 дает запрос на прерывание, но они запрещены, после чтения регистра данных запрос должен сброситься, но он не сбрасывается.
Исходя из этого лучше в debug-консоли для ЦП набрать команду g200 и запустить тест командой O. Я их таким образом и гонял. Есть ошибки в эмуляции команд ASH и ASHC.

У меня сейчас тест 791401 проходит -- запуском через R либо O -- перенёс вчерашние исправления MARK, MFPS и RTT из BKBTL.
Но есть проблема с тестом 791404 -- я тебя письмом выслал трассу -- посмотри если не трудно. Там валится на примере с установкой бита T через RTT и затем вызовом IOT.

Alex_K
19.12.2009, 23:36
У меня сейчас тест 791401 проходит -- запуском через R либо O -- перенёс вчерашние исправления MARK, MFPS и RTT из BKBTL.
Но есть проблема с тестом 791404 -- я тебя письмом выслал трассу -- посмотри если не трудно. Там валится на примере с установкой бита T через RTT и затем вызовом IOT.

По всей видимости проблема в том, что прерывание по биту T не должно исполняться, ведь исполнение IOT загружает новый PSW, а там по всей видимости бит T сброшен и прерывания по биту T не должно возникнуть.

P.S. Для процессора ВМ2 предназначен тест 691401, по 791401 он вываливается в СТОП.

nzeemin
20.12.2009, 01:42
Не знаю, насколько это пригодится. Написал для этих тестов простейший загрузчик чтобы грузить их на БК "легально", без обходных манёвров. В аттаче готовые бинарники. По идее, можно даже в .wav сохранить и на реальной БК загрузить. Но результаты тестирования выдаются в порт 177566, который наверное мало у кого выведен наружу.

Текст загрузчика (походу, моя первая программа в машкодах PDP-11):


; Скопировать загрузчик 00200 байт с адреса 01000 на адрес 022000
000000: 012700 MOV #022000, R0
022000
000004: 012701 MOV #001000, R1
001000
000010: 012702 MOV #000100, R2
000100
000014: 012120 MOV (R1)+, (R0)+
077202 SOB R2, $-2

; Продолжаем работу загрузчика уже на адресах 022000+
000020: 000137 JMP #022024
022024

; Скопировать тест 020000 байт с адреса 02000 на адрес 000000
000024: 005000 CLR R0 ; Этот код уже исполняется с адреса 022024
012701 MOV #002000, R1
000030: 002000
012702 MOV #010000, R2
000034: 010000
012120 MOV (R1)+, (R0)+
000040: 077202 SOB R2, $-2

; Очистить PSW и запустить тест с адреса 0200
000042: 005000 CLR R0
106400 MTPS R0
000046: 000137 JMP #000200
000200
000052:

svofski
19.04.2010, 17:39
nzeemin, у меня вопрос про инструкцию MARK. Все доки, которые я видел, говорят, что первым делом она делает SP = SP + 2xNNN. А по логике теста 791401 вроде бы выходит, что SP = PC + 2xNNN. Подсмотрел в сорцы bkbtl и увидел тоже SP = PC + 2xNNN (если правильно понял). Есть этому какое-то объяснение?

И большое спасибо за опенсорсенье bkbtl!

b2m
19.04.2010, 18:29
Всё правильно, инструкция MARK размещается только в стеке.

ivagor
19.04.2010, 18:33
Извините за злостный оффтоп, но не могу удержаться - 580е сообщение svofski про 1801, про что же будет 1801е?

nzeemin
19.04.2010, 18:40
nzeemin, у меня вопрос про инструкцию MARK. Все доки, которые я видел, говорят, что первым делом она делает SP = SP + 2xNNN. А по логике теста 791401 вроде бы выходит, что SP = PC + 2xNNN. Подсмотрел в сорцы bkbtl и увидел тоже SP = PC + 2xNNN (если правильно понял). Есть этому какое-то объяснение?

Когда я работал по этим тестам, инструкцию MARK пришлось исправлять -- см. svn revision 118.
Насколько я помню, руководствовался я описанием процессора 1801ВМ2 от Alex_K, а именно:

Алгоритм: SP := PC + 2 * NN; PC := R5; R5 := (SP)+
Описание: Эта команда используется для облегчения выхода из подпрограммы, заносящей в стек параметры. Команда MARK восстанавливает указатель стека во время выхода из подпрограммы. Под восстановлением указателя стека подразумевается загрузка в него нового содержимого, которое указывало бы на последнюю заполненную ячейку стека перед тем, как возникла необходимость записи в стек N параметров.

Вот ещё описание команды:
http://www.mailcom.com/bk0010/mark.shtml

svofski
19.04.2010, 18:41
b2m, угу. Но в родных мануалах была опечатка, значит.
http://simh.trailing-edge.com/semi/ucode/j11/j11.mcr
Это сорцы микрокода J11, тут PC+2xnnn. То же самое и в сорцах simh. А вот POP-11, который я считал полностью работоспособным, содержит ошибки. Да и не одну. Вопрос снят.


ivagor, lol

svofski
20.04.2010, 02:05
А что за вектор по адресу 000042? После каждой итерации тест норовит его дернуть, если он не пустой.

nzeemin
23.04.2010, 23:48
А что за вектор по адресу 000042? После каждой итерации тест норовит его дернуть, если он не пустой.

Что-то не помню такого. Речь про который тест?

svofski
23.04.2010, 23:57
401, но в общем-то это несущественно. Просто любопытство.

svofski
26.04.2010, 14:52
Можно сказать, два года ловил ошибку (хотя конечно же, два года я ничего не делал и потом недельку половил ошибку, но все же). Оказалось, что у меня была ошибка в инструкции SWAB: вместо поля адреса назначения, как положено для однооперандных инструкций, бралось поле адреса источника. Оно бы и ладно, тесты должны такие вещи вылавливать тут же, но почему-то 791401 проходил без ошибок, хотя тест SWAB там есть. Но, все тесты SWAB в нем проводятся над регистром R3. Код такой инструкции 00 03 03. Часть кода операции совпадала с выбранным регистром в поле назначения. То есть в дейтсвительности вышло так, что независимо от реального операнда всегда исполнялась SWAB R3 и именно SWAB R3 проверяется в тестах. Бетон.

nzeemin
26.04.2010, 14:59
Можно сказать, два года ловил ошибку (хотя конечно же, два года я ничего не делал и потом недельку половил ошибку, но все же).
8-) Н-да, забавненько.
А как определил что именно SWAB если тестом не бралось?

svofski
26.04.2010, 15:11
Спасибо тебе и твоему эмулятору ;) Феликсу тоже спасибо большое: не давал мне продохнуть, выдавал идеи пачками и про SWAB-ы сразу сказал, но я пропустил мимо ушей.

А искал примерно так же, как доктор Флойд диагностировал HAL. Я почутьчуть сравнивал прогресс в выполнении "PRINT PI" в эмуляторе и в своем компьютере. Сделал брейкпойнты и доступ к R0-R7 и PS через JTAG и сравнивал понемногу. Дело дошло до UNPCK, а в нем SWAB-ы начинаются довольно быстро. Так что основное время ушло на преодоление лени перед реализацией нормальных брехтпунктов и инспектора.

Кстати об эмуляторе, может быть сделать ему клавиатурный ввод с маппингом от писишной клавиатуры? А то совершенно непонятно, как набирать некоторые символы. А вообще -- зачот! Отладочные окна просто супер.

b2m
13.05.2010, 18:26
Вопрос есть к специалистам по программированию ВМ1: после исполнения каких команд не возникает исключение при нечётном регистре PC? Судя по нескольким программам (тесты, демка Disco Club, Bolder) нечётность PC не проверяется как минимум после JMP. Тоже вопрос: а при всех ли режимах адресации? И как дела обстоят в команде JSR?

---------- Post added at 19:26 ---------- Previous post was at 18:54 ----------

Кажется я понял, в чём дело: на БК вообще не проверялось, чётный ли адрес в регистре PC. Убрал проверку, и всё заработало как надо, и Bolder, и Disco Club. В демке, кстати, эта фича используется для организации цикла с количеством повторений 2 раза. А я-то блин думал!!? Зачем там используется команда INC PC? И как это работает? :)

svofski
13.05.2010, 18:29
А я-то наивно надеялся, что эти хаксоры хотя бы БК оставили в покое.

И что именно происходит, когда выполняется переход по нечетному адресу?

b2m
13.05.2010, 20:50
Ничего особенного. Считываются же слова, а при этом младший бит не используется. Интересно получается, когда INC PC второй раз исполняется - следующее за ней слово пропускается :)

svofski
13.05.2010, 21:12
Как это -- "второй раз"?

b2m
13.05.2010, 21:42
Например в цикле, или просто в программе несколько команд INC PC. В той же деме Disko Club есть такой код: сначала идёт тело цикла, потом INC PC, затем переход на начало цикла. Первый раз выполнится переход, а второй раз INC PC перепрыгнет команду перехода :)

svofski
13.05.2010, 22:24
Я никак не могу понять, как INC PC отличает первый раз от второго. Есть какое-то скрытое внутреннее состояние?

Alex_K
13.05.2010, 23:26
Я никак не могу понять, как INC PC отличает первый раз от второго. Есть какое-то скрытое внутреннее состояние?
При чтении слова не учитывается самый младший бит в адресе, т.е. чтение по адресу 1000 и 1001 - читается одна и та же ячейка.
А теперь пример кода:


1000: ...
...
1020: INC PC
1022: BR 1000
1024: ...

Когда код исполняется первый раз, то адреса четные. Процессор читает по адресу 1020 команду INC PC. После чтения команды счетчик команд становится равным 1022. При исполнении команды счетчик команда уже будет равен 1023. Но по чтению 1023 и 1022 - одно и то же. Читается команда BR 1000, сначала счетчик команд после чтения команды равен 1025, а после исполнения - 1001. Команды перехода осуществляют переход вперед/назад на +127/-128 слов максимум. Переход осуществляется словами, а в команде записано смещение. В данном примере ее код 766, т.е. переход на -12(8) слов, исполняется команда 1025-12*2=1001, поэтому переход происходит в данном случае по нечетному адресу. Далее весь код исполняется в нечетных адресах, но т.к. по чтению четные и нечетные адреса равны, то ничего особенного не происходит до исполнения команды INC PC. При чтении этой команды счетчик команд становится равным 1023 и указывает на команду BR 1000. Но вот при исполнении счетчик команд увеличивается на единицу и становится равным 1024, а этот адрес уже указывает на команду после BR 1000. Вот таким хитрым способом удается сделать двойной цикл.

svofski
13.05.2010, 23:27
Всё, понял. Спасибо за развернутое объяснение!

Patron
30.01.2011, 01:06
Прогоняя тест 791404 в своём эмуляторе процессора 1801ВМ1 - обнаружил, что тест успешно проходят две разные реализации "нечётного PC":

1. Когда команды загрузки адреса ( JMP, JSR ) обнуляют младший бит PC при загрузке нечётных значений:


PC[012376] PSW[004] : JMP 012415
PC[012414] PSW[004] : DEC PC
PC[012415] PSW[000] : DEC PC
PC[012416] PSW[000] : INC @#000404
PC[012422] PSW[000] : CMP #59., @#000404


2. Когда младший бит PC загружается командами JMP и JSR "как есть":


PC[012376] PSW[004] : JMP 012415
PC[012415] PSW[004] : DEC PC
PC[012416] PSW[000] : INC @#000404
PC[012422] PSW[000] : CMP #59., @#000404


Думаю, что второй подход более правильный и (скорее всего) настоящий 1801ВМ1 работает именно так, но поскольку реального процессора у меня нет, а тест даёт неоднозначные результаты - буду рад, если кто-нибудь уточнит этот момент.

Всего-то и надо, что выполнить на реальном 1801ВМ1 примерно такой набор команд:


Mov #Metka+1, R0
Jmp (R0)
Metka: Mov PC, R1

И проверить содержимое R1 ( по идее - оно должно быть нечётным ).

...
Добавлен файл VM1PS3.zip, содержащий "1801VM1 PSW test 3".
Добавлен файл VM1PS4.zip, содержащий "1801VM1 PSW test 4".
Добавлен файл TTST2.zip, содержащий "LSI-11 Traps Tests #2".
Добавлен файл TTST3.zip, содержащий "LSI-11 Traps Tests #3".
Добавлен файл VM1VE1.zip, содержащий "1801VM1 VE-Timer Test #1".

Vslav
11.04.2013, 23:59
В продолжение темы - http://zx-pk.ru/showthread.php?t=16317&page=11
Осциллограммы 1801ВМ1:
- БК-0010.01 @ 3MHz
- Тестовые последовательности размещались по адресу 100000
- Снято при помощи логанализатора Acute TL-2136
- Частота сэмплирования 200МГц

1. Тестовая последовательность


005700 ; $1: TST R0
005700 ; TST R0
000775 ; BR 1$


Результаты для последовательности 1:
http://s019.radikal.ru/i617/1304/aa/148907f61134.png

2. Тестовая последовательность


012700
100006 ; MOV #100006, R0
005710 ; $1: TST (R0)
000776 ; BR $1


Результаты для последовательности 2:
http://s019.radikal.ru/i605/1304/f7/62d97c4b5489.png

Меньший масштаб (более наглядное отличие между тестами):
http://s51.radikal.ru/i133/1304/88/8195f002ac4c.png

Для пытливых исследователей - данные в текстовом виде для обеих последовательностей и обычный старт монитора (для сравнения) во вложении

Patron
12.04.2013, 00:34
Круто!

Похоже, что подтверждается моя теория о том, что у 1801ВМ1 есть зачатки предвыборки и если выполняемая команда производит обращение к памяти, то это вызывает увеличение её продолжительности на величину штрафа отмены предвыборки.

Но также очевидно, что влияние видео-адаптера затрудняет тестирование "чисто процессорных" аспектов работы 1801ВМ1 и есть смысл уделить больше внимания работе 1801ВМ1 именно в составе БК.

И первый вопрос на эту тему следующий:

На форуме http://bk0010.org/forum/ в теме Тонкости и толстости ВМ1 (http://bk0010.org/forum/?id=3799) прозвучало следующее утверждение:



? gid @ - 6 апреля 18:09
Практический эксперимент показал, что для 1801ВМ1 в его так сказать HALT режиме прерывания происходят по адресам 160000+номер. Напр HALT/IRQ1 - по адресу 160002, Независимо от того, каково содержание SEL1. Читается или нет регистр 177716 сказать не могу, но в реальности его содержимое не важно.

Т.е. утверждается, что хотя начальный старт и происходит по адресу из SEL1, но по команде HALT или сигналу IRQ1 - БК-0011 ( насколько я понял - тестировалась эта модель ) всегда переходит по адресу 160002, независимо от содержимого SEL1.

Что-то мне с трудом в такое верится, может там тестирование не вполне правильно было проведено..

Интересно, как поведёт себя тестируемая БК, выполнив команду HALT.

Vslav
12.04.2013, 00:39
Но также очевидно, что влияние видео-адаптера затрудняет тестирование "чисто процессорных" аспектов работы 1801ВМ1

Уточнение - тестовые последовательности запускались по адресу 100000 из эмулятора ПЗУ, то есть - обращения к ОЗУ не было.



Т.е. утверждается, что хотя начальный старт и происходит по адресу из
... skipped ...

Интересно, как поведёт себя тестируемая БК, выполнив команду HALT.

Набросайте тест - я прогоню на стенде. А то завтра УКНЦ приедет уже ))

Patron
12.04.2013, 01:00
Уточнение - тестовые последовательности запускались по адресу 100000 из эмулятора ПЗУ, то есть - обращения к ОЗУ не было.Точно! Там нулевая задержка RPLY, поэтому "дырки" в SYNC выглядят такими большими.

Тогда при случае можно будет много чего протестировать.



Набросайте тест - я прогоню на стенде.Тест команды HALT имеет самый простой код - сплошные нули.

Т.к. команда HALT всегда вызывает HALT-Trap, то имея эту команду ( код 000000 ) на стартовом адресе - мы должны получить зацикленный HALT-Trap. В самом начале можно NOP поместить ( код 0240 ), чтобы отделить HALT от стартовой последовательности.


А то завтра УКНЦ приедет ужеДля 1801ВМ2 ( и тем более в составе УКНЦ ) нерешённых задачек ещё больше, чем для 1801ВМ1 !!!

Vslav
12.04.2013, 09:00
Тестовая последовательность:



000240 ; $1: NOP
000000 ; HALT
000775 ; BR $1


Результат:
http://s003.radikal.ru/i201/1304/a3/dfea2b1f7420.png

При исполнении HALT:
- выполняется цикл DAT I/O и устанавливается бит 3 в регистре SEL1
- выполняется цикл DAT O, запись в 177676 - попытка сохранить PSW
- так как 177676 в БК не реализован - возникает тайм-аут шины
- тут любопытно (на картинке не видно в таком масштабе, к сожалению), после самого первого тайм-аута после аппаратного сброса процессор выполняет (пытается выполнить) запись (слова - WTBT низкий, но это значит слово по моему опыту) по адресу 154731 (единичка младшая игнор). Операция со стеком?
- дальше цикл уже повторяется без вариаций - установка бита 3 в 177716 и попытка записи по 177676

К сожалению, ответа на вопрос куда уходит ВМ1 после HALT пока нет. Думаю что я буду дорабатывать свой эмулятор, добавлю поддержку циклов DAT O и DAT I/O, тогда можно будет поддержать транзакции к 177674/6 и узнать, куда оно таки переходит.


.
Для 1801ВМ2 ( и тем более в составе УКНЦ ) нерешённых задачек ещё больше, чем для 1801ВМ1 !!!

Посмотрим в каком оно состоянии приедет, покупалось-то по "мусорной" цене. Работоспособность неизвестна, сначала в порядок попытаюсь привести, а у меня уже запасы КМ-ок к концу подходят :).

Patron
12.04.2013, 12:24
У процессора 1801ВМ1 есть и другие загадочные особенности.

1. Штраф невзаимности - имеет место всегда, когда первый аргумент не обращается к памяти, а второй обращается. Из-за этого команда CMP (R0), R0 выполняется гораздо быстрее, чем CMP R0, (R0)

А как это выглядит на шине..

Для проверки нужно сравнить две последовательности:



021000 ; CMP (R0), R0
000776 ; BR .-2.

020010 ; CMP R0, (R0)
000776 ; BR .-2.поместив в R0 адрес BR.

...

2. Штраф второго операнда - из-за него команда TST (R0) выполняется быстрее, чем команда CMP (R0), R0

Для проверки нужно сравнить две последовательности:



005710 ; TST (R0)
000776 ; BR .-2.

021000 ; CMP (R0), R0
000776 ; BR .-2.
поместив в R0 адрес BR.

Vslav
13.04.2013, 01:52
Доисследовал вопрос с HALT - эмулятор ПЗУ теперь поддерживает регистры 177674 и 177676. Не пытайтесь повторить на обычном БК - их там нет :)

http://s017.radikal.ru/i404/1304/3c/4b51d08b5a24.png (http://www.radikal.ru)

При выполнении HALT 1801ВМ1 таки переходит на 160002, игнорируя содержимое 177716. На 160002 в эмуляторе мусор, поэтому не обращайте внимание на считываемые там данные

---------- Post added at 00:52 ---------- Previous post was at 00:40 ----------


У процессора 1801ВМ1 есть и другие загадочные особенности.

Потестировал, результаты:
http://s41.radikal.ru/i094/1304/f9/4f498dda7fbe.png (http://www.radikal.ru)

Titus
13.04.2013, 14:42
А не проще ли сфоткать кристалл под микроскопом, который имеется у нескольких человек с форума, и разобрать микрокод?
Или мы не ищем легких путей?

Patron
13.04.2013, 15:08
Потестировал, результаты1801ВМ1 - один из самых загадочных процессоров в мире.

С одной стороны - команды TST (R0) и CMP (R0),R0 выполнились за строго одинаковое время, но с другой стороны - алгоритмическое время следующей команды после TST (R0) уменьшилось на 1 такт.

Ранее тесты показали, что при выполнении большого количества команд TST (R0) подряд - они выполняются на один такт быстрее, чем CMP (R0),R0. Возможно, дело было в том, что тесты этих команд проводились в разные дни, а тактовая частота процессора довльно сильно зависела от температуры.

Чтобы немного лучше разобраться в вопросе - можно выполнить подряд по три одинаковых команды TST (R0) и CMP (R0),R0 и если их времянки опять совпадут - значит никакого штрафа второго операнда у 1801ВМ1 скорее всего нет.

...

БК-0010.01 @ 3MHz - очень интересный объект для тестирования, но для нормального запуска тестов и вывода результатов - её было бы полезно подключить к PC через последовательный порт.

Нужна любая плата последовательного порта для МПИ ( ИРПС БК, СА УКНЦ, И12 от "Электроника 60" и т.п. )

...


А не проще ли сфоткать кристалл под микроскопом, который имеется у нескольких человек с форума, и разобрать микрокод?Кому-то проще сфоткать кристалл и разобрать микрокод, а кому-то проще сделать несколько тестов.
Пока не нашлось ни одного желающего пойти по первому пути и только несколько желающих пойти по второму.

Складывается впечатление, что большинству фанатов БК и 1801ВМ1 - их любимый компьютер и их любимый процессор откровенно не интересны. До сих пор, например, никто точно не знает, как на самом деле процессор БК работает с ОЗУ.

Результаты прогона тестов таймингов команд на БК (http://gray-gid.narod2.ru/f/BK11timings.rar) появились совсем недавно и дать их верную теоретическую интерпретацию до сих пор никто не может.

Vslav
13.04.2013, 16:01
Чтобы немного лучше разобраться в вопросе - можно выполнить подряд по три одинаковых команды TST (R0) и CMP (R0),R0 и если их времянки

Так R0 для смежных комманд уже не будет указывать на адрес следующей команды? Или это уже не суть важно для этого теста?



БК-0010.01 @ 3MHz - очень интересный объект для тестирования, но для нормального запуска тестов и вывода результатов - её было бы полезно подключить к PC через последовательный порт.

Можно на "эмуляторе ПЗУ" реализовать и UART, но с некоторым расползанием времянки и скорее всего без прерываний. Но я сейчас буду заниматься захватом видеовывода и выводом его через USB в окошко Windows, уже прикупил макетик на CY7C680013. Возможно туда же получится прикрутить и эмуляцию клавиатуры. Потому что телевизоры у меня далеко, второй VGA монитор есть, но надо скандаблер и жалко место на столе, кучку клавиатур тоже держать не хочется.



До сих пор, например, никто точно не знает, как на самом деле процессор БК работает с ОЗУ.

Там стоит ВП1-037, с ОЗУ ведь работает она? А процессор на RPLY от нее ориентируется. Какие тут подробности интересны?

Titus
13.04.2013, 17:12
Складывается впечатление, что большинству фанатов БК и 1801ВМ1 - их любимый компьютер и их любимый процессор откровенно не интересны. До сих пор, например, никто точно не знает, как на самом деле процессор БК работает с ОЗУ.
В смысле не известно? Тайминги или что?

Patron
13.04.2013, 17:40
В смысле не известно? Тайминги или что?Непонятно, за счёт чего получаются наблюдаемые тайминги.

Например, на БК-0011М @ 4 МГц :



CMP @Tab(R1), @#Addr 6 x DATI 80 CLC
CMP @Tab(R1), @Tab(R0) 7 x DATI 80 CLC


---------- Post added at 16:40 ---------- Previous post was at 16:22 ----------


Так R0 для смежных комманд уже не будет указывать на адрес следующей команды? Или это уже не суть важно для этого теста?Совсем не важно.


Можно на "эмуляторе ПЗУ" реализовать и UART, но с некоторым расползанием времянки и скорее всего без прерываний.Прерывания весьма желательны, но можно попробовать и без них - в пультовом порту "Электроники 85" тоже, говорят - нет прерываний.
Если удастся сделать рабочий комплект RT-11 + HX для порта без прерываний - он будет грузиться и через пультовой порт Pro350 / Э-85.


я сейчас буду заниматься захватом видеовывода и выводом его через USB в окошко Windows, уже прикупил макетик на CY7C680013.Это хорошо для запуска игр, но для загрузки RT-11 и запуска тестов нужен именно терминальный обмен через последовательный порт.


Там стоит ВП1-037, с ОЗУ ведь работает она? А процессор на RPLY от нее ориентируется. Какие тут подробности интересны?Конечная задача, которую нужно решить - определение формулы расчёта количества тактов, которое потребуется для выполнения любой команды процессора БК, обращающейся к ОЗУ в циклах от 1 x DATI до 7 х DATI ( или 6 x DATI + DATO или 6 x DATI + DATIO ).

Для начала, наверное, хорошо бы получить осциллограммы выполнения всех вариантов команды CMP с кодом команды и всеми аргументами в ОЗУ:


R0 (R0) (R0)+ @(R0)+ -(R0) @-(R0) Addr @#Addr @Tab(R0)

Cmp R1 14 35 35 49 36 49 49 49 61
Cmp (R1) 30 43 43 57 44 58 57 57 70
Cmp (R1)+ 30 43 43 57 44 58 57 57 70
Cmp @(R1)+ 43 57 57 70 58 71 70 70 83
Cmp -(R1) 31 44 44 57 45 58 57 57 71
Cmp @-(R1) 44 57 57 71 58 72 71 71 84
Cmp Addr 43 57 57 70 57 71 70 70 83
Cmp @Tab(R1) 56 70 70 83 71 84 83 83 96


А потом то же самое для MOV и ADD.

Patron
15.04.2013, 15:34
Новая загадка мистического процессора 1801ВМ1 ждёт своего решения:

Выяснилось, что при задержке RPLY = 6*CLK - время выполнения NOP равно времени выполнения MOV R0,R0 , но при задержке RPLY < 1*CLK - MOV R0,R0 выполняется за 8 тактов, а NOP - за 9 тактов.

Постановка задачи:

Сделать настраиваемую задержку RPLY и определить, при какой минимальной задержке RPLY ( в тактах CLK ) время выполнения команд MOV R0,R0 и NOP становится одинаковым.

Vslav
15.04.2013, 16:01
У меня RPLY на диаграммах какой-то странноватый - снимался прямо с ножки 39 процессора. На схеме БК-0010 нарисован триггер 155ТМ2, который синхронизирует этот сигнал со спадом CLC (ножка 1 процессора). На диаграммах такого не наблюдается - то ли неисправность, то ли схема на заводе и в этой части подшаманена - буду разбираться. Доделаю в PCAD плату эмулятора в разъем МПИ и продолжу с тестами.

А вопрос такой - выходы у ВМ1 - все типа "открытый коллектор" - как ГОСТ 26765.51-86 (Интерфейс Магистральный Параллельный МПИ) требует?
Есть желание ВМ1/2/3 к 3-вольтовой FPGA прицепить, если там "открытый коллектор", то можно попытаться вообще напрямую, без преобразования уровней - резисторы на +3.3V кинуть вместо +5V и все. С сигналом WTBT я самостоятельно разобрался - у него двойное назначение.

Patron
15.04.2013, 16:09
Отрохов ( разработчик ВМ1 ) писал, что у них вышел какой-то глюк с обработкой RPLY, из-за чего на этот вход процессора приходится ставить триггер. Но чем плохо без триггера и как именно триггер должен изменять тайминги приёма RPLY - я так и не понял.

Vslav
16.04.2013, 13:57
Отрохов ( разработчик ВМ1 ) писал, что у них вышел какой-то глюк с обработкой RPLY, из-за чего на этот вход процессора приходится ставить триггер. Но чем плохо без триггера и как именно триггер должен изменять тайминги приёма RPLY - я так и не понял.

С форума БК0010 "Тонкости и толстости ВМ1"



? anonymous - 12.02.2011 02:05
...
Это одна из проблем ВМ1, заключающаяся в том, что у него микропрограммы работы с шиной вылетают в зависание полное иногда, если RPLY в цикле обмена сразу устанавливать с DIN/DOUT и сразу снимать - почему-то не умеет он работать с быстрыми устройствами, надо линию задержки вводить, чтоб отсрочить его появление и уход в пассивное состояние

Повиснет на уровне автомата состояний шины я так понял, без внешнего задерживающего триггера. Но это не снимает вопрос чего у меня такой странный RPLY на картинках

Patron
16.04.2013, 14:38
Повиснет на уровне автомата состояний шины я так понял, без внешнего задерживающего триггера. Но это не снимает вопрос чего у меня такой странный RPLY на картинкахПохоже, что необходима и достаточна задержка на полтакта - она и выполняется.

---------- Post added at 13:38 ---------- Previous post was at 13:23 ----------

Хотя, не исключено, что достаточно и задержки до ближайшего фронта CLK, но задержку в половину такта оказалось проще реализовать.

svofski
16.04.2013, 18:28
Но я сейчас буду заниматься захватом видеовывода и выводом его через USB в окошко Windows, уже прикупил макетик на CY7C680013.
Я такое уже делал: http://sensi.org/~svo/bkvideo -- вдруг пригодится.

Vslav
17.04.2013, 00:24
Разобрался насчет REPLY. У меня БК-0010 "переразведенка", с подшаманенной на заводе схемой. RPLY поступающий с разъема МПИ и с вывода 34 ВП1-037, объединяются на ЛА3 D7.4 и инвертируются на ЛН1 D5.4 как на штатной схеме. А дальше на моем экземпляре установлен ИР1, который попутно формирует видеовывод, и тактируется от 12МГц, и вот на одном из его свободных от видеовывода разрядов сделали задержку RPLY на четверть такта процессорной частоты (то есть на 80нс примерно).
Далее еще интересный момент - самый первый RPLY на моих диаграммах - при чтении SEL1 - он формируется отнюдь не ВП1-037, а самостоятельно внутри процессора. Поэтому у него такая времянка. Любопытно, в многопроцессорной системе, куда перезжают эти регистры 177714 и 177716 - не могут же они в этом случае не зависеть от номера процессора.

Patron
17.04.2013, 00:44
Регистры зависят - их адреса определяются состоянием ножек 26 и 27:


Адреса внешних регистров:
номер МП адреса регистров
SEL1 SEL2
00 177716 177714
01 177736 177734
10 177756 177754
11 177776 177774
но вот база векторов HALT-моды, похоже - не зависит и всегда = 160000

Vslav
17.04.2013, 10:25
Я так понимаю что от номера процессора в системе (выводы 26, 27) зависит базовый адрес всего блока регистров 177700..177716, не только 177714 и 177716.
177700..177712 - внутренние, а 177714 и 177716 - внешние, по отношению к ВМ1.
А кто в БК-0010 формирует адрес начального старта? В БК-0011 на AD15 и AD14 есть явно активируемые при чтениии SEL1 выходы 155ЛН2 - в итоге дает 140000. Но в БК-0010 такой схемы нет, получается сам ВМ1 формирует старший разряд (0 в инвертированном AD15)?

Patron
17.04.2013, 12:09
Очень любопытно!

Значит ли это, что если SEL1 & 0xFF00 читается как 000000 - старт будет с адреса 0100000, а если как 020000 - старт будет с адреса 0120000 ..

...

Alex_K
17.04.2013, 12:26
А кто в БК-0010 формирует адрес начального старта? В БК-0011 на AD15 и AD14 есть явно активируемые при чтениии SEL1 выходы 155ЛН2 - в итоге дает 140000. Но в БК-0010 такой схемы нет, получается сам ВМ1 формирует старший разряд (0 в инвертированном AD15)?
Если не ошибаюсь, то адрес начального старта формирует 1801ВП1-037. Регистр она распознает не по сигналу SEL1, а по адресному обмену.

Vslav
18.04.2013, 20:26
Если не ошибаюсь, то адрес начального старта формирует 1801ВП1-037. Регистр она распознает не по сигналу SEL1, а по адресному обмену.
Да, это похоже на правду - я отрезал ножку ВП1-037 от шины данных, и старший разряд стартового вектора не сформировался.
Нормальный такой ВМ1 - на 177700-177712 формируется снаружи и RPLY и данные, хотя чтение идет "самим собой" внутренних регистров. Но это вполне допустимо. А вот для 177714-177716 - формирует сам для себя только RPLY - данные внешняя система должна уж как-нибудь сама предоставить. Что в-общем то нарушает протокол обмена МПИ - RPLY должен снаружи формировать модуль, предоставляющий данные, а не схема внутри процессора.

Alex_K
18.04.2013, 20:32
Да, это похоже на правду - я отрезал ножку ВП1-037 от шины данных, и старший разряд стартового вектора не сформировался.
Нормальный такой ВМ1 - на 177700-177712 формируется снаружи и RPLY и данные, хотя чтение идет "самим собой" внутренних регистров. Но это вполне допустимо. А вот для 177714-177716 - формирует сам для себя только RPLY - данные внешняя система должна уж как-нибудь сама предоставить. Что в-общем то нарушает протокол обмена МПИ - RPLY должен снаружи формировать модуль, предоставляющий данные, а не схема внутри процессора.
В описании сказано, что для регистров SEL1 и SEL2 формировать сигнал RPLY не надо, достаточно успеть выставить данные или записать их. Наверное это сделано для упрощения внешней схемы. А если регистров нет, то в данном случае будет читаться ноль, и запуск процессора всегда произойдет с нулевого адреса. А по поводу снаружи регистров 177700-177712 - их можно прочесть другим устройством через механизм прямого доступа к памяти. Плюс к тому же они разные в многопроцессорной системе, и программа может прочесть регистры любого процессора таким образом.

darkstar
05.11.2013, 11:24
Народ, подскажите пожалуйста.
Разбираюсь с 1801ВМ1.
Если на шине AD (15...0) такие уровни 0000 0000 0011 0001, то это число 61 или 177716 ?
Другими словами - +5 вольт на линии - это ноль или единица?

MM
05.11.2013, 12:12
На МПИ БК принято за лог. 1 уровень 0в, за лог. 0 +5в.
Приведенный двоичный адрес соответствует 177716 - если осциллографом мерить.
Если ВМ1 выдает этот адрес, он должен ( в БК ) одновременно выдавать уровень 0в. на линии чтения системного порта 177716 - см. Э3 БК.
( Т.е. при начальном пуске требовать адрес старта с 177716 - старший байт ).

darkstar
05.11.2013, 12:58
Спасибо большое!
177716 - это я к примеру привёл. Потому, что (как я понял) проц стартует и обращается к этому адресу за старшим байтом адреса перехода.
Разбираюсь в одном приёмнике, управление которого собрано как раз на К1801ВМ1.
Прочитал ПЗУ-шку, теперь ищу дизассемблер.

esl
05.11.2013, 14:03
IDA

darkstar
05.11.2013, 19:24
Ок.
Уже установил IDA 6.1 и поставил надстройку от Patron вот отсюда:
http://zx.pk.ru/showthread.php?postid=367209
правда она для версии 5.2, но вроде как работает.

Некоторые команды не распознаются, например
.Word 7002 или
.Word 7601
но возможно я уже залез в блок констант.

Межблочная шина МПИ. Думаю зацепиться на неё и посмотреть что куда пересылается.

MM
05.11.2013, 20:27
Разрешите сообщить начинающему ( программисту ), что самой лучшей ковырялкой из всех, что за 28 лет я видел - это DESS V5.00 от ОС ДВК ( она же RT11 V5.01 )
дизассемблер там написан чуть ниже таблицы чисел - а транслировать можно
командой "T" ( пословно ). Листинг трансляции можно вывести на принтер - но поблочно ( что несколько смущает начинающих хакеров ). Гугля в помощь.
Однако тот DESS, что поставляется в комплекте с эмулем ДВК - непрофессионально
дополнен Хексами, которые в принципе не нужны на DEC-системах, и по этому
там испорчен набор команд в ассемблере, в отличии от DESS V5.00.
*
Вообще у Dessa есть несколько недостатков:
1.Нельзя назначить виртуальный адрес исследуемого массива - только физический
( особенно неудобно расковыривать дурные ПЗУ, код которых неперемещаем ( 95%))
2.Нет команды заполнить массив числами - для писателей пригодилось бы.
3.Нет команды перемещения блоков байтов - приходится ручками перелопачивать кучи цифр.
4.Потерял вариант, где вывод ассемблера был не на принтер/девайс, а в файл .
5.Других недостатков за 25 лет работы и написания кучи ПЗУ не выявил.

darkstar
06.11.2013, 06:14
MM, спасибо.
Я действительно начинающий ковырятель в чужом коде.
Раньше, бывало, писал на AVR-ассемблере :)
IDA нашёл первее и пока в ней поцарапаюсь.
А чтобы завести DESS, видимо нужно сначала поставить эмуль, из под него запустить RT-11, а потом уже DESS... как-то так?

Кстати, немного непривычно идут адреса - через один (только чётные).
Видимо предполагалось, что память будет 8-разрядная?

Блин, ничего не пойму с этим дизассемблером...
вот такой код из ПЗУ-шек (их там две - старший и младший байты):
0100: 15
0101: С6
0102: 90
0103: С0

то есть
000400: 012706
000402: 110300

По моему разумению, это будет
MOV(B) #110300, R6
т.е. содержимое ячейки 110300 скопировать в регистр R6.

Дизассемблер же пишет
BiCB @(R0)+,(R5)+

Или лыжи не едут, или ... одно из двух.

b2m
06.11.2013, 10:54
Или лыжи не едут, или ... одно из двух.
Если учесть, что старший байт по нечётному адресу, то получится:
143025 BICB @(R0)+,(R5)+
140220 BICB R2,@(R0)+

Если байты переставить, то будет:
012706 110300 MOV #110300,SP загрузить число 0110300 в регистр SP (R6).

darkstar
06.11.2013, 11:45
Так. Стоп.
Старший байт ведь идёт первым?
или нет?
"старший байт по нечётному адресу" - буду осмысливать :)

DESS нашёл, идёт стандартом к DVK Emulator:
http://zx.pk.ru/showthread.php?t=18351
Методом тыка нашёл управляющие клавиши:
D - на слово назад
T - на слово вперёд
A - переход по указанному адресу
B - выбор блока
R - вид кода (Word-Hex-Byte-Rad), но нужно отключить CapsLock
I - дополнительная строчка с переводом текущей позиции в другую систему счисления
F - загрузка нового файла

Единственно, пока не понял, как внешние файлы туда подключить...

MM
06.11.2013, 12:49
В DEC-системах принято, что младший ( четный ) байт в слове, старший - нечетный.
Например: 000000 - младший четный, 000001 - старший нечетный.
При этом слово ( 2 байта ) имеет адрес - 000000.
*
Подключение внешних дисков xxxxxx.dsk ( полных снимков дискет RT-11 )
происходит в управляющем файле конфигурации в "блокноте".
Для научных целей можно любые другие файлы подключать, переименовав их в ".dsk" - но не более 32 мегабайта - на данный момент это магическая величина для
DEC-16 бит систем на основе RT-11.
*
В DESS есть замечательная команда "Output" - по умолчанию на LP: , но можно
назнадить любое другое устройство, как LP: командой .ASS xxx LP: - из командной строки RT-11. Туда будут передаваться символы дизассемблера от команды "Т".
При выводе на устройство запись в него ведется с 000000 блока, с 000000 адреса -
т.е. если на нем был каталог, то он вытирается.
Очень удобно организовать при помощи драйвера LD: виртуальные диски и на них выводить дизассемблер из DESS.
Например, командой CREATE создать файл размером блоков так 10, и переименовать его в XY.DSK , затем связать его с диском LD0: командой MOUNT .

darkstar
06.11.2013, 13:48
Спасибо.
Допустим у меня есть дамп ПЗУ в файле dump.bin.
Я его переименовываю dump.dsk ?
Как увидеть его из DESS?
По умолчанию у меня HD0 = HDSYS.DSK.
Указываю HD1 = dump.dsk.
набираю команду mount
спрашивает Device?
пишу LD1
спашивает File?
пишу dump
и он мне в ответ - LD-F-File nod found DK:dump.DSK
То есть, нужна какая-то файловая система в прицепляемом файле...

MM
06.11.2013, 14:09
К сожалению, просто так описанный фокус не проходит.
Не помню точно, но наличие ФС на монтируемых дисках - необязательное условие.
Что бы RT-11 не ругалась, не забывайте указывать, где ( т.е. "путь" ) расположен файл для драйвера LD. Например : SY:XY.DSK
Для добавления отдельных файлов в диск типа .dsk под RT-11 есть плагин для тотал командира - хрен знает, как его ставить - как-то промучился полдня, но поставил -
видимо, там какой-то баг в самом командире с установкой.
*
В Вашем случае можно совсем не монтировать, а при запуске DESS просто указать,
например, DW1: - DESS не нуждается в ФС на девайсе и воспринимает его просто как файл. Если чесно, настоятельно не рекомендую патчить DESSом файлы размером свыше 64 блока - возможны самые дурные варианты, например запись
исправления не в, допустим, 128-й блок файла, а в 1-й - проверено годами, но этот баг вылезает не всегда.

Patron
06.11.2013, 14:54
Допустим у меня есть дамп ПЗУ в файле dump.bin.
Как увидеть его из DESS?Нужно скопировать dump.bin в образ диска HDSYS.DSK.

Можно сделать это при помощи плагина для TotalCommander, описанного ЗДЕСЬ (http://zx.pk.ru/showthread.php?t=11015).

darkstar
07.11.2013, 06:50
Ого! Заработало!
Установил плагин:
Меню Конфигурация -> Настройка -> Плагины
Архиваторные плагины .wcx "Настройка"
Файлы с расширением "wcx"
Обзор -> RT-11dsk.wcx
И теперь тотал коммандер открывает файлы *.dsk при помощи <Ctrl>+<PgDown>.
Вовнутрь HDSYS.DSK удалось скопировать dump.bin только после переименования его в dump1.SAV,
т.к. файл DUMP.SAV там уже есть, а расширение .BIN не принимается.

после выполнения команды DIR напротив имени файла выводится его объём в блоках (по 512 байт)?
У меня получилось 32 блока. Исходный файл занимает 16 кб.

Теперь DESS читает мой файл! Ура!
Но байты всё же придётся переставить...

Байты переставил. Копаюсь в файле.
А может ли DESS вывести результат дизассемблирования в виде текстового файла?

Patron
07.11.2013, 13:36
И теперь тотал коммандер открывает файлы *.dsk при помощи <Ctrl>+<PgDown>При штатной установке DSK-плагина - расширение *.dsk регистрируется в TotalCommander за этим плагином и образы можно открывать просто нажав <Enter>.


расширение .BIN не принимаетсяDESS может открыть файл с любым именем и расширением - нужно только полностью их указать:



.DESS STARTS
Не найден файл DK:STARTS.SAV

.DESS STARTS.COM

Block=000000/00000. Adres=000000 Type=Word Edit DK:STARTS.COM Size=00001.
000/ 051441 052105 052440 051123 047040 051517 040527 006520 *!SET USR NOSWAP.*
020/ 020412 042523 020124 054105 052111 047040 051517 040527 *.!SET EXIT NOSWA*
040/ 006520 051412 052105 052040 020124 041523 050117 006505 *P..SET TT SCOPE.*
060/ 051412 052105 042440 020115 047117 005015 042523 020124 *.SET EM ON..SET *
100/ 046123 047440 006516 040412 051523 044040 031504 042040 *SL ON..ASS HD3 D*
120/ 006513 000012 000000 000000 000000 000000 000000 000000 *K...............*

hobot
07.11.2013, 16:20
darkstar, http://archive.pdp-11.org.ru/BIBLIOTEKA/DVKTXT/DESS.HLP
http://archive.pdp-11.org.ru/BIBLIOTEKA/DVKTXT/DECOD2.TXT - альтернатива
дизассемблер form'a - http://archive.pdp-11.org.ru/ukdwk_archive/ukncbtlwebcomplekt/Other/form_disasm203/
кросс-отладчик "МАРИЯ", автор Gina - http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/MARIAH1/

Дополнительные материалы >>>
http://archive.pdp-11.org.ru/BIBLIOTEKA/dwkbooks/
http://archive.pdp-11.org.ru/BIBLIOTEKA/assembler_pdp11/
http://archive.pdp-11.org.ru/BIBLIOTEKA/assembler_pdp11_vax11/
http://archive.pdp-11.org.ru/ukdwk_archive/dwkwebcomplekt/ASMDOC.dsk


Я использую версию DESS.SAV - размером 19 блоков которая (она меня полностью устраивает и не глючит на УК-НЦ (живой и эмуляторе).

---------------------------------------
в случае непредвиденных осложнений правьте ссылки на зеркало архива !!!

darkstar
08.11.2013, 06:50
hobot, спасибо.
Книжку с ассемблером перегнал в DJVU.

Буду разбираться, что же означает:
TRAP 044
TRAP 012
TRAP 033
Вроде как это команда на прерывание, но куда они ведут - непонятно...
в таблице векторов прерываний по этим адресам - пусто...

b2m
08.11.2013, 11:02
Вроде как это команда на прерывание, но куда они ведут - непонятно...
в таблице векторов прерываний по этим адресам - пусто...
Да, прерывание, но вектор всегда один 034, так же как и EMT, у которого вектор 030.

darkstar
08.11.2013, 11:13
Так.
А зачем тогда их такое множество, этих TRAP-ов?
Чем они отличаются друг от друга?
Под них аж вон сколько команд выделили: от 104400 до 104777. Зачем?
Видимо, при переходе по этому прерыванию, ещё какие-то параметры передаются...

Вроде как ни одного EMT в тексте программы не встретил. Да и по адресу 000 030 - пусто.
Зато на адресе 000 034 есть указатель на 004 504.
Я так понимаю, что число 000 200 сразу за адресом перехода в таблице векторов - это слово состояния процессора на период обработки прерывания. Оно устанавливает бит Р=1 и запрещает все маскируемые прерывания.

b2m
08.11.2013, 15:45
Так.
А зачем тогда их такое множество, этих TRAP-ов?
Чем они отличаются друг от друга?
Под них аж вон сколько команд выделили: от 104400 до 104777. Зачем?
Чтобы не передавать номер функции в регистре. Номер функции программа обработки прерывания считывает из кода команды EMT/TRAP. Для чего придумали две команды, я не знаю, но обычно EMT - это системный сервис, так сказать API операционной системы, который обычно документирован.

-=RUS=-
08.11.2013, 20:04
EMulator Trap (EMT) - можно самому создавать свои, для удобства в своих программах, как и Trap.

darkstar
09.11.2013, 06:55
Ничего не понял...
В книжке 3 от ДВК сказано:
- стр.31 "В командах EMT и TRAP старший байт слова содержит код команды, а младший байт предназначен для передачи информации драйверам внутренних прерываний".
Что это за информация? И каково её практическое использование?

Patron
09.11.2013, 13:12
Что это за информация? И каково её практическое использование?Это просто байт данных, являющийся частью кода команды. Поскольку байт имеет 256 возможных значений - есть по 256 вариантов кода команд EMT и TRAP с различными младшими байтами.

Обычно младший байт команды EMT/TRAP используется как номер вызываемой подпрограммы, а извлекается он из кода при помощи сохранённого в стеке адреса возврата:


.SBTTL ;....................... TRAP-ДИСПЕТЧЕР ........................;

TRP:
MOV (SP)+,(SP) ; Позволяет выйти по RETURN вместо RTI
MOV (SP),R0 ; R0 - Адрес возврата
MOVB -2(R0),R0 ; R0 - Аргумент команды TRAP
ASL R0 ; Номер подпрограммы х2
MOV TBL(R0),R0 ; Взять адрес подпрограммы из таблицы
JMP (R0) ; Перейти по адресу подпрограммы

b2m
09.11.2013, 21:59
Что это за информация? И каково её практическое использование?
Я же говорил, обычно это номер вызываемой функции.

darkstar
11.11.2013, 07:53
То есть, эту инфу (что идёт в виде аргумента к TRAP) можно извлечь в подпрограмме?

Выходит, логика работы такая:
1. ля-ля-ля, идёт текст программы
2. и тут возникает команда TRAP 022, к примеру
3. происходит прерывание, адрес возврата пихается в стек, и мы идём по адресу 000 034
4. на адресе 000 034 нас посылают ещё дальше, к примеру, на адрес 004 504. Попутно запрещаются все маскируемые прерывания (так как по адресу 000 036 лежит число 000 200).
5. на адресе 004 504 сидит подпрограмма обработки прерывания, которая может извлечь число 022 (т.е. аргумент TRAP-а) и действовать сообразно с этим.

А извлекаем мы это число, читая младший байт слова, стоящего перед адресом возврата из стека?

Так?

Ал-р
11.11.2013, 08:42
То есть, эту инфу (что идёт в виде аргумента к TRAP) можно извлечь в подпрограмме?
Выходит, логика работы такая:
1. ля-ля-ля, идёт текст программы
2. и тут возникает команда TRAP 022, к примеру
3. происходит прерывание, адрес возврата пихается в стек, и мы идём по адресу 000 034
4. на адресе 000 034 нас посылают ещё дальше, к примеру, на адрес 004 504. Попутно запрещаются все маскируемые прерывания (так как по адресу 000 036 лежит число 000 200).
5. на адресе 004 504 сидит подпрограмма обработки прерывания, которая может извлечь число 022 (т.е. аргумент TRAP-а) и действовать сообразно с этим.
А извлекаем мы это число, читая младший байт слова, стоящего перед адресом возврата из стека?
Так?
Да так.
В какой-то программе это было использовано для вывода символов,
к примеру: TRAP 101 вместо MOV #101, ..

Manwe
27.09.2018, 22:22
У процессора 1801ВМ1 есть и другие загадочные особенности.
1. Штраф невзаимности - имеет место всегда, когда первый аргумент не обращается к памяти, а второй обращается. Из-за этого команда CMP (R0), R0 выполняется гораздо быстрее, чем CMP R0, (R0)
2. Штраф второго операнда - из-за него команда TST (R0) выполняется быстрее, чем команда CMP (R0), R0Так вот оно что!..
А ещё интересно время выполнения (в тактах) таких команд:

MOV (R0)+,(R1)+ 44 такта
MOV (R0),(R1)+ 44 такта
MOV (R0)+,(R1) 40 тактов
MOV (R0),(R1) 40 тактов

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


Я такое уже делал: http://sensi.org/~svo/bkvideo -- вдруг пригодится.Удалось в итоге побороть проблему с уровнем видеосигнала?

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


Регистры зависят - их адреса определяются состоянием ножек 26 и 27:


Адреса внешних регистров:
номер МП адреса регистров
SEL1 SEL2
00 177716 177714
01 177736 177734
10 177756 177754
11 177776 177774
Вдруг осознал, что на 4-процессорной БКшке мы могли бы проигрывать 4-канальную трекерную музыку через 4 Covox’а :)

svofski
27.09.2018, 22:31
Удалось в итоге побороть проблему с уровнем видеосигнала?
Я этим не занимался. Там вопрос только в буферном усилителе. Но повторяемость конструкции все равно невысока из-за того, что она построена на основе довольно туманной ардуины с pic32.

Manwe
27.09.2018, 22:50
Я этим не занимался. Там вопрос только в буферном усилителе. Но повторяемость конструкции все равно невысока из-за того, что она построена на основе довольно туманной ардуины с pic32.Жаль. Идея-то отличная!

svofski
28.09.2018, 00:13
Жаль. Идея-то отличная!
Пруф концепта есть, а перенести его на другую платформу дело техники, было бы желание и время. Передо мной тогда стояла задача утилизировать совершенно не нужную странную ардуину. Если бы для дела, то надо переделать все это на человеческий stm32.

Manwe
28.09.2018, 11:53
Ответил в более подходящей теме: http://zx-pk.ru/threads/24347-ustrojstvo-dlya-zakhvata-tsvetnogo-izobrazheniya-bk-na-pc.html?p=980373&viewfull=1#post980373

konst_st
01.10.2018, 12:23
Вдруг осознал, что на 4-процессорной БКшке мы могли бы проигрывать 4-канальную трекерную музыку через 4 Covox’а
В свое время я делал проигрыватель обычных MOD и STM файлов на УКНЦ. Использовал оба процессора. Играл на 1 Covox.

Titus
01.10.2018, 19:26
В свое время я делал проигрыватель обычных MOD и STM файлов на УКНЦ. Использовал оба процессора. Играл на 1 Covox.

Исходник или экзешник в студию.

Titus
05.10.2018, 11:11
В свое время я делал проигрыватель обычных MOD и STM файлов на УКНЦ. Использовал оба процессора. Играл на 1 Covox.
И тишина)

Если исходник и экзешник потерялись, можно хотя бы рассказать, как он работал, а именно какие функции были у одного процессора, и какие у другого)

konst_st
05.10.2018, 12:24
И тишина)
Вообще то я ответил вам в теме про Covox, т.к. здесь это немного не по теме.
http://zx-pk.ru/threads/11501-covox-na-bk-0010-01.html?p=981014&viewfull=1#post981014