; 007 ;W$CERR =: 0 ; Если With@CorrectError опеределён - исправлять обнаруженные ошибки ; Не определён - для проверки качества дизассемблирования ; После выверки и решения вопроса об ошибки - убрать? .NLIST .INCLUDE /DSMAC.MAC/ .INCLUDE /MYMAC.MAC/ .INCLUDE /ASCII.MAC/ .INCLUDE /HWDF.MAC/ .INCLUDE /134DF.MAC/ .INCLUDE /134MC.MAC/ .LIST MODULE NAME=<134ROM>, REL=, VER=<01>, LIBR=, COMM=<1801PE2-134>, TYPE= .ASECT .=0 START: JMP ENTRYP V4: .WORD IV4 .WORD PR7 ; for RT-11 Link-11 .=^O<42> .WORD 0 .=^O<50> .WORD 0 .=^O<360> .WORD 0 ; end for RT-11 Link-11 ................................................................................ .=^O<400> DVDRVS: .............................................................................. ; ; MY ; PROCEDURE MY.BOT BEGIN REPEAT REPEAT UNTIL #40 SET.IN @R1 LET @R1 := #37 REPEAT UNTILB @R1 MI #0 LET @#172142 := R0 REPEAT UNTIL #100040 SET.IN @R1 UNTIL RESULT IS PL AND #NOP EQ @#0 LET PC := #0 END MY.BOT .............................................................................. ; ; MX ; PROCEDURE MX.BOT BEGIN LET R0 := R0 OFF.BY #^C<3> LET SP := #10002 PUSH R0 LET R4 := R1 LET @R4 := #100 THRU R5 := #177777 END LET R0 := R0 L.SHIFT 2 LET @R4 := @R4 SET.BY R0 THRU R5 := #47040 END CALL L00722 LET R5 := R4 TST (R5)+ LET R0 := #0 LET R1 := #1000 LET @R4 := @R4 SET.BY #40000 REPEAT UNTIL @R4 MI #0 TST @R5 REPEAT UNTIL @R4 MI #0 TST @R5 CALL L00634 LET R0 := #1000 LET R1 := #1600 CALL L00634 LET @R4 := @R4 OFF.BY #40000 LET R1 := #200 LET @R4 := @R4 SET.BY #10000 LET @R4 := @R4 SET.BY #40000 REPEAT UNTIL @R4 MI #0 TST @R5 REPEAT UNTIL @R4 MI #0 TST @R5 CALL L00634 LET @R4 := @R4 OFF.BY #40000 JMP @#0 END MX.BOT .............................................................................. ; ; ; PROCEDURE L00634 BEGIN REPEAT LET R3 := #200 PUSH #0 THRU R3 REPEAT UNTIL @R4 MI #0 LET @R0 := @R5 LET @SP := @SP + (R0)+ LET R1 := R1 - #1 IF RESULT IS EQ LEAVE LOOP END REPEAT UNTIL @R4 MI #0 IF @R5 NE (SP)+ THEN POP LET R0 := @SP JUMPTO MX.BOT END UNTIL R1 EQ #0 RETURN END L00634 .............................................................................. ; ; ; PROCEDURE L00706 BEGIN LET @R4 := @R4 SET.BY #20 THRU R5 := #23420 END RETURN END L00706 .............................................................................. ; ; ; PROCEDURE L00722 BEGIN LET @R4 := @R4 OFF.BY #40 WHILE #4000 OFF.IN @R4 CALL L00706 END RETURN END L00722 .............................................................................. ; ; DU ; PROCEDURE DU.BOT BEGIN LET SP := #N$ADR LET R0 := R0 OFF.BY #^C<3> LET R3 := #4000 LET R2 := #636+N$ADR-DVDRVS ; 10236-7400= 636 ?????? LET R1 := #172150 LET (R1)+ := R0 REPEAT IF @R1 MI #0 THEN HALT GOTO DU.BOT END REPEAT UNTIL R3 SET.IN @R1 LET @R1 := (R2)+ LET R3 := R3 L.SHIFT UNTIL RESULT IS MI REPEAT LET R4 := #N$ADR+1000 REPEAT LET (R4)+ := #0 UNTIL R4 EQ #N$ADR+1244 LET -30(R4) := (R2)+ ; 1244-30=1214 LET -44(R4) := (R2)+ ; 1244-44=1200 LET -50(R4) := (R2)+ ; 1244-50=1174 LET -2(R4) := #0 ; 1244- 2=1242 LET -4(R4) := #0 LET -54(R4) := (R2)+ LET -64(R4) := (R2)+ LET -66(R4) := #0 LET -70(R4) := @R2 LET -154(R4) := (R2)+ LET -152(R4) := #0 LET -24(R4) := R0 LET -60(R4) := R0 LET (R4)+ := (R2)+ LET @R4 := R3 LET 2(R4) := (R2)+ LET 4(R4) := R3 LET R5 := -2(R1) REPEAT UNTIL @R4 PL #0 LET R5 := -140(R4) OFF.BY #^C<37> IF RESULT IS NE THEN HALT GOTO DU.BOT END UNTIL @R2 EQ #123456 IF @#0 NE #NOP THEN HALT GOTO DU.BOT END LET PC := #0 END DU.BOT ;001202 100000 BPL 1204 ;001204 011244 MOV @R2,-(R4) ;001206 000000 HALT ;001210 000001 WAIT ;001212 000000 HALT ;001214 000000 HALT ;001216 000000 HALT ;001220 000011 .WORD 11 ;001222 000000 HALT ;001224 000060 .WORD 60 ;001226 011074 MOV @R0,@11160(R4) ;001230 011160 ;001232 000000 HALT ;001234 000000 HALT ;001236 001000 BNE 1240 ;001240 000041 .WORD 41 ;001242 000000 HALT ;001244 000060 .WORD 60 ;001246 011074 MOV @R0,@11160(R4) ;001250 011160 ;001252 123456 CMPB @(R4)+,@-(SP) .WORD 100000 ;<000><200> .WORD 011244 ;<244><022> .WORD 000000 ;<000><000> .WORD 000001 ;<001><000> .WORD 000000 ;<000><000> .WORD 000000 ;<000><000> .WORD 000000 ;<000><000> .WORD 000011 ;<011><000> .WORD 000000 ;<000><000> .WORD 000060 ;'0'<000> .WORD 011074 ;'<'<022> .WORD 011160 ;'П'<022> .WORD 000000 ;<000><000> .WORD 000000 ;<000><000> .WORD 001000 ;<000><002> .WORD 000041 ;'!'<000> .WORD 000000 ;<000><000> .WORD 000060 ;'0'<000> .WORD 011074 ;'<'<022> .WORD 011160 ;'П'<022> .WORD 123456 ;'.'<247> .............................................................................. ; ; CT ; PROCEDURE CT.BOT BEGIN LET @R1 := R2 SET.BY (R3)+ REPEAT UNTIL R1 MI #0 ; ?? (R1) ?? IF -2(R1) PL #0 GOTO SHDVER GOTO CBOOT END CT.BOT .............................................................................. ; ; MT ; PROCEDURE MT.BOT BEGIN LET @R1 := R2 REPEAT LET -2(R1) := -2(R1) R.ROTATE UNTIL RESULT IS CS LET @R1 := @R1 SET.BY (R3)+ REPEAT UNTILB @R1 MI #0 LET 2(R1) := #177777 LET @R1 :B= (R3)+ ; MOVB (R3)+,@R1 .IIF NE .-WAIT .ERROR ; PROC WAIT must be next END MT.BOT .............................................................................. ; ; Wait ; PROCEDURE WAIT BEGIN REPEAT UNTIL R5 SET.IN @R1 IF RESULT IS PL GOTO CBOOT2 .IIF NE .-SHDVER .ERROR ; PROC SHDVER must be next END WAIT .............................................................................. ; ; Show Device Error message ; PROCEDURE SHDVER BEGIN $SHMESS DVER HALT END SHDVER .............................................................................. ; ; DP ; PROCEDURE DP.BOT BEGIN .IIF NE .-CBOOT .ERROR ; PROC CBOOT must be next END DP.BOT .............................................................................. ; ; Common boot, entry 1 ; PROCEDURE CBOOT BEGIN LET @R1 := R2 .IIF NE .-CBOOT2 .ERROR ; PROC CBOOT2 must be next END CBOOT .............................................................................. ; ; Common boot, entry 2 ; PROCEDURE CBOOT2 BEGIN LET 2(R1) := #^C<511> ; 177266 LET R2 :B= (R3)+ LET R1 := R1 OFF.BY #377 LET @R1 := @R1 SET.BY R2 REPEAT UNTILB @R1 MI #0 IF @R1 MI #0 THEN IFB @R3 NE #0 GOTO SHDVER IF @R3 NE 14(R1) GOTO SHDVER END LET @R1 :B= #0 LET PC := #0 END CBOOT2 .............................................................................. ; ; DM ; PROCEDURE DM.BOT BEGIN LET 10(R1) := R0 LET @R1 := #3 GOTO WAIT END DM.BOT .............................................................................. ; ; DB ; PROCEDURE DB.BOT BEGIN LET 10(R1) :B= R0 LET @R1 :B= (R3)+ LET 32(R1) := #14000 ; 14000 ?? GOTO CBOOT3 END DB.BOT .............................................................................. ; ; MM ; PROCEDURE MM.BOT BEGIN LET 32(R1) := R0 LET @R1 := @R1 SET.BY (R3)+ REPEAT UNTIL #10000 SET.IN 12(R1) LET @R1 :B= (R3)+ REPEAT UNTILB 12(R1) MI #0 LET @R1 :B= (R3)+ REPEAT UNTILB 12(R1) MI #0 LET 6(R1) := #-1 LET @R1 :B= (R3)+ REPEAT UNTILB 12(R1) MI #0 GOTO CBOOT3 END MM.BOT .............................................................................. ; ; DW ; PROCEDURE DW.BOT BEGIN REPEAT LET @R1 := #10 REPEAT UNTIL @R1 PL #0 LET @#174006 := #1 LET @#174016 := #40 REPEAT UNTIL @R1 PL #0 LET R2 := #0 THRU R3 := #^D<256> REPEAT UNTILB @R1 MI #0 LET (R2)+ := @#174010 END UNTIL #NOP EQ @R3 LET PC := #0 END DW.BOT .............................................................................. ; ; DS ; PROCEDURE DS.BOT BEGIN LET 10(R1) :B= R0 .IIF NE .-CBOOT3 .ERROR ; PROC CBOOT3 must be next END DS.BOT .............................................................................. ; ; Common boot, entry 3 ; PROCEDURE CBOOT3 BEGIN MOV 16(R1), 16(R1) ; ???? .IIF NE .-BCBOT2 .ERROR ; PROC BCBOOT2 must be next END CBOOT3 ................................................................................ ; ; Go to Common boot, entry 2 ; PROCEDURE BCBOT2 BEGIN GOTO CBOOT2 END BCBOT2 .............................................................................. ; ; DX ; PROCEDURE DX.BOT BEGIN LET R5 := R5 SET.BY #40 IF R0 NE #0 THEN TST (R3)+ END REPEAT UNTILB R5 SET.IN @R1 LET @R1 :B= (R3)+ THRU R2 := #2 REPEAT UNTILB @R1 MI #0 LET 2(R1) :B= #1 END REPEAT UNTIL R5 SET.IN @R1 IF RESULT IS MI GOTO SHDVER LET @R1 :B= (R3) LOOP REPEAT UNTILB R5 SET.IN @R1 IF RESULT IS PL LEAVE LOOP LET (R2)+ :B= 2(R1) END IF #NOP NE @#0 GOTO SHDVER LET PC := #0 END DX.BOT ................................................................................ ; ; DK ; PROCEDURE DK.BOT BEGIN LET R2 := R2 SHIFT #5 LET 6(R1) := R2 GOTO BCBOT2 END DK.BOT ................................................................................ ; ; Bootable device description ; BTABLE: DV.BOT MT 172522, MT.BOT, MT.PRM DV.BOT CT 177342, CT.BOT, CT.PRM DV.BOT DK 177404, DK.BOT, DK.PRM DV.BOT DP 176714, DP.BOT, DP.PRM DV.BOT DM 177440, DM.BOT, DM.PRM DV.BOT MM 172440, MM.BOT, MM.PRM DV.BOT DB 176700, DB.BOT, DB.PRM DV.BOT DS 172040, DS.BOT, DS.PRM DV.BOT DX 177170, DX.BOT, DX.PRM DV.BOT DW 174020, DW.BOT, BTABLE DV.BOT MX 177130, MX.BOT, BTABLE DV.BOT MY 172140, MY.BOT, BTABLE DV.BOT DU 175150, DU.BOT, BTABLE DV.END MT.PRM: .WORD 060017 ;<017><140> ;002100 .WORD 001411 ;<011><003> ;002102 DM.PRM: DB.PRM: .BYTE 21 ;<021>'9' ;002104 DS.PRM: .BYTE 71 CT.PRM: .WORD 004003 ;<003><010> ;002106 DK.PRM: DP.PRM: .WORD 037405 ;<005>'?' ;002110 MM.PRM: .WORD 001300 ;<300><002> ;002112 .WORD 004407 ;<007><011> ;002114 .WORD 034431 ;<031>'9' ;002116 .WORD 001000 ;<000><002> ;002120 DX.PRM: .WORD 001407 ;<007><003> ;002122 .WORD 011427 ;<027><023> ;002124 $MESSL DVER, </sboj ustrojstwa /> ................................................................................ L02152: LET @#HWERRF := #0 L02156: LET @#IV4 := #137 LET @#IV4+2 := #SETV4F LET @#IFLAG := #1 LET @#HCADDR := #0 CALL SHAT CALL SHSPCE LET @#WSHOW := @#SU.PC CALL SHWRD .............................................................................. ; ; Ввод команды - выдача подсказки и уход на GETCM2 ; PROCEDURE GETCMD BEGIN CALL SHAT .IIF NE .-GETCM2 .ERROR ; PROC GETCM2 must be next END GETCMD .............................................................................. ; ; Ввод команды - цикл ввода числа. Выход по любому символу вне диапазона '0..'7 ; PROCEDURE GETCM2 BEGIN CALL KBIN IF R4 LT #'0 GOTO CHKCMD IF R4 GE #'8 GOTO CHKCMD CALL TVOUT LET @#IFLAG := @#IFLAG OFF.BY #000002!000001 IF #IF.REG SET.IN @#IFLAG THEN ; Rn ? IF #IF.RFD OFF.IN @#IFLAG THEN ; Первая цифра была? LET @#IFLAG := @#IFLAG SET.BY #IF.RFD ; Первая цифра ELSE LET @#IFLAG := @#IFLAG SET.BY #IF.RMD ; Вторая и последующие цифры END END LET R4 := R4 OFF.By #'0 LET R3 := @#IADDR+2 LET R2 := @#IADDR LET R2 := R2 C.SHIFT #3 LET R3 := R3 + R4 LET @#IADDR := R2 LET @#IADDR+2 := R3 LET @#IFLAG := @#IFLAG SET.BY #IF.NUM .IIF NE .-NXTCHR .ERROR ; PROC NXTCHR must be next END GETCM2 .............................................................................. ; ; Хелпер ; PROCEDURE NXTCHR BEGIN GOTO GETCM2 END NXTCHR .............................................................................. ; ; Входная точка обработки команд ; PROCEDURE CHKCMD BEGIN IF #IF.RS SET.IN @#IFLAG GOTO SLCMD ; RS уже ввели? - да, символ S не рассматривается .IIF NE .-RSCMD .ERROR ; PROC RSCMD must be next END CHKCMD .............................................................................. ; ; Возможная команда RS ; PROCEDURE RSCMD BEGIN IF R4 EQ #'S GOTO SLCMD IF #IF.REG OFF.IN @#IFLAG GOTO SLCMD IF #IF.RFD OFF.IN @#IFLAG GOTO NXTCHR .IIF NE .-SLCMD .ERROR ; PROC SLCMD must be next END RSCMD .............................................................................. ; ; Command / ; PROCEDURE SLCMD BEGIN IF R4 NE #SLASH GOTO CRCMD IF @#IFLAG MI #0 AND #IF.RFD OFF.IN @#IFLAG THEN LET @#IFLAG := @#IFLAG OFF.BY #002000 END IFB @#IFLAG EQ #0 THEN LET @#IFLAG := @#IFLAG OFF.BY #400 IF #IF.RMD SET.IN @#IFLAG THEN LET @#IFLAG := @#IFLAG OFF.BY #IF.REG!IF.RFD!IF.RMD!002000 END IF #IF.REG SET.IN @#IFLAG THEN LET @#IADDR+2 := @#IADDR+2 L.SHIFT 1 SET.BY #R0.SAV ELSE IF #IF.RS SET.IN @#IFLAG THEN LET @#IADDR+2 := #SU.PSW LET @#HV032 := @#LCADDR LET @#HV030 := @#HCADDR LET @#IFLAG := @#IFLAG SET.BY #400 OFF.BY #IF.RS END END LET @#LCADDR := @#IADDR+2 LET @#HCADDR := @#IADDR LET @#IFLAG := @#IFLAG OFF.BY #000002 END LET @#HV040 := #0 LET @#V4FLAG := #0 CALL L05374 IF @#V4FLAG NE #0 THEN JMP BUSERR END .IIF NE .-BRNCH1 .ERROR ; PROC BRNCH1 must be next END SLCMD .............................................................................. ; ; Хелпер -> NXTCHR ; PROCEDURE BRNCH1 BEGIN GOTO NXTCHR END BRNCH1 .............................................................................. ; ; Command ВК ; PROCEDURE CRCMD BEGIN IF R4 NE #CR GOTO LFCMD .IIF NE .-CRCMD2 .ERROR ; PROC CRCMD2 must be next END CRCMD .............................................................................. ; ; Command ВК - без проверки кода в R4 - используется ещё в паре-тройке мест ; PROCEDURE CRCMD2 BEGIN IF #IF.NUM SET.IN @#IFLAG AND @#HV040 EQ #0 THEN IF @#LCADDR EQ #SU.PSW THEN LET @#IADDR+2 := @#IADDR+2 OFF.BY #^C<^O<357>> ; кроме старшего байта и T(?) бита END LET @#V4FLAG := #0 CALL L05466 IF @#V4FLAG NE #0 THEN JUMPTO BUSERR END LET @#IFLAG := @#IFLAG SET.BY #000002 OFF.BY #IF.NUM END LET @#HV040 := #1 CALL SHAT .IIF NE .-BRNCH2 .ERROR ; PROC BRNCH2 must be next END CRCMD2 .............................................................................. ; ; Хелпер -> NXTCHR ; PROCEDURE BRNCH2 BEGIN GOTO BRNCH1 END BRNCH2 .............................................................................. ; ; Command ПС ; PROCEDURE LFCMD BEGIN IF R4 NE #LF GOTO UPCMD LET @#V4FLAG := #0 CALL L05072 .IIF NE .-CHKV4T .ERROR ; PROC CHKV4T must be next END LFCMD .............................................................................. ; ; Фактически - хелпер ; PROCEDURE CHKV4T BEGIN IF @#V4FLAG EQ #0 GOTO BRNCH2 ; фактически BR BRNCH1 JUMPTO BUSERR END CHKV4T .............................................................................. ; ; Command ^ ; PROCEDURE UPCMD BEGIN IF R4 NE #UPAROW GOTO SCCMD LET @#V4FLAG := #0 CALL L05072 GOTO CHKV4T END UPCMD .............................................................................. ; ; Command ; ; PROCEDURE SCCMD BEGIN IF R4 EQ #SCOLON THEN CALL TVOUT LET @#IADDR+2 := #0 LET @#IADDR := #0 GOTO BRNCH2 END .IIF NE .-RCMD .ERROR ; PROC RCMD must be next END SCCMD .............................................................................. ; ; Command R ; PROCEDURE RCMD BEGIN IF R4 EQ #'R THEN GOTO L03100 END .IIF NE .-DLRCMD .ERROR ; PROC DLRCMD must be next END RCMD .............................................................................. ; ; Command $ ; PROCEDURE DLRCMD BEGIN IF R4 NE #DOLLAR GOTO GPCMD .IIF NE .-L03100 .ERROR ; PROC L03100 must be next END DLRCMD .............................................................................. ; ; Общий код для R и $ ; PROCEDURE L03100 BEGIN LET @#IFLAG := #IF.REG!002000 LET @#IADDR+2 := #0 LET @#IADDR := #0 CALL TVOUT .IIF NE .-BRNCH3 .ERROR ; PROC BRNCH3 must be next END L03100 .............................................................................. ; ; хелпер -> NXTCHR ; PROCEDURE BRNCH3 BEGIN BR BRNCH2 END BRNCH3 .............................................................................. ; ; Command G and P ; PROCEDURE GPCMD BEGIN IF R4 EQ #'G OR R4 EQ #'P THEN CALL TVOUT LET R0 := @#R0.SAV LET R1 := @#R1.SAV LET R2 := @#R2.SAV LET R3 := @#R3.SAV LET R5 := @#R5.SAV LET SP := @#SP.SAV IF R4 EQ #'P THEN LET R4 := @#R4.SAV LET @#U.PSW := @#SU.PSW LET @#U.PC := @#SU.PC RTT END ; ELSE RESET LET R4 := @#R4.SAV LET @#U.PSW := #0 LET @#U.PC := @#IADDR+2 RTI ; END END .IIF NE .-SCMD .ERROR ; PROC SCMD must be next END GPCMD .............................................................................. ; ; Command S ; PROCEDURE SCMD BEGIN IF R4 EQ #'S THEN IF #IF.REG OFF.IN @#IFLAG GOTO BRNCH3 CALL TVOUT LET @#IFLAG := #IF.RS!002000 GOTO BRNCH3 END .IIF NE .-ATCMD .ERROR ; PROC ATCMD must be next END SCMD .............................................................................. ; ; Command @ ; PROCEDURE ATCMD BEGIN IF R4 NE #ATSIGN GOTO UNSCMD IF #2000 SET.IN @#IFLAG THEN ; W$CERR !! 3314 - команда перехода в этом операторе .IF NDF W$CERR ; 3314 мой код - 1442, в ПЗУ 1444 .=.-2 BEQ 30$ .ENDC IF #IF.RS OFF.IN @#IFLAG GOTO 20$ LET @#LCADDR := @#HV032 LET @#HCADDR := @#HV030 ; IF @#IFLAG MI #0 THEN ; IF.NUM = 100000 - число было? ; LET @#SU.PSW := @#IADDR+2 ; да - сохраним в PSW ; END TST @#IFLAG BPL 10$ LET @#SU.PSW := @#IADDR+2 10$: LET @#IFLAG := #0 LET @#HV032 :B= #0 AND #077000 EQ @#HV032 THEN ; WRAM? .IF NDF W$CERR ; 3374 мой код - 1012, в ПЗУ 1014 .=.-2 BNE 30$ .ENDC 20$: LET R5 := @#LCADDR LET R0 := (R5) IF @#IFLAG PL #0 GOTO 40$ ; IF.NUM = 100000 - число было? - нет - переход LET (R5) := @#IADDR+2 LET R0 := (R5) ELSE LET @#V4FLAG := #0 ; ?? .IF NDF W$CERR 30$: .ENDC CALL L03472 IF @#V4FLAG NE #0 THEN JUMPTO BUSERR END END 40$: LET @#LCADDR := R0 LET @#HCADDR := #0 .IIF NE .-L03454 .ERROR ; PROC L03454 must be next END ATCMD .............................................................................. ; ; ; PROCEDURE L03454 BEGIN CALL TVOUT LET @#IFLAG := #0 CALL L05210 .IIF NE .-BRNCH4 .ERROR ; PROC BRNCH4 must be next END L03454 .............................................................................. ; ; хелпер -> NXTCHR ; PROCEDURE BRNCH4 BEGIN GOTO BRNCH3 END BRNCH4 .............................................................................. ; ; ; PROCEDURE L03472 BEGIN LET R5 := @#LCADDR IF #IF.RFD!002000 OFF.IN @#IFLAG THEN CALL L13500 END LET R0 := (R5) IF @#IFLAG MI #0 THEN ; IF.NUM = 100000 - число было? LET R0 := @#IADDR+2 LET (R5) := R0 END RETURN END L03472 .............................................................................. ; ; ; PROCEDURE L03532 BEGIN CALL TVOUT LET R4 := #CR JUMPTO CRCMD2 END L03532 .............................................................................. ; ; Command _ ; PROCEDURE UNSCMD BEGIN IF R4 NE #UNDSCR GOTO MCMD IF #002000 SET.IN @#IFLAG GOTO L03532 LET @#V4FLAG := #0 CALL L03472 IF @#V4FLAG NE #0 THEN JUMPTO BUSERR END LET @#LCADDR := @#LCADDR + R0 LET @#HCADDR := @#HCADDR + CARRY LET @#LCADDR := @#LCADDR + #2 LET @#HCADDR := @#HCADDR + CARRY GOTO L03454 END UNSCMD .............................................................................. ; ; Команда M - получить сообщение о причине выхода в пульт ; PROCEDURE MCMD BEGIN IF R4 NE #'M GOTO BCMD CALL TVOUT IF #HE.DBL SET.IN @#HWERRF THEN LET R5 := #DBSERM GOTO SHCERR END IF #HE.INT SET.IN @#HWERRF THEN LET R5 := #INTERM GOTO SHCERR END LET R5 := #HLTM GOTO SHCERR END MCMD .............................................................................. ; ; ; PROCEDURE BUSERR BEGIN LET R5 := #BUSERM .IIF NE .-SHCERR .ERROR ; PROC SHCERR must be next END BUSERR .............................................................................. ; ; Show Console Error Показать сообщение об ошибке при работе в пульте ; Сбросить флаги ввода и текущий адрес ; Перейти к ожиданию следующей команды ; ; R5 - адрес сообщения ; PROCEDURE SHCERR BEGIN LET R3 := #ERMC.L .IIF NE .-SHERR .ERROR ; PROC SHERR must be next END SHCERR .............................................................................. ; ; Show Error Показать сообщение об ошибке ; Сбросить флаги ввода и текущий адрес ; Перейти к ожиданию следующей команды ; ; R3 - длина сообщения ; R5 - адрес сообщения ; PROCEDURE SHERR BEGIN THRU R3 LET R4 :B= (R5)+ CALL TVOUT END LET @#IFLAG := #0 LET @#IADDR+2 := #0 LET @#IADDR := #0 JUMPTO GETCMD END SHERR .IF NDF W$CERR .............................................................................. ; ; Хелпер перехода, но ссылок на него пока не обнаружено... ; PROCEDURE BRNCH5 BEGIN GOTO BRNCH4 END BRNCH5 .ENDC .............................................................................. ; ; Хелпер перехода ; PROCEDURE BRDLCM BEGIN JUMPTO DELCMD END BRDLCM .............................................................................. ; ; Command B ; PROCEDURE BCMD BEGIN IF R4 NE #'B GOTO BRDLCM ; Загрузка? Переход, если нет CALL TVOUT ; Эхо CALL TVNLN ; Новая строка LET R4 := #'$ ; Подсказка CALL TVOUT ; Показать LET R1 := #3 ; Два символа - имя устройства, один символ - номер (два символа для ZF) LET R2 := #BDEV ; Буфер THRU R1 CALL KBIN ; Очередной символ LET (R2)+ :B= R4 ; Сохранить CALL TVOUT ; Эхо END ; Повторить LET @#BUNIT := @#BUNIT OFF.BY #^C<7> ; ВК даст на выходе 10(8) - что будет?? CALL TVNLN ; Новая строка LET R4 := #BTABLE ; Описатель загрузочных устройств LOOP IF (R4) EQ #0 ; Дошли до конца? LET R4 := #ATSIGN ; Да. Подсказка CALL TVOUT ; Вывести JUMPTO GETCM2 ; Следующая команда END IF @#BDEV EQ (R4)+ LEAVE LOOP ; Нашли усройство? Если да - выход из цикла LET R4 := R4 + #6 ; Нет - пропустиь описатель очередного устройства END ; Ищем дальше ; Устройство загрузки найдено LET @#IV4+2 := #NODEV ; Метка перехода, если устройство отсутствует в системе LET R5 := (R4) ; CSR LET R0 := (R5)+ ; Присутствует? ; Все ещё здесь, если да LET @#IV4+2 := #SETV4F ; Стандартный обработчки V4 LET R1 := #DVDRVS ; Начало копируемого в нормальую моду LET R2 := #EDVDRV ; Конец копируемого в нормальную моду + 2 LET R2 := R2 - R1 R.SHIFT 1 ; Длина в словах .IF NDF W$CERR LET R2 := R2 + #1 ; ?? .ENDC LET R5 := #N$WNDW+N$ADR ; Через окно halt моды (с N$WNDW) копируем в нормальную моду ; (с адреса N$ADR нормальной моды) LET @#PARH2 := #0 ; Отображение начала окна halt моды на физический адрес 0 нормальной моды THRU R2 LET (R5)+ := (R1)+ ; Копируем блок поддержки загрузки в нормальную моду END LET R0 := @#BUNIT LET R5 := #100200 ; ??? LET R1 := (R4)+ ; CSR LET R2 := (R4)+ + #N$ADR-DVDRVS ; Точка входа драйвера минус начало копируемого блока плюс ; адрес начала копирования в нормальной моде - +7400 LET R3 := (R4) + #N$ADR-DVDRVS ; 4th parameter - адрес возможный блок параметров плюс минус корректировка адреса LET @#U.PSW := #PR7 LET @#U.PC := R2 LET SP := @#SP.SAV RESET ; ; R0 - номер устройства ; R1 - CSR ; R2 - точка входа драйвера загрузки ; R3 - адрес возможного блока параметров ; R4 - указатель на последнее слова в таблице устройств для устройства загрузки (в HALT режиме) ; R5 - 100200 ; RTI END BCMD .............................................................................. ; ; No such device - обработка прерывания обращения по адресу CSR выбранного устройства загрузки ; PROCEDURE NODEV BEGIN LET @#IV4+2 := #SETV4F ; Стандартный обработчик V4 LET R5 := #NDVM ; Сообщение об ошибке LET R3 := #NDVM.L ; Его длина JUMPTO SHERR ; Показать сообщение об ошибке, сбросить флаги ввода и ; текущий адрес, перейти к ожиданию следующей команды END NODEV .............................................................................. ; ; Точка помощи перехода на GETCM2 ; PROCEDURE L04244 BEGIN JUMPTO GETCM2 END L04244 .............................................................................. ; ; DEL ; PROCEDURE DELCMD BEGIN IF R4 NE #RUBOUT GOTO L04330 IF #IF.NUM OFF.IN @#IFLAG GOTO L04244 CALL MVCRSB CALL SHSPCE CALL MVCRSB THRU R3 := #3 LET C.BIT := OFF LET @#IADDR := @#IADDR R.ROTATE 1 ; ROR @#IADDR LET @#IADDR+2 := @#IADDR+2 R.ROTATE 1 ; ROR @#IADDR+2 END GOTO L04244 END DELCMD .............................................................................. ; ; Точка помощи перехода на GETCM2 ; PROCEDURE L04324 BEGIN JUMPTO GETCM2 END L04324 .............................................................................. ; ; Команда > ; PROCEDURE L04330 BEGIN IF R4 NE #RANGLE THEN JUMPTO TCMD END IF #002000 SET.IN @#IFLAG GOTO L04324 LET @#V4FLAG := #0 CALL L03472 IF @#V4FLAG NE #0 THEN JUMPTO BUSERR END IFB R0 PL #0 THEN LET R0 := R0 OFF.BY #^O<177400> ELSE LET R0 := R0 SET.BY #^O<177400> END LET R0 := R0 L.SHIFT 1 + #2 LET @#LCADDR := @#LCADDR + R0 JUMPTO L03454 END L04330 HLTM: $ERMSC </HALT INSTRUCTION/> DBSERM: $ERMSC </DOUBLE BUS ERROR/> INTERM: $ERMSC </INTERRUPT ERROR /> BUSERM: $ERMSC </BUS ERROR /> $MESSL NDVM .............................................................................. ; ; Стандартный обработчки V4 ; PROCEDURE SETV4F BEGIN LET @#V4FLAG := @#V4FLAG + #1 RETURN END SETV4F .............................................................................. ; ; ; PROCEDURE L04574 BEGIN LET @#HWERRF := #HE.DBL ; Double bus error GOTO L04612 END L04574 .............................................................................. ; ; ; PROCEDURE L04604 BEGIN LET @#HWERRF := #HE.INT .IIF NE .-L04612 .ERROR ; PROC L04612 must be next END L04604 .............................................................................. ; ; ; PROCEDURE L04612 BEGIN LET @#SP.SAV := SP JUMPTO L02156 END L04612 .............................................................................. ; ; ; PROCEDURE KBIN BEGIN REPEAT UNTILB @#TKS MI #0 LET R4 := @#TKB OFF.BY #^C<177> RETURN END KBIN .............................................................................. ; ; ; PROCEDURE TVOUT BEGIN REPEAT UNTILB @#TPS MI #0 LET @#TPB := R4 RETURN END TVOUT .............................................................................. ; ; Show normal prompt (@) clear stored address ; PROCEDURE SHAT BEGIN CALL TVNLN LET R4 := #ATSIGN CALL TVOUT LET @#IADDR+2 := 0 LET @#IADDR := 0 RETURN END SHAT .............................................................................. ; ; Show OCTAL from WSHOW ; PROCEDURE SHWRD BEGIN LET @#TMP.S1 := R5 LET R4 := #0 LET R5 := @#WSHOW LET R1 := #6 LET R4 := R4 C.SHIFT #1 GOTO 20$ THRU R1 LET R4 := R4 C.SHIFT #3 20$: LET R4 := R4 OFF.BY #^C<7> + #'0 CALL TVOUT END LET R5 := @#TMP.S1 RETURN END SHWRD .............................................................................. ; ; Show address ; PROCEDURE SHADDR BEGIN LET R4 := @#HASHOW LET R5 := @#LASHOW LET R4 := R4 C.SHIFT #1 LET @#WSHOW := R5 LET R4 := R4 C.SHIFT #72 OFF.BY #^C<1> + #'0 CALL TVOUT CALL SHDIG CALL SHDIG LET R5 := @#WSHOW THRU R3 := #5 CALL SHDIG END RETURN END SHADDR .............................................................................. ; ; ; PROCEDURE SHDIG BEGIN LET R4 := R4 C.SHIFT #3 OFF.BY #^C<7> + #'0 CALL TVOUT RETURN END SHDIG .............................................................................. ; ; ; PROCEDURE L05072 BEGIN IF #400 SET.IN @#IFLAG AND #SU.PSW EQ @#LCADDR THEN IF R4 NE #LF THEN CALL TVOUT END LET R4 := #CR JUMPTO CRCMD2 END CALL TVOUT IF @#IFLAG MI #0 THEN ; IF.NUM = 100000 - число было? ; да, быдл LET @#V4FLAG := #0 CALL L05466 AND @#V4FLAG NE #0 THEN JUMPTO BUSERR END IF R4 NE #UPAROW GOTO L05222 LET @#LCADDR := @#LCADDR - #2 LET @#HCADDR := @#HCADDR - CARRY .IIF NE .-L05210 .ERROR ; PROC L05210 must be next END L05072 .............................................................................. ; ; ; PROCEDURE L05210 BEGIN LET R4 := #LF CALL TVOUT GOTO L05242 END L05210 .............................................................................. ; ; ; PROCEDURE L05222 BEGIN IF R4 EQ #LF THEN LET @#LCADDR := @#LCADDR + #2 LET @#HCADDR := @#HCADDR + CARRY END .IIF NE .-L05242 .ERROR ; PROC L05242 must be next END L05222 .............................................................................. ; ; ; PROCEDURE L05242 BEGIN IF #IF.REG SET.IN @#IFLAG THEN LET @#LCADDR := @#LCADDR OFF.BY #^C<17> SET.BY #R0.SAV END LET R4 := #CR CALL TVOUT LET @#LASHOW := @#LCADDR LET @#HASHOW := @#HCADDR IF #IF.REG SET.IN @#IFLAG THEN LET R4 := #'R CALL TVOUT LET @#WSHOW := @#WSHOW R.SHIFT 1 OFF.BY #^C<7> + #'0 LET R4 := @#WSHOW CALL TVOUT ELSE CALL SHADDR END LET R4 := #'/ .IIF NE .-L05374 .ERROR ; PROC L05374 must be next END L05242 .............................................................................. ; ; ; PROCEDURE L05374 BEGIN CALL TVOUT LET R5 := @#LCADDR IF #IF.RFD!002000 OFF.IN @#IFLAG THEN CALL L13500 END LET @#WSHOW := (R5) CALL SHWRD LET R4 := #SPACE CALL TVOUT LET @#IADDR+2 := #0 LET @#IADDR := #0 LET @#IFLAG :B= #1 LET @#IFLAG := @#IFLAG OFF.BY #IF.NUM RETURN END L05374 .............................................................................. ; ; ; PROCEDURE L05466 BEGIN LET R5 := @#LCADDR IF #IF.RFD!002000 OFF.IN @#IFLAG THEN CALL L13500 END LET (R5) := @#IADDR+2 RETURN END L05466 .............................................................................. ; ; Команда T ; PROCEDURE TCMD BEGIN IF R4 NE #'T THEN JUMPTO L04324 END CALL TVOUT CALL KBIN CALL TVOUT IF #'0 LE R4 AND #'6 GE R4 THEN LET R4 := R4 - #'0 IF RESULT IS EQ THEN JUMPTO TEST0 END LET @#HV162 := #0 IF #6 EQ R4 THEN CALL L12626 LET @#U.PC := #L10416 RESET RTI END ; ELSIF даёт ошибку, пока не разбирался, но в планах - исправить, что бы не было кучи вложенных IF ELSE IF #1 EQ R4 THEN CALL TEST1 ELSE IF #2 EQ R4 THEN CALL TEST2 ELSE IF #3 EQ R4 THEN CALL TEST3 ELSE IF #4 EQ R4 THEN CALL TEST4 ELSE ; #5 EQ R4 THEN CALL TEST5 END END END END END JUMPTO GETCMD END TCMD EDVDRV: .............................................................................. ; ; ; PROCEDURE ENTRYP BEGIN LET @#SP.SAV := SP LET @#IV4 := #137 LET @#IV4+2 := #SETV4F LET @#R0.SAV := R0 LET @#R1.SAV := R1 LET @#R2.SAV := R2 LET @#R3.SAV := R3 LET @#R4.SAV := R4 LET @#R5.SAV := R5 LET @#SU.PC := @#U.PC LET @#LCADDR := @#U.PC LET @#SU.PSW := @#U.PSW LET @#HCADDR := #0 .IIF NE .-L06006 .ERROR ; PROC L06006 must be next END ENTRYP .............................................................................. ; ; ; PROCEDURE L06006 BEGIN IF @#PWRUP EQ #123456 THEN CALL L13316 JUMPTO L02152 END ; Интересный вариант повтора после определения замкнутости входа на выход :) LOOP IF @#TSTMOD EQ #TVKBC THEN ; вход на выход замкнут ? IF @#HV002 NE #0 THEN LET @#HV002 := #0 LET @#HV154 := R2 CALL TEST4 ; T4 END LET @#HV160 := @#HV160 + #1 LET @#HV156 := #0 CALL L12556 LET @#PWRUP := #0 ; вечное включение питания JUMPTO TEST0 ; T0 и возврат в эту процедуру END IF @#TSTMOD EQ #TVKBNC THEN ; вход на выход НЕ замкнут ? LET @#PWRUP := #123456 ; все, питание включено JUMPTO TEST0 ; однократный прогон T0 и в пульт END ; А ещё не знаем, поэтому - на определение CALL CLUPBC LET @#HV154 := #0 LET @#HV160 := #0 LET @#HV002 := #0 END END L06006 .............................................................................. ; ; T0 ; PROCEDURE TEST0 BEGIN LET @#HV162 := #0 CALL TEST1 LET @#HV162 := #0 CALL TEST2 LET @#HV162 := #0 CALL TEST3 IF #TVKBNC EQ @#TSTMOD THEN ; Вход на выход не замкнут RESET CALL L12626 LET @#U.PC := #CMEMSZ RTI END RESET CALL L12626 LET @#U.PC := #L10416 LET @#HV002 := #1 RTI END TEST0 .............................................................................. ; ; T1 ; PROCEDURE TEST1 BEGIN REPEAT CALL SHASTR LET R0 := @#L13776 ; Записанное значение КС LET R1 := #0 ; Начальное значение КС LET R2 := #0 ; Стартовый адрес блока для вычисляемой КС LET R3 := #L13774 ; Конечный адрес блока для вычисляемой КС REPEAT LET R2 := R2 + (R1)+ + CARRY UNTIL R1 HI R3 IF R0 EQ R2 LEAVE LOOP LET R3 := #E.ROM ; Ошибка ПЗУ CALL L13406 UNTIL #7 LE @#HV162 RETURN END TEST1 .............................................................................. ; ; T2 ; PROCEDURE TEST2 BEGIN CALL SHASTR MOV #WRAM,R0 LOOP LET R4 := R0 LET R1 := (R0) LET (R0) := R4 IFB R4 NE (R0)+ GOTO 30$ SWAB R4 IFB R4 NE (R0) GOTO 30$ LET R0 := R0 - #1 SWAB R4 COM R4 LET (R0)+ :B= R4 SWAB R4 LET (R0)+ :B= R4 SWAB R4 IF R4 NE -(R0) GOTO 30$ LET (R0)+ := R1 20$: IF R0 GE #WRAM+^O<776> GOTO 40$ END 30$: LET (R0)+ := R1 LET R3 := #E.SRAM ; Ошибка СОЗУ CALL L13406 IF #7 GT @#HV162 GOTO 20$ 40$: RETURN END TEST2 .............................................................................. ; ; T3 ; PROCEDURE TEST3 BEGIN REPEAT LET @#IV4+2 := #L06510 CALL SHASTR LET @#PARH2 := #177600 ; 17 760 000 Map to IO Page TST @#N$WNDW LET R3 := #E.V4 ; Ошибка вектора 4 CALL L13406 UNTIL #7 LE @#HV162 JUMPTO L06006 END TEST3 .............................................................................. ; ; ; PROCEDURE L06510 BEGIN LET @#IV4+2 := #SETV4F RETURN END L06510 .............................................................................. ; ; T4 ; PROCEDURE TEST4 BEGIN CALL SHASTR LET @#IV4+2 := #L06642 LET R2 := #MEDG THRU R1 := #MEDG.L LET @#LCADDR := 0 LET R0 := (R2) SHIFT #66 OFF.BY #^C<77> LET @#HCADDR := R0 LET @#PARH2 := (R2)+ LET @#N$WNDW := #0 END LET @#LCADDR := #160000 LET @#HCADDR := #77 TST (R2)+ LET @#PARH2 := #177600 ; Map to IO Page LET @#N$WNDW := #0 LET R3 := #E.ERAM ; Не определена граница ОЗУ CALL L13406 JUMPTO SETSV4 END TEST4 .............................................................................. ; ; Тест памяти ? ; PROCEDURE L06642 BEGIN LET @#IV4+2 := #MP1V4 LET R2 := R2 - #2 - #MEDG LET R1 := #MSIZES LET R3 := R2 LET R2 := R2 L.SHIFT 1 + R3 LET R4 := R2 R.SHIFT 2 IF #4 LE R4 THEN LET R4 := #4 END LET C.BIT := OFF LET R4 := R4 SHIFT #4 LET @#HV050 := R4 LET R1 := R1 + R2 LET R0 := #MSIZ THRU R2 := #MSIZ.L REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R0)+ END THRU R2 := #6 REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R1)+ END LET @#HV032 := @#LCADDR LET @#HV030 := @#HCADDR CALL L13062 LET @#HV052 := #0 $SHMESS MFW LOOP THRU R4 := #10 LET R0 := #10000 IF #3 EQ @#TKB THEN JUMPTO SETSV4 END CALL L13232 THRU R0 CALL L13500 LET @R5 := @#LCADDR + @#HV164 MP1V4R: ; Возврат сюда при прерывании по V4 на первом проходе (до 7 ошибок?) LET @#LCADDR := @#LCADDR + #2 LET @#HCADDR := @#HCADDR + CARRY END IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO L07144 END LET @#HV164 := @#HV164 + #2000 END L07144: ; Точка выхода из первого прохода LET @#IV4+2 := #MP2V4 CALL L13062 $SHMESS MRBW LOOP THRU R4 := #10 LET R0 := #10000 IF #3 EQ @#TKB THEN JUMPTO SETSV4 END CALL L13232 THRU R0 CALL L13500 LET @#IADDR+2 := @#LCADDR + @#HV164 LET @#IADDR :B= (R5)+ SWAB @#IADDR LET @#IADDR :B= (R5) SWAB @#IADDR IF @#IADDR+2 NE @#IADDR THEN CALL L12750 AND #7 LE @#HV162 THEN JUMPTO SETSV4 END CALL L13500 LET @#IADDR+2 := NOT @#IADDR+2 LET (R5)+ :B= @#IADDR+2 SWAB @#IADDR+2 LET (R5) :B= @#IADDR+2 MP2V4R: ; Возврат сюда при прерывании по V4 на втором проходе (до 7 ошибок?) LET @#LCADDR := @#LCADDR + #2 LET @#HCADDR := @#HCADDR + CARRY END IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO L07404 END LET @#HV164 := @#HV164 + #2000 END L07404: ; Точка выхода из второго прохода LET @#IV4+2 := #MP3V4 CALL L13062 $SHMESS MBR LOOP THRU R4 := #10 LET R0 := #10000 IF #3 EQ @#TKB THEN JUMPTO SETSV4 END CALL L13232 THRU R0 CALL L13500 LET @#IADDR+2 := @#LCADDR + @#HV164 LET @#IADDR+2 := NOT @#IADDR+2 LET @#IADDR := @R5 LET @R5 := #0 IF @#IADDR+2 NE @#IADDR THEN CALL L12750 AND #7 LE @#HV162 THEN GOTO SETSV4 END MP3V4R: ; Возврат сюда при прерывании по V4 на третьем проходе (до 7 ошибок?) LET @#LCADDR := @#LCADDR + #2 LET @#HCADDR := @#HCADDR + CARRY END IF @#HCADDR EQ @#HV030 AND @#LCADDR EQ @#HV032 GOTO SETSV4 ; Точка выхода из третьего прохода END LET @#HV164 := @#HV164 + #2000 END END L06642 .............................................................................. ; ; Показ информации о сбойной ячейке (?) ; PROCEDURE L07610 BEGIN LET @#HASHOW := @#HCADDR LET @#LASHOW := @#LCADDR LET R3 := #E.ARAM ; Ошибка доступа ОЗУ CALL L13406 CALL SHADDR RETURN END L07610 .............................................................................. ; ; Проверка памяти - прямая запись -> прерывание по V4 ; PROCEDURE MP1V4 BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP1V4R END MP1V4 .............................................................................. ; ; Проверка памяти - Чтение и обратная запись -> прерывание по V4 ; PROCEDURE MP2V4 BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP2V4R END MP2V4 .............................................................................. ; ; Проверка памяти - чтение обратной записи -> прерывание по V4 ; PROCEDURE MP3V4 BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP3V4R END MP3V4 .............................................................................. ; ; Восстановить стандартный обработчик прерывания по V4 ; PROCEDURE SETSV4 BEGIN LET @#IV4+2 := #SETV4F RETURN END SETSV4 .............................................................................. ; ; Вычисление размера памяти ; PROCEDURE CMEMSZ BEGIN LET @#V.LTC+2 := #30000+PR7 LET @#V.LTC := #TMROFF LET R3 := #10000 MTPS #0 THRU R3 END LET @#SSR3 := #MM3.22 LET @#SSR0 := #MM0.EN LET @#NR024 := #0 LET @#NR016 := R1 LET @#NR020 := R2 LET @#V.TR4 := #L10100 LET @#V.TR4+2 := #PR7 LET R2 := #MEDG LET R1 := #MEDG.L MTPS #0 THRU R1 LET @#KISAR1 := (R2)+ LET @#20000 := #0 END LET @#KISAR1 := #177600 TST (R2)+ LET @#20000 := #0 LET R3 := #E.ERAM ; Не определена граница ОЗУ CALL L13434 BR L10416 END CMEMSZ .............................................................................. ; ; ; PROCEDURE L10100 BEGIN LET @SP := #L10106 RTI END L10100 .............................................................................. ; ; ; PROCEDIRE L10106 BEGIN LET @#V.TR4 := #L10256 LET @#NR022 := #200 LET @#NR012 := @#KISAR1 CALL SHASTR LET R2 := R2 - #2 - #MEDG LET R1 := #MSIZES LET R3 := R2 LET R2 := R2 L.SHIFT 1 + R3 LET R1 := R1 + R2 LET R0 := #MSIZ LET R2 := #MSIZ.L THRU R2 REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R0)+ END THRU R2 := #6 REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R1)+ END LOOP LET @#KISAR1 := @#NR022 LET @#NR022 := @#NR022 + #200 LET R0 := #10000 LET R1 := #20000 L10250: THRU R0 LET (R1)+ := #0 END END END L10106 .............................................................................. ; ; ; PROCEDURE L10256 BEGIN LET @#NR014 := R0 LET @#NR010 := R1 IF R1 EQ #20000 THEN LET R0 := @#KISAR1 OFF.BY #^O<170000> IF RESULT IS EQ GOTO 20$ END LET R4 := R4 C.SHIFT #72 + R2 LET R3 := R3 + CARRY LET @#HASHOW := R3 LET @#LASHOW := R4 LET R3 := #E.ARAM ; Ошибка доступа ОЗУ CALL L13434 CALL SHADDR LET @#LASHOW := #0 LET @#HASHOW := #0 IF #7 LE @#NR024 GOTO 20$ LET R1 := @#NR010 LET R0 := @#NR014 - #1 LET @SP := #L10250 RTI 20$: LET SP := SP + #4 LET R1 := @#NR016 LET R2 := @#NR020 .IIF NE .-L10416 .ERROR ; PROC L10416 must be next END L10256 .............................................................................. ; ; ; PROCEDURE L10416 BEGIN MTPS #PR7 LET @#NR024 := #0 LET @#NR016 := R1 LET @#NR020 := R2 CALL SHASTR LET @#V.LTC+2 := #PR7 LET @#V.LTC := #TMROFF LET @#V.TR4 := #EMMUV4 LET @#V.TR4+2 := #PR7 LET @#V.MMU := #EMMUI LET @#V.MMU+2 := #PR7 LET R0 := #77406 ; <^D<127>*^O<400>&P.LNM!P.RW>? ; Полная длина страницы, чтение-запись LET R3 := #177000 MTPS #0 THRU R3 END LET @#SSR3 := #MM3.22 ; 22 бита LET @#SSR0 := #MM0.EN ; включаем ДП LET @#KISAR3 := #600 ; страница 60000 LET @#UISAR0 := #0 ; страница 0 LET @#UISAR1 := #600 ; страница 20000 LET @#UISAR7 := #177600 ; страница в/в LET PS := #140000+PR7 ; текущий режим User, предыдущий режим Kernel, приоритет 7 LET @#20000 := R0 ; LET @#V.TR4 := #L10620 MTPS #0 LET @#160000 := #0 GOTO ENV4 END L10416 .............................................................................. ; ; Проверка прохождения теста ДП ; Тест прерывания от терминала ; PROCEDURE L10620 BEGIN LET R0 := R0 - @#60000 ; Сохранили через User окно - проверяем то же самое значение Kernel окно IF RESULT IS NE GOTO EMMU ; не равны - тест ДП не пройден LET @#V.TPS := #L10670 LET @#V.TPS+2 := #PR7 LET @#TPS := @#TPS SET.BY #100 TST @#TPB LET R3 := #177000 MTPS #0 THRU R3 END GOTO ENTTY END L10620 .............................................................................. ; ; ; PROCEDURE L10670 BEGIN TST @#TPB LET @#TPS := #0 LET @#NS000 := #44444 LET @#776 := #0 JUMPTO @#776 END L10670 .............................................................................. ; ; Прерывание по вектор 4 при работе ДП ; PROCEDURE EMMUV4 BEGIN LET R3 := #E.MMU4 GOTO L10752 END EMMUV4 .............................................................................. ; ; Прерывание по вектору 250 при работе ДП ; PROCEDURE EMMUI BEGIN LET R3 := #E.MMUI GOTO L10752 END EMMUI .............................................................................. ; ; Ошибка - нет прерывания от терминала ; PROCEDURE ENTTY BEGIN LET R3 := #E.NTTY GOTO L10752 END ENTTY .............................................................................. ; ; Ошибка диспетчера памяти ; PROCEDURE EMMU BEGIN LET R3 := #E.MMU GOTO L10752 END EMMU .............................................................................. ; ; Ошибка - нет прерывания по вектору 4 ; PROCEDURE ENV4 BEGIN LET R3 := #E.NV4 .IIF NE .-L10752 .ERROR ; PROC L10752 must be next END ENV4 .............................................................................. ; ; R3 - код ошибки ; PROCEDURE L10752 BEGIN CALL L13434 CALL SHASTR LET @#NS000 := #44444 HALT END L10752 .............................................................................. ; ; "Выключите, наконец, таймер :) ; PROCEDURE TMROFF BEGIN LET R3 := #E.TMR ; Выключите таймер CALL L13434 MTPS #PR7 HALT END TMROFF .............................................................................. ; ; T5 ; PROCEDURE TEST5 BEGIN CALL SHASTR LET @#IV4+2 := #NODEV CALL TVNLN LET R0 := #LF CALL LPOUT LET R0 := #RUS CALL LPOUT CALL L11230 CALL TVNLN LET R0 := #LF CALL LPOUT LET R0 := #LAT CALL LPOUT CALL L11230 LET R0 := #LF CALL LPOUT ; LET R0 := #LPGD ; LET R4 := #26 ; CALL SHSTR $SHMESS LPGD .IF NDF W$CERR .=.-6 ; Хак ошибки (?) ROM .WORD 26 ; Длина сообщения 24 символа, а не 26 .=.+4 .ENDC CALL TVNLN 10$: LET R2 := #0 LET R0 := #LF LOOP CALL LPOUT IF #LF NE R0 AND #CR NE R0 THEN LET R2 := R2 + #1 IF #^D<80> LE R2 GOTO 10$ END REPEAT UNTILB @#TKS MI #0 LET R0 := @#TKB IFB #CTRLC EQ R0 LEAVE LOOP IF #LF EQ R0 GOTO 10$ END LET @#IV4+2 := #SETV4F RETURN END TEST5 .............................................................................. ; ; ; PROCEDURE L11230 BEGIN LET R1 := #'~-'0+1 ; Счётчик с 0 до ~ LET R0 := #'0 ; С 0 THRU R1 CALL LPOUT LET R0 := R0 + #1 END RETURN END L11230 .............................................................................. ; ; ; PROCEDURE LPOUT BEGIN LET R3 := #0 THRU R5 := #10 THRU R3 IFB @#LPS MI #0 GOTO 20$ END END $SHMESS NOLP LET SP := #U.PC LET @#IV4+2 := #SETV4F JUMPTO GETCMD 20$: LET @#LPB := R0 REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= R0 RETURN END LPOUT .............................................................................. ; ; ; PROCEDURE TVNLN BEGIN LET R4 := #LF CALL TVOUT LET R4 := #CR CALL TVOUT RETURN END TVNLN .............................................................................. ; ; R1 - ?? ; R2 - ?? ; R3 - код ошибки ; PROCEDURE SHTERR BEGIN IF #1122 NE R1 THEN INC R2 IF R2 LT #7 GOTO 50$ WAIT END LET R5 := #ERRORS LOOP DEC R3 IF RESULT IS EQ LEAVE LOOP LET R5 := R5 + #ERMT.L END THRU R3 := #ERMT.L REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R5)+ END 50$: RETURN END SHTERR ERRORS: $ERMST E.ROM, </o[ibka pzu// /> ; 1 $ERMST E.SRAM, </o[ibka sozu// /> ; 2 $ERMST E.V4, </o[ibka wektora 4// /> ; 3 $ERMST E.ARAM, </o[ibka dostupa ozu// /> ; 4 $ERMST E.RAM, </o[ibka ozu // /> ; 5 $ERMST E.MMU4, </wektor 4 pri rabote dp// /> ; 6 $ERMST E.MMUI, </wektor 250 pri rabote dp// /> ; 7 $ERMST E.NTTY, </net prerywaniq ot terminala /> ; 10 $ERMST E.MMU, </o[ibka dispet^era pamqti// /> ; 11 $ERMST E.NV4, </net prerywaniq po wektoru 4// /> ; 12 $ERMST E.TMR, </wykl@^itx tajmer// /> ; 13 $ERMST E.ERAM, </ne opredelena granica ozu // /> ; 14 $MESSL MSIZ, /dostupnoe ozu - /> $MESSL NOLP, </pe~atx ne gotowa/> $MESSL MFW, </idet prqmaq zapisx/> $MESSL MRBW, </idet ~tenie i obratnaq zapisx /> $MESSL MBR, </idet ~tenie obratnoj zapisi// /> $MESSL LPGD, </pe~atx prowerena/> .............................................................................. ; ; Проверка - не замкнут ли вход на выход консоли ; ; Флаг TSTMOD - TVKBNC - не замкнут ; TVKBC - замкнут ; PROCEDURE CLUPBC BEGIN THRU R2 := #0 TSTB @#TPS ; выход консоли готов? IF RESULT IS MI LEAVE LOOP ; MI, если да END ; продолжаем ждать LET @#TPB := #ASTER ; попробуем послать * THRU R2 := #0 ; TSTB @#TKS ; вход консоли готов? BMI 50$ ; MI, если да END ; продолжаем ждать 40$: LET @#TSTMOD := #TVKBNC ; выход на выход НЕ замкнут BR 60$ 50$: CMP #ASTER,@#TKB ; прилетела * ? BNE 40$ ; нет LET @#TSTMOD := #TVKBC ; выход на выход НЕ замкнут 60$: RETURN END CLUPBC .............................................................................. ; ; ; PROCEDURE L12556 BEGIN IF #TVKBNC NE @#TSTMOD THEN IF @#HV160 GE #20 LET @#HV160 := #1 END LET R2 := @#HV156 + @#HV160 + @#HV050 LET @#LPB := R2 END RETURN END L12556 .............................................................................. ; ; T6 ? ; PROCEDURE L12626 BEGIN LET R5 := #N$WNDW LET R1 := #0 LET R2 := #-N$WNDW>/2 LET @#PARH2 := #0 THRU R2 LET (R5)+ := (R1)+ END LET @#N$WNDW := #0 LET @#N$WNDW+^O := #0 LET @#U.PSW := #0 LET SP := #SPTOP LET R1 := @#TSTMOD LET R2 := @#HV154 LET @#KISAR0 := #0 LET @#KISAR7 := #177600 LET R0 := #^D<8> LET R3 := #KISDR0 THRU R0 LET (R3)+ := #<^D<127>*^O<400>&P.LNM!P.RW> ; Полная длина страницы, чтение-запись END LET R0 := #^D<8> LET R3 := #UISDR0 THRU R0 LET (R3)+ := #<^D<127>*^O<400>&P.LNM!P.RW> ; Полная длина страницы, чтение-запись END RETURN END L12626 .............................................................................. ; ; ; PROCEDURE L12750 BEGIN LET @#TMP.S1 := R0 LET @#TMP.S2 := R4 LET @#LASHOW := @#LCADDR LET @#HASHOW := @#HCADDR LET R3 := #E.RAM ; Ошибка ОЗУ CALL L13406 CALL SHADDR LET R4 := #'/ CALL TVOUT LET @#WSHOW := @#IADDR CALL SHWRD CALL SHSPCE LET @#WSHOW := @#IADDR+2 CALL SHWRD LET R0 := @#TMP.S1 LET R4 := @#TMP.S2 RETURN END L12750 .............................................................................. ; ; ; PROCEDURE L13062 BEGIN LET @#LCADDR := #0 LET @#HCADDR := #0 LET @#HV164 := #0 LET @#PARH2 := #0 RETURN END L13062 .............................................................................. ; ; ; PROCEDURE SHASTR BEGIN REPEAT UNTILB @#TPS MI #0 LET @#TPB := #ASTER RETURN END SHASTR .............................................................................. ; ; Переместить курсор на позицию назад (двумя возможными способами?) ; PROCEDURE MVCRSB BEGIN CALL SCTRLW ; Ctrl/W CALL SHOWBS ; BS RETURN END MVCRSB .............................................................................. ; ; ; PROCEDURE SCTRLW BEGIN REPEAT UNTILB @#TPS MI #0 LET @#TPB := #CTRLW RETURN END SCTRLW .............................................................................. ; ; ; PROCEDURE SHOWBS BEGIN REPEAT UNTILB @#TPS MI #0 LET @#TPB := #BS RETURN END SHOWBS .............................................................................. ; ; ; PROCEDURE L13170 BEGIN IF @#HV052 EQ #0 THEN INC @#HV052 CALL SCTRLW END CALL SHOWBS RETURN END L13170 .............................................................................. ; ; ; PROCEDURE SHSPCE BEGIN REPEAT UNTILB @#TPS MI #0 LET @#TPB := #SPACE RETURN END SHSPCE .............................................................................. ; ; ; PROCEDURE L13232 BEGIN IF @#HV170 NE #0 THEN LET @#HV170 := #0 CALL SHASTR CALL L13170 LET @#HV156 := #0 CALL L12556 ELSE INC @#HV170 CALL SHSPCE CALL L13170 LET @#HV156 := #200 CALL L12556 END RETURN END L13232 .............................................................................. ; ; ; PROCEDURE L13316 BEGIN CLR @#PARH2 ; С адреса в нормальном режиме IF #44444 EQ @#N$WNDW+NS000 THEN ; @#NS000 (@#15000) в нормальном режиме LET @#PARH2 := #600 ; 60000 LET @#HV154 := R2 IF @#N$WNDW NE #077406 THEN ; <^D<127>*^O<400>&P.LNM!P.RW> ; Полная длина страницы, чтение-запись ? LET R3 := #E.MMU ; Ошибка диспетчера памяти CALL L13406 END LET R0 := #N$WNDW LET @#PARH2 := #0 THRU R1 := #/2 LET (R0)+ := #0 END END RETURN END L13316 .............................................................................. ; ; R3 - код ошибки ; PROCEDURE L13406 BEGIN LET R1 := @#TSTMOD LET R2 := @#HV154 CALL SHTERR LET @#HV154 := R2 LET @#HV162 := @#HV162 + #1 RETURN END L13406 .............................................................................. ; ; R3 - код ошибки ; PROCEDURE L13434 BEGIN LET R1 := @#NR016 LET R2 := @#NR020 CALL SHTERR LET @#NR020 := R2 LET @#NR024 := @#NR024 + #1 RETURN END L13434 .............................................................................. ; ; Show string at R0 length R4 ; PROCEDURE SHSTR BEGIN THRU R4 REPEAT UNTILB @#TPS MI #0 LET @#TPB :B= (R0)+ END RETURN END SHSTR .............................................................................. ; ; ; PROCEDURE L13500 BEGIN LET R5 := @#LCADDR LET R3 := R5 LET R5 := R5 OFF.BY #^C<17777> SET.BY #N$WNDW LET @#TMP.S3 := R2 LET R2 := @#HCADDR C.SHIFT #72 LET R3 := R3 OFF.BY #177 LET @#PARH2 := R3 LET R2 := @#TMP.S3 RETURN END L13500 MEDG: .WORD 010000 ;<000><020> .WORD 020000 ;<000>' ' .WORD 030000 ;<000>'0' .WORD 040000 ;<000>'@' .WORD 050000 ;<000>'P' .WORD 060000 ;<000><140> .WORD 070000 ;<000>'П' .WORD 100000 ;<000><200> .WORD 110000 ;<000><220> .WORD 120000 ;<000><240> .WORD 130000 ;<000><260> .WORD 140000 ;<000><300> .WORD 150000 ;<000><320> .WORD 160000 ;<000><340> .WORD 170000 ;<000><360> MEDG.L =: <.-MEDG>/2 MSIZES: .ASCII /256 K / .ASCII /512 K / .ASCII /768 K / .ASCII / 1 M / .ASCII /1,2 M / .ASCII /1,5 M / .ASCII /1,7 M / .ASCII / 2 M / .ASCII /2,2 M / .ASCII /2,5 M / .ASCII /2,7 M / .ASCII / 3 M / .ASCII /3,2 M / .ASCII /3,5 M / .ASCII /3,7 M / .ASCII / 4 M / .IIF GT .+4-ROMEND .ERROR ; ПЗУ слишком большое!! .=ROMEND-4 L13774: .WORD 000000 L13776: .WORD 140166 ; КС ROM .IIF NE .-ROMEND .ERROR ; ПЗУ неправильного размера!! .INCLUDE /134WA.MAC/ END 134ROM .END