$A JUST=1; LINE=76; PAGE=59; TOP=3; BOTTOM=4; MARK=2 $A PAGENO=1 $A TAB=5,15,25 $B20 $L1CM USER MANUAL FOR DEIMOS $B2 $L1CM B. GILMORE $L1CM AUGUST 1976 $N $L1CUM CONTENTS $B6 $A INDENT=1 .TITLE $T6 .PAGE $B0 @GENERAL FEATURES $T6 3 $B0 @SYSTEM COMMANDS. $T6 4 $B0 @THE .EDITOR. $T6 7 $B0 @THE .IMP COMPILER. $T6 8 $B0 @THE .LINKER. $T6 9 $B0 @LIBRARY MANIPULATION. $T6 11 $B0 @THE DEBUGGING PROGRAM. $T6 12 $A INDENT=0 $N $L1CM GENERAL FEATURES $B1 $T2 (THIS SECTION HAS NOT BEEN WRITTEN YET) $N $L1CM SYSTEM COMMANDS $P1 @ALL COMMANDS GIVEN TO THE SYSTEM ARE INTERPRETED BY THE COMMAND LANGUAGE INTERPRETER .(CLI). @THE .CLI INDICATES ITS READINESS TO ACCEPT A COMMAND BY TYPING THE PROMPT '>' AND '<' OVERLAID. @IF A PROGRAM IS RUNNING, THE .CLI CAN BE INVOKED BY TYPING , THE COMMAND PROMPT SHOULD THEN APPEAR. $P1 @THE INPUT TO THE .CLI HAS TWO FORMS, EITHER:- $B0 .A) @A .FILE .NAME, FOLLOWED BY 'STREAM DEFINITIONS' $C+5 OR $B0 .B) @A .COMMAND .VERB, POSSIBLY FOLLOWED BY PARAMETERS $B3 $L1C A) A FILE NAME $P1 @IF A .FILE .NAME IS SPECIFIED, THAT FILE IS LOADED AND THE PROGRAM CONTAINED IN IT IS ENTERED. @IF THE FILE DOES NOT EXIST, OR DOES NOT CONTAIN A PROGRAM, THE MESSAGE .'*NO .FRED', WHERE .FRED IS THE NAME OF THE FILE, IS OUTPUT AND THE COMMAND PROMPT IS RE-ISSUED. $B1 @THE 'STREAM DEFINITIONS' ARE INPUT IN THE FORM:- $B1 $I1 $C+5 ,,/,, $B1 ETC, EACH REPRESENT A 'STREAM DEFINITION'. $B1 @A 'STREAM DEFINITION' IS OF THE FORM:- $A INDENT=1 $B1 .$.TT $T2 - WHICH IS EITHER INPUT OR OUTPUT FROM A TERMINAL. $B0 .$.LP $T2 - OUTPUT TO A LINE PRINTER $B0 $B0 $B1 $I0 @A .FILE .DEFINITION IS IN THE FORM:- $B1 $I2 .() $A INDENT=1 $B1 @THE , CURRENTLY, IS EITHER '0' OR '1' AND REFERS TO THE PHYSICAL DISC DRIVE. @IF NEITHER IS SPECIFIED, '0' IS ASSUMED. $B0 @THE CONSISTS OF AN ALPHANUMERIC STRING, WHICH MUST BE PRECEEDED BY A LETTER, OF UP TO 6 CHARACTERS IN LENGTH $B0 @THE IS THE FILE SYSTEM THAT THE FILE COMES FROM, OR IS CREATED IN. @IF NONE IS SPECIFIED, THE USERS OWN IS USED (SEE THE COMMAND .LOGON) EG $A INDENT=2 $B1 $I1 .FRED $T2 - THE FILE CALLED .FRED ON UNIT 0 IN THE USERS FILE SYSTEM. $I1 .0.FRED $T2 - THE SAME. $I1 .1.FRED $T2 - @THE FILE .FRED IS TAKEN FROM DISC UNIT ONE. $I1 .FRED(0) $T2 - THE FILE .FRED FROM FILE SYS. ZERO (THE SYSTEMS OWN ONE) $I1 .1.FRED(25) $T2 - THE FILE .FRED FROM DISC UNIT ONE AND FILE SYSTEM 25 (OCTAL). $I1 .$.TT $T2 - THE TERMINAL, INPUT IF ON THE LEFT HAND SIDE, OUTPUT IF ON THE RIGHT HAND SIDE. $A INDENT=0 $P1 @THE STREAM DEFINITIONS ARE LINKED INTO THE INPUT AND OUTPUT STREAMS AVAILABLE TO AN .IMP PROGRAM, FOR EXAMPLE, IF THE PROGRAM .FRED IS RUN WITH THE FOLLOWING COMMAND:- $B0 $I2 .FRED .F1$,F2/O1$,O2$,.TT $B0 THEN INPUT STREAM ONE, USED BY CALLING .'SELECT .INPUT(1)' IS MAPPED TO THE FILE .'F1'. @A .'SELECT .OUTPUT(2)' WILL SEND OUTPUT TO THE FILE .O2', AND .'SELECT .OUTPUT(3)' WILL SEND THE OUTPUT TO THE TERMINAL. $P1 @IF A FIELD IS LEFT BLANK, AS WITH IN THE ABOVE EXAMPLE, THE STREAM IS MAPPED TO .'NULL' - WHICH CAUSES AN 'END OF FILE' SIGNAL ON INPUT AND ON OUTPUT, ALL THE OUTPUT IS THROWN AWAY. $B1 @INPUT STREAM ZERO AND OUTPUT STREAM ZERO ARE ALWAYS MAPPED TO THE USERS TERMINAL. $B1 .FURTHER .EXAMPLES $A INDENT=3 $B1 $I1 .PROG .$.TT $T3 - USES ONE INPUT STREAM .'$.TT', NO OUTPUT STREAM (APART FROM ZERO) IS DEFINED. $I1 .PROG .FILE $T3 - WILL READ FROM A FILE CALLED .FILE ON STREAM ONE. $I1 .PROG ./FILE $T3 - NO INPUT STREAMS DEFINED (APART FROM ZERO), WILL WRITE TO A FILE CALLED .FILE AFTER A .'SELECT .OUTPUT(1)'. $I1 .PROG .FILE/FILE $T3 - THIS WILL READ DATA FROM A FILE CALLED .FILE AND CREATE AN OUTPUT FILE CALLED FILE $A INDENT=1 $B1 .NOTE: @WHEN A PROGRAM DOES THE FIRST .'SELECT .OUTPUT(N)', WHERE A FILE IS MAPPED TO THAT STREAM, THE SYSTEM WILL CREATE A TEMPORARY FILE .(FILE# IN THE PREVIOUS EXAMPLE). @WHEN THE PROGRAM STOPS, OR CALLS .'CLOSE .OUTPUT', THE ORIGINAL FILE .(FILE) IS DESTROYED AND THE TEMPORARY FILE .(FILE#) .RENAMED TO THAT NAME .(FILE). $A INDENT=0 $B2 $L1C B) A COMMAND VERB $P1 @THERE ARE CURRENTLY SIX AVAILABLE SYSTEM COMMANDS, THEY ARE:- $A INDENT=1 $B1 $I1 A) .LOGON $T2 - USED TO 'LOGON' TO A FILE SYSTEM. $I1 B) .TASKS $T2 - @LIST THE RUNNING PROGRAMS ON THE SYSTEM. $I1 C) .HOLD $T2 - @STOP A TASK EXECUTING. $I1 D) .FREE $T2 - @RELEASE A .'HELD' TASK. $I1 E) .KILL $T2 - @STOP A PROGRAM IN A CONTROLLED MANNER. $I1 F) .PURGE $T2 - @IMMEDIATELY REMOVE A TASK FROM THE SYSTEM. $B1 $L1C A) LOGON $P1 @THIS COMMAND IS CALLED IN THE FORM: $I2 .LOGON NN $B0 WHERE 'NN' IS A TWO DIGIT OCTAL NUMBER, REPRESENTING THE USERS FILE SYSTEM NUMBER. $V25 $B1 $L1C B) TASKS $P1 @THIS COMMAND HAS NO PARAMETERS, IT LISTS OUT THE TASKS ON THE SYSTEM IN THE FORM:- $B1 $I2 $C+2 $C+2 $B1 @THE STATES OF A TASK ARE AS FOLLOWS:- $A INDENT=1 $B1 $C+1 .STATE $T3 .MEANING $B0 000001 $T3 @TASK IS IN THE .WAIT STATE. $B0 000002 $T3 @TASK HAS EXECUTED A .'POFF'. $B0 000010 $T3 @TASK IS ON A .CPU .QUEUE AWAITING EXECUTION. $B0 000020 $T3 @THE TASK IS IN THE .'RUN' STATE. $B0 000200 $T3 @THE TASK HAS BEEN .'HELD'. $A INDENT=0 $B1 $L1C C) HOLD $P1 @THIS COMMAND IS CALLED IN THE FORM: $I2 .HOLD XXXX $B0 WHERE 'XXXX' REPRESENTS THE NAME OF A TASK RUNNING ON THE SYSTEM. @IF THE TASK IS CURRENTLY EXECUTING, IT IS SUSPENDED. @IF THE TASK IS WAITING FOR A MESSAGE, IT WILL BE SUSPENDED WHEN IT NEXT REQUESTS THE .CPU. $B1 $L1C D) FREE $P1 @THIS COMMAND IS THE CONVERSE OF .HOLD AND IS CALLED: $I2 .FREE XXXX $B0 IT PLACES THE TASK 'XXXX' BACK ON THE .CPU. $B1 $L1C E) KILL $P1 @THIS COMMAND IS CALLED IN THE FORM: $I2 .KILL XXXX $B0 IT HAS THE EFFECT OF SENDING THE TASK CALLED 'XXXX' A MESSAGE TO STOP, THE TASK SHOULD THEN STOP IN A CONTROLLED MANNER TIDYING UP ALL ITS STREAMS. $V10 $B1 $L1C F) PURGE $P1 @THIS COMMAND IS CALLED IN THE FORM: $I2 .PURGE XXXX $B0 IT HAS AN IMMEDIATE EFFECT, COMPLETELY REMOVING THE TASK FROM THE SYSTEM, NO ATTEMPT IS MADE TO TIDY THE OPEN STREAMS. @THIS COMMAND SHOULD NOT NORMALLY BE USED TO STOP A PROGRAM, BUT .MUST BE USED TO CLEAR A PROGRAM FROM THE SYSTEM THAT HAS CRASHED WITH AN .'ADDRESS .ERROR' OR A .'SEG .FAULT'. $B1 .NOTE: @IF A PROGRAM IS STILL RUNNING, .HOLD MUST BE CALLED BEFORE EITHER .KILL OR .PURGE IS USED. $A INDENT=0 $N $A TAB=5,20 $L1CM THE EDITOR $P1 @THE .EDITOR IS A .PDP11 VERSION OF THE .COMPATIBLE .CONTEXT .EDITOR. $P1 @FOR GENERAL INFORMATION ON THE @EDITOR, SEE THE .USER .GUIDE OF THE .COMPATIBLE .CONTEXT .EDITOR BY @H @DEWAR. $P1 @THE COMMAND FOR CALLING THE @EDITOR HAS THREE POSSIBLE FORMS AS ILLUSTRATED BELOW: $A INDENT=2 $B1 $I1 .E ./TEST $T2 - TO PRODUCE A NEW FILE CALLED .TEST. $I1 .E .TEST $T2 - TO EDIT AN EXISTING FILE CALLED .TEST $I1 .E .TEST/TEST2 $T2 - TO PRODUCE A NEW FILE CALLED .TEST2 $I2 $C+2 FROM AN EXISTING FILE CALLED .TEST. $A INDENT=1 $B1 $I0 .NOTES $B0 1) @THE @EDITOR PROMPTS '>' WHEN IT IS READY TO ACCEPT A COMMAND AND ':' WHEN IT EXPECTS A LINE OF INPUT .(COMMAND: .GET). $B1 2) @THIS VERSION OF THE @EDITOR USES A 'WINDOW' OF THE FILE, THIS WILL NOT NORMALLY BE APPARENT, BUT IT DOES MEAN THAT THE COMMAND .'M-*' WILL NOT NECESSARILY RETURN RIGHT TO THE TOP OF THE FILE. $N $A JUST=1; LINE=76; PAGE=59; TOP=3; BOTTOM=4; MARK=2 $A TAB=5,15 $L1CM RUNNING THE IMP COMPILER $P1 @THE .IMP COMPILER IS A THREE PASS COMPILER TO WHICH A FOURTH PASS, A .LINKING PHASE, IS AUTOMATICALLY CALLED FOR .$%BEGIN ... .$%ENDOFPROGRAM PROGRAMS $B1 @THERE ARE FOUR MAIN WAYS OF CALLING IT:- $A INDENT=2 $B1 $I0 .IMP .A/B $T2 - WHICH COMPILES SOURCE FILE .'A' TO OBJECT .'B' $I0 .IMP .A/$,L $T2 - WHICH ONLY DOES ONE PASS AND CREATES A LISTING FILE .'L' (NOTE: .'L' CAN BE EITHER A FILENAME, .'.TT' OR .'.LP'). $I0 .IMP .A/B$,L $T2 - WHICH CREATES BOTH AN OBJECT FILE AND A LISTING FILE. $I0 .IMP .A$,$.TT/B $T2 - THIS FORM IS USED TO CHANGE THE .LINKER DEFAULTS, FOR MORE DETAILS OF THE DEFAULTS, SEE THE SECTION ON THE .LINKER. $A INDENT=0 .NOTES $A INDENT=1 $I0 1) $T1 @AT PRESENT, THE PROGRAM .'IMPX' MUST BE RUN TO AVOID THE LINKING PHASE FOR .$%EXTERNALROUTINE FILES. @IN THIS CASE, THE FILE .'B' ABOVE IS THE COMPILERS THIRD PASS OUTPUT. $I0 2) $T1 @THE TEST COMPILER IS ACCESSED BY RUNNING THE PROGRAM .'NIMP'. $I0 3) $T1 @THE FIRST PASS AUTOMATICALLY USES A FILE OF .'$%SPECS' CALLED .'PRIMS' WHICH IS TAKEN FROM THE SYSTEM FILE SYSTEM. $I0 4) $T1 @THE FIRST PASS CREATES A TEMPORARY OUTPUT FILE .'O' FOR USE WITH THE ECOND PASS. @THE SECOND PASS CREATES .'O2' AND .'O3' AND THE THIRD PASS .'OY'. $I0 5) $T1 @THE OUTPUT FROM THE THIRD PASS .'OY' IS USEFUL. @IT CAN BE USED AS INPUT TO THE PROGRAMS .'RECODE' AND .'VIEW' IF IT IS NECESSARY TO DE-COMPILE THE COMPILER OUTPUT. $B0 @IF THE LINKER IS TO BE RUN AS A SEPERATE 4TH PASS, THE FILE .'OY' IS USED AS ITS INPUT. $N $A TAB=5,25 $A JUST=1; LINE=76; PAGE=59; TOP=3; BOTTOM=4; MARK=2 $A TAB=5,15 $L1CM THE LINKER $P1 @THE .LINKER IS NORMALLY RUN AUTOMATICALLY AS A FOURTH PASS TO THE .IMP COMPILER. @IT IS RUN INDIVIDUALLY BY TYPING ONE OF THE TWO FOLLOWING FORMS OF COMMAND TO THE .COMMAND .LANGUAGE .INTERPRETER. $A INDENT=1 $B0 .LINK .A/B $C+20 OR $B0 .LINK .A$,$.TT/B $A INDENT=0 $P1 @BOTH OF THE ABOVE COMMANDS TAKE THE FILE .'A', WHICH MUST BE THE OUTPUT FROM THE THIRD PASS OF THE COMPILER AND CREATE A RUNNABLE FILE .'B'. $P1 @THE SECOND FORM OF THE COMMAND OVERRIDES THE STANDARD .LINKER DEFAULTS, THE .LINKER PROMPTS FOR THE NEW DATA AS FOLLOWS (DEFAULTS IN BRACKETS):- $A INDENT=2 $I1 .NAME: $T2 - UP TO 4 CHARACTERS ARE TYPED IN AS THE .TASK .NAME FOR THE PROGRAM (THE FIRST FOUR CHARACTERS OF THE OBJECT FILE NAME ARE USED). $I1 .STACK: $T2 - THE DESIRED STACK SIZE (IN OCTAL BYTES), EXCLUDING THE .GLA (DEFAULT: 14000). $I1 .STREAMS: $T2 - THE MAX NUMBER OF INPUT AND OUTPUT STREAMS THAT THE PROGRAM IS GOING TO USE, EXCLUDING .INPUT AND .OUTPUT (0) (DEFAULT: 3). $A INDENT=0 $P1 @IF A PROGRAM HAS EXTERNAL REFERENCES IN IT, THE .LINKER WILL FIRST ATTEMPT TO SATISFY THEN USING .'LIB000' IN THE USERS FILE SYSTEM. @IF THERE ARE STILL UNSATISFIED REFERENCES, THE .LINKER WILL LOOK AT .'LIB000' IN FILE SYSTEM ZERO (THE SYSTEM FILE SYSTEM). @FOR MORE INFORMATION ON .LIBRARIES, SEE THE SECTION ON THEM. $P1 @A SAMPLE .LINKER OUTPUT MAP IS GIVEN BELOW:- $A INDENT=1 $B2 .CODE: 040000 $C+2 .GLA: 140020 $B0 $C+2 .XREF:PON $C+5 .POFF $C+5 .PONOFF $C+5 .MAPVIRT $B0 $C+2 .XDEF: 040000 $C+2 .#GO $B0 .FILE:SHARED $B0 $C+2 .CODE: 046506 $C+2 .GLA: 140752 $B0 $C+2 .XREF: 004000 $C+2 .RUN $B0 $C+2 .XDEF: 022656 $C+2 .PON $B0 $C+2 .XDEF: 022700 $C+2 .POFF $B0 $C+2 .XDEF: 022736 $C+2 .MAPVIRT $B0 $C+2 .XDEF: 023006 $C+2 .MAPABS $B1 .TOTALS: .CODE = 006506 $C+2 .GLA/STACK = 002016 $A INDENT=0 $P1 @THE .TASK .NAME OF THE PROGRAM .(DBUG) IS PRINTED ALONG WITH THE BASE ADDRESS FOR ITS CODE (040000) AND ITS .GLA (140020). @THE .'XREF' REFERS TO 'EXTERNAL REFERENCES' FROM THAT SECTION OF CODE (IN THIS CASE THEY ARE ALL DECLARED BY THE SYSTEM). @THE .'XDEF' IS AN 'EXTERNAL DEFINITION', IN THIS CASE .'#GO' WHICH IS THE ENTRY POINT FOR THE MAIN PROGRAM. $P1 @THE .'FILE:' INDICATES THAT THE .LINKER HAS LOADED AN OBJECT FILE , IT SPECIFIES ITS NAME .(SHARED) AND THE START ADDRESS OF ITS CODE (046506) AND .GLA (140752) SECTIONS. @THE LIST BENEATH THAT IS THE 'EXTERNAL DEFINITIONS', IN THIS CASE ENTRY POINTS THAT THE FILE CONTAINS. $P1 @THE LAST LINE GIVES THE OVERALL CODE LENGTH OF THE PROGRAM (006506) AND THE TOTAL SIZE OF THE .GLA AND THE DECLARED STACK. $P1 @IF ANY REFERENCES ARE LEFT UNDECLARED, THE .LINKER WILL LIST THEM ALONG WITH AN .'UNDEFINED .REFERENCE' MESSAGE. $P1 @IF THE .LINKER ATTEMPTS TO LOAD A FILE THAT CONTAINS AN ENTRY POINT THAT HAS ALREADY BEEN LOADED, THE MESSAGE .'*DOUBLE .DEF' IS OUTPUT AND THE .LINKER STOPS. $N $A JUST=1; LINE=76; PAGE=59; TOP=3; BOTTOM=4; MARK=2 $A TAB=5,20 $L1CM LIBRARY MANIPULATION $P1 @WHEN THE .LINKER FINDS AN .EXTERNAL .REFERENCE IN A PROGRAM FILE IT WILL ATTEMPT TO SATISFY THE REFERENCE BY:- $A INDENT=1 $I0 1) $T1 @SEARCHING THE LIBRARY .'LIB000' IN THE .USER FILE SYSTEM, LOADING OBJECT FILES AS NECESSARY, THEN $I0 2) $T1 @SEARCHING THE LIBRARY .'LIB000' IN THE .SYSTEM FILE SYSTEM (ZERO). $A INDENT=0 $P1 @THERE ARE THREE PROGRAMS CURRENTLY AVAILABLE TO THE USER TO MANIPULATE LIBRARIES, THEY ARE:- $A INDENT=2 $B1 $I1 1) .NEWLIB $T2 - CREATES A NEW LIBRARY FILE. $I1 2) .INSERT $T2 - @INSERTS THE ENTRIES OF AN OBJECT FILE INTO A LIBRARY. $I1 3) .INDEX $T2 - LISTS THE CONTENTS OF A LIBRARY. $A INDENT=1 $B1 .NOTE: @EACH OF THE PROGRAMS WILL MANIPULATE LIBRARIES OTHER THAN .'LIB000', BUT AT PRESENT THE .LINKER WILL NOT LINK THEM. $B2 $L1C 1) NEWLIB @THE COMMAND FOR USING .NEWLIB IS AS FOLLOWS:- $B0 .NEWLIB ./LIB $B0 @THIS COMMAND WILL CREATE A NEW LIBRARY FILE .'LIB', IF IT ALREADY EXISTS THE OLD COPY IS DESTROYRD. $B2 $L1C 2) INSERT @THERE ARE TWO MAIN FORMS OF THIS COMMAND AS FOLLOWS: $B0 .INSERT .TESTY$,LIB/LIB $C+10 AND $B0 .INSERT .TESTY$,LIB/LIB2 $P1 @THE FIRST COMMAND WILL ADD THE ENTRIES OF THE FILE CALLED .TESTY INTO THE LIBRARY CALLED .LIB. $P1 @THE SECOND COMMAND WILL ADD THE CONTENTS OF THE FILE CALLED .TESTY INTO THE LIBRARY CALLED .LIB, CREATING A NEW LIBRARY CALLED .LIB2. $B1 $L1C 3) INDEX @THE FORM OF THIS COMMAND IS AS FOLLOWS:- $B0 .INDEX .LIB $P1 @THIS COMMAND WILL PRINT OUT ALL THE ENTRIES IN THE LIBRARY FILE .'LIB' $N $A TAB=5, 10; CAPO=0; CAPSHO=0; INVERT=1 $A JUST=1; LINE=72; PAGE=59; TOP=3; BOTTOM=4; MARK=2 $L1CM DEBUGGING PROGRAM $B2 $L1C OBJECT: DBUG $A INDENT=1 $P2 @THIS PROGRAM IS USED AS AN AID TO DEBUGGING PROGRAMS, IT WILL MORMALLY BE 'LINKED' TO A RUNNING PROGRAM ON THE SYSTEM USING THE COMMAND .'T' (FOR DETAILS SEE LATER), ALL ACCESSES TO LOCATIONS WILL THEN BE MADE IN THAT PROGRAMS VIRTUAL MEMORY. $B0 @IT MAY BE USED TO:- $A INDENT=2 $B0 1) .SET AND .CLEAR BREAKPOINTS $B0 2) @DUMP OUT THE .PSECT, .REGISTERS AND/OR THE .IMP .STACK. $B0 3) .EXAMINE AND .CHANGE LOCATIONS IN CORE. $B0 4) .DUMP GENERAL AREAS OF CORE. $A INDENT=1 $P2 .DEBUG INDICATES ITS READINESS TO ACCEPT COMMANDS BY TYPING .'DEBUG:'. @THE FOLLOWING COMMANDS MAY BE USED. $A INDENT=2 $B1 $I-1 .T - $T+1 @SET @TASK NUMBER OF PROGRAM TO BE DEBUGGED. $I-1 .B - $T+1 @SET BREAKPOINT. $I-1 .C - $T+1 @CLEAR BREAKPOINT. $I-1 .N - $T+1 @SET A NEW PROGRAM CODE BASE. $I-1 .R - $T+1 @DUMP THE .REGISTERS. $I-1 .P - $T+1 @DUMP THE .PSECT. $I-1 .I - $T+1 @DUMP THE .IMP STACK. $I-1 .A - $T+1 @DO .'P', .'R', AND .'I'. $I-1 .D - $T+1 @DUMP AN AREA OF CORE. $I-1 .O - $T+1 @CHANGE THE OUTPUT DEVICE. $I-1 .W - $T+1 .WAIT .DEBUG. $I-1 .S - $T+1 @STOP .DEBUG. $I-1 .? - $T+1 @PRINT OPTIONS. $A INDENT=1 $P1 @IN ADDITION TO THESE COMMANDS, THERE IS AN IMPLIED COMMAND, ACTIVATED BY TYPING AN OCTAL DIGIT, THAT ENTERS THE LOCATION EXAMINATION/CHANGE PART OF .DEBUG. $P2 @A DETAILED DESCRIPTION OF EACH COMMAND FOLLOWS. $B3 $L1C T - SET TASK NUMBER $P1 @THE PROMPT .'TASK .ID:' IS OUTPUT AND THE (OCTAL) .ID OF THE PROGRAM TO BE DEBUGGED SHOULD BE ENTERED. @THE .TASK .ID OF A RUNNING PROGRAM MAY BE OBTAINED BY TYPING THE COMMAND .'TASKS' TO THE COMMAND LANGUAGE INTERPRETER. $B0 .NOTE: @ONLY THE COMMANDS .'T', .'N', .'O', .'S' AND .'W' MAY BE USED BEFORE .'T' IS USED FOR THE FIRST TIME. $V15 $B3 $L1C B - SET BREAKPOINT $P1 @THE PROMPT .'ADDR:' IS OUTPUT, THE REPLY IS THE .RELATIVE ADDRESS (WRT THE START OF THE PROGRAM) OF THE DESIRED BREAKPOINT. @DEBUG WILL REMEMBER THE CONTENTS AND PLACE A .'BR $.' IN THE LOCATION. @THIS WILL CAUSE THE PROGRAM TO LOOP WHEN IT EXECUTES THAT INSTRUCTION. $P1 @DEBUG REPLIES: $I2 .BP: N .ADDR: N2 .CONT= N3 $B0 - WHERE 'N' IS THE BREAKPOINT NUMBER (BETWEEN 0 AND 20), 'N2' IS THE VIRTUAL ADDRESS, AND 'N3' THE ORIGINAL CONTENTS. $P1 @THE MESSAGE .'BP .TABLE .FULL' IS OUTPUT IF MORE THAN 21 BREAKPOINTS ARE USED. @SEE THE COMMAND .'N' FOR SETTING BREAKPOINTS IN EXTERNAL ROUTINES. $B3 $L1C C - CLEAR BREAKPOINTS $P1 @PROMPTS .'NO?'. @THE BREAKPOINT NUMBER SHOULD BE TYPED. .'A' OR '-1' IS TYPED IF .ALL THE BREAKPOINTS ARE TO BE CLEARED. @IF THE SPECIFIC BREAKPOINT HAS NOT BEEN SET, THE MESSAGE '?' IS OUTPUT. @THE ORIGINAL CONTENTS ARE REPLACED. $B3 $L1C N - SET A NEW PROGRAM CODE BASE $P1 @PROMPTS .'NEW .PROGRAM .CODE:'. @REPLY GIVING THE NEW ADDRESS. @THIS COMMAND IS USEFUL FOR PROGRAMS USING EXTERNAL ROUTINES. @TO SET A BREAKPOINT IN AN EXTERNAL ROUTINE, THE CODE BASE IS SET TO THAT OF THE EXTERNAL ROUTINE, AS PRINTED OUT BY THE .LINKER, AND THE RELATIVE ADDRESS SPECIFIED. @THIS DOES NOT EFFECT ANY PREVIOUSLY SET BREAKPOINTS. $B3 $L1C R - PRINT REGISTERS. $P1 @THIS COMMAND PRINTS THE REGISTERS OF THE NOMINATED TASK. @THE .LOCAL .NAME .BASE .(LNB) FOR THE OUTER LEVEL IS ALSO PRINTED. $V20 $B3 $L1C P - PRINT THE PSECT $P1 @THE .PSECT (OWN SYSTEM VARIABLES) OF THE NOMINATED TASK IS PRINTED. $B0 @THE COMMAND :- $B0 $I+1 1) @PRINTS THE NAME OF THE TASK $B0 $I+1 2) @PRINTS THE STATE OF THE TASK. $B0 $I+1 3) @INDICATES WHETHER THERE ARE MESSAGES QUEUED. $B0 $I+1 4) @CALLS .'REGISTERS' TO DUMP THE REGISTERS OUT. $B0 $I+1 5) @PRINTS THE CONTENTS OF THE SEGMENTATION REGISTERS $B0 $I+1 $C+4 IN THE FORM:- $B1 $I2 . $C+3 .
$C+3 . $C+3 . $V6 $V10 $B3 $L1C I - PRINT THE IMP STACK $P1 @THE ENTIRE .IMP .STACK IS PRINTED ON THE OUTPUT DEVICE. $B0 .NOTE: @THE .GLA OF THE PROGRAM IS HELD AT THE LOW ADDRESS END OF THE STACK, THE .IMP STACK (IE THE .SP STACK) STARTS AT THE HIGH ADDRESS END AND WORKS TOWARDS THE LOW ADDRESS END. IS NOT THE SAME AS THE START OF THE STACK. $B3 $L1C A - PRINT ALL $P1 @THE COMMAND EXECUTES A PRINT PSECT .(P), PRINT REGISTERS .(R) AND THE .IMP STACK .(I). @THIS COMMAND IS USEFUL FOR DUMPING ALL THE RELEVANT INFORMATION ABOUT A PROGRAM ONTO THE LINE PRINTER (SEE COMMAND .'O'). $B3 $L1C D - DUMP AN AREA OF CORE $P1 @PROMPTS .'FROM:' AND .'LENGTH:'. @BOTH NUMBERS SHOULD BE TYPED IN OCTAL AND THE AREA OF CORE FROM .'FROM' TO .'FROM+LENGTH' IS OUTPUT. $B1 .NOTE: 1) @ON ALL THE DUMPS .'ZEROES' IS OUPUT IF ONE OR MORE ENTIRE LINE CONTAINS ZERO. $B0 2) @AN .ISO EQUIVALENT IS PRINTED ON THE .RHS OF THE DUMP. $B3 $L1C O - CHANGE THE OUTPUT DEVICE $P1 @PROMPTS .'STREAM:'. @THE REPLY IS USED IN THE FORM .'SELECT .OUTPUT(N)' FOR THE OUTPUT OF COMMANDS .R,P,I,A AND .D. @BY CALLING .'DBUG' IN THE FORM:- $B0 .DBUG ./L $T+2 OR $B0 .DBUG ./.LP $T+2 ETC $B0 THE OUTPUT MAY BE DIRECTED TO THE FILE .'L' OR TO THE LINE PRINTER. $B3 $L1C W - WAIT DEBUG $P1 @THIS COMMAND IS USED TO SUSPEND .DEBUG IF IT IS NECESSARY TO INPUT TO A PROGRAM ON THE SAME TELETYPE. @IT IS RESTARTED BY $B0 .(ESCAPE) .FREE .DBUG $B3 $L1C S - STOP DEBUG $P1 @DEBUG HALTS. $B0 @NOTE: ALL BREAKPOINTS ARE CLEARED. $V10 $B3 $V15 $L1C IMPLIED COMMAND TO EXAMINE/CHANGE CORE ADDRESSES $P1 @THIS COMMAND ACCEPTS THE FOLLOWING INSTRUCTIONS:- $A INDENT=2 @NOTE .'N' AND .'M' REPRESENT NUMBERS INPUT IN OCTAL. $B0 .N $T4 : PRINTS CONTENTS OF .N. $B0 .N+C $T4 : PRINTS CONTENTS OF .(N+ PROGRAM BASE). $B0 .N+I $T4 : PRINTS CONTENTS OF .(N+ .IMP .STK BASE). $B0 .N+RM $T4 : PRINTS CONTENTS OF .(N+REGISTER .M) $B1 .N(+ OPTIONS)=M $T4 : PUTS .M INTO .N $A INDENT=1 $B2 EG: .DEBUG:100 (CR) - WILL PRINT CONTENTS OF LOCN 100. $B0 $C+4 .DEBUG:100+R5 (CR) - WILL PRINT CONTENTS OF 100 ON FROM REG. 5. $B0 $C+4 .DEBUG:100+R5=200 (CR) - DITTO, EXCEPT PLANTS 200. $B0 .NOTES $A INDENT=1 $B1 @AN .'*N' AT THE END OF THE COMMAND WILL CAUSE THE FOLLOWING .'N' LOCATIONS TO BE DUMPED OUT .('N' MAY BE NEGATIVE). $B1 '+' OR .'+=M' MAY BE ENTERED AS A NEW COMMAND, THIS TAKES THE LAST LOCATION USED AND STEPS IT UP BY 2 (-2 IF '-' IS USED). $N $E