Вход

Просмотр полной версии : Помогите найти основной тест комманд электроники 60



Impartial
10.11.2011, 11:14
Жизнь заставляет заниматься извращением. Возникла необходимость в эмуляторе МС1201 для замены стоек управления ЧПУ.
В инете нашел несколько исходников и пытаюсь приспособить под свою задачу. Эмулятор будет работать на ARM Cortex M3, заменяя практически всю необходимую переферию станка.
Запустил с образом К1801РЕ1-000. Работает не так как надо. Где то ошибка в методах адресации. Помогите найти бинарник основного теста команд.
Или подскажите с какого адреса он находится в указанном ПЗУ.
Еще очень хотелось бы найти содержимое ПЗУ Электроники 60 К581РУ1-3.
И детальное описание К581ИК1,2.

С Уважением

nzeemin
10.11.2011, 12:01
Посмотрите, речь случайно не про этот тест?
http://zx.pk.ru/showthread.php?t=11557

http://ukncbtl.googlecode.com/svn/trunk/src/UKNCBTL.TB/data/test03_5.bmp

Описание этого теста здесь:
http://grands.land.ru/docs/test0505.htm

Кстати, выложите пожалуйста прошивку К1801РЕ1-000.

Patron
10.11.2011, 12:02
Помогите найти бинарник основного теста команд.В приложении - комплект тестов.

Подготовка и запуск тестирования выполняется командным файлом:


SPEED
R FTMON
C MXPSI
^C


Цепочный файл MXPSI.CCC содержит команды FTMON, запускающие отдельные тесты:



; ЦЕПОЧНЫЙ ФАЙЛ MXPSI.CCC
B/1
; ОСНОВНОЙ ТЕСТ КОМАНД:
L 791401
S
;-------------------------------------------
; ТЕСТ ПРЕРЫВАНИЙ:
L 791404
S
;-------------------------------------------
; ТЕСТ СИМВОЛЬНОГО ДИСПЛЕЯ:
L 012101
S
;-------------------------------------------
; СИСТЕМНЫЙ ТЕСТ
L SYST1
S
;-------------------------------------------
; ТЕСТ ПАРАЛЛЕЛЬНОГО ИНТЕРФЕЙСА
L LPIN
S
;-------------------------------------------
;ТЕСТ ПАМЯТИ:
L 791323
D 3454=1
S
E

...

Я уже год эмулирую МС1201 и к настоящему моменту мой эмулятор успешно проходит следующие тесты:

ОСНОВНОЙ ТЕСТ КОМАНД
ТЕСТ ПРЕРЫВАНИЙ
ТЕСТ СИМВОЛЬНОГО ДИСПЛЕЯ

:)

nzeemin
10.11.2011, 13:22
Impartial, насколько я понимаю, на этой плате стоит К1801ВМ1?
У меня есть код процессора, который проходит тест 791401, но пока не проходит 791404: http://code.google.com/p/bkbtl/source/browse/#svn%2Ftrunk%2Fsrc%2FBKBTL%2Femubase

Patron
10.11.2011, 14:06
У меня есть код процессора, который проходит тест 791401, но пока не проходит 791404Если не ошибаюсь - тест 791404 проверяет (в том числе и) соблюдение строгой последовательности обработки прерываний от последовательных портов при их одновременном приходе. Т.е. тест делает MTPS 0340, затем вызывает установку IRQ от портов передачи и приёма терминала не в том порядке, в каком эти прерывания должны обрабатываться, потом делает MTPS 0 и смотрит, прерывание от какого порта будет обработано первым. Если первым будет обработано прерывание от того порта, который первым выставил запрос IRQ, но по строгому порядку должен быть обслужен вторым - эмуляция не засчитывается :)

---------- Post added at 12:57 ---------- Previous post was at 12:36 ----------

Еще одна тонкость, необходимая для успешного прохождения эмулятором теста 791404 (если не ошибаюсь) в том, что прерывания по готовности выходного порта терминала должны отставать от команды записи в его регистр данных не менее чем на 4 команды процессора.

---------- Post added at 13:06 ---------- Previous post was at 12:57 ----------

Ну и, конечно - прерывание при установке бита 6 (бит разрешения прерываний) в регистре готового устройства (установлен бит 7) должно происходить строго через одну команду процессора после команды установки бита 6.

Если следующая команда сбросит бит 6 ( а значит - отменит IRQ ) - эмулятор должен выполнять HALT_Trap_To_SEL1+012, но если следующая команда не только сбросит бит 6, но и вызовет сброс шины - отмена IRQ должна проходить без проблем.

Impartial
10.11.2011, 14:16
Спасибо !
Буду пробовать. Я пытаюсь запустить исходник от Robert M Supnik с опциями эмуляции LSI 11/03.
Начал проект позавчера. Пока дошел до непоняток с регистром 177716.
При любых конфигурациях бит загрузки вылетает в HALT.
Буду начинать с теста команд, прерываний ... Ну и вспоминать ВМ1.
А в ПЗУ наверняка есть этот тест. По моему вызывался по Т0 с терминала ДВК. Адрес какой?

Кстати, выложите пожалуйста прошивку К1801РЕ1-000.
Эту прошивку я нашел где то в недрах этого сайта.

