; ; new show ErrCorr ZF ZF64 ; 007 13746 ; 008 13532 ; 009 13516 013564 13722 13770 ; ; D:\intelFPGA_lite\Projects\Dnepr 2018.13.0sp1\ROM ; .NLIST .INCLUDE /KXX:DSMAC.MAC/ .INCLUDE /KXX:MYMAC.MAC/ .INCLUDE /KXX:ASCII.MAC/ .INCLUDE /KXX:HWDF.MAC/ .INCLUDE /134CND.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: PROCEDURE MY.BOT ; ; MY ; 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 PROCEDURE MX.BOT ; ; MX ; 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 .IF DF P$ZF PROCEDURE ZF.BOT ; ; R0 - номер устройства ; R1 - CSR ; R2 - точка входа драйвера загрузки ; R3 - адрес возможного блока параметров ; R4 - указатель на последнее слова в таблице устройств для устройства загрузки (в HALT режиме) ; R5 - 100200 ; ; 114 (драйвер под XM) ; ; 183 PIO4, APM254 ; BEGIN .IF DF Z$FN77 LET R0 := R0 OFF.BY #^C<100077> ; 0..77 .IFF LET R0 := R0 OFF.BY #^C<100007> ; 0..3 .ENDC LET R5 := R0 IF RESULT IS MI THEN ASL R0 ASR R0 LET R5 := R0 LET R5 := R5 * #40 END LET @R1 := #DC.STA!DC.NIE LET R1 := R1 + #P$STAT-P$CSR2 ; P$STAT, P$CMD REPEAT REPEAT LET R2 :B= @R1 ; P$STAT - CS.BSY busy? .ASSUME CS.BSY EQ <^O200> UNTIL RESULT IS PL .ASSUME CS.DRD EQ <^O100> LET R2 :B= R2 L.SHIFT 1 UNTIL RESULT IS MI LET R1 := R1 + #P$SCNT-P$STAT LET (R1)+ := #1 ; P$SCNT .ASSUME P$SNUM EQ LET (R1)+ := #0 ; P$SNUM .ASSUME P$CYLL EQ LET (R1)+ := #0 ; P$CYLL .ASSUME P$CYLH EQ LET (R1)+ := R5 ; P$CYLH .ASSUME P$DH EQ LET R3 := (R3) SET.BY #DH.STA!DH.LBA ; DH.DRV LET (R1)+ := R3 ; P$DH .ASSUME P$CMD EQ .ASSUME P$STAT EQ LET @R1 := #CS.RD ; CS.RD -> P$CMD, P$STAT REPEAT REPEAT LET R2 :B= @R1 ; P$STAT => R2 - CS.BSY busy? UNTIL RESULT IS PL UNTILB #CS.DRQ SET.IN R2 ; Data transfer request? .ASSUME CS.ERR EQ <^O1> LET R2 :B= R2 R.SHIFT 1 IF RESULT IS CC THEN ; 1=>C - CS.ERR? LET R2 := #0 LET R1 := R1 + #P$DBUF-P$STAT THRU R4 := #256. LET (R2)+ := @R1 END LET R1 := R1 + #P$CSR2-P$DBUF ; R1 CSR AND @R4 EQ #NOP THEN ; R4 - 0 ; R0 Device Num LET PC := #0 END LOOP HALT END END ZF.BOT .ENDC .IF NDF P$ZF PROCEDURE DU.BOT ; ; DU ; 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 .ENDC ; NDF P$ZF ;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> PROCEDURE CT.BOT ; ; CT ; 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 PROCEDURE MT.BOT ; ; MT ; 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 $GOTO WAIT END MT.BOT PROCEDURE WAIT ; ; Wait ; BEGIN REPEAT UNTIL R5 SET.IN @R1 IF RESULT IS PL GOTO CBOOT2 $GOTO SHDVER END WAIT PROCEDURE SHDVER ; ; Show Device Error message ; BEGIN $SHMESS DVER HALT END SHDVER PROCEDURE DP.BOT ; ; DP ; BEGIN $GOTO CBOOT END DP.BOT PROCEDURE CBOOT ; ; Common boot, entry 1 ; BEGIN LET @R1 := R2 $GOTO CBOOT2 END CBOOT PROCEDURE CBOOT2 ; ; Common boot, entry 2 ; BEGIN LET 2(R1) := #^C<511> ; 177266 LET R2 :B= (R3)+ LET R1 := R1 OFF.BY #377 LET @R1 := @R1 SET.BY R2 ENTRY CBDK 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 PROCEDURE DM.BOT ; ; DM ; BEGIN LET 10(R1) := R0 LET @R1 := #3 GOTO WAIT END DM.BOT PROCEDURE DB.BOT ; ; DB ; BEGIN LET 10(R1) :B= R0 LET @R1 :B= (R3)+ LET 32(R1) := #14000 ; 14000 ?? GOTO CBOOT3 END DB.BOT PROCEDURE MM.BOT ; ; MM ; 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 PROCEDURE DW.BOT ; ; DW ; 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 PROCEDURE DS.BOT ; ; DS ; BEGIN LET 10(R1) :B= R0 $GOTO CBOOT3 END DS.BOT PROCEDURE CBOOT3 ; ; Common boot, entry 3 ; BEGIN MOV 16(R1), 16(R1) ; ???? $GOTO BCBOT2 END CBOOT3 PROCEDURE BCBOT2 ; ; Go to Common boot, entry 2 ; BEGIN GOTO CBOOT2 END BCBOT2 PROCEDURE DX.BOT ; ; DX ; 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 PROCEDURE DK.BOT ; ; DK ; ; R0 - номер устройства ; R1 - CSR ; R2 - точка входа драйвера загрузки ; R3 - адрес возможного блока параметров ; R4 - указатель на последнее слова в таблице устройств для устройства загрузки (в HALT режиме) ; R5 - 100200 ; BEGIN .IF NDF W$CERR LET R2 := R2 SHIFT #5 LET 6(R1) := R2 GOTO BCBOT2 .IFF TST (R1)+ ; CSR -> WC LET (R1)+ := #-256. ; WC :=-256. -> BA LET (R1)+ := #0 ; BA := 0 -> drive address LET R0 := R0 SHIFT #13. LET (R1) := R0 ; Drive address LET R0 := R0 SHIFT #-13. LET R1 := R1 - #6 LET (R1) :B= (R3) GOTO CBDK ; REPEAT ; UNTILB (R1) MI #0 ; CLR PC .ENDC 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 .IF DF P$ZF DV.BOT ZA ZACSR2, ZF.BOT, ZAZFWQ DV.BOT ZB ZBCSR2, ZF.BOT, ZAZFWQ DV.BOT ZC ZCCSR2, ZF.BOT, ZAZFWQ DV.BOT ZD ZDCSR2, ZF.BOT, ZAZFWQ DV.BOT ZE ZECSR2, ZF.BOT, ZAZFWQ DV.BOT ZF ZFCSR2, ZF.BOT, ZAZFWQ DV.BOT WQ WQCSR2, ZF.BOT, ZAZFWQ DV.BOT WS WQCSR2, ZF.BOT, WS.PRM .ENDC .IF NDF P$ZF DV.BOT DU 175150, DU.BOT, BTABLE .ENDC DV.END ZAZFWQ: .WORD 0 WS.PRM: .WORD DH.DRV 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 /> .EVEN ................................................................................ L02152: LET @#HWERRF := #0 L02156: LET @#IV4 := #137 LET @#IV4+2 := #SETV4F LET @#IFLAG := #IF.B0 LET @#HCADDR := #0 CALL SHAT2 CALL SHSPCE LET @#WSHOW := @#SU.PC CALL SHWRD PROCEDURE GETCMD ; ; Ввод команды - выдача подсказки и уход на GETCM2 ; BEGIN CALL SHAT2 $GOTO GETCM2 END GETCMD PROCEDURE GETCM2 ; ; Ввод команды - цикл ввода числа. Выход по любому символу вне диапазона '0..'7 ; BEGIN CALL KBIN IF R4 LT #'0 GOTO CHKCMD IF R4 GE #'8 GOTO CHKCMD CALL TVOUT LET @#IFLAG := @#IFLAG OFF.BY #IF.B1!IF.B0 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 #^O<3&77> LET R3 := R3 + R4 LET @#IADDR := R2 LET @#IADDR+2 := R3 LET @#IFLAG := @#IFLAG SET.BY #IF.NUM $GOTO NXTCHR END GETCM2 PROCEDURE NXTCHR ; ; Хелпер ; BEGIN GOTO GETCM2 END NXTCHR PROCEDURE CHKCMD ; ; Входная точка обработки команд ; BEGIN IF #IF.RS SET.IN @#IFLAG GOTO SLCMD ; RS уже ввели? - да, символ S не рассматривается $GOTO RSCMD END CHKCMD PROCEDURE RSCMD ; ; Возможная команда RS ; BEGIN IF R4 EQ #'S GOTO SLCMD IF #IF.REG OFF.IN @#IFLAG GOTO SLCMD IF #IF.RFD OFF.IN @#IFLAG GOTO NXTCHR $GOTO SLCMD END RSCMD PROCEDURE SLCMD ; ; Command / ; BEGIN IF R4 NE #SLASH GOTO CRCMD .ASSUME IF.NUM EQ <^O<100000>> IF @#IFLAG MI #0 AND #IF.RFD OFF.IN @#IFLAG THEN LET @#IFLAG := @#IFLAG OFF.BY #IF.B10 END IFB @#IFLAG EQ #0 THEN LET @#IFLAG := @#IFLAG OFF.BY #IF.B8 IF #IF.RMD SET.IN @#IFLAG THEN LET @#IFLAG := @#IFLAG OFF.BY #IF.REG!IF.RFD!IF.RMD!IF.B10 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 #IF.B8 OFF.BY #IF.RS END END LET @#LCADDR := @#IADDR+2 LET @#HCADDR := @#IADDR LET @#IFLAG := @#IFLAG OFF.BY #IF.B1 END LET @#HV040 := #0 LET @#V4FLAG := #0 CALL L05374 IF @#V4FLAG NE #0 THEN JMP BUSERR END $GOTO BRNCH1 END SLCMD PROCEDURE BRNCH1 ; ; Хелпер -> NXTCHR ; BEGIN GOTO NXTCHR END BRNCH1 PROCEDURE CRCMD ; ; Command ВК ; BEGIN IF R4 NE #CR GOTO LFCMD $GOTO CRCMD2 END CRCMD PROCEDURE CRCMD2 ; ; Command ВК - без проверки кода в R4 - используется ещё в паре-тройке мест ; 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 #IF.B1 OFF.BY #IF.NUM END LET @#HV040 := #1 CALL SHAT2 $GOTO BRNCH2 END CRCMD2 PROCEDURE BRNCH2 ; ; Хелпер -> NXTCHR ; BEGIN GOTO BRNCH1 END BRNCH2 PROCEDURE LFCMD ; ; Command ПС ; BEGIN IF R4 NE #LF GOTO UPCMD LET @#V4FLAG := #0 CALL L05072 $GOTO CHKV4T END LFCMD PROCEDURE CHKV4T ; ; Фактически - хелпер ; BEGIN IF @#V4FLAG EQ #0 GOTO BRNCH2 ; фактически BR BRNCH1 JUMPTO BUSERR END CHKV4T PROCEDURE UPCMD ; ; Command ^ ; BEGIN IF R4 NE #UPAROW GOTO SCCMD LET @#V4FLAG := #0 CALL L05072 GOTO CHKV4T END UPCMD PROCEDURE SCCMD ; ; Command ; ; BEGIN IF R4 EQ #SCOLON THEN CALL TVOUT LET @#IADDR+2 := #0 LET @#IADDR := #0 GOTO BRNCH2 END $GOTO RCMD END SCCMD PROCEDURE RCMD ; ; Command R ; BEGIN IF R4 EQ #'R THEN GOTO L03100 END $GOTO DLRCMD END RCMD PROCEDURE DLRCMD ; ; Command $ ; BEGIN IF R4 NE #DOLLAR GOTO GPCMD $GOTO L03100 END DLRCMD PROCEDURE L03100 ; ; Общий код для R и $ ; BEGIN LET @#IFLAG := #IF.REG!IF.B10 LET @#IADDR+2 := #0 LET @#IADDR := #0 CALL TVOUT $GOTO BRNCH3 END L03100 PROCEDURE BRNCH3 ; ; хелпер -> NXTCHR ; BEGIN BR BRNCH2 END BRNCH3 PROCEDURE GPCMD ; ; Command G and P ; ; R0.SAV: .BLKW 1 ; R1.SAV: .BLKW 1 ; R2.SAV: .BLKW 1 ; R3.SAV: .BLKW 1 ; R4.SAV: .BLKW 1 ; R5.SAV: .BLKW 1 ; SP.SAV: .BLKW 1 ; SU.PC: .BLKW 1 ; SU.PSW: .BLKW 1 BEGIN IF R4 EQ #'G OR R4 EQ #'P THEN CALL TVOUT .IF DF P$ZF IF R4 EQ #'P THEN LET R0 := #SU.PSW+2 LET @#U.PSW := -(R0) LET @#U.PC := -(R0) LET CARRY := SET ELSE LET @#U.PSW := #0 LET @#U.PC := @#IADDR+2 LET R0 := #SP.SAV+2 END LET SP := -(R0) LET R5 := -(R0) LET R4 := -(R0) LET R3 := -(R0) LET R2 := -(R0) LET R1 := -(R0) LET R0 := -(R0) IF RESULT IS CS THEN RTI END RTT .IFF 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 .ENDC END $GOTO SCMD END GPCMD PROCEDURE SCMD ; ; Command S ; BEGIN IF R4 EQ #'S THEN IF #IF.REG OFF.IN @#IFLAG GOTO BRNCH3 CALL TVOUT LET @#IFLAG := #IF.RS!IF.B10 GOTO BRNCH3 END $GOTO ATCMD END SCMD PROCEDURE ATCMD ; ; Command @ ; BEGIN IF R4 NE #ATSIGN GOTO UNSCMD IF #IF.B10 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 .ASSUME IF.NUM EQ <^O<100000>> ; ; Ошибка генерации меток... ; IF @#IFLAG MI #0 THEN ; IF.NUM = 100000 - число было? ; LET @#SU.PSW := @#IADDR+2 ; да - сохраним в PSW ; END ; IF @#IFLAG MI #0 LET @#SU.PSW := @#IADDR+2; IF.NUM = 100000 - число было? 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) .ASSUME IF.NUM EQ <^O<100000>> 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 $GOTO L03454 END ATCMD PROCEDURE L03454 ; ; ; BEGIN CALL TVOUT LET @#IFLAG := #0 CALL L05210 $GOTO BRNCH4 END L03454 PROCEDURE BRNCH4 ; ; хелпер -> NXTCHR ; BEGIN GOTO BRNCH3 END BRNCH4 PROCEDURE L03472 ; ; ; BEGIN LET R5 := @#LCADDR IF #IF.RFD!IF.B10 OFF.IN @#IFLAG THEN CALL L13500 END LET R0 := (R5) .ASSUME IF.NUM EQ <^O<100000>> 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 PROCEDURE UNSCMD ; ; Command _ ; BEGIN IF R4 NE #UNDSCR GOTO MCMD IF #IF.B10 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 PROCEDURE MCMD ; ; Команда M - получить сообщение о причине выхода в пульт ; 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 $GOTO SHCERR END BUSERR PROCEDURE SHCERR ; ; Show Console Error Показать сообщение об ошибке при работе в пульте ; Сбросить флаги ввода и текущий адрес ; Перейти к ожиданию следующей команды ; ; R5 - адрес сообщения ; BEGIN .IF NDF N$SHOW LET R3 := #ERMC.L .ENDC $GOTO SHERR END SHCERR PROCEDURE SHERR ; ; Show Error Показать сообщение об ошибке ; Сбросить флаги ввода и текущий адрес ; Перейти к ожиданию следующей команды ; ; R3 - длина сообщения ; R5 - адрес сообщения ; BEGIN .IF DF N$SHOW LET R3 :B= (R5)+ .ENDC 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$CER2 PROCEDURE BRNCH5 ; ; Хелпер перехода, но ссылок на него пока не обнаружено... ; BEGIN GOTO BRNCH4 END BRNCH5 .ENDC PROCEDURE BRDLCM ; ; Хелпер перехода ; BEGIN JUMPTO DELCMD END BRDLCM PROCEDURE BCMD ; ; Command B ; BEGIN IF R4 NE #'B GOTO BRDLCM ; Загрузка? Переход, если нет CALL TVOUT ; Эхо CALL TVNLN ; Новая строка LET R4 := #'$ ; Подсказка CALL TVOUT ; Показать LET R1 := #3 ; Два символа - имя устройства, один символ - номер (два символа для ZF) LET R2 := #BUNIT+2 ; Буфер ; .IF DF Z$FN77 CLR -(R2) CLR -(R2) ; .ENDC THRU R1 CALL KBIN ; Очередной символ IF R1 EQ #1 AND R4 EQ #'G THEN BIS #100000, @#BUNIT INC R1 ELSE LET (R2)+ :B= (R2)+ SET.BY R4 ; Сохранить END CALL TVOUT ; Эхо END ; Повторить .IF DF Z$FN77 IFB @#BUNIT NE #CR THEN IF @#BDEV EQ #"ZF THEN LET @#L77134 := #0 IFB @#BUNIT EQ #'G THEN THRU R1 CALL KBIN ; Очередной символ IF R1 LOS #2 IF #'0 LOS R4 AND R4 LOS #'7 THEN IF @#BDEV EQ #"ZF THEN CALL TVOUT ; Эхо CLC LET (R2) := (R2) L.SHIFT 3 + R4 - #'0 ; Сохранить ELSE CALL TVOUT ; Эхо LET R4 := R4 OFF.BY #^C<7> LET (R2)+ :B= R4 ; Сохранить LET R1 := #1 END ELSE IF R4 EQ #CR THEN CALL TVOUT ; Эхо LET R1 := #1 ELSE LET R1 := R1 + #1 END END ELSE LET (R2)+ :B= R4 ; Сохранить CALL TVOUT ; Эхо END END ; Повторить ELSE END ELSE LET @#BUNIT := #0 END .IFF .IF DF W$CER2 IFB #'0 LE @#BUNIT ANDB @#BUNIT LE #'7 THEN .ENDC .IF DF P$ZF LET @#BUNIT := @#BUNIT OFF.BY #^C<100007> ; ВК даст на выходе 10(8) - что будет?? .IFF LET @#BUNIT := @#BUNIT OFF.BY #^C<7> ; ВК даст на выходе 10(8) - что будет?? .ENDC .IF DF W$CER2 ELSE IFB @#BUNIT NE #CR GOTO SHBERR LET @#BUNIT :B= #0 END .ENDC .ENDC .IF DF N$SHOW LET R5 := #BTABLE ; Описатель загрузочных устройств .IFF CALL TVNLN ; Новая строка LET R4 := #BTABLE ; Описатель загрузочных устройств .ENDC LOOP .IF DF N$SHOW IF (R5) EQ #0 GOTO SHBERR ; Дошли до конца - да, показать вопрос и на новую команду IF @#BDEV EQ (R5)+ LEAVE LOOP ; Нашли усройство? Если да - выход из цикла LET R5 := R5 + #6 ; Нет - пропустиь описатель очередного устройства .IFF IF (R4) EQ #0 THEN ; Дошли до конца? LET R4 := #ATSIGN ; Да. Подсказка CALL TVOUT ; Вывести JUMPTO GETCM2 ; Следующая команда END IF @#BDEV EQ (R4)+ LEAVE LOOP ; Нашли усройство? Если да - выход из цикла LET R4 := R4 + #6 ; Нет - пропустиь описатель очередного устройства .ENDC END ; Ищем дальше .IF DF N$SHOW CALL TVNLN ; Новая строка LET R4 := R5 .ENDC ; Устройство загрузки найдено 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 .IF DF W$CER2 LET @#SP.SAV := #10000 .ENDC LET SP := @#SP.SAV RESET ; ; R0 - номер устройства ; R1 - CSR ; R2 - точка входа драйвера загрузки ; R3 - адрес возможного блока параметров ; R4 - указатель на последнее слова в таблице устройств для устройства загрузки (в HALT режиме) ; R5 - 100200 ; RTI END BCMD .IF DF N$SHOW PROCEDURE SHBERR BEGIN LET R4 := #QUEST CALL TVOUT JUMPTO GETCMD ; Следующая команда END SHBERR .ENDC PROCEDURE NODEV ; ; No such device - обработка прерывания обращения по адресу CSR выбранного устройства загрузки ; BEGIN LET @#IV4+2 := #SETV4F ; Стандартный обработчик V4 LET R5 := #NDVM ; Сообщение об ошибке .IF NDF N$SHOW LET R3 := #NDVM.L ; Его длина .ENDC JUMPTO SHERR ; Показать сообщение об ошибке, сбросить флаги ввода и ; текущий адрес, перейти к ожиданию следующей команды END NODEV PROCEDURE L04244 ; ; Точка помощи перехода на GETCM2 ; BEGIN JUMPTO GETCM2 END L04244 PROCEDURE DELCMD ; ; DEL ; 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 PROCEDURE L04324 ; ; Точка помощи перехода на GETCM2 ; BEGIN JUMPTO GETCM2 END L04324 PROCEDURE L04330 ; ; Команда > ; BEGIN IF R4 NE #RANGLE THEN JUMPTO TCMD END IF #IF.B10 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 .EVEN PROCEDURE SETV4F ; ; Стандартный обработчки V4 ; 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 $GOTO L04612 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> .IF DF W$CER2 IFB #'a LE R4 ANDB R4 LE #'z THEN LET R4 := R4 OFF.BY #'a-'A END .ENDC RETURN END KBIN .IF DF N$SHOW PROCEDURE TVWAIT ; ; ; BEGIN REPEAT UNTILB @#TPS MI #0 RETURN END TVWAIT PROCEDURE TVOUT0 ; ; ; BEGIN THRU R2 :B= (R0)+ CALL TVWAIT LET @#TPB :B= (R0)+ END THRU R2 := #5 CALL TVWAIT LET @#TPB :B= (R1)+ END END TVOUT0 .ENDC PROCEDURE TVOUT ; ; ; BEGIN .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC LET @#TPB := R4 RETURN END TVOUT .IF DF N$SHOW PROCEDURE SHAT2 ; ; Show normal prompt (@) clear stored address ; BEGIN CALL TVNLN CALL SHAT LET @#IADDR+2 := 0 LET @#IADDR := 0 RETURN END SHAT2 PROCEDURE SHAT ; ; ; BEGIN LET R4 := #ATSIGN JUMPTO TVOUT END SHAT .IFF PROCEDURE SHAT2 ; ; Show normal prompt (@) clear stored address ; BEGIN CALL TVNLN LET R4 := #ATSIGN CALL TVOUT LET @#IADDR+2 := 0 LET @#IADDR := 0 RETURN END SHAT2 .ENDC PROCEDURE SHWRD ; ; Show OCTAL from WSHOW ; BEGIN LET @#TMP.S1 := R5 LET R4 := #0 LET R5 := @#WSHOW LET R1 := #6 LET R4 := R4 C.SHIFT #^O<1&77> GOTO 20$ THRU R1 LET R4 := R4 C.SHIFT #^O<3&77> 20$: LET R4 := R4 OFF.BY #^C<7> + #'0 CALL TVOUT END LET R5 := @#TMP.S1 RETURN END SHWRD PROCEDURE SHADDR ; ; Show address ; BEGIN LET R4 := @#HASHOW LET R5 := @#LASHOW LET R4 := R4 C.SHIFT #^O<1&77> LET @#WSHOW := R5 LET R4 := R4 C.SHIFT #^O<-6&77> 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 #^O<3&77> OFF.BY #^C<7> + #'0 CALL TVOUT RETURN END SHDIG PROCEDURE L05072 ; ; ; BEGIN IF #IF.B8 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 .ASSUME IF.NUM EQ <^O<100000>> 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 $GOTO L05210 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 $GOTO L05242 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 := #'/ $GOTO L05374 END L05242 PROCEDURE L05374 ; ; ; BEGIN CALL TVOUT LET R5 := @#LCADDR IF #IF.RFD!IF.B10 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= #IF.B0 LET @#IFLAG := @#IFLAG OFF.BY #IF.NUM RETURN END L05374 PROCEDURE L05466 ; ; ; BEGIN LET R5 := @#LCADDR IF #IF.RFD!IF.B10 OFF.IN @#IFLAG THEN CALL L13500 END LET (R5) := @#IADDR+2 RETURN END L05466 PROCEDURE TCMD ; ; Команда T ; 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: ; R0.SAV: .BLKW 1 ; R1.SAV: .BLKW 1 ; R2.SAV: .BLKW 1 ; R3.SAV: .BLKW 1 ; R4.SAV: .BLKW 1 ; R5.SAV: .BLKW 1 ; SP.SAV: .BLKW 1 ; SU.PC: .BLKW 1 ; SU.PSW: .BLKW 1 PROCEDURE ENTRYP ; ; ; BEGIN .IF NDF P$ZF LET @#SP.SAV := SP .ENDC LET @#IV4 := #137 LET @#IV4+2 := #SETV4F .IF DF P$ZF LET @#R0.SAV := R0 LET R0 := #R1.SAV LET (R0)+ := R1 LET (R0)+ := R2 LET (R0)+ := R3 LET (R0)+ := R4 LET (R0)+ := R5 LET (R0)+ := SP LET (R0)+ := @#U.PC LET @#LCADDR := @#U.PC LET (R0)+ := @#U.PSW LET @#HCADDR := #0 .IFF 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 .ENDC $GOTO L06006 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 PROCEDURE TEST0 ; ; T0 ; 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 PROCEDURE TEST1 ; ; T1 ; BEGIN .IF DF N$SMERR .IF DF P$TEST LET R4 := #'1 CALL TVOUT .IFF CALL SHASTR .ENDC .IFF REPEAT .IF DF P$TEST LET R4 := #'1 CALL TVOUT .IFF CALL SHASTR .ENDC 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 .IF DF SH$SUMM LET @#WSHOW := R2 CALL SHWRD CALL TVNLN LET R3 := #E.ROM ; Ошибка ПЗУ .IFF LET R3 := #E.ROM ; Ошибка ПЗУ .ENDC CALL L13406 UNTIL #7 LE @#HV162 .ENDC ; DF N$SMERR RETURN END TEST1 PROCEDURE TEST2 ; ; T2 ; BEGIN .IF DF P$TEST LET R4 := #'2 CALL TVOUT .IFF CALL SHASTR .ENDC 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 PROCEDURE TEST3 ; ; T3 ; BEGIN REPEAT LET @#IV4+2 := #L06510 .IF DF P$TEST LET R4 := #'3 CALL TVOUT .IFF CALL SHASTR .ENDC 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 PROCEDURE TEST4 ; ; T4 ; BEGIN .IF DF P$TEST LET R4 := #'4 CALL TVOUT .IFF CALL SHASTR .ENDC 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 ; R2*2+R2 -> R2*3 (R2 - четное, так что по сути *6) 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 .IF DF N$SHOW CALL TVOUT0 .IFF 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 .ENDC 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 PROCEDURE MP1V4 ; ; Проверка памяти - прямая запись -> прерывание по V4 ; BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP1V4R END MP1V4 PROCEDURE MP2V4 ; ; Проверка памяти - Чтение и обратная запись -> прерывание по V4 ; BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP2V4R END MP2V4 PROCEDURE MP3V4 ; ; Проверка памяти - чтение обратной записи -> прерывание по V4 ; BEGIN CALL L07610 IF #7 LE @#HV162 GOTO SETSV4 JUMPTO MP3V4R END MP3V4 PROCEDURE SETSV4 ; ; Восстановить стандартный обработчик прерывания по V4 ; 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 .IF DF N$SHOW CALL TVOUT0 .IFF 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 .ENDC 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 #^O<-6&77> + 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 $GOTO L10416 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 PROCEDURE EMMUV4 ; ; Прерывание по вектор 4 при работе ДП ; BEGIN LET R3 := #E.MMU4 GOTO L10752 END EMMUV4 PROCEDURE EMMUI ; ; Прерывание по вектору 250 при работе ДП ; 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 PROCEDURE ENV4 ; ; Ошибка - нет прерывания по вектору 4 ; BEGIN LET R3 := #E.NV4 $GOTO L10752 END ENV4 PROCEDURE L10752 ; ; R3 - код ошибки ; 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 PROCEDURE TEST5 ; ; T5 ; BEGIN .IF DF P$TEST LET R4 := #'5 CALL TVOUT .IFF CALL SHASTR .ENDC 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 $SHMESS LPGD .IF NDF W$CERR & N$SHOW .=.-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 .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC LET @#TPB :B= R0 RETURN END LPOUT PROCEDURE TVNLN ; ; ; BEGIN LET R4 := #LF CALL TVOUT LET R4 := #CR CALL TVOUT RETURN END TVNLN PROCEDURE SHTERR ; ; R1 - Замкнутость входа на выход ; R2 - Количество повторов, сделанных уже ; R3 - код ошибки (или метка) ; BEGIN IF #TVKBNC NE R1 THEN ; системный терминал - вход замкнут на выход, если NE - да INC R2 ; тогда семь повторов без сообщения об ошибки IF R2 LT #7 GOTO 50$ WAIT END .IF DF N$SHOW LET R5 := R3 THRU R3 :B= (R5)+ .IFF LET R5 := #ERRORS LOOP DEC R3 IF RESULT IS EQ LEAVE LOOP LET R5 := R5 + #ERMT.L END THRU R3 := #ERMT.L .ENDC ; THRU R3 := #ERMT.L .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC LET @#TPB :B= (R5)+ END 50$: RETURN END SHTERR ERRORS: .IF DF W$CER2 $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 .IFF $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 .ENDC $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 .IF DF W$CER2 $ERMST E.MMU, </o{ibka dispet^era pamqti/> ; 11 .IFF $ERMST E.MMU, </o[ibka dispet^era pamqti/> ; 11 .ENDC $ERMST E.NV4, </net prerywaniq po wektoru 4/> ; 12 .IF DF W$CER2 $ERMST E.TMR, </wykl`~itx tajmer/> ; 13 .IFF $ERMST E.TMR, </wykl@^itx tajmer/> ; 13 .ENDC $ERMST E.ERAM, </ne opredelena granica ozu /> ; 14 .IF DF W$CER2 $MESSL MSIZ, /dostupnoe ozu - /> .IFF $MESSL MSIZ, /dostupnoe ozu - /> .ENDC $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/> .EVEN PROCEDURE CLUPBC ; ; Проверка - не замкнут ли вход на выход консоли ; ; Флаг TSTMOD - TVKBNC - не замкнут ; TVKBC - замкнут ; BEGIN THRU R2 := #0 TSTB @#TPS ; выход консоли готов? IF RESULT IS MI LEAVE LOOP ; MI, если да END ; продолжаем ждать .IF DF P$TEST LET @#TPB := #'! ; попробуем послать ! .IFF LET @#TPB := #ASTER ; попробуем послать * .ENDC THRU R2 := #0 ; TSTB @#TKS ; вход консоли готов? BMI 50$ ; MI, если да END ; продолжаем ждать 40$: LET @#TSTMOD := #TVKBNC ; выход на выход НЕ замкнут BR 60$ 50$: .IF DF P$TEST CMP #'!,@#TKB ; прилетела ! ? .IFF CMP #ASTER,@#TKB ; прилетела * ? .ENDC 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 PROCEDURE L12626 ; ; T6 ? ; 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 .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC LET @#TPB := #ASTER RETURN END SHASTR PROCEDURE MVCRSB ; ; Переместить курсор на позицию назад (двумя возможными способами?) ; BEGIN CALL SCTRLW ; Ctrl/W CALL SHOWBS ; BS RETURN END MVCRSB PROCEDURE SCTRLW ; ; ; BEGIN .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC LET @#TPB := #CTRLW RETURN END SCTRLW PROCEDURE SHOWBS ; ; ; BEGIN .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC 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 .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC 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 PROCEDURE L13406 ; ; R3 - код ошибки ; BEGIN LET R1 := @#TSTMOD ; флаг замкнутости входа на выхода консольного порта LET R2 := @#HV154 ; количество повторов CALL SHTERR LET @#HV154 := R2 LET @#HV162 := @#HV162 + #1 RETURN END L13406 PROCEDURE L13434 ; ; R3 - код ошибки ; BEGIN LET R1 := @#NR016 ; флаг замкнутости входа на выхода консольного порта LET R2 := @#NR020 ; количество повторов CALL SHTERR LET @#NR020 := R2 LET @#NR024 := @#NR024 + #1 RETURN END L13434 .IF DF N$SHOW PROCEDURE SHSTR2 ; ; Show string at R0 with length in first byte ; BEGIN LET R4 :B= (R0)+ $GOTO SHSTR END SHSTR2 .ENDC PROCEDURE SHSTR ; ; Show string at R0 length R4 ; BEGIN THRU R4 .IF DF N$SHOW CALL TVWAIT .IFF REPEAT UNTILB @#TPS MI #0 .ENDC 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 #^O<-6&77> 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 / .BYTE 0 .=.-1 .EVEN .IIF GT .+4-ROMEND .ERROR ; ПЗУ слишком большое!! .=ROMEND-4 L13774: .WORD 000000 L13776: .IF DF SH$SUMM .IF DF P$ZF .IF DF Z$FN77 .IF DF P$TEST .WORD 174750 ;- .IFF .WORD 135661 ;- .ENDC .IFF .IF DF P$TEST .WORD 062470 ;+ .IFF .WORD 023324 ;- .ENDC .ENDC .IFF .IF DF P$TEST .WORD 121663 ;- .IFF .WORD 062574 ;- .ENDC .ENDC .IFF .IF DF P$ZF .WORD 000000 ; нужно писать прогу подсчёта для этого случая :) .IFF .WORD 140166 ; исходный вариант .ENDC .ENDC .IIF NE .-ROMEND .ERROR ; ПЗУ неправильного размера!! .INCLUDE /134WA.MAC/ END 134ROM .END