!***************************** !* DBUG4S * !*DATE: 04.DEC.79 * !***************************** !! STK = 300, STR = 1 %CONTROL K'100001' %PERMROUTINESPEC SVC(%INTEGER EP, R0, R1) %PERMINTEGERMAPSPEC INTEGER %PERMBYTEINTEGERMAPSPEC BYTEINTEGER %PERMINTEGERFNSPEC ADDR %PERMINTEGERFNSPEC ACC %SYSTEMROUTINESPEC MAPHWR(%INTEGER SEG) %BEGIN %CONSTINTEGER MAP PSECT = 16; ! SUPERVISOR CALL TO MAP TO PSECT %CONSTBYTEINTEGERNAME ID = K'160030' %CONSTINTEGER VIR DISP=K'22'; ! DISP TO 1ST VERSION NO %CONSTBYTEINTEGERNAME INT = K'160060' %ROUTINESPEC PSECT %ROUTINESPEC DREG %ROUTINESPEC DSTACK %ROUTINESPEC OCTAL(%INTEGER N) %INTEGERFNSPEC ROCTAL %ROUTINESPEC DUMP(%INTEGER LOW, QUANT) %ROUTINESPEC REGISTERS %ROUTINESPEC BREAK POINT %ROUTINESPEC CLEAR(%INTEGER P) %ROUTINESPEC WAIT %ROUTINESPEC CORE(%INTEGER TYPE) %INTEGERMAPSPEC CONT(%INTEGER ADR) %BYTEINTEGERFNSPEC BYTECONT(%INTEGER ADR) %ROUTINESPEC RELEASE USER SEG %RECORDFORMAT SEGF(%INTEGER PAR, PDR, PT, X) %RECORDFORMAT PSECTF(%BYTEINTEGER X, Y, ID, STATE, %BYTEINTEGERARRAY %C NAME(0:3), %BYTEINTEGER PRIO, %INTEGER POFFQ, %C %INTEGERARRAY R(0:8), %C %INTEGER TRPV, %RECORD (SEGF) %ARRAY SEG(0:7)) ! NB: R(0-8) ARE R0, R1, R2, R3, R4, R5, PC, PS, SP %RECORD (PSECTF) %NAME P %OWNINTEGERARRAY MAX(0:7) %RECORDFORMAT D1F(%INTEGER X) %RECORDFORMAT D2F(%INTEGERNAME N) %RECORDFORMAT D3F(%RECORD (PSECTF) %NAME P) %RECORD (D2F) %NAME D2 %RECORD (D1F)D1 %RECORD (D3F) %NAME D3 %INTEGER I, J, K, TASK, STRM, PST, STACK, N %INTEGER PROG, ISTACK, S, IST, S2, TFLAG %OWNINTEGER HW REGS = -1 %OWNINTEGERARRAY BP(1:20) = 0(20) %OWNINTEGERARRAY REGC(0:8) %INTEGERARRAY CONT BP(1:20) %OWNINTEGER LAST SEG =- 1; ! LAST USER SEG ACCESSED %OWNINTEGER HEX FLAG = 0; ! PRINT IN OCTAL (0) OR HEX (1) %CONSTINTEGER COM LIM = 18 %OWNBYTEINTEGERARRAY COMM(0:COM LIM) = %C 'E', 'I', 'R', 'P', 'W', 'B', 'C', 'A', 'D', '?', 'N', 'O', 'T', 'F', 'L', 'S', '+', '-', 'H' %SWITCH SW(0:COM LIM) !! D2 == D1; D3 == D2 TASK = ID STRM = 0 PST = 0; PROG = 0 MAP HWR(5) MAX(7) = K'17777' !! LOOP2: NEWLINES(2) %IF STRM # 0 TFLAG = 0 SELECT OUTPUT(0) PROMPT(' Debug?') SKIPSYMBOL %IF NEXTSYMBOL = NL %IF NEXTSYMBOL >= '0' %AND NEXTSYMBOL <= '7' %START CORE(0) -> LOOP2 %FINISHELSESTART READSYMBOL(S); READSYMBOL(S2) I = 0 %WHILE I <= COM LIM %CYCLE %IF S = COMM(I) %START %IF I <= 3 %AND PST = 0 %START PRINTSTRING('T NOT SET ') -> SKP %FINISH INT = 0 -> SW(I) %FINISH I = I+1 %REPEAT PRINTSTRING(' S,A,I,R,P,W,N,O,B OR C PLEASE! ') SKP: SKIPSYMBOL %WHILE NEXTSYMBOL # NL %AND S2 # NL -> LOOP2 %FINISH !! SW(12): ! T - TASK NUMBER LOOP: PROMPT(' Task ID?') ->LOOP2 %IF NEXTSYMBOL='?' HW REGS = -1 TASK = ROCTAL; SKIPSYMBOL SVC(MAP PSECT, TASK, 5) PST = ACC %IF PST = 0 %START PRINTSTRING('ID ? ') -> LOOP %FINISH D1_X = PST P == D3_P PRINTSYMBOL(P_NAME(I)) %FOR I = 0, 1, 3 NEWLINE RELEASE USER SEG LAST SEG = -1 %CYCLE I = 0, 1, 7 HW REGS = I %IF P_SEG(I)_PAR = K'007600'; ! H/W REGS N = P_SEG(I)_PDR %IF N&7 = 0 %THEN N = 0 %ELSE %C N = (N+K'400') >> 2&K'177700' MAX(I) = N %REPEAT REGC(I) = P_R(I) %FOR I = 0, 1, 8 PROG = K'40000' IST = K'140000'; ! HAVE TO BE BETTER LATER!! -> LOOP2 !! SW(15): ! STOP RELEASE USER SEG CLEAR('A') %STOP !! SW(1): ! IMP STACK SELECT OUTPUT(STRM) DSTACK; -> LOOP2 !! SW(18): ! HEX TOGGLE HEX FLAG = HEX FLAG!!1 -> LOOP2 !! SW(2): ! REGISTERS SELECT OUTPUT(STRM) DREG; -> LOOP2 !! SW(3): ! PSECT SELECT OUTPUT(STRM) PSECT; -> LOOP2 !! SW(4): ! WAIT WAIT; -> LOOP2 SW(5): ! BREAK POINT BREAK POINT; -> LOOP2 !! SW(6): ! CLEAR BREAK POINT CLEAR(0); -> LOOP2 SW(9): ! ? -> LOOP2 !! SW(10): ! N(EW) PROGRAM CODE PRINTSTRING(' NEW PROGRAM CODE?'); PRINTSYMBOL(0) PROG = ROCTAL -> LOOP2 !! SW(11): ! O(UTPUT) STREAM %IF S2 # ' ' %THEN PROMPT('STREAM?') STRM = ROCTAL -> LOOP2 !! SW(7): ! ALL SELECT OUTPUT(STRM) PSECT TFLAG = 0; ! LOOK AT TASK VIRTUAL MEMORY %CYCLE I = K'40000', K'20000', K'160000' NEWLINES(5) DUMP(I, K'20000') %REPEAT -> LOOP2 !! SW(8): ! DUMP CORE PROMPT('DUMP FROM?') %IF S2 = NL I = ROCTAL PROMPT('LENGTH?') %IF NEXTSYMBOL = NL SELECT OUTPUT(STRM) DUMP(I, ROCTAL) -> LOOP2 !! SW(16): ! '+' IMPLIED COMM SW(17): ! '-' - IMPLIED COMM CORE(I) SW(13): ! F - FILE BACK TO DISC SW(14): ! L - LOAD FILE SW(0): ! E - EXTERNALS -> LOOP2 !! %ROUTINE PSECT %INTEGER I %RECORD (SEGF) %NAME SEG TFLAG = 1 PRINTSYMBOL(P_NAME(I)) %FOR I = 0, 1, 3 PRINTSTRING(' STATE = '); OCTAL(P_STATE) PRINTSTRING(' POFFQ: '); OCTAL(P_POFFQ) DREG %RETURN %IF INT#0 PRINTSTRING('SEGMENTS NO ADDR LEN ') %CYCLE I = 0, 1, 7 %RETURN %IF INT # 0 %IF MAX(I) > 0 %START SEG == P_SEG(I) WRITE(I, 1); SPACE; OCTAL(SEG_PAR) SPACE; OCTAL(MAX(I)) SPACES(2) %IF SEG_PDR&7 = 2 %THEN PRINTSYMBOL('R') %ELSE %C PRINTSYMBOL('W') NEWLINE %FINISH %REPEAT %END %ROUTINE DREG REGISTERS %RETURN %IF INT#0 PRINTSTRING('STACK='); OCTAL(REGC(8)) NEWLINE %END %ROUTINE DSTACK NEWLINES(2) DUMP(IST, MAX(6)-2) %END !! %ROUTINE REGISTERS %OWNBYTEINTEGERARRAY REGS(0:15) = %C 'R', '0', 'R', '1', 'R', '2', 'R', '3', 'R', '4', 'R', '5', 'P', 'C', 'P', 'S' %INTEGER I, J NEWLINE J = 0 %CYCLE I = 0, 1, 7 %RETURN %IF INT # 0 PRINTSYMBOL(REGS(J)); PRINTSYMBOL(REGS(J+1)) PRINTSTRING(' = ') OCTAL(REGC(I)) SPACES(3) %IF I = 3 %THEN NEWLINE J = J+2 %REPEAT NEWLINE %END !! %INTEGERFN ROCTAL %INTEGER N, I, J, SIGN N = 0; SIGN = 1 %WHILE NEXTSYMBOL < '0' %OR NEXTSYMBOL > '7' %CYCLE %STOPIF NEXTSYMBOL = 'S' %IF NEXTSYMBOL = '-' %THEN SIGN =- 1 SKIPSYMBOL %REPEAT %CYCLE I = 1, 1, 6 J = NEXTSYMBOL-'0' %IF J < 0 %OR J > 7 %THENRESULT = N*SIGN N = N << 3+J SKIPSYMBOL %REPEAT %RESULT = N %END %ROUTINE DUMP(%INTEGER LOW, QUANT) %INTEGER I, J, N, N1, CHAR, NE, ZFLAG, INITF, SEGNO ZFLAG = 0; ! SET TO PRINT MESSAGE IF ALL ! ZEROES INITF = 0; ! TO SUPPRESS N> 13 %IF SEGNO = HW REGS %START PRINTSTRING(" Cannot Dump - Points to Hardware Registers ") %RETURN %FINISH %WHILE QUANT >= 0 %CYCLE %IF INT # 0 %THEN %RETURN %IF N&K'17777' >= MAX(SEGNO) %THENEXIT N1 = N; NE = 8; J = 0 %WHILE NE # 0 %CYCLE J = J!CONT(N) N = N+2; NE = NE-1 %REPEAT %IF J = 0 %START; ! ALL ZEROES %IF ZFLAG = 0 %START PRINTSTRING(' ZEROES ') ZFLAG = ZFLAG+1 %FINISH %FINISHELSESTART ZFLAG = 0; N = N1; ! ENSURE ZFLAG IS OK OCTAL(N); PRINTSYMBOL('>') NE = 8 %WHILE NE # 0 %CYCLE %IF N >= LOW %OR INITF # 0 %THEN OCTAL(CONT(N)) %C %ELSE SPACES(6) SPACE N = N+2; NE = NE-1 %REPEAT PRINTSTRING('*') NE = 16 %WHILE NE # 0 %CYCLE CHAR = BYTECONT(N1)&127 %IF CHAR < 32 %OR CHAR > 126 %THEN CHAR = ' ' PRINTSYMBOL(CHAR) N1 = N1+1; NE = NE-1 %REPEAT NEWLINE %FINISH QUANT = QUANT-16 INITF = INITF+1 %REPEAT %END %ROUTINE OCTAL(%INTEGER N) %INTEGER I %CONSTBYTEINTEGERARRAY CHAR(0:15) = '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' %IF HEX FLAG = 0 %START %CYCLE I = 15, -3, 0 PRINTSYMBOL((N >> I)&7+'0') %REPEAT %ELSE; ! PRINT IN HEX %CYCLE I = 12, -4, 0 PRINTSYMBOL(CHAR((N>>I)&15)) %REPEAT %FINISH %END %ROUTINE BREAK POINT %INTEGER A, I, P %IF S2 # ' ' %START PROMPT('ADDR?') %FINISH A = ROCTAL+PROG %CYCLE I = 1, 1, 20 %IF BP(I) = 0 %START; ! FREE SLOT BP(I) = A P = CONT(A) CONT BP(I) = P CONT(A) = K'777' PRINTSTRING('BP: '); OCTAL(I) PRINTSTRING(' ADDR='); OCTAL(A) PRINTSTRING(' CONT='); OCTAL(CONT BP(I)); NEWLINE %RETURN %FINISH %REPEAT PRINTSTRING(' BP TABLE FULL! ') %END !! %ROUTINE CLEAR BP(%INTEGER N) %INTEGERNAME P P == CONT(BP(N)) P = CONT BP(N) BP(N) = 0 %END !! %ROUTINE CLEAR(%INTEGER P) %INTEGER I, N %IF S2 # ' ' %AND P # 'A' %START PROMPT('NO?') %FINISH %IF P = 0 %THEN P = NEXTSYMBOL; N =- 1 %IF P # 'A' %THEN N = ROCTAL %IF N < 0 %START %CYCLE I = 1, 1, 20 CLEAR BP(N) %IF BP(I) # 0 %REPEAT %FINISHELSESTART %IF N <= 0 %OR N > 20 %OR BP(N) = 0 %START PRINTSTRING('? ') %FINISHELSE CLEAR BP(N) %FINISH %END !! %ROUTINE WAIT *K'104001'; ! EMT WAITC %END !! %ROUTINE CORE(%INTEGER TYPE) %OWNINTEGER LAST %INTEGER I, J, N, S, C, STACK, REPT !! !! FORMAT :- !! : PRINTS VALUE !! +C : PRINTS VALUE ! N+CODE BASE !! +RN : PRINTS VALUE ! N+REGISTER N !! DITTO = : PLANTS OCTAL !! REPT = 1 %IF TYPE = 0 %START N = ROCTAL READSYMBOL(S) %IF S = '+' %START READSYMBOL(C) %IF C = 'C' %THEN N = N+PROG %ELSESTART %IF C = 'G' %THEN N = N+ISTACK+K'20' %ELSESTART %IF C # 'R' %START REJ: PRINTSTRING(' ? ') %RETURN %FINISH READSYMBOL(C) C = C-'0' -> REJ %IF C < 0 %OR C > 5 N = N+REGC(C) %FINISH; %FINISH READSYMBOL(S) %FINISH %ELSE %IF TYPE = 16 %THEN N = LAST+2 %ELSE N = LAST-2 S = S2 %FINISH %UNTIL REPT = 0 %CYCLE LAST = N OCTAL(N); PRINTSTRING(' : ') %IF N&1 # 0 %THEN PRINTSTRING(' ODD!') %ELSESTART %IF N&K'17777' >= MAX(N >> 13) %THEN PRINTSTRING( %C ' SEGMENT?') %ELSESTART OCTAL(CONT(N)) %IF S = '=' %START C = ROCTAL CONT(N) = C PRINTSTRING(' -> '); OCTAL(C) %FINISH %IF S = '*' %START REPT = ROCTAL; S = 0 %FINISH %FINISH %FINISH NEWLINE REPT = REPT-1 N = N+2 %REPEAT %END %INTEGERMAP CONT(%INTEGER ADR) %OWNINTEGER DUMMY = 0 %INTEGER SEG %IF PST = 0 %AND ADR&K'160000'#0 %START D1_X = ADR&K'137777' -> RES %FINISH %IF TFLAG = 0 %START SEG = ADR >> 13 %IF ADR&K'17777' >= MAX(SEG) %THEN %RESULT == DUMMY %IF SEG = HWREGS %THEN %RESULT == DUMMY %IF SEG # LAST SEG %START RELEASE USER SEG MAP VIRT(TASK, SEG, 4) LAST SEG = SEG %FINISH D1_X = K'100000'+(ADR&K'17777') %ELSE D1_X = ADR %FINISH RES: %RESULT == D2_N %END %BYTEINTEGERFN BYTECONT(%INTEGER ADR) %INTEGER X X = CONT(ADR&K'177776') %IF ADR&1 # 0 %THEN X = X >> 8 %ELSE X = X&X'FF' %RESULT = X %END %ROUTINE RELEASE USER SEG %IF LAST SEG #- 1 %THEN MAP VIRT(0, -1, 4) %END %ENDOFPROGRAM