https://shop.trenz-electronic.de
там и алтера и ксайлинкс в наличии и с документацией.
Вид для печати
https://shop.trenz-electronic.de
там и алтера и ксайлинкс в наличии и с документацией.
Кстати, есть же еще ReVerSE-U16: с SD, HDMI и USB host на борту, на основе Cyclone-IV и SDRAM.
Идеально же! :)
только у меня нет этой борды, чтоб поиграться с портированием
Там по прежнему до 22k LE? Тогда не совсем идеально.
J-11? Почему? Какая оценка?
Для оценки я смотрю на RISC-V реализованный на SpinalHDL в разных конфигурациях, включая I/D кеш, MMU и прочие радости, чтоб поднять Linux. Примеры 2х SoC:
https://github.com/SpinalHDL/VexRiscv
А что J11? Правильно написанный J11 вполне влезет в 5К. А если регистровый файл ляжет в RAM-блок то и в 4K должен уместиться.
Вон в 22K целый PC/XT засовывают, норм.
- - - Добавлено - - -
Да, я как бы догадывался что там скромно, но чтобы оно сблекджеком и продажными девушкамиMMU и cache влазило в 3K LUT - это круто.
В качестве эксперимента, попробовал сделать плату МС1201.01. Воткнул процессор 1801ВМ1 со своей обвязкой, ПЗУ 000, сделал переключатель карты памяти через регистр начального пуска. Получилась, по сути, ЭВМ ДВК-1, только вместо внешнего терминала 15ИЭ-00-013 используется КСМ.
Грузиться эта плата умеет только с дисков DX (вот и пригодились, наконец):
RT-11 v5.4 грузиться отказывается, но 5.01 вполне загрузилась. Почему-то RESORC показывает поддержку EIS, хотя EIS в ВМ1 отродясь не было, кроме команды MUL в последних ревизиях.Код:160442
@D0
SL V08.00 [SW] sTOROVEWYH s.w. 1988
RT-11SJ V05.01
.SET TT QUIET
.
.SH CONF
RT-11SJ V05.01
Booted from DX0:RT11SJ
USR is set SWAP
EXIT is set SWAP
KMON is set NOIND
TT is set QUIET
ERROR is set ERROR
SL is set OFF
EDIT is set Unknown
KMON nesting depth is 3
LSI 11 or PDP 11/03 Processor
56KB of memory
Extended Instruction Set (EIS)
60 Cycle System Clock
FPU support
Если кому интересно, все это лежит в экспериментальной ветке dvk1 репозитория. Модулем верхнего уровня надо назначить mc1201_01 вместо mc1201_02.
Конечно, смысла особого в этой плате нет - МС1201.02 умеет все то же самое и даже гораздо больше. Но получился прикольный такой конструктор ЭВМ. Наверное, можно и Электронику-60 сделать, собрав процессорную плату на LSI-11, но, опять же, пользы от нее будет немного.
Это и есть RT-11 от DEС. Не рафос и не фодос.... Удаление стартового файла ничего не меняет.
А вот если установить параметр VM1_CORE_MULG_VERSION =0, выкинув поддержку MUL, то RESORC забывает о поддержке EIS. Получается, RESORC определяет поддержку EIS только по наличию команды MUL.
Тогда понятно.
Не совсем так. Поддержку EIS (и именно по наличию команды MUL - плюс правильность результата 3*3) определяет вторичный загрузчики запоминает во втором слове конфигурации системы.
RESORC тупо показывает оттуда:Код:45 ;+
46 ; Check if the processor has FULL extended instruction set.
47 ;-
48 001676 012703 000003 MOV #<3>,R3 ;Set up R3 to ...
49 001702 070303 MUL R3,R3 ; ... test for EIS
50 001704 022703 000011 CMP #<3*3>,R3 ;Did it multiply right?
51 001710 001401 BEQ 40$ ;Yes
52 001712 005011 CLR @R1 ;No, don't set the bit
53 001714 CK.R1 TSEIS,+2
54 001714 052110 40$: BIS (R1)+,@R0 ;Set bit if EIS present and working
Код:90$: BIT #C2.EIS,R4 ;How about EIS?
BEQ 100$ ;Branch if no
PRINT EISET,<Extended Instruction Set (EIS)>
Даже так? Но ведь если команды MUL нет в процессоре, загрузчик должен трапнуться. Или там и это предусмотрено?
Раз уж начал, попробовал собрать ЭВМ из остальных имеющихся процессоров - М2 и М4.
С процессором М2 все более-менее работает нормально. RT-11 грузится, вся периферия работает как надо. Правда, во встроенном в микрокод мониторе загрузчиков нет в принципе, но с RK и MY можно загрузиться буквально парой команд, спасибо DMA.
Единственная замеченная проблема - почему-то при запуске процессора командой G с адреса 0 он начинает проходить загрузчик по шагам, как будто включен переключатель HALT (программа-пульт). С некоторого момента это проходит, и дальше загрузка идет как ей положено:
Может быть, я чего-то не понимаю, и так и должно быть... Я электронику-60 в свое время вживую так и не пощупал, а теперь уж и пощупать негде.Код:000000
@172140/000040 37
172142/000000 0
@0G
000000
@P
000002
@P
000036
@P
000040
@P
000430
@P
RT-11SJ V05.01
?KMON-F-File not found DK:STARTS.COM
.SH CONF
RT-11SJ V05.01
BOOTED FROM MY0:RT11SJ
USR IS SET SWAP
EXIT IS SET SWAP
KMON IS SET NOIND
TT IS SET NOQUIET
ERROR IS SET ERROR
SL IS SET OFF
EDIT IS SET UNKNOWN
KMON NESTING DEPTH IS 3
LSI 11 OR PDP 11/03 PROCESSOR
56KB OF MEMORY
EXTENDED INSTRUCTION SET (EIS)
FLOATING INSTRUCTION SET (FIS)
60 CYCLE SYSTEM CLOCK
Поскольку процессор М4 на 100Мгц не работает, я его запустил на 50 Мгц, взяв тактовую частоту прямо с кварца платы. Все заработало, и проблема с пошаговым прохождением загрузчика та же самая.
M4 нет, на M2 надо распаять выкушенные кондёры, так что проверить не могу, но что то мне подсказывает, что так не должно быть.. По адресу 0 - NOP, по адресу 2 - BR на 36, по адресу 36 - BR на 40, по адресу 40 - JMP на 430
Это понятно, исходный текст загрузчика ведь в самом драйвере лежит.
Проблема выглядит так. Любые адрес вплоть до 430 процессор идет по шагам. Начиная с 432 - запускается в нормальном режиме.
Более того, проблема проявляется ровно 1 раз после заливки прошивки в плату. Если попробовать повторно загрузить систему - запускается нормально прямо с адреса 0. Странный такой косяк получился. Но я с процессором М2 плотно не разбирался, просто воткнул его на место ВМ2 - он подходит почти порт-в-порт. Может быть, и не учел каких-то тонкостей.
Как будто какой то сигнал вначале не в том состоянии...
Ну, по логу можно сказать и так 5 первых команд в пошаговом режиме, потом старт. Можно попробовать стартануть сразу с адреса 430, ещё вариант - записать по адресу 1000 - 137, по адресу 1002 - 430 и попробовать стартануть.. Можно ещё варианты придумать для тестов
Он не просто подходит - оно именно так и задумывалось :).
Я бы посмотрел что там на HALT. Возможно процессор рановато стартует и HALT еще не снят.
У меня тесты заводские стартует нормально, никуда не впадает.
- - - Добавлено - - -
Поскольку M2 и M4 ну принципиально разные, то скорее всего таки что-то внешнее.
О, так на это я первым делом подумал..Притянул сигнал к 0, больше это прерывание в принципе произойти не может. В PSW лежит 0, если верить монитору (RS/), то есть бит Т не установлен. Ну а какие еще сигналы могут вызвать пошаговый режим, я понятия не имею. Внешних сигналов таких вроде нет, а потроха процессора для меня полная загадка. В отличие от великих людей вроде VSLAV, Titus, Alex_k, я процессор рассматриваю как черный ящик с ножками-портами. Хотя желание разобраться в нем имеется, но это надо собраться и выделить пару полных дней...Код:.vm_halt(1'b0)
Предполагаю, что тесты запускались с bsel=00. А у меня bsel=10, поскольку другие режимы запуска в моей системы не имеют смысла - нет в адресном пространстве нм одного ПЗУ. Но как это может повлиять, я, опять-таки, понятия не имею.
- - - Добавлено - - -
Блин. Понял. Есть же в мониторе команда М.
Вот оно как. Код 3 - Ошибка обращения к каналу. Адрес - 177774. При этом выполняется команда NOP.Код:000000
@172140/000040 37
172142/000000 0
@0G
000000
@M000013
@R6/177774
@
По этому адресу, естественно, нет ничего. Чудеса, однако.
Попробуй руками установить стек (10000) перед запуском с 0
Не, ну если руками установить стек не в 0, то оно начинает работать нормально. Я это сразу проверил, но это ничего не объясняет.
С какого бодуна команда NOP лезет в стек?
Я думаю, это не команда NOP, а команды G и P - надо смотреть логику их выполнения
Я с таким же сталкивался на 1831ВМ1 и J11, если настроить при старте сразу выход в MicroODT
А чего его там смотреть - первые пять (примерно) команд я уже наизусть помню. А вот чего там делается с 430 адреса - не, не смотрел
- - - Добавлено - - -
Я на вскидку полазал по коду, но где там MicroODT - не нашёл. Может, Vslav подскажет...
Ну, где там ODT вроде понятно, и обработчик команды G есть:Но тут надо знать знать внутреннюю архитектуру, систему команд... Я об этом и говорил, что потроха процессора для меня пока загадка.Код:cmd_g: mw RDSTL,PCL ;
ll 0,RIRL ;
jsr putch ;
jsr putch ;
sw RPSWL,RPSWL ;
lcf NZVC,RPSWL ;
jmp 1$ ;
;
.loc 0x196 ;
1$: ri i4 ; reset T-bit interrupt
jmp 2$ ;
;
.loc 0x19A ;
2$: si i5 ; disable interrupts
jmp resop ;
;
.loc 0x19E ;
resop: jsr sinit ; performs RESET
jmp rsvc0 ; instruction
Мой тест из ODT по @1622G тоже на LSI-11 не стартует, и тоже код 3 - двойная ошибка шины светится. Если предварительно установить SP - работает. Если запретить прерывание таймера - тоже работает. Похоже оно пытается таймер обработать сразу и умирает. Почему пытается - непонятно, прерывания должны быть запрещены.
Интересно получается. Попробовал повторить эксперимент с отключенным таймером.Ситуация изменилась. Теперь процессор влетает в двойной таймаут шины ровно 1 раз, перед выполнением кода загрузчика. А после выполнения первой же инструкции все начинает работать. Действительно, при этом PSW=0, прерывания должны быть запрещены. Странно.Код:000000
@172140/000040 37
172142/000000 0
@0G
000000
@M000013
@R6/177774
@P
RT-11SJ V05.01
?KMON-F-File not found DK:STARTS.COM
.
Проверить бы это на реальной электронике-60. Только где ж ее взять...
А почему запрет прерываний устанавливается в 5-м разряде? Вроде в LSI-11 5-й и 6-й разряды не используются, запрет прерываний устанавливается в 7-м разряде.
Сигнал RESET по идее должен сбросить и внутренний триггер сетевого таймера в процессоре.
forth32, а какие у вас в первичном загрузчике значения ячеек 0100 и 0102. В стандартном драйвере там нули, т.е. будет перезапуск первичного загрузчика. Также в стандартном драйвере после команды JMP исполняется команда установки указателя стека MOV #10000, SP.
Стандартно, по адресу 0 - NOP, по адресу 2 - BR 36, по адресу 36 - BR 40 (если использовать стандартные макросы)
Дальше обычно делается похоже - по адресу 40 - JMP на точку входа загрузчика, но переход может отличаться адресам. В примере ниже - JMP @#574. Обычно так же - первая команда загрузчика - установить SP
- - - Добавлено - - -Код:5 000040' . = RKBOOT+40 ;PUT THE JUMP BOOT INTO SYSCOM AREA
6 000040 000137 000574 BOOT1: JMP @#BOOT-RKBOOT ;START THE BOOTSTRAP
7
29
30 000574' . = RKBOOT+574
31 000574 012706 010000 BOOT: MOV #10000,SP ;SET STACK POINTER
32 000600 013746 MOV @(PC)+,-(SP) ;GET THE RK UNIT NUMBER
33 000602 177412 BOTCSR: .WORD RKDA
Не всегда. Есть драйвера, у которых 102,2. На даже этот вариант потребует установленного указателя стека
Я писал про стандартный драйвер. А так да, есть. Но эти значения уже устанавливали в DESS-е. А вот стандартный драйвер MZ для УКНЦ в ячейках 0100 и 0102 содержит 0102 и 2, т.к. в УКНЦ сетевой таймер по умолчанию включён.
- - - Добавлено - - -
Код:000000 000240 NOP
000002 000415 BR 000036
000036 000400 BR 000040
000040 000167 JMP 000430
000042 000364
000430 012706 MOV #10000,SP
000432 010000
В M2 не совсем так, триггер который детектирует фронт EVNT - он внешний по отношению к MCP-1600, обычный TM2. И сбрасывается выделенным сигналом CLR_EVNT, который генерируется микропрограммно. После сброса CLR_EVNT генерируется, а по команде G - нет. И сам MCP-1600 уже реагирует на уровень с выхода TM2 - есть высокий - переходим на обработку таймера.
- - - Добавлено - - -
Ну что, я вас поздравляю, похоже, мы нашли багу в MicROM от DEC :).
Инструкция si в обработчике cmd_g устанавливает флажок I5, что соответствует разрешению прерываний внутри MCP-1600.
Этот флажок поступает на матрицу PLM, и если он активен и есть запрос прерывания, то вместо обработки инструкции микропрограмма аппаратно (матрица выдает нужный LC) перебрасывается на обработчик. Итого - в слове PSW PDP-11 флажок-то может быть любой, но если I5 установлен - то оно идет на прерывание. Если фронт от таймера уже был, то и запрос активен. И пока загрузка PSW командой PDP-11 не произойдет и I5 при ее обработке не сбросится - прерывания по факту будут разрешены. Невзирая на PSW PDP-11 :). При нормальном старте, не из ODT этой инструкции si нет и все работает. А M4 - то отдельно надо смотреть.
Update: а это, кстати, может быть и не ошибка, а законный и документированный старт из ODT с разрешенными прерываниями.
Не, я вижу что все законно в cmd_g:
Вот команда SW - она вычитает 16-битную пару, тут сама из себя. То есть PSW=0. Это у меня комментарий дебильный и ошибочный "disable interrupts". А изначально люди намерено поставили в обработчике "G" PSW=0 и разрешили прерывания. Ну мы можем добавить сброс запроса таймера по INIT, но это не совсем в тему, оно же будет сбрасываться при нормальном исполнении инструкции RESET - и будем терять прерывания от таймера. Вот в обрабочик cmd_g можно сброс запроса таймера и добавить. Но будет ненулевая вероятность что после сброса и до запрета прерываний инструкцией PDP-11 все-таки таймер прилетит, то есть - сброс в cmd_g - не гарантия.Код:sw RPSWL,RPSWL ;
lcf NZVC,RPSWL ;
- - - Добавлено - - -
Возможно после сброса была генерация одного фронта, и оно залипло на детекторе фронта (сделанного согласно оригинального М2) внутри lsi_wb:
А щелкнули переключателем выключения таймера когда? Уже после выпадения в ODT?Код://
// Periodic timer interrupt edge detector
//
always @(posedge vm_clk_p)
begin
evnt_ed <= vm_evnt;
if (mc_clr_evnt | vm_dclo)
evnt_rq <= 1'b0;
else
if (vm_evnt & ~evnt_ed)
evnt_rq <= 1'b1;
end
Все оказалось именно так. У меня же после старта схемы таймер по умолчанию включен, посколькуА потом, уже при работающем ODT, я его отключил кнопкой. Но триггер успел захватить запрос прерывания. Пересобрал сейчас схему с timer_on=0 - все, проблема ушла, загрузчик запускается сразу.Код:initial timer_on=1;
Где-то в книжках по электронике-60 мне встречалась фраза, что машину желательно запускать с отключенным таймером, а включать его уже после загрузки ОС. Теперь стало понятно, откуда оно растет. Видимо, зря я повесил выключатель таймера на кнопку - надо было его на переключатель сажать, как в оригинале. Но переключатели на плате - они мелкие и неудобные, кнопкой пользоваться приятнее.
А сделать кнопку и переключатель одновременно? Если выключатель выключен - кнопка не работает, прерываний от таймера нет. А если переключатель включен, то разрешение прерываний управляется кнопкой.
- - - Добавлено - - -
Станочники грузятся, в-основном, с перфоленты, у команды "L" такой проблемы нет. Возможно поэтому факт разрешенных прерываний по "G" малоизвестен.
Можно и так, но только ситуацию это не спасет. При включении платы переключатель должен быть обязательно выключен, чтобы процессор не защелкнул прерывание. Соответственно, чтобы в RT-11 заработали часы, переключатель надо будет включить. Смысл кнопки пропадает полностью.
Правильнее было бы сделать так, чтобы переключатель в момент включения платы задавал начальное состояние таймера:
Только работать так не будет, к сожалению.Код:initial timer_on=sw[4];
Я даже не знаю, стоит ли включать плату электроники-60 в проект. Функционально она ничем не лучше МС1201.02, даже хуже, а на ДВКшной плате проблем с таймером нет.
В семействе PDP-11 (как и среди наших машин) есть представители, у которых таймер есть, а регистра управления таймеров нет. Насколько я в курсе, у всех у них есть на типа передней панели кнопка-триггер - разрешить прерывания от таймера. Нажал - разрешил, ещё раз нажал - запретил. После включения питания или сброса с передней панели - состояние кнопки сбрасывается в - запретить прерывания от таймера.
М2 драли, насколько я знаю, один в один с платы DEC - LSI-11. Пару раз видел на eBay, но увы.. в коллекции только LSI-11/2, хотя вроде по функционалу они один в один, просто LSI-11 - полная плата (или двойная), LSI-11/2 - полуплата (или одинарная). Так что если делать Э60 в проекте (а с моей точки зрения - надо включать все) - то по функционалу должно быть - как мамка говорила :)
Ну я вот поначалу так и сделал, почитав немного дековскую документацию. Раз уж нет в системе полноценного KW11L... Но потом меня достало включать таймер каждый раз после нажатия сброса. А в процессе отладки схемы сброс нажимается регулярно. Поэтому я и сделал таймер включенным по умолчанию. На ДВК это не мешает.
Тут я с тобой полностью согласен. Уж коли у нас есть отличные процессорные ядра, то они должны работать в проектах, а не пылиться в исходном репозитории. Видимо, я для ДВК оставлю таймер включенным, а для Э60 - сделаю отключение по сбросу.