Перезалил на вариант без R5.
Надежнее просто не трогать 11 бит.Код:.RU PSW1
PSW test #1
MOV #177777,@#177776
177776/174757
MOV #177777,@#177776
CLRB @#177776
177776/174400
MOV #177777,@#177776
MOVB #000000,@#177777
177776/000357
Program completed.
.
Тесты на ВМ3.
Код:.MFPS
UISDR7=077506, PSW=140016, MFPS R0, R0=000016
UISDR7=077400, PSW=140016, MFPS R0, R0=000016, MMU FAULT
.MVPS
;PSW=170000, @#177776=123456
MFPS R1 ;R1=000056
MTPS #17 ;PSW=170001, @#177776=123417
.YT4A
Yellow Stack Trap test #1
SP/000400
CMP -(SP),-(SP)
>>> Trap to 004 <<<
SP/000374
SP/000400
CMP @-(SP),@-(SP)
>>> Trap to 004 <<<
SP/000374
Program completed.
.MFPI
MFPI SP command test.
MOV #140340,@#177776
MOV #44444, SP
MOV #000340,@#177776
MOV #22222, SP
MFPI SP
022220/022222
MOV #030340,@#177776
MFPI SP
022216/044444
MOV #140340,@#177776
MFPI SP
022214/000000
044442/022216
MOV #170340,@#177776
MFPI SP
022212/000000
044440/044442
Program completed.
.PSW1
PSW test #1
MOV #177777,@#177776
177776/170357
MOV #177777,@#177776
CLRB @#177776
177776/170000
MOV #177777,@#177776
MOVB #000000,@#177777
177776/000345
Program completed.
.
Новый тест: PSW2.SAV - проверяет момент изменения PSW в командах с приёмником @#177776.
Запускать на машинах с диспетчером памяти. На эмулируемой ДВК-3 результат такой :
Код:.RU PSW2
PSW test #2
CLR @#177776
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140010
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000004
Program completed.
.
Код:.RU PSW2
PSW test #2
CLR @#177776
INC @#177776
177776/000001
ROL @#177776
177776/000003
CLR @#177776
BIS #140000, @#177776
177776/140000
CLR @#177776
BISB #000300, @#177777
177776/140000
CLR @#177776
MOV #000000, @#160000
>>> Trap to 004 <<<
177776/000004
Program completed.
.
Похоже, что хотя MOVB на 11/83 использует цикл DATOB и поэтому при обращении к старшему байту PSW не затирает изменения признаков в младшем байте PSW - модифицирующие байтовые команды ( типа BISB ) используют цикл DATIO и поэтому признаки в младшем байте PSW копируются из "прошлой версии" содержимого PSW.
Скрытый текст
Код:.TY TEST.MAC
.TITLE TEST
.MCALL .EXIT,.PRINT
.ASECT
.=14
.WORD BESST,0
.PSECT
START:: MOV #ARGS,R2
MOV #30000,@#-2
BPT
BISB #1,@#-2
BPT
MOV @#-2,(R2)+
BPT
MOV #BUFF,R0
MOV #FMTS,R1
MOV #ARGS,R2
CALL $EDMSG
.PRINT #BUFF
.EXIT
BESST:: MOV 2(SP),(R2)+
RTI
ARGS: .BLKW 4
BUFF: .BLKW 40
FMTS: .ASCII /MOV #030000,@#177776 ;PSW=%P%N/
.ASCII /BISB #1,@#177776 ;PSW=%P%N/
.ASCIZ /MOV @#177776,ARGS+4 ;PSW=%P:%P/
.END START
[свернуть]Код:.RU TEST
MOV #030000,@#177776 ;PSW=030000
BISB #1,@#177776 ;PSW=030001
MOV @#177776,ARGS+4 ;PSW=030001:030001
.
Точно. При операции BISB с младшим байтом - в старшем байте PSW ничего "по волшебству" не меняется, поэтому цикл DATIO не портит PSW, но при операции BISB со старшим байтом PSW - установившиеся по итогам операции признаки в младшем байте PSW затираются в фазе записи цикла DATIO.
Интересует - есть ли разница в поведении MOVB и BISB при модификации старшего байта PSW.
Если MOVB использует DATOB - свежие признаки в младшем байте PSW должны "выжить", в то время как команда BISB #xxx,@#177777 - затирает свежие признаки в PSW старыми ( которые были в младшем байте PSW в фазе чтения цикла DATIO ).
Для проверки - можно выполнить на 11/83 что-то типа такого:
Вариант с MOVB :
Код:Clr @#177776
MovB #300, @#177777
Mov @#177776, $PSW
Clr @#177776
То же самое с BISB :
Код:Clr @#177776
BiSB #300, @#177777
Mov @#177776, $PSW
Clr @#177776