Я сделал, только он сырой пока что. Как раз универсальный, работает, как в ЦП, так и в ПП. Сначала тестирует скорость команд в ПП, потом в ЦП.
Вид для печати
На 11/83.
Просто SPEED.SAV кривой до безобразия - искренне считает, что .SETTOP выделяет память программе и думает, что раз он его выдал, то уж никак не наткнется вверх по памяти на систему. Танцы с включите-выключите таймер - вообще жуть :)
А так - был бы тест который можно было бы запустить в RT-11 и командой PRUN загрузить в PPU без изменений :)
Там его нет в виду того, что это полноценная таки машина :)
Суть в другом. Можно сделать тест который просто тестирует то, где запущен. Запустил командой RUN - тестирует ЦП. Загрузил командой PRUN на УКНЦ - тестирует ПП. Сделать универсальный RELо-SAV нетрудно. Различить из программы где она запущена тоже :)
В приложении - тест скорости вывода символов в порт терминала - CPS.SAV с исходником.
Есть два варианта теста:
1. CPS.SAV - без ожидания прерывания по WAIT.
2. CPS2.SAV - с ожиданием прерывания по WAIT.
Интересно, какие результаты получаются на реальном оборудовании..
Только что окончательно обнаружил, что на моей тестовой УКНЦ'шке периферийный процессор тактируется 8-ю мегагерцами! Помнится, мне товарищ, который подарил ее, говорил, что разгонял ПП. Придется переходить на вторую УКНЦ.
Проверь на живом УКНЦ, ну и может пригодится когда - пример одной проги и для ЦП и для ПП :)
В эмуляторе пашет :)
Код:.TITLE PPCP
.IDENT /V01.00/
$USRSP == 42 ;USER STACK POINTER
CR = 15 ;CARRIAGE RETURN
LF = 12 ;LINE FEED
.MCALL .EXIT,.TTYOUT ;SYSTEM MACRO CALLS
START:: CMP @#$USRSP,SP ;RUNNING UNDER RT-11?
BEQ 10$ ;EQ->YES
MOV #PR.PP,PRINT ;UPDATE PRINT HANDLER
MOV #EX.PP,EXIT ;UPDATE EXIT HANDLER
10$: MOV #TEXT,R1 ;POINT TO ASCIZ STRING
CALL @PRINT ;PRINT IT
JMP @EXIT ;EXIT
PR.PP:: MOV R1,10$ ;SET STRING ADDRESS
JSR R4,@#163006 ;PRINT STRING
10$: .BLKW ;
RETURN ;RETURN
PR.RT:: MOVB (R1)+,R0 ;GET CHAR
BEQ 10$ ;EQ -> END OF LINE
.TTYOUT ;PRINT CHARACTER
BR PR.RT ;LOOP
10$: RETURN ;RETURN
EX.RT:: .EXIT ;EXIT TO OS
EX.PP:: MOV #START,R1 ;FREE MEMORY AND EXIT
JMP @#176300 ;
PRINT:: .WORD PR.RT ;RT-11 BY DEFAULT
EXIT:: .WORD EX.RT ;
TEXT: .ASCIZ <CR><LF>/HELLO WORLD!/<CR><LF>
.END START
Собственно я про это несколько раз писал, про отличие времени исполнения в ОЗУ ЦП, ОЗУ ПП и ПЗУ. Самая быстрая - это ПЗУ. А вот контроллер ОЗУ делит доступ к памяти между видеоадаптером и процессором. При этом у ЦП частота 8 Мгц, а у контроллера ОЗУ 6,25 Мгц, небольшая рассинхронизация. Таким образом выходит, что доступ к ОЗУ ЦП минимум за 320 нс (3T для ЦП), максимум - 960 нс (8T для ЦП). В ПП ситуация похуже - минимум 960 нс (6T), максимум - 1280 нс (8T), хотя более гладкая. Так что как-то не получается, что программа в ПП работает в 2 раза медленнее, учитывая еще предвыборку. Еще кстати частота сетевого таймера в УКНЦ не 50 Гц, а 50,08 Гц, между импульсами не 20000 мкс, а 19968 мкс, различие мизерное, но мало ли что.
Теперь несколько слов про тайминги, которые появились в эмуляторе УКНЦ. Сами тайминги взяты из архива эмулятора PDP-11 на Forth. Там в каталоге pdpemu есть файл 1806VM2.TIM, а сами смещения в этой таблице расписаны в файле pdpbeg.f, конкретные времена по командам - файл pdpinstr.f. В этом архиве есть файлик readme.txt с контактной информацией, но я с автором не связывался. Кстати в этом эмуляторе было кое-что по особенностям исполнения команд, которое подтвердилось на реальных тестах, но которое не отражено в техническом описании на процессор 1801ВМ2.
Отличия состоят в разности исполнения словных и байтовых команд MOV, MOVB, CLR, CLRB, MFPS. Словные команды MOV и CLR для dst исполняют только цикл записи, а вот байтовые команды MOVB, CLRB, MFPS для dst в памяти производят цикл чтение-пауза-вывод. Это практически подтвердилось на реальной УКНЦ.
Процессор по правилам должен при записи в регистр побайтово расширить значение до слова. Не уверен есть ли исключения. Касается именно MOVB, но не всяких BICB, BISB, CLRB.
На УКНЦ кстати помню сталкивался с приколом где-то в прошивке - с параллельным портом чтоли. Там хитро сделано, что нечетные адреса тоже нужно пословно адресовать :)
Байтовые команды с регистром работают только с младшим байтом, старший не трогают. Исключением являются MOVB и MFPS, которые расширяют старший байт знаковым разрядом.
Ну да, для параллельного порта используется 8-разрядная микросхема 580ВВ55, у которой только две адресных линии. Разработчики почему то подключили к ним не AD2 и AD1, а AD1 и AD0. Подключение идет через 1801ВП1-120, который содержит дешифратор адреса для параллельного порта. Линии данных подключены только к младшему байту. Самому процессору 1801ВМ2 по барабану, какой адрес, четный или нечетный, что сказали, то и выставил на шину. Поэтому в данном случае и надо производить словное обращение даже по нечетным адресам. Если записывается байт по нечетному адресу, то он будет в старшем байте, а в младшем будут нули. Также и чтение байта по нечетному адресу, процессор прочтет слово, а возьмет только старший байт.
Это какая MF? Знаю только MFPD и MFPI, но они словные. Кстати на первых релизах 1801ВМ3 был глюк. Так как у этого процессора нет раздела на зоны инструкций и данных, то по идее эти команды должны исполняться одинаково, но так как команда MFPD в своем коде содержит установленный старший бит, то она исполнялась как байтовая. Приходилось патчить программы и заменять MFPD на MFPI.
Вспомнил еще про MFPT, но там вроде не такие большие значения были, все таки тип процессора.
Вообще-то расширение знака - это исключение.
Уже как-то просил, но все забили...
Запустите кто-нибудь на чем есть: ДВК, УКНЦ...
Интересно все-таки сравнить :)
Совершенно верно - про них и говорим и я говорю, что это правило: именно так эти команды работают на всех известных мне процессорах. Есключение было бы если бы так оно работало на УКНЦ, а на других не расширяло. Остальные команды не должны трогать и это вроде даже документировано.
места под метод адресации не хватит работать со старшим байтом регистра :)
а делать кособокую срань как в интеле когда на байт сошел с дорожки и вообще вся картина поменялась, а не пара команд - бе :)
---------- Post added at 04:14 ---------- Previous post was at 04:00 ----------
Кстати об эмуляторе УКНЦ... Подумал тут: это единственный известный мне нашинский эмулятор который правильно работает с VT52 ESC последовательностями. В силу того, что собственно VT52 не эмулирует сам по себе :)))
Естественно VT-52 эмулируется программой в СПЗУ, но не все то гладко. ESC A, ESC B, ESC C и ESC D - если курсор уперся в край экрана, то он должен так там и остаться, а в УКНЦ при необходимости делается скроллинг, т.е. ESC A работает как ESC I, а ESC B, как LF. Нет псевдографики, холдскрина. Хотя все это поправимо с помощью загружаемых модулей, благо сделать свою функцию обработки Esc-последовательности труда не представляет. На диске sysimage есть пример - ESCFG, реализует ESC F и ESC G, псевдографика правда взята с КЦГД.