Impartial
10.11.2011, 14:32
Если первым будет обработано прерывание от того порта, который первым выставил запрос IRQ, но по строгому порядку должен быть обслужен вторым - эмуляция не засчитывается :)
По моему а ПДП11 нет программных приоритетов прерываний от УВВ . Приоритет определяется местом установки платы УВВ в корзине. Чем ближе к процессору ( в электрической цепочке линии IRQ) тем выше приоритет.

Patron
10.11.2011, 14:47
А в ПЗУ наверняка есть этот тест. По моему вызывался по Т0 с терминала ДВК. Адрес какой?

По T0 запускается выполнение всех тестов ( T1 - T6 ) подряд (таймер должен быть выключен).

В моём эмуляторе МС1201 успешно проходят тесты T1 - T4 :



160442
@T0
ТЕСТ 1

ТЕСТ 2
ПАМЯТЬ 020000 -157776
ПАМЯТЬ 000600 -017776

ТЕСТ 3

ТЕСТ 4
ВВЕДИТЕ СЛЕДУЮЩИЕ СИМВОЛЫ:

1 2 3 4 J C U K
1 2 3 4 J C U K
ТЕСТ 5

ДЕФЕКТ 71

002046
@



Код ПЗУ, запускающий тесты, выглядит так:



ROM:160754 Cmd_T: Call GetChar
ROM:160760 BiT #2000, R1
ROM:160764 BNE BadCmdChar
ROM:160766 Cmp #6, R0
ROM:160772 BCS BadCmdChar
ROM:160774 Mov R0, @#456
ROM:161000 ASL R0
ROM:161002 Add #T0, R0
ROM:161006 Mov R0, R4
ROM:161010 Mov (R4), R4
ROM:161012 Jmp @#160306

ROM:160306 Clr @#177644
ROM:160312 BiS #^B1100, @#177716 ; SEL1
ROM:160320 Jmp (R4)

ROM:161410 T0: .Word 167430
ROM:161412 T1: .Word 167652
ROM:161414 T2: .Word 164354
ROM:161416 T3: .Word 164354
ROM:161420 T4: .Word 164354
ROM:161422 T5: .Word 164354
ROM:161424 T6: .Word 164354

---------- Post added at 13:47 ---------- Previous post was at 13:42 ----------


По моему а ПДП11 нет программных приоритетов прерываний от УВВ . Приоритет определяется местом установки платы УВВ в корзине. Чем ближе к процессору ( в электрической цепочке линии IRQ) тем выше приоритет.Дело в том, что передающий и принимающий порты - это разные устройства, но находящиеся в одном контроллере. Их невозможно воткнуть в корзину в произвольном порядке, поэтому их приоритет относительно друг друга определяется схемотехникой самого контроллера. Следовательно, нарушение их приоритета означает физическое повреждение контроллера, что и проверяет тест.

Impartial
10.11.2011, 16:17
Дело в том, что передающий и принимающий порты - это разные устройства, но находящиеся в одном контроллере. Их невозможно воткнуть в корзину в произвольном порядке, поэтому их приоритет относительно друг друга определяется схемотехникой самого контроллера. Следовательно, нарушение их приоритета означает физическое повреждение контроллера, что и проверяет тест.
Судя по документации вставлять УВВ в корзину в произвольном порядке можно, но только без разрывов (по линии IAKO).
При получении сигнала VIRQ процессор (при разрешенных прерываниях)
формирует безадресный цикл шины (без SYNC) выставляя сигналы DIN и IAKO.
УВВ принимая сигнал IAKO блокирует его прохождение далее по цепочке и выставляет на шину адрес своего вектора прерывания, подтверждая выдачу сигналом RPLY и снимая свой запрос по линии VIRQ. Процессор снимает последовательно сигналы DIN,IAKO завершая цикл приема вектора, а устройство отвечает снятием сигнала RPLY.
Таким образом определить какое устройство вызвало прерывание можно только по адресу вектора им выданном и больше никак.
Повреждение блока прерывания в УВВ проверить так нельзя.

Patron
10.11.2011, 16:51
Судя по документации вставлять УВВ в корзину в произвольном порядке можноРечь идёт не о разных устройствах, находящихся на разных платах, а о разных портах (регистрах) одного устройства, схемотехнически реализованных на единой плате (в обсуждаемом случае - о передающем и приёмном портах терминала на плате МС1201 ), выдающих прерывания по разным векторам.

Так порт приёма контроллера терминала имеет регистр команд по адресу 0177560 и выдаёт прерывания по вектору 060, а порт передачи контроллера терминала имеет регистр команд по адресу 0177564 и выдаёт прерывания по вектору 064.

Когда за время маскирования прерываний успевают "созреть" запросы IRQ и от порта передачи терминала, и от порта приёма - то после MTPS 0 оба прерывания должны быть обслужены непосредственно одно за другим - в порядке аппаратного приоритета.

Порядок этот однозначно и единообразно определяется схемотехникой платы МС1201 и никак не зависит от её положения в корзине.

Impartial
10.11.2011, 17:21
Речь идёт не о разных устройствах, находящихся на разных платах, а о разных портах (регистрах) одного устройства, схемотехнически реализованных на единой плате (в обсуждаемом случае - о передающем и приёмном портах терминала на плате МС1201 ), выдающих прерывания по разным векторам.
С точки зрения архитектуры передатчик и приемник это разные устройства сидящие на общей шине, не зависимо от того где они физически находятся.
Скажите, а тест процессора зацикливается на неправильно отработанной команде?
Я правильно понял, что тест Т1 это тест процессора и находится он по адресу 167652?

