Сообщение от
Patron
Относительно перехода процессора 11/83 в режим KERNEL и обратно у меня сложилось следующее впечатление:
1. При любом запуске блока прерываний - устанавливается режим KERNEL и если предыдущим режимом был режим USER - запоминается значение SP.
2. Если в результате любой последующей команды значение SP становится больше запомненного - устанавливается режим USER.
Если в векторе прерывания PSW задан с очищенными двумя старшими битами - устанавливается режим KERNEL. При этом прошлый режим записывается в два следующих бита ниже старших. SP для каждого режима свой и значение его никакого влияния на режим не оказывает. Адрес/PSW для возврата пишется в стек режима который включается.
---------- Post added at 11:26 ---------- Previous post was at 11:24 ----------
Еще насчет режимов - есть такая ошибка некогда распространенная - при возврате из прерывания установить режим 140000 (пользователь, прошлый - кернел). Почему ошибка - думаю объяснять не нужно
Но давно не встречал.
---------- Post added at 11:32 ---------- Previous post was at 11:26 ----------
То есть подводя итоги: режим процессора задается двумя старшими битами PSW, SP в каждом режиме свой.
---------- Post added at 11:35 ---------- Previous post was at 11:32 ----------
Ну и попутно раз пошла такая пьянка...
В усерском режиме команда HALT вызывает трап по 4 или 10 (зависит от проца), на 11/83 по 4.
Команды WAIT, RESET, SPL выполняются как NOP.
В усерском режиме нельзя трогать приоритет процессора и биты режима.
С усерского режима нельзя соскочить через RTI - биты режима установятся снова в USER.
---------- Post added at 11:39 ---------- Previous post was at 11:35 ----------
Ну и еще для информации - вектора прерываний - это не адреса 0-774, а адреса, которые в кернелном режиме отображаются в это место. Но обычно они совпадают.
---------- Post added at 11:59 ---------- Previous post was at 11:39 ----------
Вот собственно для демонстрации
Код:
.TY TEST.MAC
.TITLE TEST
.MCALL .PRINT,.EXIT
START: MOV #10$,@#14
CLR @#16 ;ПЕРЕХОДИМ В КЕРНЕЛ
BPT
10$: CALL MODE
MOV #20$,@#14
MOV #140000,@#16 ;ПЕРЕХОДИМ В УСЕР
BPT
CALL MODE
.EXIT
20$: CALL MODE
RTI ;ОСТАЕМСЯ В УСЕР
MODE: MOV @#177776,-(SP)
MOV 2(SP),R1
MOV #SPC,R0
MOV PC,R2
CALL $CBOMG
MOV SP,R1
CMP (R1)+,(R1)+
MOV #SSP,R0
MOV PC,R2
CALL $CBOMG
MOV (SP)+,R1
MOV #SPS,R0
MOV PC,R2
CALL $CBOMG
.PRINT #STATE
RETURN
STATE: .ASCII /PC=/
SPC: .ASCII /XXXXXX SP=/
SSP: .ASCII /XXXXXX PS=/
SPS: .ASCIZ /XXXXXX/
.END START
.RU TEST
PC=001020 SP=155204 PS=030000
PC=001050 SP=000774 PS=140000
PC=001042 SP=001000 PS=170010
.
---------- Post added at 13:10 ---------- Previous post was at 11:59 ----------
Сообщение от
Patron
в режим KERNEL
Никак об эмуляции ВМ3 подумываешь?
Теперь информации хватает, недостающие мелочи дотестить можно всегда.