Надо написать тестовую программу для КМД и дождаться, когда anonymous активирует свою ДВК-1 с КМД.
Вид для печати
Если всю подготовку провести в памяти ДВК, то "внутренняя" часть теста не слишком длинная:
Перед переходом в память КМД по команде JMP - надо настроить обработчик прерываний на метку Trap4 и подготовить R0, R1, R2 и R5.Код:Test:
Mov R0, (R2) ; Настроить окно на верхние адреса
Mov (R1), (R3) ; Запись из SEL1 в копию регистра данных
Trap4: ; или Trap4
Mov R5, SP ; Восстановить стек.
Return ; Завершение подпрограммы пользователя
R3 изначально указывает в КМД на то слово, которое будет записано в регистр данных после завершения программы пользователя.
ДВК-шная часть теста ждёт, когда КМД выполнит программу пользователя и выводит на экран содержимое регистра данных КМД.
Моя программа вывода надписи из КМД и проверки некоторых регистров:
Код:.TITLE TSKMD1
.MCALL .PRINT,.EXIT
START: .PRINT #VER
5$: BIT #100,@#177564
BNE 5$
10$: BIT #40,@#172140
BEQ 10$
MOV #35,@#172140
20$: TSTB @#172140
BPL 20$
MOV #KMDPRG,@#172142
30$: BIT #40,@#172140
BEQ 30$
BIT #100,FLG1
BNE 31$
.PRINT #NEXEC
.EXIT
31$: BIT #200,FLG
BEQ 32$
.PRINT #A3PR
32$: BIT #1,FLG1
BNE 40$
.PRINT #AD3NPR
BR 41$
40$: .PRINT #AD3PR
BIT #2,FLG1
BEQ 41$
.PRINT #AD3N7
41$: BIT #400,FLG
BEQ 33$
.PRINT #A7PR
33$: BIT #4,FLG1
BNE 42$
.PRINT #AD7NPR
BR 43$
42$: .PRINT #AD7PR
BIT #10,FLG1
BEQ 43$
.PRINT #AD7N7
43$: .EXIT
FLG1: .WORD 0
VER: .ASCIZ /TEST KMD WINDOW ver.1/
NEXEC: .ASCIZ <16>/pODPROGRAMMA W kmd NE ZAPU]ENA/<17>
AD3PR: .ASCIZ <16>/aDRES 177564(/<17>/WINDOW/<16>/=3) PRISUTSTWUET/<17>
AD3NPR: .ASCIZ <16>/aDRES 177564(/<17>/WINDOW/<16>/=3) NE PRISUTSTWUET/<17>
AD7PR: .ASCIZ <16>/aDRES 17777564(/<17>/WINDOW/<16>/=377) PRISUTSTWUET/<17>
AD7NPR: .ASCIZ <16>/aDRES 17777564(/<17>/WINDOW/<16>/=377) NE PRISUTSTWUET/<17>
AD3N7: .ASCIZ <16>/bIT 7(gp) W 177564 NE USTANOWLEN/<17>
AD7N7: .ASCIZ <16>/bIT 7(gp) W 17777564 NE USTANOWLEN/<17>
A3PR: .ASCIZ <16>/aDRES 160000(/<17>/WINDOW/<16>/=3) PRISUTSTWUET/<17>
A7PR: .ASCIZ <16>/aDRES 17760000(/<17>/WINDOW/<16>/=377) PRISUTSTWUET/<17>
.EVEN
KMDPRG: MOV #20000,R0
MOV #KMDPR1+40000,R1
MOV #<KMDEND-KMDPR1>/2,R2
1$: MOV (R1)+,(R0)+
SOB R2,1$
JMP @#20000
KMDPR1: MOV @#177102,SAVRD
MOV 74(R3),SAV4
MOV #<TR4-KMDPR1+20000>,74(R3)
BIS #100,FLG
MOV #<3*400+3>,@#177102
TST @#60000
BCS 1$
BIS #200,FLG
1$: TST @#77564
BCS 10$
BIS #1,FLG
MOV #2,R2
MOV #<HEL3-KMDPR1+20000>,R0
CALL PRWND
10$: MOV #<377*400+377>,@#177102
TST @#60000
BCS 2$
BIS #400,FLG
2$: TST @#77564
BCS 20$
BIS #4,FLG
MOV #10,R2
MOV #<HEL377-KMDPR1+20000>,R0
CALL PRWND
20$: MOV SAVRD,@#177102
MOV SAV4,74(R3)
MOV FLG,@#FLG1+40000
RETURN
PRWND: MOV #10000,R1
1$: TSTB @#77564
BMI 2$
SOB R1,1$
BIS R2,FLG
RETURN
2$: MOVB (R0)+,@#77566
BNE PRWND
RETURN
TR4: BIS #1,@SP
RTI
SAV4: .BLKW 1
SAVRD: .BLKW 1
FLG: .WORD 0
HEL3: .ASCIZ /Hello from KMD, WINDOW=3/<15><12>
HEL377: .ASCIZ /Hello from KMD, WINDOW=377/<15><12>
.EVEN
KMDEND:
.END START
Да не очень-то. Ведь сам центральный процессор ее использует не все время, только во время операций чтения/записи. Так что устройство ПДП и попадает в эти свободные окна. Подтормозить можно центральный вычислитель, если устройство ПДП все время будет обращаться к несуществующему адресу (TRAP_4).
Поэтому блокировка ставится не на шину, а на устройство. Память допускает полностью параллельную работу, а изменить состояние любого конкретного устройства может только тот поток, который первым туда "залез".
Но строго говоря, даже если ставить блокировку на любое обращение к "общей" шине - многопоточная эмуляция будет медленнее однопоточной только на одноядерном процессоре.
Это с непривычки.
Допустим, мы эмулируем два процессора на одной шине. При однопоточной эмуляции - в каждый момент времени работает эмулятор одного процессора, а эмулятор другого ждёт своей очереди. При многопоточной эмуляции - эмуляторы обоих процессоров работают одновременно - каждый на своём физическом процессоре хост-машины.
Чтобы при многопоточной эмуляции быстродействие с блокировками было ниже, чем при однопоточной без блокировок - код блокировки должен суммарно выполняться дольше, чем код эмуляции - тогда удвоенное быстродействие двух физических ядер будет "убито" непрерывно выполняющимся кодом блокировок. Если код блокировок будет "отъедать" ровно столько же процессорного времени хост-машины, сколько и код эмуляции - быстродействие многопоточной эмуляции будет РАВНО быстродействию однопоточной. Во всех остальных случаях многопоточная эмуляция будет быстрее.