Если всю подготовку провести в памяти ДВК, то "внутренняя" часть теста не слишком длинная:
Перед переходом в память КМД по команде JMP - надо настроить обработчик прерываний на метку Trap4 и подготовить R0, R1, R2 и R5.Код:Test: Mov R0, (R2) ; Настроить окно на верхние адреса Mov (R1), (R3) ; Запись из SEL1 в копию регистра данных Trap4: ; или Trap4 Mov R5, SP ; Восстановить стек. Return ; Завершение подпрограммы пользователя
R3 изначально указывает в КМД на то слово, которое будет записано в регистр данных после завершения программы пользователя.
ДВК-шная часть теста ждёт, когда КМД выполнит программу пользователя и выводит на экран содержимое регистра данных КМД.
Последний раз редактировалось Patron; 05.01.2014 в 00:33.
Моя программа вывода надписи из КМД и проверки некоторых регистров:
Код:.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).
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Поэтому блокировка ставится не на шину, а на устройство. Память допускает полностью параллельную работу, а изменить состояние любого конкретного устройства может только тот поток, который первым туда "залез".
Но строго говоря, даже если ставить блокировку на любое обращение к "общей" шине - многопоточная эмуляция будет медленнее однопоточной только на одноядерном процессоре.
Это с непривычки.
Допустим, мы эмулируем два процессора на одной шине. При однопоточной эмуляции - в каждый момент времени работает эмулятор одного процессора, а эмулятор другого ждёт своей очереди. При многопоточной эмуляции - эмуляторы обоих процессоров работают одновременно - каждый на своём физическом процессоре хост-машины.
Чтобы при многопоточной эмуляции быстродействие с блокировками было ниже, чем при однопоточной без блокировок - код блокировки должен суммарно выполняться дольше, чем код эмуляции - тогда удвоенное быстродействие двух физических ядер будет "убито" непрерывно выполняющимся кодом блокировок. Если код блокировок будет "отъедать" ровно столько же процессорного времени хост-машины, сколько и код эмуляции - быстродействие многопоточной эмуляции будет РАВНО быстродействию однопоточной. Во всех остальных случаях многопоточная эмуляция будет быстрее.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)