! FILE 'DBUG5S'
!*****************************
!* 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<LOW
N = LOW&X'FFF0'; ! START ON BDRY
SEGNO = 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 :-
!! <OCTAL> : PRINTS VALUE
!! <OCTAL>+C : PRINTS VALUE
! N+CODE BASE
!! <OCTAL>+RN : PRINTS VALUE
! N+REGISTER N
!! DITTO =<OCTAL> : 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