---------- Post added at 17:21 ---------- Previous post was at 17:11 ----------

Patron
10.11.2011, 17:37
С точки зрения архитектуры передатчик и приемник это разные устройства сидящие на общей шине, не зависимо от того где они физически находятся.А с точки зрения теста платы МС1201 - передатчик и приёмник терминала находятся на плате МС1201 и порядок обслуживания их прерываний жёстко и однозначно задан схемотехникой платы МС1201. Поэтому, если данный порядок не соблюдается - тест сообщает об ошибке.


тест процессора зацикливается на неправильно отработанной команде?Выходит с сообщением номера дефекта ( номера дефектов указаны в документации - см. описание платы МС1201 (http://www.onlinedisk.ru/file/767266/) ).


Я правильно понял, что тест Т1 это тест процессора и находится он по адресу 167652?Согласно документу МИКРО-ЭВМ "ЭЛЕКТРОНИКА МС 1201" ТЕХНИЧЕСКОЕ ОПИСАНИЕ И ИНСТРУКЦИЯ ПО ЭКСПЛУАТАЦИИ (http://www.onlinedisk.ru/file/767266/) - тест процессора выполняется по команде "T3"

Impartial
10.11.2011, 18:08
Спасибо!
Тест команд прошел!
Буду городить вывод на терминал.

Impartial
13.11.2011, 20:31
Partron подскажите.
Вот трассировка начального старта с адреса 160000 при "1" в регистре 0177716, т,е выход в пультовый режим.

Input PC =
Start adr = 160000
160000 000406 BR .+16
160016 052737 BIS #10,@#177716
160024 042737 BIC #4,@#177716
160032 012706 MOV #177614,SP
160036 004767 JSR PC,160112
160112 012700 MOV #177614,R0
160116 012701 MOV #161330,R1
160122 012703 MOV #10,R3
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160126 012120 MOV (R1)+,(R0)+
160130 077302 SOB R3,160126
160132 000207 RTS PC
160042 005037 CLR @#177650
160046 005037 CLR @#177644
160052 005037 CLR @#177640
160056 005000 CLR R0
160060 013701 MOV @#177716,R1
160064 042701 BIC #177770,R1
160070 020100 CMP R1,R0
160072 001402 BEQ 160100
160074 005200 INC R0
160076 000774 BR 160070
160070 020100 CMP R1,R0
160072 001402 BEQ 160100
160100 006300 ASL R0
160102 062700 ADD #161432,R0
160106 011000 MOV (R0),R0
160110 000110 JMP (R0)
160440 000000 HALT
> PC=160442 PSW=10

Заканчивается командой HALT
Что я упустил? Что дальше должно быть?
При пуске с (177716=0,2) (вектор 24 и начальным загрузчиком НГМД) все заканчивается прерыванием по несуществующей команде (код 012).

Patron
13.11.2011, 22:21
выход в пультовый режим. Заканчивается командой HALTПроцессор 1801ВМ1 выполняет команду HALT, как программное прерывание особого типа ( HALT Trap ) по вектору 0160002.

Алгоритм HALT Trap выглядит так:


void VM1_CPU_Class::HALT_TrapToRomOffset( int nROM_Vector_Offset )
{
WORD(SEL1) |= BIT_3;

WORD(0177676) = PSW;
WORD(0177674) = PC;

word addr = 0160000 + nROM_Vector_Offset;

PC = WORD(addr);
PSW = WORD(addr+2);
}


Т.е. по команде HALT (как и по сигналу IRQ1, устанавливаемому переключателем "Пульт") процессор 1801ВМ1 устанавливает бит 3 в регистре SEL1 по адресу 0177716 (подключая ПЗУ пульта в адресное пространство), сохраняет PSW в слове памяти по адресу 0177676, сохраняет PC по адресу 0177674 и считывает вектор (т.е. PC и PSW) программы обработки прерывания HALT по адресу 0160002.


Что дальше должно быть?Поскольку по адресу 0160002 записаны 0160446 и 02340, то процессор запишет в PSW значение 02340, установив бит 10 и зафиксировав переход из режима USER в режим HALT, и перейдёт к выполнению программы обработки прерывания HALT по адресу 0160446.


При пуске с (177716=0,2) (вектор 24 и начальным загрузчиком НГМД) все заканчивается прерыванием по несуществующей команде (код 012).Это команда START, которая обычно используется для выхода из режима HALT в режим USER.

Процессор 1801ВМ1 имеет только две дополнительных команды - START и STEP, алгоритм выполнения которых следующий:


// STEP
case 014:
case 015:
case 016:
case 017:
nSTEP_Flag = 1;
// START
case 010:
case 011:
case 012:
case 013:
WORD(SEL1) = WORD(SEL1)&(~BIT_3);

PC = WORD(0177674);
PSW = WORD(0177676);
PSW &= ~(BIT_9|BIT_8);

continue;


Т.е. обе команды делают одно и то же, но STEP дополнительно запрещает прерывания на один шаг.

Impartial
13.11.2011, 22:53
Спасибо за точный и исчерпывающий ответ!

AlecV
15.11.2011, 13:13
Еще очень хотелось бы найти содержимое ПЗУ Электроники 60 К581РУ1-3.
И детальное описание К581ИК1,2.

Довольно детальное описание есть в книжке: Игорь Владимирович Захаров. Техническое обслуживание и эксплуатация МикроЭВМ «Электроника-60М»

http://bookinist.net/books/bookid-46221.html

Там же есть описание УПО (Устройство Последовательного Обмена), которое является простейшим СОМ-портом на мелкой логике и годится для консоли 177560. Глава 5.3

В конце книги есть трасса микрокода 581РУ в момент старта процессора.

Еще такой тупой вопрос: зачем вам эмулировать пультовой режим К1801ВМ1/2 ? Он очень ракообразный. У Электроники-60 пультовой режим реализован в микрокоде, т.е. исполнение микрокода PDP-11 останавливается и нижний микрокод выходит непосредственно на связь с консолью на 177560. В вашем случае - код ARM-а :D

Impartial
15.11.2011, 14:49
Еще такой тупой вопрос: зачем вам эмулировать пультовой режим К1801ВМ1/2 ? Он очень ракообразный. У Электроники-60 пультовой режим реализован в микрокоде, т.е. исполнение микрокода PDP-11 останавливается и нижний микрокод выходит непосредственно на связь с консолью на 177560. В вашем случае - код ARM-а :D

Если бы найти детальное описание 581 комплекта с содержимым ПЗУ, то конечно лучше написать эмулятор основываясь на этой архитектуре.
Но этого нет. Приходится делать то, на что есть хоть какое то описание.
Часть пути уже пройдена и начинать с начала уже нет времени.
А пультовый режим нужен только на этапе отладки и кривой он или нет уже не важно. Процессор это небольшая часть работы, больше проблем с эмуляцией переферии станка.

Patron
15.11.2011, 15:12
больше проблем с эмуляцией переферии станка.Если управляющие сигналы поступают в станок по нестандартным каналам, то помимо программной эмуляции посылающих эти сигналы контроллеров будет осуществлена и их совместимая с PC аппаратная имитация, верно?

Или стойка ЧПУ общается со станком по какому-то стандартному каналу типа RS-232..

Impartial
15.11.2011, 15:23
Вся периферия станка общается по кубасу.
В том то и задумка, чтобы всю периферию запихнуть в АРМ.
Я пытаюсь это сделать на STM32F103RET6.

Скажите какой адрес регистра SEL2?

Patron
15.11.2011, 15:48
Скажите какой адрес регистра SEL2?Адрес SEL2 = 0177714, но ни процессор, ни ПЗУ пульта не обращаются к этому регистру.

Impartial
15.11.2011, 16:10
Адрес SEL2 = 0177714, но ни процессор, ни ПЗУ пульта не обращаются к этому регистру.
А как монитор узнает сколько памяти установлено?
И еще вопрос. Включаются области ПЗУ установкой или сбросом битов в 0177716 Ф1,Ф2?

161012 000167 JMP 160306
160306 005037 CLR @#177644
160312 052737 BIS #14,@#177716
160320 000114 JMP (R4)

Вот после этого куска где установлены оба бита эмулятор правильно выбрал следующую команду или должен был уйти на обработку ошибки обращения к каналу? Это кусок теста процессора на который выход по Т3 с пультового режима.
Сейчас после команды 160320 000114 JMP (R4) происходит прерывание, т.е эта команда выполняется.

Patron
15.11.2011, 18:43
А как монитор узнает сколько памяти установлено?При начальной загрузке выполняется чтение/запись ячеек памяти с некоторым шагом (возможно = 1К) и при возникновении TrapTo_04 - предыдущий успешно считанный и записанный адрес принимается за вершину памяти.


И еще вопрос. Включаются области ПЗУ установкой или сбросом битов в 0177716 Ф1,Ф2?
1. Код ПЗУ, содержащий загрузчик с DX, всегда виден в диапазоне 0173000..0174000.
2. При появлении на шине сигнала DCLO плата МС1201 устанавливает в 0177716 (SEL1) бит 2, подключая в адресное пространство код ПЗУ в диапазоне 0160000..0163777.
3. При обработке HALT_Trap процессор 1801ВМ1 устанавливает в SEL1 бит 3, подключая в адресное пространство код ПЗУ в диапазоне 0160000..0172777.
4. При выполнении команд START и STEP процессор 1801ВМ1 сбрасывает в SEL1 бит 3, пытаясь полностью отключить ПЗУ пульта из адресного пространства, но если бит 2 SEL1 не был до того сброшен - при сбросе бита 3 SEL1 код ПЗУ отключается только в диапазоне 0164000..0172777.



161012 000167 JMP 160306
160306 005037 CLR @#177644
160312 052737 BIS #14,@#177716
160320 000114 JMP (R4)

Вот после этого куска где установлены оба бита эмулятор правильно выбрал следующую команду или должен был уйти на обработку ошибки обращения к каналу? Это кусок теста процессора на который выход по Т3 с пультового режима.
Сейчас после команды 160320 000114 JMP (R4) происходит прерывание, т.е эта команда выполняется.Зависит от значения R4. Если в R4 находится адрес программы обработки команды T3 в ПЗУ пульта - то установка битов 2 и 3 SEL1 гарантирует присутствие кода ПЗУ пульта в адресном пространстве.

Impartial
16.11.2011, 12:07
1. Код ПЗУ, содержащий загрузчик с DX, всегда виден в диапазоне 0173000..0174000.
2. При появлении на шине сигнала DCLO плата МС1201 устанавливает в 0177716 (SEL1) бит 2, подключая в адресное пространство код ПЗУ в диапазоне 0160000..0163777.
3. При обработке HALT_Trap процессор 1801ВМ1 устанавливает в SEL1 бит 3, подключая в адресное пространство код ПЗУ в диапазоне 0160000..0172777.
4. При выполнении команд START и STEP процессор 1801ВМ1 сбрасывает в SEL1 бит 3, пытаясь полностью отключить ПЗУ пульта из адресного пространства, но если бит 2 SEL1 не был до того сброшен - при сбросе бита 3 SEL1 код ПЗУ отключается только в диапазоне 0164000..0172777.

Я не корректно задал вопрос.
В коде начального старта сразу идет установка бита 3 и сброс бита 2 в 0177716

160000 000406 BR .+16
160016 052737 BIS #10,@#177716
160024 042737 BIC #4,@#177716
160032 012706 MOV #177614,SP

Если бы запись "0" в бит 2 закрывала ПЗУ с адреса 160000, то все дальнейшее не имело бы смысла.
Похоже, что "0" открывает скрытое ПЗУ с адреса 160000.
Хотя исходя из логики работы шины "0" это "1" ведь шина инверсная.

Я не внимательно прочитал Ваш пост, извиняюсь.


Т.е. по команде HALT (как и по сигналу IRQ1, устанавливаемому переключателем "Пульт") процессор 1801ВМ1 сохраняет PSW в слове памяти по адресу 0177676, сохраняет PC по адресу 0177674, устанавливает бит 3 в регистре SEL1 (по адресу 177716), подключая ПЗУ пульта в адресное пространство, считывает адрес начального пуска из старшего байта SEL1, прибавляет к нему 02 и считывает оттуда вектор (т.е. PC и PSW) программы обработки прерывания HALT.

Что однозначно указывает, что процессор работает в HALT моде, установка бита 3 в 0177716 или установка бита 10 в PSW?

Patron
16.11.2011, 12:46
В коде начального старта сразу идет установка бита 3 и сброс бита 2 в 0177716Бит 2 сбрасывается для того, чтобы после выполнения команды START код ПЗУ пульта полностью отключился из адресного пространства. Если бит 2 останется установленным, что сброс бита 3, выполняемый командой START, приведёт к отключению кода ПЗУ из адресного пространства только в диапазоне адресов 0164000..0172777.


Если бы запись "0" в бит 2 закрывала ПЗУ с адреса 160000, то все дальнейшее не имело бы смысла.Если установлен бит 3 в SEL1, то значение бита 2 не играет роли. Бит 2 в SEL1 влияет на подключение/отключение кода ПЗУ только тогда, когда бит 3 в SEL1 сброшен.



Что однозначно указывает, что процессор работает в HALT моде, установка бита 3 в 0177716 или установка бита 10 в PSW?Установка бита 10 в PSW. Единственное отличие HALT-моды процессора 1801ВМ1 от USER-моды в том, что прерывание зависания, вызывающее в USER-моде TrapTo_04, в HALT-моде обрабатывается как HALT_TrapTo_SEL1+02.

Impartial
17.11.2011, 10:53
Patron, Извиняюсь за навязчивость.
Скажите назначение адреса 0177776 и если можно список всех ячеек памяти важных для платы МС1201. Я имею в виду системных без периферии.

Patron
17.11.2011, 14:19
Скажите назначение адреса 0177776 и если можно список всех ячеек памяти важных для платы МС1201. Я имею в виду системных без периферии.Если запись по адресу 0177776 не приводит к TrapTo_04, то тест процессора сообщает об обнаружении дефекта 12 - "Ошибка при отработке прерывания по несуществующему адресу".

У процессора 1801ВМ1 есть регистры, которые отсутствуют у процессора LSI-11 ( "Электороника 60" ). Вряд ли есть смысл заниматься их эмуляцией при условии совместимости с LSI-11.

Для работы ПЗУ пульта платы МС1201 и команд START и STEP процессора 1801ВМ1 - требуется наличие ячеек ОЗУ в диапазоне адресов 0177600..0177677.

Impartial
17.11.2011, 15:23
Patron, Огромное Вам спасибо за консультации и поддержку!
Прошли тесты 1,2,3 и 4, т.е правильно сделана эмуляция терминала.
Будем работать дальше по периферии. Ну и сделаем (на досуге) поддержку дисковода, чтобы поиграть в XONIX :)

Patron
17.11.2011, 17:54
сделаем (на досуге) поддержку дисководаПредлагаю первым делом реализовать поддержку псевдоустройства HD, позволяющего подключать к эмулятору образы любых размеров.

В приложении - исходник драйвера HD.SYS для RT-11 и образ загрузочного диска HD с тестами TMOS для платы МС1201.

Для поддержки устройства HD эмулятор должен обслуживать его регистры HDCSR = 0177720 и HDDATA = 0177722.

Драйвер HD передаёт в HDCSR следующие команды:



SetUni = 1 ; Set HD unit number
SetBlk = 2 ; Set HD block number
SetBuf = 3 ; Set memory buffer address
SetWCn = 4 ; Set operation word count
CmdRea = 5 ; Execute READ on HD
CmdWri = 6 ; Execute WRITE on HD
GetSiz = 7 ; Get HD size in blocks.

Если после получения команды эмулятор установит старший бит HDCSR - это будет признак ошибки.

"memory buffer address", записываемый драйвером HD в регистр HDDATA перед выдачей в HDCSR команды 3 ( Задать адрес в памяти ) - это адрес эмулируемой памяти ДВК, начиная с которого эмулятор должен читать или писать данные, при получении в HDCSR команды 5 (Читать образ диска в память) или 6 (Писать память в образ диска).

Смещение от начала образа диска для команд чтения и записи (в блоках по 512 байт) задаётся содержимым HDDATA при получении эмулятором в HDCSR команды 2 ( Задать номер блока ).

При получении в HDCSR команды 7 ( Сообщить размер образа ) эмулятор должен записать в HDDATA размер файла образа (в блоках по 512 байт), подключенного к приводу, заданному до того командой 1 ( Задать номер привода ), или 0, если к этому приводу образ диска в эмуляторе не подключен. При выполнении команды 7 признак ошибки не устанавливается.

Устройство HD должно выполнять команды "мгновенно" для обслуживаемого процессора, поэтому на время выполнения команд HD - процессор надо останавливать.

Impartial
17.11.2011, 19:33
Предлагаю первым делом реализовать поддержку псевдоустройства HD, позволяющего подключать к эмулятору образы любых размеров.

В приложении - исходник драйвера HD.SYS для RT-11 и образ загрузочного диска HD с тестами TMOS для платы МС1201.

Для поддержки устройства HD эмулятор должен обслуживать его регистры HDCSR = 0177720 и HDDATA = 0177722.

Драйвер HD передаёт в HDCSR следующие команды:

А каким образом будет происходить загрузка с этого диска? Ведь в ПЗУ, насколько я понял, нет для него загрузчика.
А образа нет поменьше размером, а то этот не влезет в микроконтроллер.
В нем 512кб флеша, из них около 18кб сам эмулятор, остальное можно под диск выделить.

Patron
17.11.2011, 21:59
А каким образом будет происходить загрузка с этого диска? Ведь в ПЗУ, насколько я понял, нет для него загрузчика.Загрузка с любого дискового устройства RT-11 заключается в чтении блока 0 (т.е. первых 512 байтов образа диска) в эмулируемую память, начиная с адреса 0, и передаче управления на адрес 0.

Но сначала нужно записать в PSW значение 0340, а в регистр R0 - номер загружаемого привода ( в диапазоне 0 .. 7 ).

Т.е. если загружаемый образ будет эмулироваться подключенным к приводу HD0 - регистр R0 процессора нужно обнулить.


А образа нет поменьше размером, а то этот не влезет в микроконтроллер.В приложении - образ размером 380К.

Открыв образ при помощи любой утилиты просмотра образов дисков RT-11 ( например, использовав плагин для Total Commander (http://zx.pk.ru/showthread.php?t=11015) ), можно обнаружить, что там есть довольно много файлов, которые не особо важны для тестирования, например - экранный редактор текстов, ассемблер, интерпретатор BASIC и даже альтернативный монитор операционной системы.

Если поставить задачу создания минимального по размеру загрузочного образа HD, который не будет пригоден ни для чего, кроме запуска тестов TMOS - то образ загрузочного диска можно сделать гораздо меньше ( ~ 130К ) - см. второй вариант в приложении.

Impartial
18.11.2011, 11:21
Если после получения команды эмулятор установит старший бит HDCSR - это будет признак ошибки.

"memory buffer address", записываемый драйвером HD в регистр HDDATA перед выдачей в HDCSR команды 3 ( Задать адрес в памяти ) - это адрес эмулируемой памяти ДВК, начиная с которого эмулятор должен читать или писать данные, при получении в HDCSR команд 5 (Читать образ диска в память) и 6 (Писать память в образ диска).

Смещение от начала образа диска для команд чтения и записи (в блоках по 512 байт) задаётся содержимым HDDATA при получении эмулятором в HDCSR команды 2 ( Задать номер блока ).

При получении в HDCSR команды 7 ( Сообщить размер образа ) эмулятор должен записать в HDDATA размер файла образа (в блоках по 512 байт), подключенного к приводу, заданному до того командой 1 ( Задать номер привода ), или 0, если к этому приводу образ диска в эмуляторе не подключен. При выполнении команды 7 признак ошибки не устанавливается.

В регистре HDCSR = 0177720 используются только биты 0,1,2,15 или есть еще какие то биты управления? Что является признаком начала выполнения операции? Просто запись в этот регистр?

Patron
18.11.2011, 12:02
В регистре HDCSR = 0177720 используются только биты 0,1,2,15 или есть еще какие то биты управления? Что является признаком начала выполнения операции? Просто запись в этот регистр?Все ответы содержит исходник драйвера HD.MAC



;
; HD command codes (for HD command reg: 177720 )
;

SetUni = 1 ; Set HD unit number
SetBlk = 2 ; Set HD block number
SetBuf = 3 ; Set memory buffer address
SetWCn = 4 ; Set operation word count
CmdRea = 5 ; Execute READ on HD
CmdWri = 6 ; Execute WRITE on HD
GetSiz = 7 ; Get HD size in blocks.

;
; I/O request entry point.
;

.DrBeg HD

Mov HDCQE, R4 ; R4 -> Queue element
Mov (R4)+, R2 ; R2 = Block number
MovB (R4)+, R1 ; R1 = SpFun code
BNe SPFUN ; Is it SpFun call?
MovB (R4)+, R1 ; R1 = Unit number
BiC #^c7, R1 ; Force it to be 0..7
Mov R1, @#HD$CSR+2 ;
Mov #SetUni, @#HD$CSR ; Select unit for operations.

Tst @#HD$CSR ; Valid unit number?
BMi HDERR ; No - Error!

Mov R2, @#HD$CSR+2 ;
Mov #SetBlk, @#HD$CSR ; Set block number.
Tst @#HD$CSR ; Valid?
BPl 3$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - return EOF
Br DONE ;
3$:
Mov (R4)+, @#HD$CSR+2 ;
Mov #SetBuf, @#HD$CSR ; Set buf addr

Mov (R4), R1 ; R1 = word count
BEq DONE ; R1 = 0 - Nothing to do
BPl HDREAD ; > 0 - Read
EMWRIT: ; < 0 - Write
Neg R1 ; Get true word count
Mov R1, @#HD$CSR+2 ; ...
Mov #SetWCn, @#HD$CSR ; and set it.
Tst @#HD$CSR ; Valid?
BPl 4$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - set EOF bit
4$:

Mov #CmdWri, @#HD$CSR ; Make Write to HD
Br CHECK ; OK?
HDREAD:
Mov R1, @#HD$CSR+2 ;
Mov #SetWCn, @#HD$CSR ; Set word count
Tst @#HD$CSR ; Valid?
BPl 5$ ; Yes - OK
Mov HDCQE, R4 ;
BiS #EOF$, @-(R4) ; Else - set EOF bit
5$:
Mov #CmdRea, @#HD$CSR ; Make Read from HD
CHECK:
Tst @#HD$CSR ; Error?
BPl DONE ; No - OK
; Else - abort
EMINT:
HDINT:
HDERR:
Mov HDCQE, R4 ;
BiS #HDERR$, @-(R4) ; Set ERROR bit in CSW.
DONE:
.DRFIN HD


Т.е. в регистре HDCSR = 0177720 используются только биты 0,1,2,15, а признаком начала выполнения операции является просто запись в регистр.

Из текста драйвера также можно извлечь информацию об одном довольно тонком моменте. Если операционная система запрашивает установку позиции чтения/записи в пределах образа диска, но запрашивает чтение/запись большего числа слов, чем остаётся до конца образа - то драйвер, получив от эмулятора признак ошибки в ответ на команду установки счётчика слов - всё же выполняет чтение/запись, чтобы прочитать/записать те слова, которые расположены в образе между установленной позицией чтения/записи и концом образа.

Т.е. эмулятор, получив слишком большой счётчик слов будущей операции - должен не только сообщить об ошибке, но и установить свой внутренний счётчик слов чтения/записи на максимально допустимое значение.

Impartial
19.11.2011, 02:33
Patron, Пришел вот к этому (сообщения с гипертерминала)



HD Boot-I-Cold boot..

HD (177720) disk driver v1.0b 2011


И зависание на этом участке


154000 001337 BNE 153700
154002 016705 MOV 153426,R5
154006 001217 BNE 153446
154010 012704 MOV #200,R4
154014 001007 BNE 154034
154034 100434 BMI 154126
154036 005067 CLR 154012
154042 106427 MTPS #0
154046 016705 MOV 137364,R5
154052 005765 TST 36(R5)
154056 001403 BEQ 154066
154060 032715 BIT #100200,(R5)
154064 003403 BLE 154074
154074 000240 NOP
154076 000240 NOP
154100 112767 MOVB #200,154012
154106 000771 BR 154072
154072 000735 BR 153766
153766 106427 MTPS #340
153772 000240 NOP
153774 016704 MOV 137720,R4
154000 001337 BNE 153700

Загружен минимальный образ из рекомендованных Вами выше.
Не подскажете, чего ждет программа?
Может прерывания по таймеру? (пока не реализовано)

Patron
19.11.2011, 04:15
Не подскажете, чего ждет программа?
Может прерывания по таймеру?В приложении - лог загрузки того же образа с устройства HD0: при выключенном таймере до появления на экране версии монитора:



HD Boot-I-Cold boot..

HD (177720) disk driver v1.0b 2011

RT-11SB (S) V05.07

shattered
05.06.2016, 21:46
Пишу эмулятор МС1201.02 в mame/mess и пока в таком же тупике, как и Impartial :)

Сравниваю свой трейс с эталоном, пока не очень успешно. Но эталон, похоже, делает меньше чтений с диска, чем мой вариант (загружен tstmin.dsk):


[:vhd] 0.027152 at ':maincpu' (0254): I/O [:vhd] read of 1024 words, lbn 000002 memory 001000
[:vhd] 0.034369 at ':maincpu' (0254): I/O [:vhd] read of 512 words, lbn 000006 memory 005006
[:vhd] 0.041900 at ':maincpu' (0254): I/O [:vhd] read of 137 words, lbn 000232 memory 005006
[:vhd] 0.708941 at ':maincpu' (0254): I/O [:vhd] read of 167 words, lbn 000235 memory 001000
[:vhd] 0.709160 at ':maincpu' (0254): I/O [:vhd] read of 163 words, lbn 000272 memory 004006
[:vhd] 0.709490 at ':maincpu' (0254): I/O [:vhd] read of 256 words, lbn 000056 memory 005006
[:vhd] 0.709730 at ':maincpu' (0254): I/O [:vhd] read of 366 words, lbn 000056 memory 156444
[:vhd] 0.756200 at ':maincpu' (0254): I/O [:vhd] read of 230 words, lbn 000231 memory 005006
[:vhd] 0.756425 at ':maincpu' (0254): I/O [:vhd] read of 10624 words, lbn 000241 memory 106044
[:vhd] 0.756656 at ':maincpu' (0254): I/O [:vhd] read of 143 words, lbn 000234 memory 001000
[:vhd] 0.762560 at ':maincpu' (0254): I/O [:vhd] read of 96 words, lbn 000237 memory 001000
[:vhd] 0.764965 at ':maincpu' (157672): I/O [:vhd] read of 74 words, lbn 000233 memory 001000
[:vhd] 0.767345 at ':maincpu' (157672): I/O [:vhd] read of 158 words, lbn 000236 memory 001000
[:vhd] 0.861819 at ':maincpu' (157672): I/O [:vhd] read of 512 words, lbn 000361 memory 125002
[:vhd] 0.866176 at ':maincpu' (157672): I/O [:vhd] read of 512 words, lbn 000365 memory 125002
[:vhd] 0.869014 at ':maincpu' (157672): I/O [:vhd] read of 512 words, lbn 000006 memory 127002
[:vhd] 0.946583 at ':maincpu' (157672): I/O [:vhd] read of 256 words, lbn 000366 memory 125720
[:vhd] 0.984797 at ':maincpu' (157672): I/O [:vhd] read of 512 words, lbn 000361 memory 124720
[:vhd] 0.988677 at ':maincpu' (157672): I/O [:vhd] read of 256 words, lbn 000104 memory 126720
[:vhd] 0.995230 at ':maincpu' (157672): I/O [:vhd] read of 1280 words, lbn 000105 memory 001000

Patron
06.06.2016, 11:31
Сравниваю свой трейс с эталоном, пока не очень успешно.Я в таких случаях вывожу для обоих эмуляторов дизассемблер хода загрузки и потом сравниваю последовательности выполнявшихся процессором команд, что позволяет найти место, где "пути эмуляторов разошлись".

shattered
07.06.2016, 01:20
Так и делаю, слегка спотыкаясь о то, что дизассемблеры разные -- CALL vs. JSR, MOV (SP)+, R3 vs. POP R3 итд итп. Пока нашел разницу в том, что в эталоне не эмулируется EIS (MUL и пр.).

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

Выключение эмуляции MUL и пр. не помогло. RT-11 стартует, но с консолью не общается -- похоже, потому, что EMT 351 вместо функции вывода символов вызывает пустую процедуру. Разницы в состоянии регистров на момент 146140 нет.

эталон

PC[147420] PSW[240] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[140124] R6[007754] : MTPS #0.
PC[147424] PSW[000] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[140124] R6[007754] : JMP 146132
PC[146132] PSW[000] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[140124] R6[007754] : BIS #64., @-3444.(PC)
PC[146140] PSW[000] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[140124] R6[007754] : CALL @-3330.(PC)
!!!
PC[147454] PSW[340] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[140124] R6[007746] : JSR R5, 153622
PC[153622] PSW[340] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[147460] R6[007744] : MOV R4, -(SP)
PC[153624] PSW[340] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[147460] R6[007742] : INC #-1.
PC[153630] PSW[344] R0[143306] R1[010000] R2[140430] R3[137202] R4[000015] R5[147460] R6[007742] : BGT 153642

mess

147420 - MTPS #$000000
147424 - JMP $146132
146132 - BIS #$000100, @$137354
146140 - JSR @$137542
!!!
151370 - NOP
151372 - NOP
151374 - CEC
151376 - RTS

Patron
07.06.2016, 23:31
RT-11 стартует, но с консолью не общается -- похоже, потому, что EMT 351 вместо функции вывода символов вызывает пустую процедуру.Загрузчик RT-11 ( из фала BSTRAP.MAC ) активно патчит ядро в момент загрузки, в зависимости от найденной аппаратуры. Если в одном и том же месте в ядре вызываются разные подпрограммы - наверняка это загрузчик постарался.

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

shattered
09.06.2016, 22:34
Пожалуй, сначала надо починить cpu core так, чтобы проходили встроенные тесты прошивки 055...

https://img-fotki.yandex.ru/get/93949/264743.4/0_b4461_92b87da7_orig.png (https://fotki.yandex.ru/next/users/shattered/album/137130/view/738401)

Кстати, не откажусь от описания ошибок этого теста -- в 0.305.019 ТО (1983 год) описывается, видимо, прошивка 000.

Patron
10.06.2016, 02:39
в 0.305.019 ТО (1983 год) описывается, видимо, прошивка 000Тесты там, вроде, одинаковые - поэтому и номера ошибок совпадают.

shattered
10.06.2016, 08:55
не-а

не совпадают ни номера, ни то, какие сообщения ожидаются.

shattered
16.06.2016, 23:53
Ответ был довольно очевиден -- нужно читать ТО более позднего выпуска, хоть и с тем же номером -- http://www.emuverse.ru/downloads/computers/DVK/docs/MC1201/MC1201.02_TO.djvu