TITLE DAEMON - PROGRAM TO SERVICE USER REQUESTS V23(1025) - 31-MAY-88 SUBTTL D BLACK/DAL/RCC/JSL/CER/RLD/SMM/BAH/PMW/WRS/KPY/TJW/ISM/DBD/JLG/GMU/RKB SEARCH JOBDAT,MACTEN,UUOSYM SALL ;PRETTY LISTINGS .DIRECT FLBLST ;PRETTIER LISTINGS .DIRECT SFCOND ;THIS DIRECTIVE SUPPRESSES ALL FAILING CONDITIONALS ;IN THE LISTING AND MAKES IT MORE READABLE. THEREFORE, ;THE CODE UNDER FTUNSUPPORTED NEVER APPEARS IN THE ;LISTING. COMMENT THIS DIRECTIVE OUT TO CAUSE ;THE FAILING CONDITIONALS TO APPEAR IN THE LISTING VWHO==0 ;WHO LAST UPDATED THIS CUSP VDAEMON==23 VMINOR==0 ;MINOR VERSION NUMBER VEDIT==1025 ;******************************************************************** ;* The following symbol gives the version of the monitor that this * ;* version of DAEMON is built for. It must be changed for each new * ;* version of the monitor * ;******************************************************************** VMON==704 ;7.04 MONITOR ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1971,1978,1979,1980,1981,1982,1985,1986,1987. ;ALL RIGHTS RESERVED. ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1971,1978,1979,1980,1981,1982,1986. ALL RIGHTS RESERVED. \; \ ENDS COPYRIGHT-IN-EXE MACRO ; UPDATE SUMMARY AS OF VERSION 7(52) ;053 PARAMETER NOT SET UP CORRECTLY FOR GETLCH UUO IN ERROR ; INTERCEPTING ROUTINE AT INTRES+5 (SPR 10-11,097). ;054 NEW ROUTINES INTRODUCED TO PROVIDE ERROR REPORTING FOR ; MAGTAPES AS PART OF THE 507/601 RELEASE. NEW ROUTINES ARE ; COMPLETELY BACKWARD COMPATIBLE AND WILL NOT BE EXERSIZED FOR ; MONITORS PRIOR TO 50622. ;055 ERROR.SYS UPTIME INCORRECT BY FACTOR OF 4. ERRINI+14, ; MAKE ASHC OPERAND DECIMAL 17 RATHER THAN OCTAL. ;056 RANDOM PROTECTION OF FACT FILES. APPNDF+4, STORE AC A, ; RATHER THAN 0. ;057 FT1975, SUPPORT FOR NEW FORMAT FACT FILE ENTRIES, IN WHICH ; THE DATE LASTS PAST 1975. ;060 FIXES TO MAKE EDIT 54 WORK. ;061 FIX TO TAKE CARE OF AOBJN DIFFERENCE FROM KA TO KI. CLOCK ; REQUEST FOR HIGHEST JOB NUMBER WAS NOT GETTING SERVICED ON KA. ;062 ADD DEFENSIVE CODE TO HANDLE ERRORS ON ERROR.SYS. DAEMON WILL ; NOW WRITE ERROR.X01 TO ERROR.X77 IF NECESSARY. ;063 GENERATE CORRECT FORMAT DATE/TIME WORD IN FACT ENTRIES ;064 FIX FOR UNDEFINED SYMBOL NXTWAK IF USING CERTAIN NONSTANDARD ; FEATURE TEST SETTINGS ;065 CLEAR .JBINT ON EXIT ;066 INSURE THAT DUMP DOESN'T GET DONE IF AN ERROR THAT WILL PREVENT ; IT FROM WORKING IS DETECTED ;067 QPNTR IS STILL SET UP WRONG (ON KA AND KI).RH NEEDS TO BE ; -(# OF INTERNAL CLOCK REQUESTS -1). (SINCE 0 REPRESENTS ; A QUEUE IN JBTCLK. ;070 IMPLEMENTS 6.01 SUPPORT ;071 COMPLETES IMPLEMENTATION OF 6.01 SUPPORT AND INCLUDES THE ; SOURCE FOR SCANER AS PART OF DAEMON.MAC. ;072 MINOR EDIT TO CLEAN UP SOME SMALL DEFICIENCIES LEFT OVER FROM ; EDIT 71 AND TO PROVIDE A COMMON FATHER FOR SOUPS OF FUTURE ; DEVELOPMENT AND INTEGRATION OF IPCF STUFF ;073 EDITS PREPARING THE INTEGRATION OF [SYSTEM] INFO ; ALL [SYSTEM]INFO DEPENDENCIES ARE DETERMINED BY THE ; FEATURE SWITCH FTIPCF.THIS SWITCH IS DEFINED AS OFF ; FOR STANDARD RELEASES AND SHOULD NOT BE TURNED ON ; NOTE: THAT TURNING ON FTIPCF IMPLIES AN IMPURE VERSION. ; IT MIGHT BE REMARKED THAT A PURE DAEMON IS A RATHER ; IMPURE IDEA ;074 ADD THE CAPABILITY TO DAEMON TO RESTART ON ILLEGAL UUO'S ; ILL. MEM.REF ADDRESS CHECK EXTERNAL JOB ERROR,NXM ,PDL ; OVERFLOW ;075 FIX SOME BUGS AND CHANGE THE FORMAT OF A SAVE FILE SO THAT ; NON-CONTIGUOUS LOW SEGMENTS CAN BE 'GOTTEN' INTO A CORE IMAGE ; THAT RESEMBLES THE ORIGINAL. THIS IS DONE BY OUTPUTTING A NULL ; IOWD FOR EACH EXISTANT BUT ZERO PAGE. ;076 INSERT A NEW SUBROUTINE 'SCNBRK' TO FORCE TTY SCANNING ; TO GO TO END OF LINE FOR EACH DAEMON COMMAND. ;077 FIX A BUG INVOLVING USING THE WRONG HALF OF 'SEGSWP' TO STORE ; A SWAPPING POINTER BEFORE CALL TO REDPEC ;100 A BLIND ATTEMPT TO FIX WHAT MIGHT BE A PROBLEM GETTING UPMP'S ; OFF THE SWAPPING SPACE. ;101 START DAEMON AT DAEMON +2 WHEN RESTARTING IT,THIS WILL IDENTIFY ; THAT IT HAS TO DETACH FROM THE CURRENT TERMINAL AND SUPPRESS OTHER OUTPUT ; NOTE THAT RESTART ALWAYS DEFINED AND ALWAYS IS ZERO WHEN ; NO IPCF OR RESTART FUNCTIONS ARE WISHED ;102 FIX A SECURITY LEAK IN THE DCORE COMMAND ;103 CHANGE NAME TO DAE AND NO TO DUMMY ;104 INIT DSK:[1,4] INSTEAD OF SYS:[1,4] FOR FACT.SYS UPDATES ; AS ELSEWISE THE ENABLING OF NEW E.G. WILL LET ; THE UPDATE MODE ACCESS FAIL ;105 IF ANOTHER DAEMON IS RUNNING THEN JUST EXIT ; AND LET OPERATOR DECIDE WHAT TO DO ;106 AS 104 ERROR.SYS CANNOT BE UPDATED WITH AMBIGUOUS SYS ;107 A REENTER OF DAEMON FAILED TO EXIT WITH THE TERMINAL ATTACHED ; THIS WAS DUE TO THE OMISSION OF A JFCL AFTER THE ZAPRUN CALL ;110 EDIT ERROR IN EDIT 102 IN DAEOPN CODE ;110(A) WHEN A SECOND DAEMON IS RUNNING DAEMON SHOULD CALL ; DAEREN TO EXIT ;110(B) GIVE MORE INFORMATION THEN COULD NOT GET AT SWAP POINTER ;EDITS 111-210 RESERVED FOR SPECIAL RELEASES ;VERSION 10(110) RELEASED WITH ALL ABOVE EDITS ;ALL LATER EDITS IN VERSION 11 ;211 FIX CODE TO HANDLE NEW SWAPPING POINTERS FOR ; 6.01 CORRECTLY ;212 REMOVE CRLF FROM JOB SAVED MESSAGE TO LOOK LIKE MONITOR ;213 FIX EXAMINE AND DEPOSIT COMMANDS FOR HIGH SEGMENTS ;214 CHECK FOR OUTPUT DEVICE OF NUL AND FINISH WITH NO IO IF TRUE ;215 FIX HIGH SEGMENT SAVE TO ONLY WRITE EXACT ; NUMBER OF WORD IN LAST BLOCK OF HGH OR SHR FILE ;216 FIX TO EDIT 62 TO MAKE DAEMON WRITE IN LAST ERROR.X?? FILE ; WHICH EXISTS ON ERRDEV ;217 FIX UNDEFINED GLOBALS ILIST AND OLIST IF FTFACT!FTCHKPNT=0 ;220 FIX TO MAKE DAEMON SAVE DO SAME AS MONITOR DEPENDENT ON CONTENTS ; OF .JBCOR AND .JBHRL. ;221 FIX TO NOT ERROR INTERCEPT ON ALL IO.BKT ERRORS SO WE CAN ; REPORT THEM ON COMMANDS ;222 FIX 220 AND 215 TO DO THE RIGHT THING TOGETHER ;223 ADD EXTERNAL SYMBOLS SO SYSINF KNOWS START AND END OF DAEMON ;224 FIX TO 220/222 TO NOT SAVE .LOW IF .JBCOR .LT. 140 ;EDITS 225-324 RESERVED FOR SPECIAL RELEASES. ;VERSION 11(224) RELEASED WITH ALL ABOVE EDITS. ALL LATER EDITS IN ;VERSION 12. ;325 ADD A FEATURE TEST TO CREATE THE ABILITY TO ASSEMBLE AS TWO ; SEPARATE PROGRAMS, ONE TO DO ALL COMMANDS AND THE DCORE FUNCTION ; OF THE UUO, AND ONE TO DO ERROR REPORTING, CHECKPOINTING, ; ACCOUNTING, OTHER UUO FUNCTIONS, AND SYSTEM INFO. THE FEATURE ; TEST IS FTSAVE, EQUAL -1 FOR SAVE ONLY, 0 FOR BOTH, AND +1 ; FOR DAEMON ONLY. NOTE THAT FTIPCF=-1 OR FTRSTR=-1 WILL NOT ; WORK WITH FTSAVE=-1. ;326 ADD SUPPORT FOR RH10 DEVICES. THIS IMPLEMENTS THE SPECIAL DRIVE ; REGISTERS ON MASSBUS DEVICES. THIS EDIT IS ONLY INTENDED FOR ; RP04'SAND RS04'S ON SYSTEMS WITH THE RP04 LIR. IT WILL HAVE NO ; EFFECT ON SYSTEMS WITHOUT THE RP04 LIR. ;327 FIX SOME INCONSISTENCIES IN BEHAVIOR ON SAVE ;330 SAVE ADDRESS OF DDB ALONG WITH LENGTH SO USER CAN ASSOCIATE ; DDB'S WITH CHANNELS (SPR 14451) ;331 FINISH EDIT 325 -- MAKE TYPEOUT SAY THE RIGHT THINGS ;332 FIX BUG IN FINCHK WHICH CAUSED JOB 8 (AC J =8 ) TO BE CHECKED ; RATHER THAN THE JOB WE WERE INTERESTED IN. THIS BUG CAUSED ; RANDOM ERROR CODE 3 TO DAEMON UUO'S AND ALSO WRITING IN RANDOM ; PAGES. ;333 FIX DAEMON TO TAKE ADVANTAGE OF THE GETTABS ADDED IN 507/601 ; FOR ITS BENEFIT. ;334 ADD CODE TO DUMP UNILOG AS LAST ITEM IN CODE 10 ENTRY IN ; ERROR FILE ;335 MAKE UNKNOWN COMMANDS GIVE ERROR MESSAGE, INSTEAD OF DOING ; DCORE AS IN PREVIOUS VERSIONS ;336 FIX SWAPPING POINTERS FOR 507. THEY ARE THE SAME ON ; BOTH 507 AND 601, NOT DIFFERENT AS PREVIOUSLY CODED ; SEE EDIT 211 FOR SIMILAR CHANGE FOR 601. ;337 FIX BUGS ADDED BY CHANGE TO DAEMON/SAVER(EDIT 325), AND ; IN USING NEW GETTABS(EDIT 333) ;340 FIX RACE ADDED BY EDIT 325 ;341 SPEED UP COMPRS (IGNORE NONEXISTENT PAGES, DON'T LOOK AT EVERY ; WORD ON THEM) ;EDITS 342-441 RESERVED FOR SPECIAL EDITS ;342 ADD SUPPORT FOR TAPSER MAGTAPE ERROR REPORTING. ;VERSION 12A(342)RELEASED WITH TAPSER LIR. ;VERSION 12(341) RELEASED WITH ALL ABOVE EDITS ;ALL LATER EDITS IN VERSION 13 ;442 ADD CODE TO USE ERRPT. UUO INSTEAD OF SCANNING FOR ERRORS ;443 FIX HSVADR TO NOT NEED UPMP IN CORE. ALSO FIX CALLS TO NOT READ ; UPMP IF NOT NECESSARY FOR OTHER REASONS. ;444 FIX DCORE TO DO CORRECT THING WITH FIRST PAGE OF HIGH SEG ;445 CHANGE ALL SUPER I/O TO USE SUSET. ;446 CHANGE REFERENCES TO SYMBOLS IN UPMP TO USE GETTABS, NOT DEFINED ; SYMBOLS ;447 FIX SETUP OF PARAMETERS FOR SWAPPING TO USE GETTABS ; AND WIN WITH UNITS MISSING ;450 FIX CODE FOR HANDLING ERROR FILE TO ADD WORD AT START ; OF EACH BLOCK POINTING AT FIRST COMPLETE ENTRY ; IN BLOCK. ALSO, PAD LAST BLOCK WITH ZEROS. ;451 ADD SUPPORT FOR CODE 50 IN ERROR.SYS, DL10 ERRORS ; 602 AND LATER MONITORS ONLY. ;452 ADD FUNCTION 5 TO DAEMON UUO, APPEND TO ERROR.SYS ;453 ADD SUPPORT FOR OSAVE AND OSSAVE COMMANDS FOR 6.02 ;454 ADD CODE TO GET JOB # FROM DDB ON BOTH 602 AND EARLIER MONITORS ; JOB # WAS MOVED TO NEW WORD IN 602 ;455 ADD CODE TO SYNCHRONIZE ERROR REPORTING WITH STOPPED JOBS. NO ; JOBS WILL NOW BE STARTED AT THE JOB LOOP -- ALL WILL NOW BE ; STARTED AFTER THE ERROR THAT STOPPED THEM IS REPORTED ;456 ADD CODE TO SUPPORT SOME NEW ERRORS REPORTED IN 6.02 ; NEW ERRORS ARE: .ESCSC (CONFIGURATION STATUS CHANGE) = 15 ; ER.MSE (MONITOR SOFTWARE ERROR) = 2 ; .ESNXM (NON-EX-MEM, NEVER BEFORE SUPPORTED) = 4 ;457 CORRECT IMPLEMENTATION OF ER.MSE ;460 FIX BUG IN IMPLEMENTATION OF DL10 (ER.DLE) ERRORS ;461 FIX TAPSER ERROR REPORTING TO USE TAPOP'S TO GET THE POINTERS ; TO THE INITIAL AND FINAL ERROR STATUS AREAS, RATHER THAN ; ABSOLUTE OFFSETS RELATIVE TO TUBRID ;462 FIX UP MASSBUSS ERRORS TO REPORT USER'S PPN AND FILENAME CORRECTLY ;463 ADD USERS ID ETC TO CODE 3 & 10,ADD BAD BLOCKS SLOTS ; TO CODE 10 & 11, ADD EXPECTED TERM. WD TO CODE 6 (RLD) ;464 CHANGE ERROR FILE HEADER LENGTH TO 4 AND INCLUDE SYS SER. # AND ; CHAGE HEADER VERSION TO 1, INCREASE MAX ENTRY SIZE TO 777 VICE ; 77 BY MOVING HEADER LENGTH LEFT 3 PLACES (RLD) ;465 ANSWER TO SPR#15908 ;466 MODIFICATIONS TO CORRECT FOR VERSION 1 HEADERS IN ERROR FILE ;467 ADD CODE TO REPORT NXM AND SET MEMORY OFFLINE TYPE ERRORS. ; THIS ALSO CHANGES THE WHY RELOAD ERROR ENTRY SINCE IT ; KEEPS A COPY OF THE ORIGINAL NXM TABLE IN OUR CORE. ;470 FIX CODE TO USE SUPER USETI./O IF SUSET. FAILS. ;471 (16349)MAKE DCORE, DUMP, AND SAVE ABORT ON DSK ERRORS ;472 FIX BUGS IN CODE 4(NXM), CODE 15(MEMORY ON/OFF LINE), AND IN ; EDIT 466. ;473 FIX SOME USES OF MONITOR VERSION NUMBER TO BE USES OF "VMMON" ; INSTEAD ;474 FIX BYTE POINTER TO STORE ENTRY LENGTH IN ERROR FILE HEADER ; TO STORE 9 BITS, NOT 6. PART OF EDIT 466 ;EDITS 475-507 RESERVED FOR SPECIAL RELEASES ;VERSION 13(474) RELEASED WITH ALL ABOVE EDITS ;ALL LATER EDITS IN VERSION 14 ;510 FIX BUG IN COMPUTING POINTER TO PARITY SUBTABLE IN CODE 3 ; ERROR FILE ENTRY ;511 DON'T REPORT MEMORY ON-LINE AT RELOAD ON 507/601 AND EARLIER ; MONITORS ;512 ALLOW ERROR FILE ENTRIES TO SPAN MORE THAN ONE BLOCK, I.E. ; DO THE RIGHT THING IF AN ENTRY HAS TWO BLOCK BOUNDARIES ; IN IT ;513 ADD SUPPORT FOR KL10 PROCESSOR ERRORS, CODE 60-AR/ARX PARITY ; TRAP, CODE 61- PARITY INTERRUPT, CODE 67-ADDRESSING FAILURE ;VERSION 14(513) RELEASED WITH ALL ABOVE EDITS ;ALL LATER EDITS IN VERSION 15 ;EDITS 514-517 RESERVED FOR SPECIAL RELEASES ;520 PERFORM PROPER ADDRESS CHECKING FOR ALLOCATED BUT ZERO PAGE ;521 CORRECT ADDRESS CHECK CODE TO PREVENT POSSIBLE ; OVERWRITING OF JOB DATA AREA ;522 SET UP JBINT TO PREVENT HANG IN TO STATE ON OPR ; ACTION REQUESTED CONDITIONS ;523 UUOSYMIZE DAEMON ;524 IN CASE OF STRUUO FAILURE WHEN RESETTING DAEMON SEARCH LIST, ; PURGE INVALID STRUCTURES AND RETRY STRUUO. ;525 FIX ERRORS IN WRTSWP (ROUTINE TO WRITE SWAPPING SPACE) ;526 FIX IMPROPER ADDI AT UADOLD-2 (FROM EDIT 521) ;527 ELLIMINATE MILLIONS OF HRRI T1,.GTSTS 'S ;530 USE XOR IN PLACE OF ANDCA TO SEE IF A BLOCK CROSSES PAGE BOUNDARIES ;531 FIX POTENTIAL LOOP IN FINCHK BY CHECKING FOR PROPER SEGMENTS ;532 GET RID OF UNNEEDED MOVSI T1,(J) 'S ;533 MAKE DAEMON FUNCTION TO APPEND TO ERROR.SYS WORK ;534 ZERO TRAILING SPACE ON ERROR.SYS ON OUTPUT ;535 REASSIGN CHANNELS TO OUR JOB ON RELEASE OF CHANNEL. THUS IF ; WE ARE ASKED TO LOG AN ERROR FOR THAT FILE, THE DDB WILL STILL ; EXIST. ;536 RIP OUT SCANER AND REPLACE WITH REASONABLE COMMAND SCANNER. ; MAKE MINOR NECESSARY CHANGES TO THE DEVIL HIMSELF, INCLUDING ; REMOVAL OF EDIT 76 ;537 FIX UP INTERRUPT ROUTINE SO IT WON'T DESTROY T1 OR SELF-DESTRUCT ;540 WRITE DAEMON FILES ON SYS ONCE AGAIN. DISENABLE NEW TO AVOID ; ANY PROBLEMS. HACK OUT CODE WHICH RESETS DAEMON SEARCH LIST, ; SINCE THIS ISN'T NECESSARY WHEN WRITING ON ERSATZ DEVICES ;541 FIX IMPROPER INDEX AC TO PREVENT PROBLEMS WHEN READING ARG ; BLOCK FROM USER WHICH IS SPLIT ACROSS PAGES. ;542 MAKE SURE USER HAS RENAME PRIV'S WHEN DELETING .SAV, .HGH, ETC. ; ALSO FIX CHCACC FUNCTION IN ACCCHK TO CHECK WRITE PRIV'S INSTEAD ; OF RENAME PRIV'S WHEN TRYING TO WRITE ;543 PUT PATCHING SPACE AND JUNK UNDER FTDEBG ;544 SET UP INTADR SO WE CAN'T LEAVE USER IN DAEMON ERROR PAUSE ; IF WE BLOW UP WHILE RECORDING ERROR ;545 ON DISK ERROR, DON'T GIVE EXPECTED CHANNEL TERMINATION WORD ; UNLESS HAVE A 601 OR GREATER MONITOR, SINCE THIS VALUE IS NOT ; STORED FOR THE LAST ERROR ON PREVIOUS MONITORS, AND THE BEST ; WE CAN DO IS PICK UP THE LAST EXPECTED CHANNEL TERMINATION WORD, ; WHICH MAY BE FOR A MORE RECENT TRANSFER THAN THE LAST ERROR. ;546 ADD SUPPORT FOR KL10 CPU ERROR INFORMATION OBTAINED FROM ; RSX20 FRONT END -11 ;547 CHANGE FORMAT OF KL ERROR ENTRY IN ERROR.SYS TO INCLUDE ; COUNT OF 8 BIT DATA BYTES ;550 ADD DEFINITION OF %CVPTR&.ESDRE UNTIL UUOSYM GETS ; UPDATED. ALSO ADD SUPPORT FOR LP100-CODE 71 ;551 ADD FUNCTION TO SUPPORT READING PENDING ENTRIES AND OTER INFO ; FROM CRASH.EXE FILES. ;552 FIXES TO CORRECTLY RECORD OVER 200 WORD ERROR FILE ENTRIES ;553 FIX PREV.CHANGES & MAKE UNUSED AND ILLEGAL ERROR CODES ; GO TO JOBFIN VOCE CPOPJ ;554 FIX EDIT 545 SO THAT MONVER GETS SET UP CORRECTLY ;555 MAKE WORK CORRECTLY FOR RPO6'S ;556 FIX KLERR STUFF ;557 PUT CRASH STUFF IN FTSAVE CONDITIONALS ;560 FIX EDIT 557 ;561 SAVE PDBPTR AROUND CRASH CHECK STUFF AND FIX TYPO'S ;562 GET UDT FROM %CNDTM NOT %CNDAT ;563 FIX GTUPMP CODE ;564 DON'T SMASH TWO PACK STRUCTURES WITH CRASH STUFF ;565 FIX EDIT 544 ;566 FIX MAGTAPE ERROR REPORTING ;567 FIX REDSWP ON VM ;570 MAKE DAEMON EXIT GRACEFULLY ON RE-ENTER ;571 DCORE SPOOLED DDB'S CORRECTLY. ;572 HANDLE AN ARGUMENT BLOCK SPLIT ACROSS FRAGMENTED PAGES ; ON THE SWAPPING SPACE CORRECTLY ON A VM SYSTEM. ;573 FIX MAGTAPE STATISTICS REPORTING. THE UNIT NAME WAS BEING ; OUTPUT AS GARBAGE. ;574 FIX MAGTAPE STATISTICS SO THAT THERE IS SOME USEFUL INFORMATION ; IN THE ERROR.SYS FILE. ;575 FIX PATH. UUO SO WE DON'T WASTE A PPB ;576 FIX CALL TO GETZ AT CRSIN3+5 ;577 HISTORICALLY THE MAXIMUM FACT FILE SIZE WAS 2048 BLOCKS ; WITH SAID MAXIMUM ACHIEVED WHEN P2 EXCEED 777577 AND ; RESULTING ARITHMETIC ERRONEOUSLY POINTED TO THE WRONG BLOCK. ; RECODE TO TEST FOR THIS CONDITION AND EXIT ACCORDINGLY. ;600 FIX BUG WHERE DATA FROM TAPE UNLOAD IS NOT SAVED. ; CURE: AT GTPST1+1 ADJUST T1 NOT P1 ;601 ADD USER'S P,PN AND PROGRAM NAME TO MAGTAPE ERROR REPORTING ;602 ADD IPCF SUPPORT FOR SYSERR ;603 5-10-78 ISM CHECK FOR 0 LENGTH DAEMON QUEUE TABLE IN ; CRASH.EXE FILE. THIS FIXES A PROBLEM WITH DAEMON LOOPING ; WHILE READING CERTAIN CRASH.EXE FILES DURING STARTUP. ;604 5-15-78 ISM FIX EDIT 544. INTADR IMPROPERLY SET UP ; SO THAT DAEMON MAY GO INTO TO STATE WHILE DETACHED. ;605 5-19-78 ISM DCORE FILES GET WRITTEN INTO [1,2] IF SIGN ; BIT IS SET IN THE PPN. CHECK FOR SIGN BIT ON AND BOMB THE USER. ;606 6-5-78 ISM DAEMON DOES NOT HANDLE DUMP COMMAND FOLLOWED BY ; SPACES PROPERLY. THROW AWAY THE SPACES. ;607 RELEASE DISK CHANNEL UPON EXITING CRSCHK SINCE WE ARE DONE WITH IT ;610 AFTER DOING A DCORE, CHECK IF USER JOB IS DETACHED. IF NOT ; DO NOT REATTACH JOB. ;611 8-22-78 ISM FILES WITH PROTECTION GREATER THAN <400> ; (FILE DAEMON CALLABLE) CAN GET WIPED OUT BY DCORE FUNCTION. USE ; "IN YOUR BEHALF" FILOP. TO CHECK PROTECTION PROPERLY. ;612 18-SEP-78/BAH DAEMON SENDS A PACKET WITH AN INCORRECT INDEX INTO ; ERROR.SYS WHEN USING THE /NOW SWITCH IN SYSERR. ALSO SYSERR ALWAYS ; REPORTS 0 FOR CHAR/H/S FOR READ/WRITE ERRORS IN MAGTAPE STATS ; BECAUSE DAEMON USES WRONG OFFSET TO GET THE DATA. ;VERSION 17 ;700 ADD SUPPORT FOR KS10 SYSTEM ERROR ENTRIES ;701 CHANGE THE REFERENCES TO WORD 36 TO .JBSYM (WORD 116). (USED ; AS THE FLAG WORD FOR DETERMINING IF A CRASH FILE HAS BEEN PROCESSED ; BY DAEMON OR NOT) ;702 FIX MAGTAPE STATS ENTRY ROUTINE ;703 (SPR 10-26436) ALLOW CONTROLLER NUMBER TO BE REPORTED TO ; SYSERR. AREA AFFECTED: MBDVDN ;704 ADD CODE TO LOG DX20 DEVICE ERRORS. AT PRESENT THIS MEANS ; TU7X TAPE ERRORS REPORTED BY TAPSER. ;705 REMOVE ALL CODE SPECIFIC TO PRE-603 MONITORS. THIS IS THE FIRST ; STEP IN UPDATING DAEMON FOR 701. ;706 ADD CODE TO DUMP THE CPU STATUS BLOCK VIA ERROR CODE 63 (.ESCSB) ;707 ADD CODE TO DUMP THE DEVICE STATUS BLOCK VIA ERROR CODE 64 ; (.ESDSB) ;710 ADD CODE TO SEND THE DATE/TIME INCREMENTAL CHANGE TO %SIACT ; IF THE SYSTEM DATE/TIME CHANGES. INVOKED BY SUBFUNCTION 3 ; OF ERROR CODE 15. ;711 BRING ALL THE CODE UP TO 7.01 LEVEL. ALSO FIX A LARGE NUMBER ; OF BUGS IN THE ERROR REPORTING CODE. ;712 ADD CODE TO LOG SOFTWARE EVENTS OF INTEREST VIA CODE 14. ;713 REWRITE MISCELANEOUS PARTS OF THE CODE TO CLEAN IT UP ; AND FIX A LOT OF BUGS. ;714 TO BE ABLE TO MEASURE SOME SORT OF GENERIC "AVAILABILITY" ; FOR A SYSTEM, MAKE DAEMON WAKE UP EVERY 6 MINUTES AND ; LOOK AROUND TO SEE WHAT THE SYSTEM STATE IS. LOG THIS ; INFORMATION TO A NEW FILE, SYS:AVAIL.SYS. ;715 FOR SYSTEMS WITH JOBN+SEGN-1 .GT. 511 (7.01 REMEMBER), ; THE GETTAB SIMULATION FAILS FOR TABLES INDEXED BY JOB ; OR SEGMENT NUMBER IF THE INDEX IS LARGER THAN 511. ; NUMTAB ONLY HAS 9 BITS FOR THE MAXIMUM TABLES SIZE. THE ; MONITOR USES JBTMXL EXPLICITLY FOR SUCH TABLES. ;716 FOR SYSTEMS WITH A LARGE NUMBER OF (POSSIBLY DUAL PORTED) ; DISKS, ERROR CODE 5, INFORMATION EXTRACTED FROM A CRASH ; MAY OVERFLOW WHILE WRITING THE ENTRIES FOR EACH DISK. ; REMOVE THE DISK STUFF FROM ERROR CODE 5 AND WRITE A ; NEW ENTRY (45) WHICH CONTAINS THE INFORMATION. ;717 LOG NODE OFF AND ON-LINE VIA SUB-CODES 6 AND 7 OF THE ; CONFIGURATION STATUS CHANGE ENTRY. ;720 IF THE ERPTBK TABLE IN A CRASHED MONITOR IS FULL AND EPKIDX ; IS 0, DAEMON WILL LOOP PROCESSING THE ENTRIES. REDO THE CODE ; AT READCR TO AVOID THIS PROBLEM. ;721 DAEMON MAY REATTACH THE WRONG JOB TO A TERMINAL AFTER PROCESSING ; A REQUEST IF THE USER ATTACHES AND LOGS OUT THE JOB DOING THE ; REQUEST AND ANOTHER USER LOGS IN AND DETACHES BEFORE THE REQUEST ; IS COMPLETED. DON'T REATTACH A JOB TO A TERMINAL IF THE JOB'S ; LOGIN TIME DOESN'T MATCH THAT SAVED AT THE START OF THE REQUEST ;722 FIX PROBLEM WHERE DAEMON WAS RETURNING A UUO ERROR CODE WHILE ; PROCESSING HARDWARE ERRORS. ;723 IF AN ERROR OCCURS WHEN DAEMON IS DETACHED, THE ERROR MESSAGE, ; IF ANY, IS THROWN ON THE FLOOR. USE TRMOP. FUNCTION .TODSP ; TO PRINT THE ERROR MESSAGE ON DEVICE OPR. ;724 AVOID PROBLEMS WITH USERS GETTING A [1,2] JOB BY ALWAYS ; SETTING DSKFUL ERROR WHEN DAEMON STARTS UP. ;725 SINCE THE 700 MONITOR IS CAPABLE OF CHANGING THE ACTIVE ; SWAPPING LIST ON THE FLY, WE CAN NO LONGER READ SWPTAB ; WHEN DAEMON STARTS UP. READ THE INFORMATION FROM SWPTAB ; ON EACH REQUEST TO READ/WRITE THE SWAPPING SPACE. ;726 TC10C TAPE ERRORS ARE REPORTED BY SYSERR AS DX10 ERRORS. ; THE DEVICE CODE FOR TC10C'S IS 724 AND THE CODE ASSUMED ; THAT ANY DEVICE CODE LARGER THAT 540 WAS AN RH20. A COMPLEMENTING ; BUG IN SYSERR THEN TURNED THAT INTO A DX10 ERROR REPORT. ;727 FIX BUG IN PEKUSR THAT CAUSED SWAP POINTER INCONSISTENCIES ; WHILE READING FUNNY SPACE ADDRESSES. ;730 FIX RANDOM ERROR CODE 3 FAILURES IN DAEMON UUO FACT FUNCTION ; CAUSED BY RELEASING THE JOB WITHOUT PROCESSING IT ; IF JS.DPM WAS SET. ;731 YET ANOTHER SECURITY FIX TO PREVENT A USER GETTING A [1,2] ; JOB. ;732 FIX ROUTINE TO DUMP KS10 HALT STATUS BLOCK ;START VERSION 20 HERE WITH 7.01 FIELD TEST ; ;733 FIX KLERR ROUTINE TO CORRECTLY PROCESS ENTRIES ON CPUS OTHER ; THAN THE BOOT CPU ;734 CHANGE THE FORMAT OF THE ERPTBK TABLE TO USE 4 WORD ENTRIES SO ; THAT THE CPU NUMBER CAN BE INCLUDED IN THE ERROR DATA RETURNED ; BY THE MONITOR. ;735 ADD SUPPORT FOR NEW SYSERR ENTRIES FOR 7.01 MONITOR. THESE ARE ; ERROR TYPES 6,51,52,54,55,56 AND 57. ;736 FIX DATA GATHERING PROBLEM IN ENTRY TYPE 56. ;737 FIX SBDIAG POINTER IN ENTRY TYPE 52 ;740 MAKE ANOTHER ATTEMPT AT FIXING THE KLERR REPORT. ;741 FIX ILL MEM REF IN MASSBUS ERROR ROUTINE. ;742 MONBTS NOW WRITES DUMPS THAT ARE NOT A CONTIGUOUS PHYSICAL ; CORE IMAGE. CHANGE PEKSPY TO READ AND FOLLOW THE .EXE ; DIRECTORY WHEN READING WORDS FROM THE DISK. ;743 IF A USER ^C'S DAEMON WHILE IT IS WRITING A DUMP/DCORE/SAVE ; FILE, DAEMON DOESN'T RELEASE THE CHANNEL WHICH CAUSES THE ; USER TO GET AN FBM ERROR WHEN HE TRYS TO DELETE THE TMP FILE. ;744 DEVICE OPR0 DOESN'T EXIST IF FTNET IS TURNED OFF OR IF A SITE ; HACKS THEIR MONITOR. MAKE DAEMON TRY HARDER TO FIND A TTY TO ; TRMOP. TO. ;745 AVAIL HAS TROUBLE FIGURING OUT WHEN AVAIL.SYS STARTED AND WHEN ; IT ENDED. DEFINE 2 NEW ENTRIES, 46 AND 47 WHICH ARE THE FIRST ; AND LAST ENTRIES IN AVAIL.SYS. THESE ENTRIES PROVIDE TIMESTAMPS ; FOR AVAIL. ;746 MAKE PROCESSING OF ERRORS DURRING INITIALIZATION CLEANER ;747 LIMIT THE NUMBER OF ENTRIES MADE IN THE DISK STATISTICS ; ENTRY TO AVOID INFINITE ERROR FILES IF THE UDB CHAINS GET ; SCREWED UP. ;750 CHANGE DAEMON TO USE %CNSUP AS THE UPTIME INSTEAD OF %NSUPT ; SO THAT IT GETS CLOCK REQUESTS RIGHT IF CPU0 ISN'T RUNNING. ;751 FIX BUG THAT CAUSED ERROR CODE 2 FROM JOBPEK WHEN READING ; FRAGMENTED CORE. ;752 ADD CODE TO LOG RP20 DISK DEVICE ERRORS ;753 SPR #10-29485 RKB 2-JUN-80 ; FIX ROUTINE "CHECK" TO FORCE A FACT.SYS UPDATE AT EACH CHECK- ; POINT. THIS HELPS PRESERVE MORE ACCOUNTING DATA. ;754 AVAIL.SYS UPDATE ROUTINES DON'T USE ERRDEV AND ERRPPN TO ; DO THEIR UPDATES. ;755 SPR #10-29218 RKB 11-JUN-80 ; FIX ROUTINE "COMPRS" TO AVOID CREATING IOWDS OVER 128K. ;756 ALLOW A USER HAVING POKE PRIVILEGES TO DO THE APPEND TO ; ERROR.SYS DAEMON UUO FUNCTION. ;757 LOOK FOR CRASH FILES TO PROCESS ON THE UNION OF THE ; SYSTEM SEARCH LIST AND THE SYSTEM DUMP LIST. ;760 CLEAN UP THE RP20 ERROR REPORTING LOGIC TO MAKE IT LESS DEPENDENT ; ON ASSEMBLED-IN PARAMETERS. ;START VERSION 21 HERE WITH 7.02 ; ;761 UPDATE EDIT NUMBER FOR 7.02, REMOVE THE FT603 CONDITIONAL AND ; MAKE SOME COSMETIC CHANGES. ;762 UNCONDITIONALLY LINK THE STATE OF FTCHKPNT TO THAT OF FTFACT. ; YOU CAN NO LONGER ASSEMBLE DAEMON WITH FTFACT OFF AND FTCHKPNT ; ON. THIS WILL ALLOW US TO TURN OFF THE FTFACT FEATURE TEST ; SWITCH IN PREPARATION FOR THE MOVE TO USAGE ACCOUNTING. ;763 ADD THE FTI701 FEATURE TEST SWITCH THAT WILL SURROUND CODE ; THAT MUST EXIST FOR PRE-702 MONITORS. THE DEFAULT VALUE ; WILL BE ON. THE FEATURE TEST SWITCH AND THE CODE THAT ; IT SURROUNDS WILL BE REMOVED ON 703 SHIP. ;764 DO SOME MORE GENERAL CODE CLEANUP. ;765 REMOVE SUPPORT FOR THE SAVE AND SSAVE COMMANDS. THESE COMMANDS ; WERE ONLY INVOKED BY .SAV FILE WRITES FOR VIRTUAL PROGRAMS. ;766 SUPPORT KL-PAGING MONITORS; DESUPPORT E, D, VERSION, DCORE, AND DUMP ; COMMANDS FOR 7.02 MONITORS. ;767 SPR #32036 BCM 26-MAR-82 ; INCREASE THE MAXIMUM NUMBER OF CPUS WE CAN REPORT TO THE ; CURRENT SUPPORTED OPERATING SYSTEM MAXIMUM. ;770 IT HAS BECOME NEARLY IMPOSSIBLE TO CONTINUE SUPPORTING BOTH ; THE CURRENT AND PREVIOUS VERSIONS OF THE MONITOR WITH DAEMON. ; FIX DAEMON TO DETERMINE IF IT IS RUNNING WITH A PREVIOUS ; VERSION OF THE MONITOR AND RUN THE OLD VERSION OF DAEMON IF ; IT IS. THE PREVIOUS VERSION IS ASSUMED TO HAVE A NAME OF ; THE FORM DAEXXX.EXE, WHERE XXX IS THE MONITOR VERSION, E.G., ; DAE701 FOR THE 701 MONITOR. WE CAN ALSO REMOVE A GREAT ; DEAL OF CODE THAT WAS NECESSARY TO SUPPORT PRE-702 MONITORS ; AS A RESULT. INSTEAD OF REMOVING THIS CODE COMPLETELY FROM ; THE SOURCE, IT HAS BEEN PLACED UNDER THE FTUNSUPPORTED FEATURE ; TEST SWITCH. THIS VERSION OF DAEMON HAS ONLY BEEN TESTED WITH ; THAT SWITCH TURNED OFF AND WE EXPRESSLY DO NOT SUPPORT DAEMON ; WITH THE SWITCH TURNED ON. THE SWITCH IS THERE STRICTLY FOR ; REFERENCE PURPOSES AND ALL CODE CONTAINED WITHIN THE SCOPE ; OF THE FEATURE TEST SWITCH WILL BE REMOVED FOR THE NEXT RELEASE ; OF THE MONITOR. ;771 INCREASE THE SIZE OF THE ERROR.SYS HEADER TO 5 WORDS AND ADD ; A MONOTONICALLY INCREASING SEQUENCE NUMBER IN THE NEW WORD. ; DAEMON ALSO WRITES THE SEQUENCE NUMBER INTO THE EOF WORD AT ; THE END OF THE FILE WHEN IT WRITES AN ENTRY. EVERYTIME IT ; STARTS UP, DAEMON FINDS THE EOF WORD IN THE FILE AND USES ; THAT NUMBER AS THE START FOR THE NEW RUN. IF IT CAN'T FIND ; THE EOF MARK IN THE FILE FOR SOME REASON, DAEMON WILL TRY ; TO FIND THE FIRST SEQUENCE NUMBER IN THE FILE. IT THEN ADDS ; THE SIZE OF THE FILE DIVIDED BY THE SIZE OF THE SMALLEST ; ERROR ENTRY TO THAT NUMBER AND USES THAT AS THE SEQUENCE ; NUMBER. AS PART OF THIS CHANGE, DAEMON WILL CONTINUE TO ; USE ERROR.XNN INSTEAD OF ERROR.SYS IF IT FINDS AN .XNN ; FILE. THIS MEANS THAT THE SEQUENCE NUMBERS IN THE FILES ; SHOULD START IN ERROR.SYS AND INCREASE THRU ERROR.XNN. ; NOTE THAT THIS MEANS THAT ALL ERROR.* FILES MUST BE ; PROCESSED AS A UNIT. SEE THE 7.02 BEWARE FILE FOR ; MORE INFORMATION. ;772 STU GROSSMAN 13-JAN-83 ; SYMPTOM: THE FIRST ENTRY IN ERROR.XNN IS WRONG SIZE, AND MAY CONTAIN ; PIECES OF DAEMON CODE. ALSO, MANY RE-SYNC POINTERS GENERATED. ; IF YOU GET AN I/O ERROR IN ERRFIN WHILE WRITING AN ENTRY INTO ; THE FILE, WE CREATE AN ERROR.XNN+1 FILE, AND THEN RESTART ERRFIN. ; UNFORTUNATELY P4 (WHICH SHOULD POINT TO THE LAST WORD WRITTEN INTO ; ERABUF), MAY HAVE BEEN CHANGED INTO A WORD COUNT BY ERFILL. WHEN ; WE GET TO ERFILL AGAIN, IT TRIES TO CONVERT P4 INTO A WORD COUNT ; (AGAIN!). THINGS GO DOWN HILL FROM THERE. ; FIX: RESTORE OLD VALUE OF P4 BEFORE RESTARTING ERRFIN. ;773 GMU/KBY 7-OCT-83 ; AVAIL.SYS GETS BAD ENTRIES IN IT SWITCHING FROM 7.01(A) TO 7.02. ; THIS IS BECAUSE WE THINK THE HEADER FOR THE AVAIL.SYS WORKING ; ENTRY IS THE SAME LENGTH AS THE HEADER FOR THE ERROR.SYS/AVAIL.SYS ; DATA ENTRIES. THIS CHANGED WITH 7.02. USE NEW SYMBOL AWELEN WHERE ; APPROPRIATE FOR DEALING WITH THE AWE. ALSO, DON'T STORE EL.HED IN ; WORKING ENTRY HEADER. ;774 TARL 17-OCT-83 ; FIX PEKDI6, WHERE READING A KI PAGING CRASH WOULD RETRIEVE BAD ; ADDRESSES FROM CRASH FILE THROUGH PEKDSK. ;775 TARL 17-OCT-83 ; MOVE CLRBFI FROM INITIALIZATION CODE TO RIGHT BEFORE THE HIBER. ; HELPS AVOID LOOPS WHILE DEBUGGING DAEMON ON A TERMINAL. ;776 TARL 17-OCT-83 ; WHILE WE'RE IN THE CODE, COMBINE THE BINARY AND SOURCE COPYRIGHT ; STATEMENTS. HAVE THEM BE ON THE FIRST PAGE. ; ;777 DZIEDZIC 2-FEB-84 ; ADD SYSTEM ERROR BLOCK SUPPORT AS PART OF CI DISK PROJECT. ;START VERSION 22 HERE. ; ;1000 TARL 22-NOV-83 ; UP THE MONITOR VERSION TO 703 ; ;1001 TARL 15-MAY-84 ; MCO 11194, SIX CHARACTER STOPCODE NAMES. STOPCODE NAME IS NOW IN ; %SYSCD INSTEAD OF %SYSPC. ; ;1002 TARL 22-MAY-84, SPR 34163 ; BAD RANGE CHECK AT DSPERR, FIXED. ; ;1003 TL 28-Nov-84 ; Do ORION messages when KLINIK events are logged ; ;1004 CJA 1985-03-22 09:25:45 ; In routine ERRFIN ; make DAEMON do multi-block output to ERROR/AVAIL file ; so we don't write a partial entry if the system crashes. ; ;1005 CJA 17-APR-85 ; In routine AVLAGE, rename LAST-WEEK's AVAIL file to .Ann ; and rename AVAIL.SYS to AVAIL.LWK (to make it the new ; LAST-WEEK file). Complain if we already used AVAIL.A77. ; ;1006 CJA 24-APR-85 ; Since edit 1004, we get some entries in ERROR.SYS which ; are not reflected in RIBSIZE. Perhaps the data was written ; but the system crashed before the RIB was updated. Try ; to preserve these entries when looking for EOF. ; ;1007 JAD 2-MAY-85 ; Fix QUEUE. UUO argument block so WTO's aren't so messy. ; ;1010 LEO 9-AUG-85 ; DO COPYRIGHTS. ; ;1011 CJA 30-APR-85 ; First attempt to flag software-detected disk errors positively. ; Left half of 4 word ERRPT. block will contain a code to indicate ; which of the several software-detected errors occur. These include ; SAT errors, RIB errors, Recovered Transfer hung, etc. All of ; these errors are detected in FILIO. This enlarges the massbus-disk ; entry (11) by one word. ; ;1012 CJA 30-APR-85 ; Create new entry (code 74) for FILIO-detected CI disk error. ; Similar to massbuss disk (code 11) entry, but without a lot ; of useless information about controller status. ; ;1013 DPM #33947 29-Apr-86 ; Range check the number of kontroller registers. Don't allow ; more than MAXREG. ; ;1014 JAD 20-May-86 ; Don't attempt to SPY on more than 128K. ;Start version 23 for use with 7.04 monitor ; ;1015 DPM 6-Jan-87 ; Use new GETTAB table .GTCHN to fetch channel data block offsets ; instead of hardwiring needed values. ; ;1016 JAD 1-Apr-87 ; Ignore code 53 error entries (KS memory errors) for the moment. ; ;1017 DPM 5-May-87 ; If the oldest (first) entry in the error file is older than ; 7 days, create a new file. ; ;1020 JAD 27-Jul-87 ; Always do an SEBLK. UUO after the ERRPT. UUO to ensure any system ; error blocks are copied to the error file in a timely fashion. ; ;1021 DPM 13-Aug-87 ; Update FILSER and TAPSER KDB/UDB offsets to agree with the new ; values defined in DEVPRM. ; ;1022 DPM 3-Nov-87 ; Fix up references where UNIKON was used to find the KDB. UDBKDB ; now points to the KDB. Delete definition of UNIKON since it is ; no longer used. ; ;1023 DPM 12-May-88 ; Edit 1022 revisited. UDB offsets changed again. ; ;1024 ? ; ;1025 JAD 31-May-88 ; Handle IPA20 DRAM dump record in ERROR.SYS and write a dump ; file containing the DRAM data on XPN:. ; ; END OF EDIT HISTORY SUBTTL SYMBOL DEFINITIONS ;DEBUGGING NOTE: ;IF DAEMON IS LOOPING AND YOU WANT TO STOP IT AND SAVE THE CORE ;IMAGE FOR LATER ANALYSIS, DO THE FOLLOWING: ; .ATTACH 5[1,2] ;ATTACH TO IT FROM A [1,2] JOB ; .HALT ;STOP IT ; .REENTER ;STOP IT GRACEFULLY ; .SAVE BADDAE ;SAVE FOR LATER ;THIS PROCEDURE WILL CAUSE DAEMON TO SAVE ITS AC'S SO THAT YOU GET ;A DUMP WITH SOME USEFUL INFORMATION. LOC .JBVER BYTE (3)VWHO(9)VDAEMON(6)VMINOR(18)VEDIT RELOC ND FTDEBG,0 ;NON-ZERO FOR DEBUGGING FEATURES ND PDLEN,50 ;LENGTH OF PUSH DOWN LIST ND FTMCNF,0 ;NON-ZERO TO INCLUDE MAXCNF.SYS STUFF ;THIS SWITCH SHOULD REMAIN ZERO UNTIL ;WE DECIDE WHAT TO PUT IN MAXCNF ND MAXUCR,1000 ;MAXIMUM BLOCK TO READ FROM USER CORE ND MAXUPM,^D512 ;SIZE OF BLOCK TO USE AS UPMP BUFFER ND EVASIZ,^D128 ;NUMBER OF WORDS TO READ FROM FUNNY SPACE IN PEKUSR ;THIS **MUST** BE ONE OF 128, 256, OR 512. ANY ;OTHER VALUE WILL CAUSE PEKUSR TO RETURN WRONG ;VALUES ND EVDPPB,340000 ;BEGINNING OF "PER PROCESS" ADDRESS SPACE ND EVDPPE,400000 ;END (+1) OF "PER PROCESS" ADDRESS SPACE ND LINSIZ,^D200 ;MAX CHARACTERS/LINE ND CPUN,4 ;MAX NO OF CPU'S TO LOG ERRORS ON ND ERRDEV,SIXBIT/SYS/ ;SYS IS THE RIGHT PLACE IFE ,< ND FTSVSL,1 ;SAVE SEARCH LIST IF USING DISK > ND ERRPPN,<0> ;UFD (DEFAULT SYS:) FOR HARDWARE ERROR LOG FILE ND ERRSIZ,777 ;LARGEST ERROR-FILE TRANSACTION ND FTFACT,0 ;-1 TO RETURN ERROR ON .FACT FUNCTION ;0 TO SUPPRESS FACT FILE AND CALLS ;1 TO ENABLE FACT ACCOUNTING IFLE FTFACT, ;RE-DEFAULT CHKPNT IF FACT TURNED OFF ND FTCHKPNT,1 ;0 TO SUPPRESS CHKPNT FCN ND FCTDEV,SIXBIT/SYS/ ;SYS IS UNAMBIGUOUS IFE ,< ND FTSVSL,1 ;SAVE SEARCH LIST IF USING DSK > ND FTSVSL,0 ;DON'T SAVE SEARCH LIST UNLESS WE HAVE TO ND FCTPPN,<0> ;UFD (DEFAULT SYS:) FOR FACT.SYS ND TRNSIZ,20 ;LARGEST SINGLE FACT-FILE TRANSACTION ND MAXINT,^D100000 ;NUMBER OF ERROR INTERCEPTS BEFORE STOPING ;AUTOMATICALLY ND MAXFCT,^D800 ;WORDS IN FACT BUFFER ; - ADJUST TO BRING DAEMON CLOSE TO EVEN K BOUNDARY ND MAXAGE,^D600 ;MAX TIME (SECS) A FACT ENTRY MAY SIT IN DAEMON ND CHKTIM,^D600 ;SECONDS BETWEEN CHECKPOINTS ND AVLTIM,^D360 ;SECONDS BETWEEN AVAIL.SYS UPDATES ND ERRTIM,^D60 ;SECONDS BETWEEN RETRIES ON ERROR.SYS ND SLPTIM,^D60 ;TIME TO SLEEP IF NO WORK ND ICLKRQ,4 ;NO OF INTERNAL CLOCK REQUEST TYPES ND CHKRQ,0 ;CHECKPOINT REQUEST DUMMY JOB # ND AGERQ,-1 ;DUMMY JOB TO FORCE OUT OLD FACT ENTRIES ND IOERQ,-2 ;TIMER TO RETRY ERRORS ON ERROR.SYS ND AVLRQ,-3 ;UPDATE AVAIL.SYS REQUEST ;******************************************************************* ;THE FOLLOWING FEATURE TEST SWITCH IS USED TO SURROUND CODE THAT IS ;NO LONGER NECESSARY TO SUPPORT THE 702 MONITOR. THE CODE HAS ;BEEN LEFT IN THE SOURCE RATHER THAN SIMPLY DELETING IT FOR REFERENCE ;PURPOSES ONLY. DIGITAL HAS NOT TESTED DAEMON WITH THE FEATURE TEST ;SWITCH TURNED ON AND MAKES NO CLAIM THAT THE CODE WORKS IF IT IS ;TURNED ON. THE FEATURE TEST SWITCH AND THE CODE THAT IT SURROUNDS ;WILL BE REMOVED FOR THE NEXT RELEASE OF THE MONITOR. FTUNSUPPORTED==0 ;ONLY SUPPORTED SETTING IS OFF ;*************************************************************** ;AC'S SF=0 ;SCANNER FLAGS T1=1 ;TEMP AC'S T2=2 T3=3 T4=4 P1=5 ;PERMANENT AC'S P2=6 P3=7 P4=10 ;PERMANENT AC J=11 ;JOB NUMBER BEING SERVICED S=12 ;SEGMENT NUMBER OF HIGH SEGMENT IF ANY F=13 ;FLAGS SN=14 ;SCANER'S NAME OR NUMBER ACCUMULATOR BP=15 ;BYTE POINTER FOR OUTPUT SC=16 ;16 USED AS CHAR AC IN COMMAND SCANNER P=17 ;PUSH DOWN LIST PTR ;I/O CHANNELS DSK==6 SWP==7 FCT==10 DSKX==11 ;MACROS ER.STP==1B12 ;STOP PROGRAM ON THIS ERROR ER.OPR==1B11 ;NOTIFY OPR ON THIS ERROR ER.NCR==1B10 ;NO CRLF AT END OF MESSAGE DEFINE ERROR (MSG,FLG,LBL),< ERRWRN (,,FLG,LBL) > DEFINE WARN (MSG,FLG,LBL),< ERRWRN (<%>,,FLG,LBL) > DEFINE TELL (MSG,FLG,LBL),< ERRWRN (< >,,FLG,LBL) > DEFINE ERRWRN (PFX,MSG,FLG,LBL),< PUSHJ P,ERRMSG XLIST ..XX==0 ..YY==0 IRP FLG,< IFIDN ,,<..XX==..XX!> IFIDN ,,<..XX==..XX!> IFIDN ,,<..XX=..XX!> > IFNB ,<..YY=="'PFX'"> IFB , IFNB , LIST > ;FLAGS IN F IFN FTUNSUPPORTED,< L.DUMP==(1B0) ;SET IF DUMP, NOT IF DCORE L.WJ==(1B1) ;SET IF WANT GETTAB FOR JOB L.WS==(1B2) ;SET IF WANT GETTAB FOR HIGH SEGMENT L.SAVE==(1B3) ;SET IF SAVE (AS OPPOSED TO DUMP OR DCORE) L.ZPGF==(1B4) ;SET TO INDICATE CURRENTLY SCANNING A POTENTIAL ZERO PAGE IN COMPRS L.NHRL==(1B5) ;SET IF WE ARE SAVING A HIGH SEG WHERE LH(115)=0 L.UPMP==(1B6) ;SET IF USER'S UPMP IS IN USRUPM L.UUO==(1B7) ;SET IF DAEMON STARTED BY UUO > ;END IFN FTUNSUPPORTED L.ANY==(1B8) ;SET IF ANY JOBS REQUIRING DAEMON SERVICE FOUND DURING SCAN L.OPR==(1B9) ;SET IF MESSAGE SHOULD GO TO OPR L.FORC==(1B10) ;SET TO FORCE DUMP OF FACT.SYS BUFFER L.INI==(1B11) ;SET DURING INITIALIZATION TO INHIBIT TYPING ;ERROR MESSAGES ON OPR L.QUE==(1B12) ;OPR GOES ONLY TO ORION VIA QUEUE. L.DSK==(1B13) ;SET IF WE ARE PROCESSING A CRASH FILE IFN FTUNSUPPORTED,< R.SWIN==1B18 ;SET BY FINCHK IF JOB BEING SWAPPED IN > R.AVL==1B19 ;APPEND THIS ENTRY TO AVAIL.SYS IN ADDITION ;TO ERROR.SYS (USED BY ERRFIN) R.PAE==1B20 ;THIS PASS THROUGH ERRFIN IS APPENDING THE ;ENTRY TO AVAIL.SYS R.NEB==1B21 ;NO ERROR BLOCK FOR THIS CALL TO ERRINI, USE ;BOOT CPU SERIAL NUMBER R.DINI==1B22 ;IN DSK FILE INITIALIZATION. TREAT ALL CALLS ;TO PEKDSK AS 1-FOR-1 MAPPING. R.INF==1B23 ;THIS PASS THROUGH ERRFIN IS DOING THE ;SEQUENCE NUMBER INITIALIZATION FOR ERROR.SYS ;GETTAB ITEM FOR VARIOUS TABLES DACODE=='JD' ;STSTBL - QUEUE CODE FOR DAEMON QUEUE ;BITS IN JBTSTS WORD - LH JSHR==200000 ;MEANS HIGH SEGMENT IS SHARABLE JNSWP==10000 ;JOB IS NOT TO BE SWAPPED JSWP==2000 ;SWAPPED OR SWAPPING BIT JLOG==4 ;LOGGED IN JACCT==1 ;THE GODLY BIT RUN==400000 ;RUNNING(ACTUALLY, NOT IN MONITOR MODE) ;BITS IN JBTSTS WORD - RH JDC==100000 ;SET IF JOB REQUIRES SERVICE BY DAEMON JS.DEP==10000 ;JOB WAITING IN DAEMON ERROR PAUSE JS.DPM==100 ;JOB HAS BEEN WAITING FOR DAEMON TO SERVICE IT ;FOR A MINUTE. IF THIS BIT IS SET, WE FREE THE ;JOB SINCE IT'S BETTER TO MISS SOMETHING THAN ;HANG UP THE SYSTEM. ;BITS IN PAGE MAP ENTRY PM.ACC==400000 ;PAGE ACCESSABLE PM.ZER==40000 ;PAGE ALLOCATED BUT ZERO IF ONLY THIS BIT IS SET ;DDB ENTRIES DEVNAM==0 ;NAME OF DEVICE DEVSER==3 ;LH POINTS TO NEXT DDB DEVMOD==4 ;CONTAINS DEVCHR BITS DEVSTA==12 ;[571] DEVSTA WORDS OD DDB DEPSPL==1B0 ;[571] THIS IS A SPOOLED DB. ;CHANNEL DATA BLOCK ITEMS DEFINE DEFCHN,< X SYS ;LINK TO NEXT CHANNEL DATA BLOCK IN SYSTEM X LUE ;LAST UDB WITH SOFT OR HARD ERROR X ICW ;INITIAL CONTROL WORD ON LAST ERROR X ICL ;NUMBER OF WORDS POINTED TO BY CHNICW X MPE ;NUMBER OF MEMORY PARITY ERRORS X DPE ;NUMBER OF DATA PARITY ERRORS (FROM DEVICE) X NXM ;NUMBER OF NXMS OR DATA LATES (OVER RUN) X TCW ;EXPECTED TERMINATION CONTROL WORD > ;END DEFINE DEFCHN ;COMMON KDB OFFSETS KDBNAM==0 ;SIXBIT NAME OF CHANNEL KDBCHN==3 ;ADDRESS OF CHANNEL DATA BLOCK ;COMMON UDB OFFSETS UDBNAM==0 ;UNIT NAME UDBKDB==4 ;START OF KDB TABLE IN UDB ;FILSER UNIT DATA BLOCK ITEMS (UNI) UNILOG==13 ;LOGICAL UNIT WITHIN STR UNIHID==14 ;SIXBIT HOME-BLOCK ID NAME (PACK ID) UNISYS==15 ;LH - ADDR OF NEXT UNIT DATA BLOCK IN SYSTEM ;0 = NO MORE ;RH - UP POINTER TO STR DATA BLOCK UNICHN==17 ;LH - ADDR OF NEXT UDB ON SAME CHANNEL (RING) ;RH - UP POINTER TO CHAN DATA BLOCK UNIHCT==22 ;HARD (UNRECOVERABLE) ERRORS ON THIS UNIT ;LH - DEVICE & SEARCH ERRORS ;RH - DATA ERRORS UNISCT==23 ;SOFT (RECOVERABLE) ERRORS - INCREMENTED WHEN ;RECOVERY SUCCEEDS. HALVES SAME AS UNIHCT. UNIMCT==24 ;SOFTWARE-DETECTED ERRORS (3 FIELDS OF 12 BITS) ;SAT FAILURES, RIB REDUNDANCY ERRORS, FOLDED CHKSUM UNIERR==25 ;LAST ERROR STATUS ON DEVICE AFTER FIRST RECOVERY ATTEMPT UNISOF==26 ;ERROR STATUS BEFORE RECOVERY ATTEMPT UNIHBN==27 ;LOGICAL BLOCK NO OF LAST HARD ERROR UNIBRC==30 ;BLOCKS READ IN BUFFERED MODE UNIBWC==31 ;BLOCKS WRITTEN IN BUFFERED MODE UNIDRC==32 ;BLOCKS READ IN DUMP MODE (INCLUDING GET'S) UNIDWC==33 ;BLOCKS WRITTEN IN DUMP MODE (INCLUDING SAVE'S) UNIMRC==24 ;BLOCKS READ FOR MONITOR (SAT,UFD,MFC,BAT,SWAP) UNIMWC==35 ;BLOCKS WRITTEN FOR MONITOR UNIICT==36 ;SWAP READS (ALSO COUNTED IN UNIMWC) UNIOCT==37 ;SWAP WRITES (ALSO IN UNIMWC) UNIMSC==40 ;NO OF MONITOR & SWAPPING SEEKS UNIUSC==41 ;NO OF USER (INCLUDING GET & SAVE) SEEKS UNIPCT==42 ;SEEK INCOMPLETE ERRORS UNISDI==44 ;DATAI WORD ON LAST ERROR BEFORE RECOVERY ATTEMPT UNIHDI==45 ;DATAI WORD AFTER FAILURE OF FIRST RECOVERY ATTEMPT UNIECT==46 ;NO OF RETRIES+INITIAL ATTEMPT WHICH FAILED ;BIT 0 SET IF SUCCESSFUL OPERATIONS SINCE ERROR UNIHNG==47 ;HUNG RECOVERYS (4 FIELDS OF 9 BITS) ;# NOT RECOVERED BY STOPPING UNIT IN TRANSFER STATE ;# RECOVERED BY STOPPING UNIT IN TRANSFER STATE ;# CAUSED BY UNIT IN POSITION STATE AND RECOVERED AUTOMATICALLY ;# RECOVERED BY RESTARTING UNIT, WHICH WAS IDLE/TRANSFER WAIT UNIDES==67 ;[551] UNIT DESCRIPTION(FOR DSKCHR) ;[551] BOTH UNICDA AND UNIDES ARE GETTABED, BUT ARE DEFINED ;HERE IN CASE OF GETTAB FAILURE UNICDA==73 ;RH - ADDR OF DDB FOR CURRENT FILE ;TAPSER UNIT DATA BLOCK ITEMS (TUB) ;ALL ARE RELATIVE TO OFFSET OF TUBRID IN TUB, SINCE GETTAB RETURNS ;OFFSET OF TUBRID IN TUB. THE AREA FROM TUBRID TO TUBDDA IS STATIC ;IN MONITOR, I.E. NO NEW WORDS WILL BE ADDED. ALL WORDS ARE DEFINED ;HERE, EVEN IF NOT USED. TUBRID==0 ;REELID OF CURRENT TAPE TUBFIL==1 ;# OF FILES FROM BOT TUBREC==2 ;# OF RECORDS FROM EOF TUBCRD==3 ;# OF CHARACTERS READ SINCE LAST UNLOAD TUBCWR==4 ;# OF CHARACTERS WRITTEN SINCE LAST UNLOAD TUBSRE==5 ;# OF SOFT READ ERRORS SINCE LAST UNLOAD TUBHRE==6 ;# OF HARD READ ERRORS SINCE LAST UNLOAD TUBSWE==7 ;# OF SOFT WRITE ERRORS SINCE LAST UNLOAD TUBHWE==10 ;# OF HARD WRITE ERRORS SINCE LAST UNLOAD TUBTRY==14 ;# OF RETRIES TO RESOLVE ERROR TUBCCR==15 ;CHARACTER COUNT ON LAST RECORD TUBPBE==16 ;POSITION BEFORE ERROR (FILE,,RECORD) TUBFES==17 ;FINAL ERROR STATE TUBDDA==21 ;BEGINNING OF SHADOW BLOCK FOR STATISTICS ON UNLOAD TUBPGM==33 ;[601] USER'S PROGRAM IN SIXBIT TUBUID==34 ;[601] USERS PPN TUBDVC==35 ;DEVICE CODE/UNIBUS ADDRESS TUBKTY==36 ;KONTROLLER TYPE ;TAPSER TUBFEP ENTRIES FOR DX20 DEVICE ERRORS. THESE ENTRIES ARE ;RELATIVE TO THE START OF THE TUBFEP BLOCK. TD2ZRO==0 ;ZERO WORD; ALL UNDEFINED ENTRIES MAP TO HERE TD2CNI==1 ;CONI INITIAL TD2CIF==2 ;CONI FINAL TD2RED==3 ;NUMBER OF FRAMES READ TD2WRT==4 ;NUMBER OF FRAMES WRITTEN TD2D1I==5 ;DATAI PTCR INITIAL TD2D1F==6 ;DATAI PTCR FINAL TD2D2I==7 ;DATAI PBAR INITIAL TD2D2F==10 ;DATAI PBAR FINAL TD2CS0==11 ;CHANNEL LOGOUT 0 TD2CS1==12 ;CHANNEL LOGOUT 1 TD2CS2==13 ;CHANNEL LOGOUT 2 TD2CC1==14 ;FIRST CCW TD2CC2==15 ;SECOND CCW TD2MPE==16 ;COUNT OF MPE TD2NXM==17 ;COUNT OF NXM TD2OVR==20 ;NUMBER OF OVERRUNS TD2ICR==21 ;CONTENTS OF INITIAL CONTROL REG TD2VER==22 ;BYTE (9)DX20 ADDRESS(9)0(18)MICROCODE VERSION NUMBER TD2MBR==23 ;# OF MASSBUS REGS,,OFFSET TO FIRST TD2DVL==24 ;# OF DEVICE REFS,,OFFSET TO FIRST ;THE FOLLOWING VALUES AND OFFSETS INTO THE UNIEBK BLOCK FOR THE ;RP20 DISK MUST AGREE WITH THOSE DEFINED IN RNXKON. IF RNXKON CHANGES ;YOU MUST CHANGE THE FOLLOWING DEFINITIONS ALSO. RNXCS0==1 ;OFFSET TO THE WORD CONTAINING CHANNEL LOGOUT 0 RNXNXM==7 ;OFFSET TO THE WORD CONTAINING COUNT OF NXM'S ;OFFSETS IN THE HEADER FOR ERROR.SYS .EHTYP==0 ;TYPE, VERSIONS, LENGTHS EH.TYP==777B8 ;MASK FOR TYPE FIELD EH.CRS==1B16 ;ENTRY EXTRACTED FROM CRASH.EXE EH.FFM==7B20 ;MASK FOR FORMAT VERSION FIELD EL.FVR==0 ;FORMAT VERSION OF ERROR.SYS EH.HFM==7B23 ;MASK FOR HEADER VERSION FIELD EL.HVR==2 ;HEADER VERSION OF ERROR.SYS EH.HLN==7B26 ;MASK FOR HEADER LENGTH FIELD EL.HED==5 ;LENGTH OF STANDARD HEADER .EHDTM==1 ;UNIVERSAL DATE/TIME OF ENTRY .EHUPT==2 ;UPTIME OF SYSTEM WHEN ENTRY CREATED .EHASN==3 ;CPU SERIAL NUMBER OF CPU ON WHICH ERROR WAS DETECTED .EHSEQ==4 ;SEQUENCE NUMBER OF ENTRY ;OFFSETS IN HEADER FOR AVAIL.SYS WORKING ENTRY AWEHDR==0 ;BYTE(9).ESMRV(9)0(6)EL.HVR(3)EL.HED(9)BODY LENGTH AWEDAT==1 ;UNIVERSAL DATE/TIME OF ENTRY AWECDA==2 ;UNIVERSAL DATE/TIME OF FILE CREATION AWECDM==3 ;15 BIT DATE,,TIME OF MAXCNF.SYS CREATION AWELEN==4 ;LENGTH OF AVAIL.SYS WORKING ENTRY HEADER ;OFFSETS IN AVAIL.SYS MONITOR RUN VALUES (.ESMRV) BODY MRVPSN==0 ;-LEN,,OFFSET FROM MRVPSN TO ASCIZ SYSTEM NAME MRVVER==1 ;MONITOR VERSION NUMBER MRVUPT==2 ;UPTIME IN UNIVERSAL DATE/TIME FORMAT MRVCTM==3 ;MONITOR CRASH TIME (+/- 6 MIN) IN UNIVERSAL DATE/TIME FMT MRVRTM==4 ;MONITOR RELOAD TIME IN UNIVERSAL DATE/TIME FORMAT MRVWHY==5 ;WHY RELOAD CODE IN SIXBIT MRVIDT==6 ;SUM OF ALL INCREMENTAL DATE/TIME CHANGES SINCE RELOAD MRVSNM==7 ;FIRST OF 5 WORDS OF ASCIZ SYSTEM NAME ;DEFINITIONS IN KL ERROR BLOCK .KEDEV==0 ;DEVICE, LINE .KECNT==0 ;COUNT .KECPU==1 ;CPU .KEDTE==1 ;DTE NUMBER .KELNK==1 ;LINK .KEDAT==2 ;FIRST DATA WORD ;SPECIAL DEFINITIONS FOR MASSBUS ERROR PROCESSING RH10CD==1 RH20CD==2 RH11CD==3 MAXREG==20 ;MAXIMUM NUMBER OF DRIVE REGISTERS ON A MASSBUS DEVICE ;MISC CRSBLK==5 ;BLOCK # WHICH CONTAINS 1ST 200 WDS OF CORE IMAGE BLKSPP==2 ;BITS TO SHIFT TO CONVERT PAGES TO BLOCKS B2WLSH==7 ;BITS TO SHIFT TO CONVERT BLOCKS TO WORDS BLKSIZ==^D128 ;NUMBER OF WORDS PER BLOCK AVLWRK==<_-B2WLSH> ;NUMBER OF BLOCKS USED FOR ;WORKING ENTRY AT THE BEGINNING OF AVAIL.SYS P2WLSH==^D9 ;BITS TO SHIFT TO CONVERT PAGES TO WORDS W2PLSH==-^D9 ;BITS TO SHIFT TO CONVERT WORDS TO PAGES PG.BDY==777 ;MASK FOR OFFSET IN PAGE PG.SIZ==1000 ;SIZE OF PAGE IN WORDS .USSDT==5 ;CODE TO SEND TO %SIACT ON ERROR CODE 100 EXESIZ==^D512 ;[551]SIZE OF EXE DIRECTORY LN.BUF==200 ABSTAB==410 ;ABSOLUTE LOCATION OF ADDRESS OF GETTAB TABLES IFG MAXUCR-1000, ;IMPOSE JOBPEK LIMIT IFL MAXUCR-BLKSIZ, ;AT LEAST ONE BLOCK MAXUCR==MAXUCR&<-1_B2WLSH> ;FORCE BLOCK BOUNDARY DRMSIZ==2000 ;SIZE OF IPA20 DRAM STORE ;LOCATIONS SET UP BY SAVGET CODE IN COMCON IFN FTUNSUPPORTED,< SGAEXT==1 SGAHGH==16 > SUBTTL INITIALIZE DAEMON: JFCL ;IN CASE OF CCL ENTRY RESET ;GET ALL RESET MOVE P,PDL ;GET A STACK POINTER(IS A RUN UUO ACCU!!) MOVEI T1,DAEREE ;REENTER FOR [SYSTEM]INFO SHUT DOWN MOVEM T1,.JBREN ;STORE IN REENTER ADDRESS SETZB J,ZER ;J=VALUE OF QUEUE CODE FOR DAEMON QUEUE MOVE T1,[ZER,,ZER+1] BLT T1,EZER ;CLEAR STORAGE LOCATIONS MOVSI F,L.INI ;CLEAR FLAGS, NOTE INITIALIZATION MOVEI T1,E.EINT ;REENTER ADDRESS TO START WITH MOVEM T1,INTADR MOVE T1,[XWD 4,INTRES] ;ROUTINE TO RESTART AFTER ERROR INTERCEPTS MOVEM T1,INTBLK ;STORE IN INTERCEPT BLOCK MOVEI T1,777747 ;ENABLE FOR ALL ERRORS TLO T1,400000 ;SUPRESS ERROR TYPEOUTS SKIPE .JBDDT ;ARE WE DEBUGGING? TXZ T1,ER.ICC ;YES, PREVENT INSANE PROGRAMMERS MOVEM T1,INTBLK+1 ;STORE CONDITIONS IN INTERCEPT BLOCK MOVEI T1,INTBLK MOVEM T1,.JBINT ;SET UP JOB INTERCEPT BLOCK PUSHJ P,FNDOPR ;FIND OPR TTY ERROR ,STOP HRROI T1,.GTPPN GETTAB T1, ;GET OUR PPN JRST E.GTBF MOVE T2,[%LDFFA] GETTAB T2, ;GET FULL FILE ACCESS PPN JRST E.GTBF MOVEM T2,OPRPPN ;STORE AWAY FOR LATER CAME T1,T2 ;SKIP IF HAVE FULL FILE ACCESS JRST [ERROR ,NOCRLF PJOB T1, ;GET THE JOB NUMBER PUSHJ P,TDEC ;TYPE IT TELL < attempted to run DAEMON>,STOP] PJOB T1, ;OUR JOB NUMBER MOVEM T1,THSJOB ;SAVE FOR LATER SETOM THSLIN ;INDICATE OUR LINE GETLCH THSLIN ;GET CONTROLLING LINE NO & BITS MOVE T1,[%CNDAE] ;GETTAB ARG TO CHECK CORRECT VERSION GETTAB T1, ;GET IT MOVE T1,['701',,701] ;MUST BE 701 OR EARLIER HLRZ P1,T1 ;KEEP DAEMON NAME IN RH OF P1 HRRZS T1 ;KEEP JUST CURRENT DAEMON VERSION SUBI T1,VMON ;COMPARE WITH THIS VERSION OF DAEMON JUMPE T1,DAEMO1 ;GO IF THIS IS THE RIGHT VERSION JUMPL T1,PRVDAE ;GO BLT IN PREVIOUS VERSION OF DAEMON ERROR ,STOP DAEMO1: SETZM ERABUF ;ZERO ERABUF. MUST BE DONE HERE RATHER MOVE T1,[ERABUF,,ERABUF+1] ;THAN WITH ZER,,EZER BLT BECAUSE BLT T1,ERAEND ;PRVDAE OVERLAYS ERRBUF MOVE T1,[%CNSJN] GETTAB T1, ;GET LOWEST HIGH SEG NUMBER JRST E.GTBF ;CAN'T GIVE UP SOJ T1, ;DECR TO HIGHEST JOB NUMBER HRRZM T1,HJOB ;SAVE FOR JOB SCANS HLRE T2,T1 ;GET -SEGN MOVNS T2 ;MAKE IT POSITIVE ADDI T2,(T1) ;COMPUTE MAX JOB+SEG NUMBER MOVEM T2,JBTMXL ;SAVE FOR GETTAB SIMULATION ;HERE TO BUILD COPY OF GETTAB TABLE FOR GTBSPY MOVE T1,[%CNPDB] ;FIND WHERE JBTPDB IS GETTAB T1, ; FROM MONITOR JRST E.GTBF ;CAN'T, ERROR MOVEM T1,PDBPTR ;STORE FOR USE IN GETTAB SIMULATOR SETZB T3,T4 ;IN CASE WE CAN'T SPY MOVE T1,[%CNSIZ] ;GET SIZE OF SYSTEM GETTAB T1, JRST E.GTBF ;CAN'T, ERROR SUBI T1,1 ;HIGHEST LOC IN MONITOR CAILE T1,377777 ;[1014] MORE THAN 128K? MOVEI T1,377777 ;[1014] YES, REDUCE TO THE MAXIMUM SPY T1, ;SET SPY ERROR ,STOP MOVEI T1,.GTSLF ;GET TABLE NUMBER FOR NUMTAB HRLI T1,(T1) ;WANT THE NUMTAB ENTRY FOR .GTSLF GETTAB T1, ;GET IT JRST E.GTBF ;FAILED LSH T1,-^D27 ;KEEP JUST MAX ENTRY IN NUMTAB MOVEI T2,1(T1) ;PLUS ONE FOR LENGTH OF NUMTAB PUSHJ P,GETCOR ;GET THAT MUCH CORE ERROR ,STOP MOVEM T2,GTBST ;SAVE ADDRESS OF START OF TABLE NXTGTB: HRLZ T1,T3 ;NEXT TABLE PTR HRRI T1,.GTSLF GETTAB T1, ;GET NEXT TABLE PTR JRST ENDGTB ;THAT'S ALL TLZE T1,37 ;CLEAR MONITOR XR AND INDIRECT TLO T1,P3 ;SET OUR AC IF TABLE EXISTS ; (IE, IF POINTER WAS INDEXED) TRO T1,400000 ;SET SPY BIT MOVEM T1,(T2) ;STORE IN TABLE OF TABLE PTRS ADDI T2,1 ;BUMP TABLE POINTER AOJA T3,NXTGTB ;LOOP FOR ALL POSSIBLE GETTABS ENDGTB: SUBI T3,1 ;COMPUTE MAX NUMBER OF GETTABS MOVEM T3,MAXGTB ;SAVE MAX GETTAB NUMBER MOVE T2,GTBST ;GET ADDRESS OF START OF POINTERS CAIGE T3,.GTIDX ;DO WE HAVE A RANGE TABLE? TDZA T3,T3 ;NO, MAKE IT ZERO HRRZ T3,.GTIDX(T2) ;GET SPYSEG ADDRESS OF RANGE TABLE TRZ T3,400000 ;TURN OFF SPYSEG BIT MOVEM T3,RNGTAB ;SAVE FOR GETTAB SIMULATION ;HERE TO FIND QUEUE # FOR DAEMON WAIT SETZ T2, FNDDAQ: HRLZ T1,T2 ;LH T1=NEXT WORD IN TABLE HRRI T1,.GTWSN ;RH=QUEUE CODES TABLE PUSHJ P,GTBSPY ;GET NEXT WORD IN QUEUE CODES TABLE JRST E.GTBF ;MUST FIND IT MOVE T3,[POINT 12,T1] FNDDA1: TLNN T3,770000 ;SKIP IF MORE CODES IN THIS WORD AOJA T2,FNDDAQ ;NO MORE, TRY NEXT WORD ILDB T4,T3 ;T4=NEXT CODE IN SIXBIT CAIE T4,DACODE ;SKIP IF FOUND DAEMON QUEUE CODE AOJA J,FNDDA1 ;NO, TRY NEXT, COUNT CODES SKIPPED ;HERE WHEN FOUND DAEMON QUEUE CODE, NOW FIND CTY LINE NUMBER MOVEM J,DAQNAM ;SAVE DAEMON QUEUE CODE MOVE T1,[%CNPTY] PUSHJ P,GTBSPY ;GET OFFSET FOR PTY'S JRST E.GTBF ;CAN'T GET IT HLRES T1 ;T1=OFFSET FOR PTY=LINE NUM OF CTY+1 SUBI T1,1 ;LINE NUMBER OF CTY MOVEM T1,CTYLIN ;STORE LINE NUMBER OF CTY SKIPGE T1 ;GET SWAPPING PARAMETERS IF OK ERROR ,STOP MOVE T1,[%CNVER] ;GET MONITOR VERSION PUSHJ P,GTBSPY JRST E.GTBF ;CAN'T GET IT MOVEM T1,MONVER ;[545] SAVE VERSION MOVE T1,[%VMUPJ] ;GETTAB OFFSET OF UPJOB PUSHJ P,GTBSPY JRST E.GTBF ;CAN'T GET IT MOVEM T1,.UPJOB ;AND SAVE OFFSET FOR LATER IFN FTUNSUPPORTED,< MOVE T1,[%VMLST] ;GETTAB OFFSET OF .UPLST PUSHJ P,GTBDFL ;GET IT (USE POSSIBLE ZERO AS FLAG LATER) MOVEM T1,.UPLST ;SAVE OFFSET FOR USE LATER > MOVE T1,[%FTERR] ;GETTAB ARG TO GET FEATURE TESTS PUSHJ P,GTBSPY ;GET IT JRST E.GTBF ;MUST HAVE IT ANDI T1, ;MASK OFF KL PAGING BIT MOVEM T1,FTKLP ;STORE FOR LATER TESTS ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE MOVE T1,[%VMPPB] ;GETTAB ARG POINTER TO PUSHJ P,GTBSPY ;GET BEGINNING OF PER PROCESS ADDRESS SPACE MOVX T1,EVDPPB ;DEFAULT MOVEM T1,EVAPPB ;SET IT MOVE T1,[%VMPPE] ;GETTAB ARG POINTER TO PUSHJ P,GTBSPY ;GET END (+1) OF PER PROCESS ADDRESS SPACE MOVX T1,EVDPPE ;DEFAULT MOVEM T1,EVAPPE ;SET IT ;FALL THROUGH TO GET SWAP STUFF MOVE T1,[%LDESZ] ;GETTAB TO RETURN SIZE OF ERPTBK ENTRY PUSHJ P,GTBSPY ;GET IT MOVEI T1,2 ;MUST BE AN OLD MONITOR MOVEM T1,ERPTSZ ;SAVE FOR LATER IFN FTUNSUPPORTED,< ;HERE TO SET UP SWAPPING TABLES MOVE T1,[%LDSLP] ;GET POINTER TO %LDSLP PUSHJ P,GTBSPY ERROR ,STOP HRRZM T1,SWPTAB ;SAVE ADDRESS OF SWPTAB HLRES T1 ;COMPUTE -LEN OF SWPTAB MOVNM T1,SWPMAX ;SAVE LENGTH FOR COMPARES MOVE T1,[%LDSLB] ;GET POINTER TO OFFSET OF UNISLB PUSHJ P,GTBSPY ;GET IT ERROR ,STOP MOVEM T1,UNISLB ;SAVE FOR LATER TESTS > ;END IFN FTUNSUPPORTED ;HERE TO DETERMINE WHICH KIND OF JOBPEK WE HAVE MOVE T1,[%CNJPK] ;GETTAB ARG TO FIND OUT WHAT KIND GETTAB T1, ; OF JOBPEK WE HAVE JRST E.GTBF ;MUST HAVE THIS VALUE CAIE T1,MAXUCR ;SIZE OF TRANSFER MATCH WHAT WE KNOW? ERROR ,STOP ;GET, SAVE ORIGINAL FILE STRUCTURE SEARCH LIST FOR THIS JOB GETSWE: MOVE T1,[3,,[.PTFSL ;DEFINE ADDITIONAL PATH TO BE SEARCHED 0 ;NO LIB, NO SYS, NO NEW, NO PROBLEMS 0]] ;[575] DON'T WASTE A PPB PATH. T1, ;SET UP JFCL ;WHAT ISN'T IMPLEMENTED CAN'T HURT US MOVE T1,[5,,[.PTFSN ;FUNCTION TO DEFINE LOGICAL NAMES PT.UDF ;DELETE THIS LOGICAL NAME SIXBIT/SYS/ ;NAME IS SYS 0 ;2 ZERO TERMINATORS 0]] PATH. T1, ;MAKE SURE SYS ISN'T A LOGICAL NAME JFCL ;NOT DEFINED IN THE FIRST PLACE MOVE T1,[.STDFL,,.DFERR] ;ARG TO SET DSKFUL ERROR SETUUO T1, ;DO IT WARN ,OPR IFN FTSVSL,< ;ONLY CARE ABOUT OUR SEARCH LIST IF WE SAVE IT MOVEI T1,.FSDSL ;DEFINE SEARCH LIST FUNCTION MOVEM T1,USRLST ;[540] STORE IN FUNCTION BLOCK SETOM USRLST+1 ;[540] OUR JOB SETOM USRLST+2 ;[540] OUR PPN IFN .FSDSL-1, MOVEM T1,USRLST+3 ;[540] SET TO REMOVE UNLISTED STR'S, ;RATHER THAN PUTTING INTO PASSIVE LIST MOVE T1,[XWD USRLST,SRCLST] ;[540] BLT T1,SRCLST+3 ;[540] COPY SAME TO SEARCH LIST AREA MOVEI T3,SRCLST+3 ;AND USE THIS AREA, PLEASE SETOB T1,T2 ;OUR JOB, PPN PUSHJ P,GETSRC ;GET OUR SEARCH LIST SUBI T3,SRCLST-1 ;END MINUS BEGINNING=LENGTH MOVSI T3,(T3) ;THATS IN LEFT HALF HRRI T3,SRCLST ;WITH ADDR IN RIGHT MOVEM T3,PSRCH ;SAVE SO WE CAN GET THIS BACK STRUUO T3, ;TRY TO SET THIS SEARCH LIST TO SEE IF IT WORKS WARN > ;END CONDITIONAL ON FTSVSL ;HERE TO FIND OUT IF JOBPEK UUO WORKS TSTJPK: MOVEI T1,T2 HRLZ T2,THSJOB ;OUR JOB NUMBER HRRI T2,1 ;1 WORD FROM OUR JOB TO OUR JOB MOVE T3,[SECBUF,,SECBUF] JOBPEK T1, ;TRANSFER A WORD FROM US TO US ERROR ,STOP ;HERE TO CHECK FOR OTHER DAEMON'S RUNNING AROUND HRLZ T1,THSJOB HRRI T1,.GTPRG ;GET OUR NAME PUSHJ P,GTBSPY JRST E.GTBF ;CAN'T CAME T1,[SIXBIT/DAEMON/] JRST GETJIF ;IF THIS ISN'T DAEMON, NO PROBLEM MOVE J,HJOB ;HIGHEST JOB IN SYSTEM DAELUP: CAMN J,THSJOB ;DO NOT LOOK AT OUR JOB SOJG J,DAELUP JUMPLE J,GETJIF ;QUIT AFTER LOOKING AT ALL JOBS HRROI T1,.GTPRG ;GETTAB POINTER FOR PROGRAM NAME PUSHJ P,GTBSPY JRST E.GTBF ;CAN'T CAME T1,[SIXBIT /DAEMON/] SOJA J,DAELUP ;THAT'S NOT DAEMON, TRY NEXT HRROI T1,.GTSTS ;GETTAB TABLE FOR JOB STATUS PUSHJ P,GTBSPY ;MUST CHECK JACCT, SINCE ANYBODY JRST E.GTBF ; CAN USE A NAME TLNN T1,JACCT ;IS THIS THE SYS:DAEMON? SOJA J,DAELUP ;NO--AREN'T YOU GLAD WE CHECKED? ERROR ,STOP ;HERE TO GET SYSTEM CLOCK RATE (JIFFIES/SECOND) GETJIF: MOVE T1,[%CNTIC] PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,JIFSEC ;STORE JIFFIES PER SECOND IMULI T1,^D24*^D3600 ;JIFFIES PER DAY MOVEM T1,JIFDAY ;HOLD FOR DIVIDE MOVEI T1,^D1000 ;MILLISECONDS PER SECOND IDIV T1,JIFSEC ;GET MILLISECONDS PER JIFFY MOVEM T1,MILJIF ;STORE THAT, TOO ;HERE TO SET UP CLOCK FUNCTION TABLE MOVEI T2,ICLKRQ-1 ;[67]GET NUMBER OF QUEUES LESS THAN 0 MOVNM T2,QPNTR ;[67]SAVE IN QPNTR AS MOST NEG. QUEUE NO ADD T2,.JBFF ;[67]POINT TO JOB 0 HRRM T2,JBTCLK ;STORE THE POINTER HRRZ T1,HJOB ;HIGHEST JOB # IN SYSTEM MOVNI T3,ICLKRQ+1(T1) ;-VE LENGTH OF TABLE HRLM T3,QPNTR ;STORE IN POINTER MOVEI T2,ICLKRQ+1(T1) ;GET NUMBER OF WORDS IN TABLE PUSHJ P,GETCOR ;ALLOCATE THAT MUCH CORE ERROR ,STOP IFG FTFACT,< ;HERE TO SAVE RELOAD INFORMATION IN FACT.SYS PUSHJ P,BUFAGE ;DON'T LET THIS ENTRY SIT TOO LONG MOVE T1,[XWD 371000,3] ;GET NEW FORMAT RELOAD ENTRY[7(57)] HRRZM T1,FACTSZ ;NOTE 3 WORDS IN BUFFER MOVE T2,THSJOB ;GET OUR JOB NO DPB T2,[POINT 9,T1,17] MOVE T2,THSLIN ;GET OUR LINE & CHARACTERISTICS TLNE T2,(GL.CTY) ;IS IT THE CTY? SETO T2, ;YES, SPECIAL CODE FOR THAT DPB T2,[POINT 12,T1,29] MOVEM T1,FACTBF ;(0) HEADER WORD MOVE T1,OPRPPN ;(1) THIS JOB'S PPN MOVEM T1,FACTBF+1 PUSHJ P,NBSDAT ;GET UNIVERSAL DATE/TIME MOVEM T1,FACTBF+2 ;(2) DATE AND TIME ;ADD HERE OTHER RELOAD INFORMATION AS DESIRED > ;HERE TO START INTERNAL TIMERS IFN FTCHKPNT,< IFN CHKTIM,< HRREI J,CHKRQ ;INSERT THE CHECKPOINT REQUEST MOVEI T1,CHKTIM ;INTERVAL PUSHJ P,CLKREQ ;PUT IN THE REQUEST >;END OF CHKTIM COND >;END OF FTCHKPNT COND IFN AVLTIM,< HRREI J,AVLRQ ;INSERT THE AVAIL.SYS UPDATE SCAN MOVEI T1,AVLTIM ;INTERVAL PUSHJ P,CLKREQ ;PUT IN THE REQUEST >;END IFN AVLTIM ;HERE TO GET CREATE COPY OF NXMTAB IN CORE MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB PUSHJ P,GTBSPY JRST E.GTBF ;CAN'T MOVE T3,T1 ;MOVE POINTER TO T3 FOR LATER LOOP HLRE T2,T1 ;GET 36 BIT NEGATIVE LENGTH MOVMS T2 ;MAKE IT POSITIVE MOVEM T2,NXMLEN ;SAVE LENGTH PUSHJ P,GETCOR ;ALLOCATE THAT MUCH CORE ERROR ,STOP MOVEM T2,NXMTAB ;SAVE ADDRESS OF START OF NXMTAB NXMLUP: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1 PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR MOVEM T1,(T2) ;STASH IT AWAY AOS T2 ;INCREMENT T2 AOBJN T3,NXMLUP ;INCREMENT T3 AND LOOP IFN FTMCNF,< ;HERE TO INSURE THAT MAXCNF.SYS EXISTS AND BITCH AT THE OPERATOR ;IF IT DOESN'T. MOVE T1,[SIXBIT/MAXCNF/] ;FILENAME TO LOOKUP PUSHJ P,OPNFIL ;OPEN THE FILE WARN ,,CHKCF1 PUSHJ P,RELFCT ;RELEASE THE CHANNEL >;END IFN FTMCNF ;REBUILD THE AVAIL.SYS WORKING ENTRY IN CORE PUSHJ P,REDAVL ;READ WORKING ENTRY OR BUILD NEW ONE ;HERE TO SAVE WHY-RELOAD CODE AND OPR COMMENTS IN ERROR.SYS RELSTR: PUSHJ P,ERRSTR ;SET UP EXTENSION/SEQ NUMBER FOR ERROR FILE MOVSI T1,.ESDRE_9 ;[550]SET UP RESTART CODE PUSHJ P,ERRINI ;[550]STORE HEADER, SET P4 AND CLR BUFF PUSH P4,.JBVER ;[550]GET JBVER PUSHJ P,ERRFIN ;[550]AND STUFF IT MOVE T1,[%LDMBR] ;GETTAB KONREG+UNISCR PUSHJ P,GTBSPY JRST E.GTBF HRRZM T1,UNISCR ;RH IS UNISCR HLRZM T1,KONREG ;LH IS KONREG MOVE T1,[%LDBBP] ;[463] PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,UNICCT ;[463] OFFSET TO UNICCT IN UDB ;HERE TO GET CHANNEL DATA BLOCK OFFSETS GETCHN: PUSH P,P1 ;SAVE P1 MOVSI P1,-CHNLEN ;AOBJN POINTER GETCH1: MOVE T1,CHNARG(P1) ;ARGUMENT PUSHJ P,GTBSPY ;GETTAB JRST E.GTBF ;FAILED MOVEM T1,@CHNARG+1(P1) ;STORE RESULTS AOBJN P1,.+1 ;ACCOUNT FOR TWO WORD ENTRIES AOBJN P1,GETCH1 ;LOOP THROUGH TABLE POP P,P1 ;PHASE STACK JRST GETET1 ;ONWARD DEFINE X (ARG),,> CHNARG: DEFCHN CHNLEN==.-CHNARG ;HERE TO GET ADDRESS OF EXECT1 IN JOB DATA AREA GETET1: MOVE T1,[%CNET1] ;GETTAB THE ADDRESS OF EXEC T1 PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,EXECT1 ;AND SAVE FOR LATER ;HERE TO GET DDB LENGTHS MOVE T1,[%CNLSD] ;GETTAB SHORT DDB LENGTH PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,LDDBSH ;AND SAVE AS LENGTH OF SHORT DDB IFN FTUNSUPPORTED,< MOVE T1,[%CNLLD] ;NOW GET LONG LENGTH PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,LDDBLN ;AND SAVE FOR UUO'S, ETC. MOVE T1,[%CNLDD] ;AND LAST, GET DISK DDB LENGTH PUSHJ P,GTBSPY JRST E.GTBF MOVEM T1,LDDBDS ;AND SAVE FOR DCORE OF DDB'S > ;HERE TO DETACH TTY HRLZ T1,THSLIN ;LH IS NOW LINE NUMBER, RH=0 TO DETACH HRRZ T2,.JBDDT ;GET ADDR OF DDT IF ANY JUMPN T2,NODET ;DONT DETACH IF DDT TELL ATTACH T1, ;DETACH OUR TTY ERROR ,STOP NODET: TLZ F,L.INI ;NO LONGER IN INITIALIZATION PUSHJ P,CRSCHK ;[551]BEFORE WRITING ANY OTHER ENTRIES ;FOR THIS MONITOR LOAD, GO LOOK AT CRASH ;FILES TLNE F,L.DSK ;MAKE SURE WE DIDN'T SCREWUP ERROR ,STOP MOVEI T1,DALOOK ;[604] MOVEM T1,INTADR ;[604] SETOM WTUERR ;INIT FLAG TO CATCH RECURSIVE EXIT ATTEMPTS SUBTTL CHECK FOR MONITOR-INITIATED DAEMON REQUEST ;HERE WHEN DAEMON AWAKENED ; IF A HARDWARE ERROR HAS BEEN DETECTED BY THE MONITOR, RECORD THE INFO ;COLLECTED INTO ERROR.SYS. MONITOR COUNTERS GET BUMPED ON EVERY ERROR DALOOK: CAME P,PDL ;VERIFY STACK CORRECTNESS MOVEM P,PDLGUF ;OR SAVE THE BAD GUY MOVE P,PDL ;RESTORE GOODNESS NEWLOK: PUSHJ P,NBSDAT ;GET DATE/TIME MOVEM T1,DLKDTM ;SAVE FOR DEBUGGING SETZM EVAADR ;CLEAR POINTER TO FUNNY SPACE BUFFER IFN FTUNSUPPORTED,< SETZM MSGLIN ;CLEAR MESSAGE LINE NUMBER > TLZ F,L.OPR+L.QUE+IFN FTUNSUPPORTED, ;CLEAR ASSORTED BITS SETZM ERPTBK+2 ;DEFAULT CPU NUMBER CORRECTLY FOR OLD MONITOR SETZM ERPTBK+3 ;... MOVS T1,ERPTSZ ;GET LENGTH OF ENTRY IN LH HRRI T1,ERPTBK ;GET ADDRESS OF BLOCK FOR ERRPT. UUO ERRPT. T1, ;ASK MONITOR FOR NEXT ERROR TO REPORT JRST SEBLOK ;NO MORE, LOOK AT SYSTEM ERROR BLOCKS PUSHJ P,DSPERR ;DISPATCH TO CORRECT ROUTINE OFF CODE IN T1 JRST NEWLOK ;AND LOOP BACK FOR MORE SEBLOK: PUSHJ P,RSEBLK ;PROCESS ANY SYSTEM ERROR BLOCKS JRST DALOKJ ;DONE, GO LOOK AT JOBS ;ROUTINE TO SET UP AND DISPATCH TO APPROPRIATE REPORTING ;ROUTINE FROM CODE RETURNED IN T1 BY ;ERRPT. UUO. DSPERR: LDB T2,[POINT 9,(T1),35] ;GET CODE INTO T2 LDB J,[POINT 9,(T1),26] ;GET JOB NUMBER, IF ANY CAIL T2,DSPMAX ;IGNORE IF OUT OF RANGE JRST RPTERR ; RANGE JRST @DSPTAB(T2) ;DISPATCH ON CODE DSPTAB: RPTERR ;0-ILLEGAL CODE SRLERR ;1-SYSTEM RELOAD SCNSTD ;2-CONTINUABLE MONITOR ERROR SCPERR ;3-NOT IMPLEMENTED SNXMER ;4-NOT IMPLEMENTED RPTERR ;5-EXTRACTED CRASH INFO, NOT REPORTED THIS WAY CHNERR ;6-CHANNEL ERROR RPTERR ;7-DAEMON STARTED, NOT REPORTED THIS WAY SDVERR ;10-RP10,RC10 DISK ERROR SMDVER ;11-MASS BUS DEVICE ERROR DX2ERR ;12-DX20 DEVICE ERROR RSEBLK ;13-SYSTEM ERROR BLOCK(S) AVAILABLE SWEERR ;14-SOFTWARE EVENT OF INTEREST (POKE, SNOOP., ETC) SCSCER ;15-CONFIGUATION STATUS CHANGE RPTERR ;16-SYSTEM ERROR LOG, NOT REPORTED THIS WAY SDIERR ;17-SOFTWARE REQUEST RPTERR ;20-NOT IMPLEMENTED STPERR ;21-TAPSER MAGTAPE ERROR RPTERR ;22-NOT IMPLEMENTED RPTERR ;23-NOT IMPLEMENTED RPTERR ;24-NOT IMPLEMENTED RPTERR ;25-NOT IMPLEMENTED RPTERR ;26-NOT IMPLEMENTED RPTERR ;27-NOT IMPLEMENTED KLEERR ;30-KL10 FRONT END ERROR DATA RPTERR ;31-FRONT-END RELOAD, NOT REPORTED THIS WAY RPTERR ;32-NOT IMPLEMENTED RPTERR ;33-KS10 HALT STATUS BLOCK, NOT REPORTED THIS WAY RPTERR ;34-NOT IMPLEMENTED RPTERR ;35-NOT IMPLEMENTED RPTERR ;36-NOT IMPLEMENTED RPTERR ;37-NOT IMPLEMENTED RPTERR ;40-DISK STATISTICS, NOT REPORTED THIS WAY RPTERR ;41-NOT IMPLEMENTED STPERR ;42-TAPE STATISTICS FOR TAPSER RPTERR ;43-MAX CONFIGURATION IN AVAIL.SYS, NOT REPORTED THIS WAY RPTERR ;44-MONITOR RUN VALUES IN AVAIL.SYS, NOT REPORTED THIS WAY RPTERR ;45-DISK STATISTICS (USUALLY FROM A CRASH) RPTERR ;46-BEGINNING OF AVAIL.SYS TIMESTAMP RPTERR ;47-END OF AVAIL.SYS TIMESTAMP SDIERR ;50-DL10 ERROR KPARNX ;51-KI PARITY/NXM INTERRUPT (7.01) KPARNX ;52-KL PARITY/NXM INTERRUPT (7.01) JOBFIN ;53-KS MEMORY ERROR (IGNORED FOR NOW) KLSTRP ;54-KS NXM TRAP (7.01) KLSTRP ;55-KL/KS PARITY TRAP (7.01) NXMSWP ;56-NXM SWEEP (7.01) PARSWP ;57-PARITY SWEEP (7.01) RPTERR ;60-NOT IMPLEMENTED SKLTRP ;61-NOT IMPLEMENTED SCPERR ;62-NOT IMPLEMENTED CSBERR ;63-CPU STATUS BLOCK DSBERR ;64-DEVICE STATUS BLOCK RPTERR ;65-NOT IMPLEMENTED RPTERR ;66-NOT IMPLEMENTED SNXMER ;67-NOT IMPLEMENTED RPTERR ;70-NOT IMPLEMENTED SDIERR ;71-LP100 REPORT [550] SDIERR ;72-UNIT RECORD DEVICE ERROR RPTERR ;73-NOT IMPLEMENTED RPTERR ;74-NOT IMPLEMENTED ICDERR ;75-IPA20 DRAM DUMP RPTERR ;76-NOT IMPLEMENTED RPTERR ;77-NOT IMPLEMENTED DSPMAX=.-DSPTAB IFE FTUNSUPPORTED,< SNXMER: SCPERR: SKLTRP: > RPTERR: WARN ,NOCRLF MOVE T1,T2 ;GET THE CODE PUSHJ P,TOCT ;TELL OF THE ERROR TELL < returned by ERRPT. UUO>,OPR WARN ,OPR JRST JOBFIN ;GO RELEASE THE JOB ;INITIALLY PUSHJ HERE IF A JOB IS PAUSED FOR US ;THIS WILL FREE THAT JOB IN CASE OF FATAL ERROR OR WHEN WE POPJ PROTJB: PUSH P,[PROTJ1] ;[544] [565] GET PLACE TO GO ON CRASH POP P,INTADR ;[544] AND PUT IT IN INTADR POP P,(P) ;[544] TAKE RETURN ADDR OFF STACK PUSHJ P,@1(P) ;[544] AND CALL CALLER ;AUTOMATICALLY RETURN HERE WHEN DONE. THE USER IF FREED. ; PJRST JOBFIN ;[544] FINISH UP ;SUBROUTINE TO RESTART JOB WAITING FOR ERROR TO BE REPORTED ;ARGS J=JOB NUMBER JOBFIN: HRLZI T1,(J) ;[527] GET JOB NUMBER INTO LH OF T1 IFN .GTSTS, ;SET UP TO GET JOBS JBTSTS WORD PUSHJ P,GTBDFL ;GET VALUE, DEFAULT TO ZERO IF FAIL TLNN F,L.DSK ;DO NOTHING IF READING FROM DISK TRNN T1,JS.DEP ;IS JOB WAITING? POPJ P, ;[565 -PUT IT BACK] NOPE, RETURN MOVEI T1,J ;GET ADDR OF ARGUMENT FOR DAEFIN DAEFIN T1, ;AND SET JOB FREE AOS FINGUF ;REMEMBER # OF LOSSAGES POPJ P, ;HERE IF DAEMON CRASH BEFORE USER FREED PROTJ1: PUSHJ P,JOBFIN ;[544] FINISH UP JRST DALOOK ;[544] CONTINUE SUBTTL LOOK FOR A JOB REQUIRING DAEMON SERVICE DALOKJ: HRRZ J,HJOB ;J=HIGHEST JOB NUMBER IN SYSTEM DALOO1: TLZ F,L.OPR+L.QUE+IFN FTUNSUPPORTED, ;CLEAR DUMP FLAG AND SAVE FLAG MOVEM J,CURJOB ;SAVE LAST JOB EXAMINED FOR DEBUG PUSHJ P,NBSDAT ;GET DATE/TIME MOVEM T1,DLJDTM ;SAVE FOR DEBUGGING HRROI T1,.GTSTS PUSHJ P,GTBSPY ;GET JBTSTS WORD FOR JOB WARN ,OPR,DALOO2 TRNE T1,JDC ;IF JOB WANTS SERVICE FOR A COMMAND JRST DASERV ;GO SERVICE IT LDB T2,QUECOD ;GET CODE FOR DAEMON QUEUE CAMN T2,DAQNAM ;SKIP IF NOT IN DAEMON QUEUE JRST UUSERV ;GO PROCESS THE UUO TRNN T1,JS.DPM ;IF JOB HAS BEEN WAITING FOR A MINUTE JRST DALOO2 ; AND WE DID NOT PROCESS IT, RELEASE AOS DPMCNT ; IT SO THAT THE OPR DOESN'T GET MOVEM J,DPMJOB ; OBSCURE MESSAGES JRST DETUSR DALOO2: CAME J,CURJOB ;MAKE DEFENSIVE CHECK WARN ,OPR SOJG J,DALOO1 ;LOOP FOR ALL JOBS IN SYSTEM TLZE F,L.ANY ;SKIP IF NO JOBS FOUND JRST DALOOK ;DID SOMETHING, GO THROUGH AGAIN IFG FTFACT,< MOVE T1,[%NSKTM] PUSHJ P,GTBDFL ;CHECK FOR KSYS SOON JUMPE T1,.+2 ;NO KSYS--CHECK FORCE BIT SOJLE T1,.+2 ;IF PAST, OR LESS THAN 1 MINUTE, FORCE TLZE F,L.FORC ;SHOULD WE FORCE OUT THE FACT BUFFER? SKIPN T1,FACTSZ ;YES, IF ANYTHING IN IT JRST NXTWAK ;NO, OR NOTHING THERE HRLZI P1,(T1) ;SIZE IN P1 LEFT HRRI P1,FACTBF ;POINTER PUSHJ P,APPEND ;GET RID OF IT JRST DALOOK NXTWAK: ;[64] >;END OF FTFACT COND ;HERE TO CHECK FOR EXPIRED CLOCK REQUESTS SKIPN T2,NEXTUP ;[64]GET THE NEXT JOB TO WAKE JRST ZZZ ;THERE WAS NONE PUSHJ P,GETUPT ;GET THE UPTIME IN TICKS SUB T2,T1 ;GET THE DIFFERENCE JUMPLE T2,WAKJOB ;WAKE ANY JOBS THAT NEED IT, ; AND RESCAN FROM DALOOK IMUL T2,MILJIF ;CONVERT TO MILLISECONDS TLNE T2,-1 ;IS LEFT HALF EMPTY? MOVEI T2,-1 ;NO, SET MAX SLEEP TIME ZZZ: MOVEI T1,SLPTIM ;TIME TO SLEEP HRLI T2,(HB.RWJ!HB.RTL) ;ONLY MONITOR CAN WAKE US SKIPE .JBDDT ;RUNNING WITH DDT (READ ATTACHED) [775] CLRBFI ;YES, CLEAR OUT INPUT BUFFER [775] ; THIS NOT-AT-ALL OBVIOUS CONDITION IS ; BECAUSE OTHERWISE THE HIBER WILL (IN- ; CORRECTLY) THINK INPUT IS PENDING AND ; CONSTANTLY WAKE US UP!!!! HIBER T2, ;HIBERNATE SLEEP T1, ;ON SECOND THOUGHT SLEEP PUSHJ P,NBSDAT ;GET CURRENT DATE/TIME MOVEM T1,ZZZDTM ;STORE FOR DEBUG JRST DALOOK ;NOW LOOK AGAIN DAEREE: IFN FTUNSUPPORTED,< TLO F,L.INI ;AVOID DETACH ON REENTER > DAEREN: MOVEM 17,CRSHAC+17 ;SAVE AC 17 MOVEI 17,CRSHAC ;MAKE BLT POINTER BLT 17,CRSHAC+16 ;SAVE THE REST MOVE T1,.JBOPC ;GET CRASH PC FROM .REENTER COMMAND MOVEM T1,CRSHPC ;AND SAVE IT AWAY IFN FTUNSUPPORTED,< TLNN F,L.INI ;IN INITIALIZATION? SKIPE .JBDDT ; OR DDT LOADED? JRST DAERE2 ;YES, DON'T DETACH SETOM T1 ;INDICATE OUR LINE GETLCH T1 ;GET CURRENT LINE HRLZS T1 ;SETUP FOR DETACH ATTACH T1, ;MAKE SURE WE ARE DETACHED JFCL ;NOT ATTACHED > DAERE2: SETZM .JBINT ;DO NOT INTERCEPT EXIT (ESTOP2 CODE) MOVSI T1,(SIXBIT /DAE/) ;**[103] MAKE NAME DAE SETNAM T1, ;CHANGE THE NAME TO CHEAT THE SYSTEM RESET ;KILL PSI INTERRUPTS IF ANY TLNN F,L.INI ;DON'T ISSUE MESSAGE IF INITIALIZING OUTSTR [ASCIZ/ [DAEMON shut down: please SAVE, then start a new DAEMON] /] EXIT ;FORGET THE THING ;HERE TO PROCESS JOB ISSUING DAEMON UUO ;FOR DAEMON UUO'S: ;P1=USER LOCATION EXECT1=EXEC AC T1, AND CONTAINS FUNCTION REQUESTED ;P2=USER LOCATION EXECT2=EXEC AC T2, AND CONTAINS +LENGTH,ADDR OF ARGUMENT LIST ;DAEMON RETURNS BY STORING AN ERROR CODE (OR THE ORIGINAL CONTENTS OF EXECT2) ;IN EXECT1 (NOTE, T1), WHICH WILL BE PASSED BACK TO THE USER IN HIS ;CALLING REGISTER, AND 0 IN EXECT2 FOR A SUCCESSFUL (SKIP) RETURN, ;OR NON-ZERO IN EXECT2 FOR A NON-SKIP RETURN. UUSERV: SETZM EVAADR ;CLEAR FUNNY SPACE ADDRESS MOVEM J,UUOJOB ;SAVE JOB NUMBER FOR DEBUGGING TLO F,L.ANY+IFN FTUNSUPPORTED, ;SOMETHING HAPPENED, A UUO MOVEI T1,DETUSR ;NEW RESTART ADDRESS MOVEM T1,INTADR IFN FTUNSUPPORTED,< SETZM THSOFF ;OFFSET=0 FORLOW SEGMENT MOVE T2,J ;JOB NUMBER > MOVSI T1,.JBDA ;GET JOB DATA AREA PUSHJ P,GTUCOR ;GET JOB'S JOB DATA AREA IFE FTUNSUPPORTED,< JRST UUERR2 ;ADDRESS CHECK > MOVE T1,EXECT1 ;GET ADDRESS IN JOBDAT OF EXEC T1 MOVE P1,USRCOR(T1) ;EXEC AC T1=FUNCTION REQUESTED MOVEM P1,UUOFNC ;SAVE FUNCTION FOR DEBUGGING JUMPLE P1,UUERR1 ;- OR 0 IS ILLEGAL CAILE P1,MAXFNC ;SKIP IF LEGAL FUNCTION JRST UUERR1 ;TOO BIG MOVE P2,USRCOR+1(T1) ;P2=XWD MOVEM P2,SAVXWD ;SAVE XWD JRST @FNCADR-1(P1) ;CALL ROUTINE TO PROCESS REQUEST FNCADR: EXP DMPUUO ;1 .DCORE WRITE A DCORE FILE EXP CLKUUO ;2 .CLOCK WAKE A JOB IN THE FUTURE EXP FCTUUO ;3 .FACT APPEND TO FACT FILE EXP UUERR1 ;4 .DMQUE RESERVED FOR QUEUE FUNCTION EXP EAPUUO ;5 .DMERR APPEND TO ERROR.SYS MAXFNC==.-FNCADR IFN FTUNSUPPORTED,< ;HERE FOR .DCORE FUNCTION ;CALL: ; MOVE AC,[XWD ARGLEN,ARGLST] ; DAEMON AC, ; ERROR RETURN ; GOOD RETURN ;ARGLST:1 ;.DCORE ; DEVICE ;0 IMPLIES DSK ; FILNAM ;0 IMPLIES NNNDAE WHERE NNN IS JOB # ISSUEING UUO ; EXT ;0 IMPLIES TMP ; PROT ;0 IMPLIES MONITOR DEFAULT ; PPN ;OR POINTER TO PATH SPEC. 0 IMPLIES DEFAULT PATH. ; ;RESERVED FOR JOB # TO DUMP DMPUUO: HRROI T1,.GTSTS ;GET THIS GUY'S JOB STATUS PUSHJ P,GTBDFL LDB T1,QUECOD ;GET WAIT STATE CODE CAME T1,DAQNAM ;IF NOT IN DAEMON QUEUE, FUNNY RACE JRST NULEXT ;JUST FINISH QUIETLY MOVE T1,P2 ;T1=XWD TLNN T1,-1 ;WAS LENGTH GIVEN? HRLI T1,1 ;NO, DEFAULT EVERYTHING HLRZ T2,T1 ;COPY NUMBER OF ARGUMENTS CAILE T2,6 ;MORE THAN 6 ARGUMENTS JRST UUERR3 ;YES--WRONG NUMBER OF ARGS PUSHJ P,UADCHK ;CHECK ADDRESS JRST UUERR2 ;INVALID ADDRESS PUSHJ P,GTUCOR ;COPY HIM INTO ME SKIPN T1,USRCOR+1 ;GET DEVICE NAME MOVSI T1,'DSK' ;NONE--USE DSK: MOVEM T1,D.DEV ;STORE AWAY SKIPE T4,USRCOR+2 ;GET FILE NAME JRST WASFNM ;THER WAS ONE SO DO NOT REINVENT MOVEI T2,(J) ;JOB NUMBER PUSHJ P,MAKPJN ;MAKE CCL NUMBER HRRI T4,'DAE' ;DEFAULT FILENAME WASFNM: MOVEM T4,D.NAM ;STORE FILENAME SKIPN T1,USRCOR+3 ;GET EXTENSION MOVSI T1,'TMP' ;DEFAULT EXTENSION MOVEM T1,D.EXT ;STORE EXTENSION LDB T1,[POINT 9,USRCOR+4,8] ;GET PROTECTION MOVEM T1,D.PROT ;STORE PROTECTION SKIPE T1,USRCOR+5 ;GET PPN JRST CHKPTH ;HANDLE PATH OR PPN PUSHJ P,GETPTH ;READ USER'S DEFAULT PATH JRST STOPPN ;STORE THE PPN ;STILL IFN FTUNSUPPORTED CHKPTH: TLNE T1,-1 ;IS THIS A PATH POINTER, OR A PPN? JRST [TLNE T1,400000 ;[605] SIGN BIT ON? JRST UUER10 ;[605] YES,BOMB HIM JRST STOPPN] ;[605] HE'S CLEAN ADDI T1,.PTPPN ;PATH POINTER, IGNORE FIRST .PTPPN WORDS HRLI T1,.PTMAX-.PTPPN-1 ;READ UP TO MAX LENGTH PUSHJ P,UADCHK ;VALIDATE PATH ADDRESS JRST UUERR2 ;BOMB NOW PUSHJ P,GTUCOR ;READ PATH SPEC MOVSI T1,-.PTMAX+.PTPPN+1 ;READ THIS MANY WORDS MOVE T2,USRCOR(T1) ;[605] GET PPN FROM PATH BLOCK TLNE T2,400000 ;[605] SIGN BIT ON? JRST UUER10 ;[605] YES,OUT HE GOES CPYPTH: SKIPN T2,USRCOR(T1) ;PICK NEXT WORD OF PATH SPEC JRST ENDPTH ;ZERO MARKS END MOVEM T2,D.DPTH+.PTPPN(T1) ;STORE FOR OUR PURPOSES AOBJN T1,CPYPTH ;COPY MORE IF WE HAVE ROOM JRST UUER10 ;NOTE INVALID PATH TO USER ENDPTH: SETZM D.DPTH+.PTPPN(T1) ;FLAG END OF PATH MOVEI T1,D.DPTH ;SETUP DIRECTORY POINTER STOPPN: MOVEM T1,D.DIR ;STORE DIRECTORY JRST NODEFT ;DUMP. NO NEED TO SETUP DEFAULTS > ;END IFN FTUNSUPPORTED ;HERE FOR .CLOCK FUNCTION ;CALL: ; MOVE AC,[XWD ARGLEN,ARGLST] ; DAEMON AC, ; ERROR RETURN ; GOOD RETURN ;ARGLST:2 ;.CLOCK ; # SECS BEFORE WAKE ;OVERRIDES ANY PENDING REQUEST, ; ; 0 IMPLIES IMMEDIATE WAKE CLKUUO: MOVE T1,P2 ;T1=XWD TLNN T1,-1 ;LENGTH GIVEN? HRLI T1,2 ;NO, DEFAULT TO 2 HLRZ T2,T1 ;COPY THE LENGTH CAILE T2,2 ;NEED 2 ARGS, 0 IMPLIES 2 JRST UUERR3 ;WRONG NUMBER OF ARGUMENTS IFN FTUNSUPPORTED,< PUSHJ P,UADCHK ;CHECK THE ADDRESS JRST UUERR2 ;ADDRESS CHECK > PUSHJ P,GTUCOR ;READ HIS CORE IMAGE IFE FTUNSUPPORTED,< JRST UUERR2 ;ADDRESS CHECK > MOVE T1,USRCOR+1 ;GET THE TIME PUSHJ P,CLKREQ ;PUT IN QUEUE JRST UUOKX ;EXIT ;HERE FOR .FACT FUNCTION IFG FTFACT,< FCTUUO: HRROI T1,.GTSTS ;GET JOB'S STATUS PUSHJ P,GTBSPY ;GO READ THE MONITOR JRST UUERR4 ;YOU CAN'T WIN THEM ALL TLNE T1,JACCT ;LOGIN OR LOGOUT JRST GTFACT ;YES--WIN PUSHJ P,GETPPN ;GET CALLER'S PPN CAME T1,OPRPPN ;ARE YOU A GOOD GUY? JRST UUERR6 ;NO--GET LOST GTFACT: PUSHJ P,BUFAGE ;MARK TIME OF FIRST FACT ENTRY MOVE T1,P2 ;PICK UP XWD TLNN T1,-1 ;WAS LENGTH GIVEN? HRLI T1,1 ;NO, DEFAULT TO TEST NOP IFN FTUNSUPPORTED,< PUSHJ P,UADCHK ;VALIDATE THE BLOCK AND SET UP FOR GTUCOR JRST UUERR2 ;INVALID > HLRZ T4,T1 ;COPY LENGTH SOJL T4,UUERR3 ;TOO SHORT CAILE T4,TRNSIZ ;TOO LONG JRST UUERR3 ;YES--WRONG NUMBER OF ARGS JUMPE T4,UUOKX ;ALLOW A 0-LENGTH WRITE, AS A TEST NOP UUO HRL T1,T4 ;PUT BACK NEW LENGTH AOJ T1, ;BUMP POINTER PAST FUNCTION PUSHJ P,GTUCOR ;GET USER'S ARGUMENT LIST=FACT FILE ENTRY IN USRCOR IFE FTUNSUPPORTED,< JRST UUERR2 ;ADDRESS CHECK > SKIPN T1,USRCOR+2 ;DID USER PROVIDE DATE AND TIME? PUSHJ P,NBSDAT ;NO, GET IT NOW MOVEM T1,USRCOR+2 ;AND INSERT IT IN BUFFER HLRZ T1,P2 ;[63]GET LENGTH OF ARG LIST MOVE T2,USRCOR ;PICK UP HEADER WORD FOR VALIDITY CHECKING TLZE T2,777000 ;CHECK FOR AND CLEAR TYPE IDENTIFIER TLZN T2,777 ;SAME FOR JOB #. WERE BOTH GIVEN? JRST UUERR7 ;NO, REFUSE REQUEST ANDI T2,77 ;REMOVE LINE NO CAIE T2,-1(T1) ;AND VERIFY LENGTH ACCURACY JRST UUERR7 ;REFUSE ON ANY SUCH ERROR HRRZ T1,FACTSZ ;ADDR IN FACT FILE BUFFER TO STORE ADDB T2,FACTSZ ;NEW SIZE OF BUFFER CONTENTS MOVEI T1,FACTBF(T1) ;"TO" ADDR IN FACT FILE BUFFER HRLI T1,USRCOR ;"FROM" IS CORE COPIED FROM CALLER BLT T1,FACTBF-1(T2) ;TRANSFER TO FACT FILE BUFFER CAIG T2,MAXFCT ;TOO MUCH IN BUFFER? JRST UUOKX ;NO--GIVE OK RETURN HRLZI P1,(T2) ;SIZE OF WHOLE MESS HRRI P1,FACTBF ;POINTER TO BEGINING PUSHJ P,APPEND ;UPDATE FACT.SYS JRST UUOKX ;RETURN TO USER >;END COND ON FTFACT ;HERE FOR APPEND TO ERROR.SYS FUNCTION ;CALL: ; MOVE AC,[XWD ARGLEN,ARGLST] ; DAEMON AC, ; ERROR RETURN ; GOOD RETURN ;ARGLST:5 ;.DMERR ; CODE ;CODE FOR ENTRY IN ERROR FILE ; BODY ;BLOCK OF ARGLEN-2 WORDS TO PUT IN ERROR FILE EAPUUO: HRROI T1,.GTSTS ;GET JOB'S STATUS PUSHJ P,GTBSPY ;GO READ THE MONITOR JRST UUERR4 ;YOU CAN'T WIN THEM ALL MOVE T2,T1 ;SAVE THE WORD HRROI T1,.GTPRV ;GET PRIVILEGE WORD PUSHJ P,GTBSPY ;GET IT JRST UUERR4 ;SHOULDN'T HAPPEN TLNN T1,(JP.POK) ;POKE PRIVILEGE? TLNE T2,JACCT ;PRIVLEGED? JRST EAPUU1 ;YES--WIN PUSHJ P,GETPPN ;GET CALLER'S PPN CAME T1,OPRPPN ;ARE YOU A GOOD GUY? JRST UUERR6 ;NO--GET LOST EAPUU1: MOVE T1,P2 ;GET XWD INTO T1 HLRE T2,T1 ;[533] GET LENGTH INTO T2 JUMPLE T2,UUERR3 ;WRONG NUMBER OF ARGS CAIN T2,1 ;[533] ONLY 1 ARG (NULL ENTRY)? JRST UUOKX ;[533] YES, GOOD RETURN BUT DO NOTHING CAILE T2,MAXUCR ;[533] ARG BIGGER THAN OUR BUFFER? JRST UUERR3 ;[533] YES, WRONG NUMBER OF ARGS IFN FTUNSUPPORTED,< PUSHJ P,UADCHK ;CHECK ADDRESS JRST UUERR2 ;ILLEGAL ADDRESS > PUSHJ P,GTUCOR ;GO READ HIS CORE IFE FTUNSUPPORTED,< JRST UUERR2 ;ADDRESS CHECK > MOVE T1,USRCOR+1 ;GET CODE FOR ERROR FILE INTO T1 LSH T1,^D27 ;[533] AND SHIFT IT TO GOOD PLACE PUSHJ P,ERRINB ;GO PUT HEADER IN BUFFER HLRZ T2,P2 ;[533] RESTORE LENGTH OF ARG BLOCK SUBI T2,2 ;MAKE T2 NUMBER OF DATA WORDS OF ENTRY JUMPE T2,EAPUU2 ;[533] SKIP ON IF NO DATA HRLS T2 ;PUT IT INTO BOTH HALVES HRRZI T1,1(P4) ;[533] GET FIRST WORD TO TRANSFER TO INTO T1 HRLI T1,USRCOR+2 ;AND FROM INTO LH ADD P4,T2 ;UPDATE PUSHDOWN PONTER TO ERROR BUFFER JUMPG P4,UUERR3 ;[533] CHECK FOR OVERFLOW OF IOWD BLT T1,(P4) ;AND BLT STUFF TO BUFFER MOVE T1,USRCOR+1 ;GET CODE FOR THIS ERROR CAIE T1,.ESFER ;CONSOLE FRONT END RELOAD? CAIN T1,.ESNDL ; OR DOWN LINE LOAD? CAIA ;YES CAIN T1,.ESNUD ; OR UP LINE DUMP? TRO F,R.AVL ;YES, APPEND IT TO AVAIL.SYS ALSO EAPUU2: PUSHJ P,ERRFIN ;WRITE ENTRY AND CLOSE FILE JRST UUOKX ;GIVE GOOD RETURN IFN FTUNSUPPORTED,< UUER10: MOVEI T1,DMPTH% ;INVALID PATH SPEC JRST UUERRX > IFG FTFACT,< UUERR7: MOVEI T1,DMFFB% ;FACT FORMAT BAD JRST UUERRX > UUERR6: MOVEI T1,DMNPV% ;NO PRIVS TO DO THAT UUO JRST UUERRX ;EXIT IFN FTUNSUPPORTED,< UUERR5: MOVEI T1,DMCWF% ;CAN'T WRITE FILE JRST UUERRX ;EXIT > UUERR4: MOVEI T1,DMSNH% ;SHOULD NEVER HAPPEN JRST UUERRX ; BUT... UUERR3: MOVEI T1,DMWNA% ;WRONG NUMBER OF ARGS JRST UUERRX UUERR2: MOVEI T1,DMACK% ;ADDRESS CHECK JRST UUERRX ;ERROR EXIT IFE FTUNSUPPORTED, IFL FTFACT, UUERR1: MOVEI T1,DMILF% ;ILLEGAL FUNCTION ERROR CODE ; JRST UUERRX ;FALL INTO UUERRX ;HERE FOR DAEMON UUO ERRORS, T1=ERROR CODE UUERRX: SETOM USRCOR+1 ;NOTE ERROR IN FUNCTION MOVE P,PDL ;RESTORE P, SINCE ERROR MAY HAVE BEEN ;AT ANY LEVEL ON THE STACK JRST UUEXIT ;AND EXIT UUO ;HERE WHEN FUNCTION COMPELETED PROPERLY, T1=RETURN CODE IFE FTFACT, UUOKX: SETZM USRCOR+1 ;NOTE FUNCTION COMPLETED PROPERLY MOVE T1,SAVXWD ;GET OLD CONTENTS OF USERS REG UUEXIT: MOVEM T1,USRCOR ;STORE CODE TO RETURN TO USER MOVEM T1,UUXCOD ;SAVE FOR DEBUGGING MOVEM J,UUXJOB ; ALONG WITH THE JOB NUMBER MOVSI T1,2 ;WRITE 2 WORDS HRR T1,EXECT1 ;AT EXEC T1 IN USER'S JOBDAT IFN FTUNSUPPORTED,< MOVE T2,J ;WRITE IN JOB'S LOW SEGMENT SETZM THSOFF ;NO OFFSET > AOSG WTUERR ;CHECK FOR RECURSION IN EXIT PROCESS PUSHJ P,WTUCOR ;WRITE USER'S CORE SETOM WTUERR ;RESET FLAG JRST DETUSR ;AND FINISH USER'S REQUEST SUBTTL PROCESS JOB REQUESTING DAEMON SERVICE IFE FTUNSUPPORTED,< DASERV: WARN ,NOCRLF PUSH P,T1 ;SAVE JBTSTS HRRZ T1,J ;GET JOB NUMBER PUSHJ P,TDEC ;TYPE IT TELL <, JBTSTS=>,NOCRLF POP P,T1 ;GET JBTSTS BACK PUSHJ P,THALF ;TYPE IT PUSHJ P,OCRLF ;END THE LINE JRST DETUSR ;GO RESTART THE JOB > ;END IFE FTUNSUPPORTED IFN FTUNSUPPORTED,< DASERV: SETZM EVAADR ;CLEAR FUNNY SPACE ADDRESS SETZM MSGLIN ;CLEAR MESSAGE LINE NUMBER TLZ F,L.UUO!L.UPMP!L.OPR+L.QUE ;NOT A UUO, NO UPMP IN CORE TRNE T1,JS.DEP ;IF IN ERROR PAUSE AOS JDPCNT ;NOTE WE NOTICED TRNN T1,JDC ;IF NOT COMMAND REQUEST, JRST DETUSR ;RESTART THE JOB ;HERE TO PROCESS COMMAND WHICH INVOKED DAEMON MOVEM J,CMDJOB ;SAVE JOB NUMBER FOR DEBUGGING MOVEI T1,DETUSR ;NEW RESTART ADDRESS MOVEM T1,INTADR TLO F,L.ANY ;NOTE THAT WE DID SOMETHING PUSHJ P,GETTTY ;GET JOB'S TTY NUMBER JRST DETUSR ;CAN'T FIND IT JUMPGE T1,HAVLIN ;GO UNLESS CTY SKIPGE T1,CTYLIN ;GET CTY LINE NO IF KNOWN JRST DETUSR ;OTHERWISE, MUST GIVE UP HAVLIN: HRLM T1,LINE ;SAVE LINE NUMBER, IT MAY BE USEFUL MOVEI T2,.UXTRM(T1) ;GET UDX OF TERMINAL MOVEM T2,MSGLIN ;SAVE FOR MESSAGES ;HERE SHOULD CHECK FOR CTL/C IN JOB STATUS, DETUSR IF SET HRLOS T1 ;LH=LINE NUMBER, RH=DAEMON JOB PUSH P,T1 ;SAVE AC FOR ATTACH BELOW HRROI T1,.GTJLT ;GETTAB TO RETURN LOGIN TIME PUSHJ P,GTBDFL ;GET IT MOVEM T1,JOBJLT ;SAVE FOR REATTACH CHECK POP P,T1 ;RESTORE LINE NUMBER ATTACH T1, ;ATTACH USER TTY TO US JRST DETUSR ;GIVE UP IF CANT ATTACH USER'S TTY MOVEI T1,EDCORE ;NEW RESTART ADDRESS MOVEM T1,INTADR HRROI T1,.GTWCH ;WATCH BITS TABLE PUSHJ P,GTBDFL TLNE T1,(JW.WVR) ;IS VERSION WATCHING ENABLED? PUSHJ P,PDAEVR ;YES, PRINT DAEMON VERSION ;STILL IN IFN FTUNSUPPORTED ;HERE TO SET UP DEFAULTS FOR CORE-IMAGE FILE NAME MOVSI T1,'DSK' ;DEVICE DSK MOVEM T1,D.DEV MOVE T2,J PUSHJ P,MAKPJN ;COMPUTE SIXBIT JOB NUMBER IN LH MOVEM T4,CCLFIL ;SAVE SIXBIT JOB NUMBER HRRI T4,'DAE' ;NAME DAE MOVEM T4,D.NAM ;IS FILE NAME MOVSI T1,'TMP' ;EXTENSION MOVEM T1,D.EXT HRROI T1,.GTDFL ;[536] GETTAB DEFAULT PROTECTION PUSHJ P,GTBDFL ;GET IT ROT T1,^D9 ;[536] MOVE PROTECTION TO LOW ORDER 9 BITS SKIPL T1 ;[536] CODE VALID IF BIT 9 SET TRZ T1,777 ;[536] NOT VALID, USE DEFAULT HRRZM T1,D.PROT ;[536] SAVE FOR LATER PUSHJ P,GETPTH ;READ USER'S PATH MOVEM T1,D.DIR ;STORE POINTER AS DIRECTORY ;HERE ON, CODE IS COMMON TO UUO AND COMMAND NODEFT: PUSHJ P,GETPPN ;PICK UP USER'S PPN MOVEM T1,USRPPN ;SAVE FOR ACCESS CHECKING ;HERE TO SET SEARCH LIST TO BE SAME AS USER'S JOB MOVE T2,T1 ;USER'S PPN MOVE T1,J ;JOB NUMBER MOVEI T3,USRLST+3 ;SPACE RESERVED FOR USER'S SEARCH LIST PUSHJ P,GETSRC ;GET USER'S SEARCH LIST HRRZS T3 ;LAST ADDRESS STORED IN MOVEI T1,USRLST ;RE-GET USER LIST ADDRESS SUBI T3,USRLST-1 ;T3=LENGTH-1 OF LIST HRLI T1,(T3) ;FUNCTION, ETC, ALREADY SET UP IN USRLST STRUUO T1, ;SET OUR SEARCH LIST TO BE SAME AS USER'S WARN ;HERE TO INITIALIZE COMMAND SCANNER TLNN F,L.UUO ;IS THIS THE UUO PUSHJ P,ATTCHK ;JUST MAKE SURE USER DIDN'T MANAGE TO DETACH JRST DAEOPN ;IF HE DID, ASSUME DCORE; DON'T GO INTO TI WAIT MOVE T1,[IOWD COMLEN,COMLST] ;TABLE OF MONITOR COMMANDS PUSHJ P,.ISCAN ;INITIALIZE COMMAND SCANNER MOVEM T1,CMDCMD ;SAVE COMMAND INDEX FOR DEBUGGING JUMPGE T1,@COMDSP(T1) ;DISPATCH IF VALID COMMAND ERROR JRST EDECOM ;TERMINATE THE COMMAND ;STILL IN IFN FTUNSUPPORTED ;HERE IF E COMMAND. CALLED ONLY IF VIRTUAL MEMORY USER ON 6.01 AND LATER MONITORS ECOM: ERROR ,,EDECOM PUSHJ P,SAVE4 ;SAVE P1-P4 MOVE T2,J ;GET JOB NUMBER INTO T2 MOVSI T1,BLKSIZ ;SIZE OF BLOCK ON SWAPPING SPACE SETZM THSOFF ;CLEAR OFFSET OF SEGMENT PUSHJ P,GTUCOR ;GET JOB DATA AREA+ MOVE T1,[%CNEXM] PUSHJ P,GTBSPY ;GET ADDRESS OF JOBEXM JRST EDUMP ;??? HRRZ P4,USRCOR(T1) ;GET ADDRESS TO EXAMINE(ALREADY UPDATED BY COMCON) PUSHJ P,HSVADR ;GO GET START AND END ADDRESSES OF HIGHSEG SETZM THSOFF ;CLEAR OFFSET IN CASE OF LOW SEG CAML P4,HGHOFF ;ADDRESS BELOW START OF HIGH SEG? CAMLE P4,HGHREL ;OR ABOVE END OF HIGH SEG? JRST ECOM2 ;ADDRESS IS IN LOW SEG,WE'RE ALL SET MOVE T1,HGHOFF ;NO, ADDRESS IS IN HIGH SEG MOVEM T1,THSOFF ;STORE OFFSET FOR SEGMENT TO EXAMINE SUB P4,THSOFF ;MAKE P4 RELATIVE TO BEGINNING OF SEGMENT HRROI T1,.GTSGN ;[532] JBTSGN FOR JOB IN J PUSHJ P,GTBDFL ;GET HIGH SEGMENT NUMBER SKIPA T2,T1 ;GET SEGMENT NUMBER TO T2 ECOM2: MOVE T2,J ;LOW SEGMENT, USE JOB NUMBER MOVSI T1,1 ;SET TO GET ONE WORD HRRI T1,(P4) ;ADDRESS TO EXAMINE PUSHJ P,GTUCOR ;GET THE WORD HRRZ T1,P4 ;GET ADDRESS TO EXAMINE PUSHJ P,TOCTAL ;OUTPUT TO TTY TELL ,NOCRLF HLRZ T1,USRCOR ;GET LH TO TYPE PUSHJ P,TOCTAL ; TELL < >,NOCRLF ;PRINT A SPACE HRRZ T1,USRCOR ;GET RH PUSHJ P,TOCTAL ;OUTPUT PUSHJ P,TABDOT ;TYPE A TAB AND A DOT PUSHJ P,DMPBUF ;DUMP MESSAGE BUFFER JRST EDECOM ;AND EXIT ;STILL IFN FTUNSUPPORTED ;HERE IF D COMMAND. USED ONLY FOR VIRTUAL MEMORY JOBS IF 6.01 AND LATER MONITOR DCOM: ERROR ,,EDECOM PUSHJ P,SAVE4 ;SAVE P1-P4 MOVE T2,J ;GET JOB NUMBER INTO T2 MOVSI T1,BLKSIZ ;GET SIZE OF DISK BLOCK SETZM THSOFF ;CLEAR OFFSET OF SEGMENT PUSHJ P,GTUCOR ;GET JOB DATA AREA+ PUSHJ P,OCTINW ;GET LH TO DEPOSIT MOVSI P4,(SN) ;AND SAVE IN P4 PUSHJ P,OCTINW ;GET RH TO DEPOSIT HRRI P4,(SN) ;STORE IN RH(P4) PUSH P,P4 ;AND SAVE ON STACK MOVE T1,[%CNEXM] PUSHJ P,GTBSPY ;GET ADDRESS OF JOBEXM JRST EDUMP ;??? HRRZ P4,USRCOR(T1) ;GET ADDRESS TO DEPOSIT INTO PUSHJ P,HSVADR ;SET UP START AND END OF HIGH SEG SETZM THSOFF ;CLEAR OFFSET IN CASE LOW SEG CAML P4,HGHOFF ;ADDRESS BELOW START OF HIGH SEG? CAMLE P4,HGHREL ;OR ABOVE END OF HIGH SEG? JRST DCOM2 ;ADDRESS IS IN LOW SEG, WE'RE ALL SET MOVE T1,HGHOFF ;GET OFFSET FOR HIGH SEG MOVEM T1,THSOFF ;AND SAVE IT AS OFFSET FOR THIS SEGMENT SUB P4,T1 ;MAKE P4 RELATIVE TO START OF HIGH SEG HRROI T1,.GTSGN ;[532] JBTSGN PUSHJ P,GTBDFL ;GET HIGH SEGMENT NUMBER FOR JOB SKIPA T2,T1 ;GET INTO T2 FOR WTUCOR DCOM2: MOVE T2,J ;JOB NUMBER FOR LOW SEGMENT MOVSI T1,1 ;SET TO WRITE ONE WORD HRRI T1,(P4) ;ADDRESS TO WRITE TO T1 POP P,USRCOR ;GET CONTENTS OFF STACK PUSHJ P,WTUCOR ;WRITE THE WORD JRST EDECOM ;AND RETURN ;STILL IFN FTUNSUPPORTED ;HERE ON VERSION COMMAND FOR HIGH SEGMENT THAT IS NOT IN CORE. USED ;ONLY FOR VIRTUAL MEMORY JOBS ON 6.01 AND LATER MONITORS. VERCOM: ERROR PUSHJ P,SAVE4 ;SAVE P1-P4 MOVE T2,J ;GET JOB NUMBER MOVSI T1,BLKSIZ ;SIZE OF DISK BLOCK SETZM THSOFF ;SET UP TO LOOK AT LOW SEGMENT PUSHJ P,GTUCOR ;GET JOB DATA AREA INTO CORE MOVE P4,USRCOR+.JBVER ;GET LOW SEGMENT VERSION NUMBER INTO P4 HRROI T1,.GTPRG ;[532] PROGRAM NAME FOR JOB IN J PUSHJ P,GTBDFL ;GET JBTNAM MOVE P3,T1 ;SAVE LOW SEGMENT VERSION NUMBER IN P3 HRROI T1,.GTSGN ;[532] PUSHJ P,GTBDFL ;GET JOB'S HIGH SEGMENT NUMBER MOVE P2,T1 ;SAVE HIGH SEGMENT NUMBER IN P2 PUSHJ P,HSVADR ;GET RELOC/PROT FOR HIGH SEG MOVE T1,HGHOFF ;GET ADDRESS OF START OF HIGH SEGMENT MOVEM T1,THSOFF ;AND SAVE IN THSOFF MOVE T1,HGHREL ;GET TOP ADDRESS OF HIGH SEGMENT MOVEM T1,SEGREL ;AND SAVE MOVE T2,P2 ;GET SEGMENT NUMBER MOVSI T1,BLKSIZ ;GET SIZE OF DISK BLOCK PUSHJ P,GTUCOR ;READ IN LOW 128 WORDS OF HIGH SEG MOVS T1,P2 ;GET HIGH SEG NUMBER HRRI T1,.GTPRG ;JBTNAM PUSHJ P,GTBDFL ;GET NAME OF HIGH SEG SKIPN T2,T1 ;WAS THERE ONE MOVEI P1,USRCOR ;GET ADDRESS OF BUFFER MOVE T2,.JBHNM(P1) ;NO, GET FROM USER'S CORE IMAGE SKIPE T1,.JBHVR(P1) ;GET HIGH SEG VERSION CAMN T1,P4 ;COMPARE TO LOW IF PRESENT CAME T2,P3 ;COMPARE LOW NAME JRST VERCM1 ;DIFFERENT, MUST PRINT JRST VERCM5 ;SAME, JUST GET OUT ;STILL IFN FTUNSUPPORTED ;HERE WHEN IT IS DETERMINED THAT WE MUST TYPE SOMETHING TO USER VERCM1: MOVE P1,T1 ;SAVE VERSION PUSHJ P,TSIXN ;PRINT HIGH SEGMENT NAME TELL < >,NOCRLF ;FOLLOWED BY A SPACE MOVE T1,P1 ;RESTORE VERSION LSH T1,-^D24 ;GET MAJOR VERSION NUMBER ANDI T1,777 ;ELIMINATE GARBAGE SKIPE T1 PUSHJ P,TOCT ;PRINT MAJOR VERSION NUMBER HLRZ T1,P1 ;GET MINOR VERSION NUMBER ANDI T1,77 ;REMOVE GARBAGE JUMPE T1,VERCM3 ;JUMP IF NO MINOR SUBI T1,1 IDIVI T1,^D26 JUMPE T1,VERCM2 PUSH P,T2 MOVEI SC,"A"-1(T1) PUSHJ P,TYPCHR POP P,T2 VERCM2: MOVEI SC,"A"(T2) PUSHJ P,TYPCHR VERCM3: HRRZ T1,P1 ;GET EDIT NUMBER JUMPE T1,VERCM4 ;NO EDIT NUMBER? TELL <(>,NOCRLF ;PRINT LEFT PAREN PUSHJ P,TOCT ;PRINT EDIT NUMBER TELL <)>,NOCRLF ;PRINT RIGHT PAREN VERCM4: LSH P1,-^D33 ;GET CUSTOMER VERSION NUMBER JUMPE P1,VERCM5 ;IF NONE, CRLF. TELL < - >,NOCRLF MOVEI SC,"0"(P1) ;GET VERSION NUMBER PUSHJ P,TYPCHR VERCM5: JRST EDECOM ;AND EXIT ;STILL IN IFN FTUNSUPPORTED ;HERE IF DUMP COMMAND - REWRITE COMMAND AS DUMP CCL FILE ;NOTE: FILE MUST BE ON DSK, NOT TMPCOR, BECAUSE TMPCOR ; CANNOT COMMUNICATE ACROSS JOBS. DUMP: SKIPN FTKLP ;ON A KL-PAGING SYSTEM? JRST DUMP00 ;NO, BLUNDER ONWARDS ERROR ,,EDCORE ;HERE ONLY IF NOT KL-PAGING. THE DUMP/DCORE FILE FORMAT IS NOT REALLY ;SUITED TO A VM ENVIRONMENT . . . DUMP00: TLO F,L.DUMP ;NOTE DUMP MOVSI T1,DSK+<(FO.PRV)> ;CHANNEL NUMBER AND INVOKE PRIVS HRRI T1,.FOWRT ;WRITE FUNCTION MOVEM T1,D.FLOP+.FOFNC ;STORE IN BLOCK MOVEI T1,.IOASC ;MODE IS ASCII MOVEM T1,D.FLOP+.FOIOS ;STORE IN BLOCK MOVE T1,D.DEV ;GET DEVICE ON WHICH TO WRITE MOVEM T1,D.FLOP+.FODEV ;STORE IN BLOCK MOVSI T1,C.BH ;OUTPUT BUFFER HEADER MOVEM T1,D.FLOP+.FOBRH ;STORE IN BLOCK MOVSI T1,1 ;USE ONE OUTPUT BUFFER MOVEM T1,D.FLOP+.FONBF ;STORE IN BLOCK MOVEI T1,D.LKB ;POINT TO ENTER BLOCK MOVEM T1,D.FLOP+.FOLEB ;STORE IN BLOCK SETZM D.FLOP+.FOPAT ;NO PATH POINTER MOVE T1,USRPPN ;GET PPN OF USER WHO WOULD WRITE MOVEM T1,D.FLOP+.FOPPN ;STORE IN BLOCK FOR PRIV CHECK SETZM D.LKB ;CLEAR FIRST WORD OF ENTER BLOCK MOVE T1,[D.LKB,,D.LKB+1] ;MAKE BLT POINTER BLT T1,D.LKB+.RBSIZ ; CLEAR THE BLOCK MOVE T1,CCLFIL ;GET LH OF CCL FILE NAME HRRI T1,'DMP' ;MAKE IT NNNDMP MOVEM T1,D.LKB+.RBNAM ;STORE IN BLOCK MOVSI T1,'TMP' ;EXTENSION IS TMP MOVEM T1,D.LKB+.RBEXT ;STORE IN BLOCK MOVE T1,D.DIR ;GET PPN OR PATH POINTER MOVEM T1,D.LKB+.RBPPN ;STORE IN BLOCK MOVEI T1,.RBSIZ ;LEN OF WORDS TO FOLLOW MOVEM T1,D.LKB+.RBCNT ;STORE IN BLOCK PUSH P,.JBFF ;SAVE .JBFF MOVEI T1,SECBUF ;PUT BUFFER HERE MOVEM T1,.JBFF ;FAKE OUT THE MONITOR MOVE T1,[.FOPPN+1,,D.FLOP] ;POINT TO BLOCK FILOP. T1, ;OPEN THE FILE JRST [POP P,.JBFF ;RESTORE POINTER TO .JBFF JRST E.CCLE] ;AND GIVE ERROR POP P,.JBFF ;RESTORE .JBFF ;CONTINUED ON NEXT PAGE ;STILL IFN FTUNSUPPORTED ;CONTINUED FROM PREVIOUS PAGE CAIN SC," " ;COMMAND SCANNER STOP ON A BLANK? PUSHJ P,STYIA ;YES, FLUSH THEM JUMPL SC,QUIKIE ;USE QUICKIE DUMP IF DUMP CLOOP: JUMPL SC,CDONE ;ALL DONE IF AT END OF LINE CAIE SC,"/" ;THIS A SLASH JRST CLOOP1 ;NO PUSHJ P,CCCRLF ;YES, TRANSLATE IT TO A CRLF JRST CLOOP2 ;AND JOIN COMMON CODE CLOOP1: PUSHJ P,CCOUT ;OUTPUT THE CHARACTER CLOOP2: PUSHJ P,TYIA ;GET THE NEXT CHARACTER JRST CLOOP ;AND LOOP FOR NEXT QUIKIE: MOVE T1,[POINT 7,QIKNAM] QUIKI1: ILDB SC,T1 ;NEXT CHARACTER OF NAME JUMPE SC,CDONE PUSHJ P,CCOUT ;OUTPUT CHARACTER JRST QUIKI1 CDONE: PUSHJ P,CCCRLF ;END THE LAST LINE MOVEI T1,DSK ;[535] SET UP CHANNEL PUSHJ P,RELDSK ;[535] AND GO RELEASE IT JRST DAEOPN ;GO WRITE DAEMON FILE ;STILL IFN FTUNSUPPORTED ;HERE TO PROCESS DCORE COMMAND DCORE: JUMPL SC,DAEOPN ;USE DCORE DEFAULTS IF NO NAME SPECIFIED PUSHJ P,FILIN ;GET FILE NAME TO WRITE JRST EDCORE ;[536] COMMAND ERROR, FINISH UP SKIPE T1,F.DEV ;[536] SKIP IF NO DEVICE MOVEM T1,D.DEV SKIPE T1,F.NAM ;[536] SKIP IF NO NAME SPECIFIED MOVEM T1,D.NAM JUMPE T1,DCORE1 ;JUMP IF NO NAME SPECIFIED MOVSI T1,'DAE' ;IF FILE NAME SPECIFIED, DEFAULT EXT IS DAE MOVEM T1,D.EXT DCORE1: SKIPE T1,F.EXT ;[536] SKIP IF NO EXT SPECIFIED MOVEM T1,D.EXT SKIPE T1,F.DIR ;SKIP IF NO DIRECTORY SPECIFIED MOVEM T1,D.DIR JRST DAEOPN ;START UP THE DUMP ;STILL IN IFN FTUNSUPPORTED ;HERE IF SAVE OR SSAVE COMMAND. CALLED ONLY IF VIRTUAL MEMORY ;USER ON 6.01 OR LATER MONITORS. SAVE: ERROR ,,EDCORE TLO F,L.SAVE ;NOTE SAVE IN PROGRESS PUSHJ P,SAVE4 ;SAVE P1-P4 MOVE T2,J ;GET JOB NUMBER INTO T2 MOVSI T1,MAXUCR ;FILL THE INPUT BUFFER SETZM WRDCNT ;CLEAR COUNT OF OUTPUT FILE SETZM REMBLK ;CLEAR REGISTER TO HOLD BLOCK FOR LAST IOWD SETZM REMWRD ;LAST ADDRESS FOR IOWD SETZM THSOFF ;CLEAR OFFSET FOR THIS SEGMENT PUSHJ P,GTUCOR ;GET JOB DATA AREA + MOVEI P1,USRCOR ;SET UP INDEX TO JOB DATA AREA MOVE T1,.SGDEV(P1) ;GET DEVICE TO DO THE SAVE ON MOVEM T1,D.DEV ;AND SAVE ON ARGUMENT LIST MOVE T1,.SGNAM(P1) ;GET NAME OF SAVED FILE MOVEM T1,D.NAM ;AND SAVE SKIPE T1,.SGPPN(P1) ;USE DEFAULT PATH IF USER GAVE NO PPN TLNE T1,-1 ;SETUP PATH BLOCK IF THIS IS A POINTER JRST SAVE00 ;EITHER 0 OR PPN, JUST STORE ADDI T1,(P1) ;POINT TO START OF PPN IN OUR CORE HRLI T1,D.DPTH ;MAKE SWAPPED BLT POINTER MOVSS T1 ;SWAP THE HALVES BLT T1,D.DPTH+.PTMAX-1 ;BLT THE PATH BLOCK TO OUR CORE MOVEI T1,D.DPTH ;AND POINT TO THE BLOCK SAVE00: SKIPE T1 ;USE DEFAULT IF NO PPN OR POINTER MOVEM T1,D.DIR ;STORE PPN OR POINTER MOVE P3,SGAHGH(P1) ;GET HIGH SEGMENT EXTENSION HLLZM P3,D.EXT ;AND SAVE FOR HIGH SEGMENT SAVE ;CONTINUED ON NEXT PAGE ;STILL IFN FTUNSUPPORTED ;CONTINUED FROM PREVIOUS PAGE MOVE P4,.SGLOW(P1) ;SAVE LOW SEGMENT EXTENSION FOR LATER HRROI T1,.GTSGN ;[532] GETTAB INDEX TO JBTSGN PUSHJ P,GTBDFL ;GET THE HIGH SEGMENT NUMBER FOR THIS JOB MOVE P2,T1 ;SAVE SEGMENT NUMBER FOR LATER PUSHJ P,HSVADR ;GET RELOC/PROT FOR HIGH SEG JUMPLE P2,SAVE04 ;JUMP IF NO HIGH SEGMENT TLNE P2,JSHR ;SHARABLE HIGH SEGMENT? JRST SAVE01 ;YES, DONT SAVE DATA FOR VESTIGIAL JOB DATA AREA MOVS T1,P2 ;NO, GET DATA FOR VESTIGIAL JOB DATA AREA HRRI T1,.GTUPM ;INDEX TO JBTUPM PUSHJ P,GTBDFL ;GET POINTER TO UPMP LDB T2,[POINT 9,T1,8] ;GET JBYHSO BYTE PUSH P,T2 ;AND SAVE ON STACK PUSH P,D.NAM ;SAVE .SGNAM PUSH P,.JBVER(P1) ;SAVE VERSION NUMBER HRR T2,.JBREN(P1) HLL T2,.JBHRL(P1) PUSH P,T2 PUSH P,.JBCOR(P1) PUSH P,.JB41(P1) PUSH P,.JBSA(P1) ;ALL DATA FOR VESTIGIAL JOB DATA AREA NOW SAVED ;CONTINUED ON NEXT PAGE ;STILL IFN FTUNSUPPORTED ;CONTINUED FROM PREVIOUS PAGE SAVE01: MOVE T1,HGHOFF ;GET ADDRESS OF START OF HIGH SEGMENT MOVEM T1,THSOFF ;AND STORE FOR CALL TO GTUCOR MOVE T1,HGHREL ;GET LAST ADDRESS OF HIGH SEG HLRZ T2,.JBHRL(P1) ;GET LENGTH OF HIGH SEG MOVEM T1,SEGREL ;SAVE SIZE OF HIGH SEGMENT SKIPE T2 ;IF LH(.JBHRL)NON ZERO, MOVEM T2,SEGREL ;THEN THATS WHAT WE USE SKIPN T1 ;IF LH(.JBHRL)=0, TLO F,L.NHRL ; THEN REMEMBER FOR LATER MOVE T2,P2 ;GET SEGMENT NUMBER TO T2 MOVSI T1,MAXUCR ;SET UP TO GET FIRST BLOCK OF HIGH SEG INTO CORE PUSHJ P,GTUCOR ;GET THE BLOCK TLNE P2,JSHR ;SHARABLE HIGH SEGMENT?? JRST SAVE02 ;YES, NO NEED TO SET UP VESTIGIAL JOB DATA AREA MOVEI T1,USRCOR-1 ;SET UP POINTER POP P,T2 ;GET BACK .JBSA PUSH T1,T2 ;AND STORE IN VESTIGIAL JOB DATA AREA POP P,T2 ;GET BACK .JB41 PUSH T1,T2 ;AND STORE POP P,T2 ;GET .JBCOR PUSH T1,T2 POP P,T2 ;GET .JBREN & .JBHRL PUSH T1,T2 POP P,T2 ;GET .JBVER PUSH T1,T2 POP P,T2 ;GET .SGNAM PUSH T1,T2 AOBJN T1,.+1 PUSH T1,[EXP 0] POP P,T2 ;GET BACK JBYHSO BYTE DPB T2,[POINT 9,(T1),17] ;AND STORE SAVE02: JRST DAEOPN ;AND GO OPEN HIGH SEGMENT SAVE FILE ;STILL IFN FTUNSUPPORTED SAVE03: SKIPN THSOFF ;HIGH SEGMENT SAVE? JRST SAVE09 ;NO, MOVE T1,P2 ;YES, GET SEGMENT NUMBER PUSHJ P,SAVHGH ;SAVE THE HIGH SEGMENT CLOSE DSK, ;AND CLOSE THE SAVE HIGH SEGMENT HRLZM P3,D.EXT ;GET EXTENSION TO TRY TO DELETE PUSHJ P,DELETE ;AND GO TRY MOVSI T1,'SAV' ;GET EXTENSION .SAV MOVEM T1,D.EXT ;AND SET UP TO DELETE PUSHJ P,DELETE ;AND WIPE OUT ANY OLD .SAV FILES MOVE T2,J MOVSI T1,MAXUCR ;SIZE OF BLOCK ON SWAPPING SPACE SETZM THSOFF ;CLEAR OFFSET FOR LOW SEGMENT PUSHJ P,GTUCOR ;GET JOB DATA AREA JRST SAVE05 ;THEN GET DO LOW SEGMENT SAVE04: PUSHJ P,DELETE ;NO HIGH SEGMENT, DELETE .SHR HRLZM P3,D.EXT ;GET EXTENSION .HGH PUSHJ P,DELETE ;AND WIPE OUT ANY OF THOSE SAVE05: MOVEI P1,USRCOR ;SET UP POINTER TO JOB DATA AREA SKIPE T1,SGAEXT(P1) ;DID USER SUPPLY AN EXTENSION? JRST SAVE06 ;YES, USE IT JUMPE P2,SAVE07 ;JUMP IF NO HIGH SEGMENT SAVED MOVSI T1,'LOW' ;WAS A HIGH SEG, DELETE .LOW SAVE06: MOVEM T1,D.EXT ;SAVE EXTENSION TO DELETE PUSHJ P,DELETE ;AND TRY TO WIPE IT OUT JRST SAVE08 ;THEN DO LOW SEG SAVE07: SKIPN T1,.SGLOW(P1) ;USER SUPPLIED A LOW EXTENSION? MOVSI T1,'SAV' ;NO, USE .SAV MOVEM T1,D.EXT ;STORE SAVE08: HLRZ T1,.JBCOR(P1) ;GET LH OF JOBCOR CAIGE T1,.JBDA ;IF NOT GREATER THAN END OF JOBDAT JUMPN SAVE11 ;AND NOT 0,NO LOWSEG TO SAVE JRST DAEOPN ;AND GO OPEN LOW SEGMENT SAVE FILE ;STILL IFN FTUNSUPPORTED SAVE09: MOVEI P1,USRCOR ;SET UP POINTER TO INPUT BUFFER MOVE T1,.JB41(P1) ;GET USER'S UUO DISPATCH MOVEM T1,.SG41(P1) ;AND SAVE MOVE T1,.JBDDT(P1) ;GET DDT STARTING ADDRESS MOVEM T1,.SGDDT(P1) ;AND SAVE MOVE T1,.JBSA(P1) ;GET STARTING ADDRESS HRRZM T1,STRADR ;AND SAVE FOR JRST WORD MOVEI T2,.SGDDT ;ADDRESS AT WHICH TO START SAVE SETZM USRADR JUMPE P2,SAVE1A ;HAVE A HIGH SEGMENT? MOVE T1,HGHREL ;GET END OF HIGH SEG HRLI T1,1(T1) ;SET UP T1 LIKE .JBHRL ADD T1,HGHOFF ; IS SET UP BY MONITOR HLRZ T2,.JBHRL(P1) ;GET LH OF .JBHRL SKIPN T2 ;ONLY SAVE IF NOTHING THERE MOVEM T1,.JBHRL(P1) ;NOT SET UP, SAVE IT AWAY MOVEI T2,.SGDDT ;ADDRESS AT WHICH TO START SAVE MOVE T1,HGHOFF ;GET START ADDRESS SUBI T1,1 ;POINT TO LAST ADDRESS OF PREVIOUS PAGE MOVEM T1,SEGREL ;STORE HIGHEST ADDRESS TO COMPRESS MOVE T1,J ;GET JOB NUMBER PUSHJ P,COMPRS ;GO COMPRESS LOW PART OF LOW SEG MOVE T2,J ;GET JOB NUMBER MOVSI T1,MAXUCR HRR T1,HGHREL ;GET TOP ADDRESS OF HIGH SEG ADD T1,HGHOFF ;AND ADD OFFSET AOS T1 ;POINT TO START OF POTENTIAL HIGH PART OF LOW SEG PUSHJ P,GTUCOR ;GET IT INTO BUFFER MOVE T2,HGHREL ;GET END OF HIGH SEG AGAIN ADD T2,HGHOFF ;AND ADD OFFSET AOS T2 MOVEM T2,USRADR ;START COMPRESSION OF HIGH PART HERE SAVE1A: MOVEI T1,-1 ;AND SAVE TO TOP OF IMAGE MOVEM T1,SEGREL MOVE T1,J ;GET JOB NUMBER INTO T1 AGAIN PUSHJ P,COMPRS ;WRITE OUT ZERO-COMPRESSED LOW SEG SKIPE T1,STRADR ;WAS THERE A NON-ZERO START ADDRESS TLOA T1,(JRST) ;YES, MAKE A JRST WORD MOVSI T1,(HALT) ;NO, MAKE A HALT PUSHJ P,DWRITE ;PUT IT IN OUTPUT FILE JUMPGE BP,SAVE10 ;JUMP IF NEVER WROTE ANYTHING PUSHJ P,BLKWRT ;OUT ANY PARTIAL BUFFER REMAINING SAVE10: CLOSE DSK, ;CLOSE FILE SAVE11: CLOSE DSK,CL.DAT ;[536] CLOSE FILE BUT DON'T WRITE IT MOVE T2,D.NAM ;[536] GET FILE NAME PUSHJ P,TSIXN ;[536] TYPE IT TELL < saved>,NOCRLF ;[536] PRINT REASSURING MESSAGE JRST EDCORE ;END EXIT SUBTTL WRITE CORE-IMAGE FILE ;STILL IFN FTUNSUPPORTED ;HERE TO OPEN CORE-IMAGE FILE DAEOPN: MOVE T1,D.DEV ;DEVICE TO WRITE ON DEVCHR T1, ;GET DEVICE CHARACTERISTICS TLNN T1,(DV.DSK) ;SKIP IF IT IS A DISK JRST E.NDSK ;NOT A DISK TLNN T1,(DV.MTA) ;IS IT ALSO A MAG TAPE? JRST DAEOP0 ;NO, THEN IS A REAL DISK TLNE F,L.SAVE ;YES, MUST BE NULL JRST SAVE10 ;FINISH SAVE TLNE F,L.DUMP ;DUMP OR DCORE? JRST EDUMP ;FINISH DUMP ERROR ,,EDECOM DAEOP0: PUSHJ P,DELETE ;DELETE ANY EXISTING FILE MOVSI T1,DSK+<(FO.PRV)> ;DSK CHANNEL PLUS PRIVS HRRI T1,.FOMAU ;FUNCTION IS MULTI-ACCESS UPDATE MOVEM T1,D.FLOP+.FOFNC ;STORE IN BLOCK MOVEI T1,.IODMP ;DUMP MODE MOVEM T1,D.FLOP+.FOIOS MOVE T1,D.DEV ;GET DEVICE NAME MOVEM T1,D.FLOP+.FODEV SETZM D.FLOP+.FOBRH ;NO BUFFER HEADERS SETZM D.FLOP+.FONBF ; AND NO COUNT MOVEI T1,D.LKB ;ADDRESS OF LOOKUP BLOCK MOVEM T1,D.FLOP+.FOLEB SETZM D.FLOP+.FOPAT ;NO PATH BLOCK MOVE T1,USRPPN ;GET PPN OF USER WHO WOULD WRITE MOVEM T1,D.FLOP+.FOPPN SETZM D.LKB ;ZERO FIRST WORD OF ENTER BLOCK MOVE T1,[D.LKB,,D.LKB+1] ;MAKE BLT POINTER BLT T1,D.LKB+.RBSIZ ;CLEAR THE BLOCK MOVE T1,D.NAM ;GET FILENAME MOVEM T1,D.LKB+.RBNAM ;SAVE IN BLOCK HLLZ T1,D.EXT ;GET EXTENSION MOVEM T1,D.LKB+.RBEXT HRLZ T1,D.PROT ;GET PROTECTION LSH T1,^D9 ;POSITION IT MOVEM T1,D.LKB+.RBPRV MOVEI T1,.RBSIZ ;COUNT OF WORDS TO FOLLOW MOVEM T1,D.LKB+.RBCNT MOVEI P1,5 ;NUMBER OF TIMES TO RETRY IF FILE BEING MODIFIED DAEOP1: MOVE T1,D.DIR ;GET PPN OR POINTER MOVEM T1,D.LKB+.RBPPN HLLZS D.LKB+.RBEXT ;CLEAR ANY ERROR CODE ;CONTINUED ON NEXT PAGE ;STILL IFN FTUNSUPPORTED ;CONTINUED FROM PREVIOUS PAGE MOVE T1,[.FOPPN+1,,D.FLOP] ;POINT TO BLOCK FILOP. T1, ;CREATE THE FILE JRST [PUSHJ P,FBMTRY ;CHECK FOR ERFBM% JRST DAEOP1 ;IS, RETRY JRST E.DAEF] SETZM CURWRD ;START AT WORD 0 SETZB BP,CURBLK ;START AT FIRST BLOCK OF FILE MOVEI T1,EDECOM ;NEW RESTART ADDR MOVEM T1,INTADR TLNE F,L.SAVE ;SKIP IF NOT DOING A SAVE JRST SAVE03 ;ARE, CONTINUE JRST DCJBI0 ;START UP THE DCORE SUBTTL WRITE JOB INFORMATION ;STILL IFN FTUNSUPPORTED ;HERE TO WRITE JOB INFORMATION DCJBI0: MOVEI T1,.CAJOB ;CATEGORY NUMBER FOR JOB INFORMATION PUSHJ P,CATSTA ;START UP CATEGORY MOVE T1,.JBVER ;(0)DAEMON VERSION NUMBER PUSHJ P,DWRITE ;WRITE IT DATE T1, ;(1)TODAY'S DATE PUSHJ P,DWRITE ;WRITE THAT MSTIME T1, ;(2)TIME OF DAY IN MILLISECONDS PUSHJ P,DWRITE ;WRITE IT HRROI T1,.GTSGN ;SEGMENT TABLE PUSHJ P,GTBDFL ;GET HIGH SEGMENT NUMBER IF ANY MOVE S,T1 ;SAVE SEGMENT NUMBER IN S HRL T1,J ;(3)LH=JOB NUMBER, RH=SEGMENT NUMBER PUSHJ P,DWRITE ;WRITE THAT HLRZ T1,LINE ;(4)LH=RESERVED, RH=LINE NUMBER PUSHJ P,DWRITE ;AND WRITE THAT ;HERE TO WRITE GETTAB ENTRIES FOR JOB SKIPL P1,[-GTTBLN,,GTTABL] ;SKIP IF ANY GETTABS WANTED JRST GTTBJE ;NO GETTABS DESIRED GTTBLP: HLRZ T2,(P1) ;T2=INDEX INTO ROUTINE HRRZ T1,(P1) ;T1=GETTAB TABLE PUSHJ P,WGTBTH(T2) ;GET JOB OR SEGMENT OR BOTH AOBJN P1,GTTBLP ;LOOP FOR GETTABS DESIRED ;HERE AFTER ALL GETTABS FOR JOB WRITTEN - WRITE SYSTEM GETTABS GTTBJE: PUSHJ P,CATEND ;END OF JOB INFORMATION CATEGORY ;HERE TO WRITE CONFIGURATION TABLE MOVEI T1,.CACNF ;BEGIN CONFIGURATION TABLE CATEGORY PUSHJ P,CATSTA MOVEI P1,.GTCNF PUSHJ P,GTTBAL ;WRITE ALL OF TABLE PUSHJ P,CATEND ;END OF CONFIGURATION CATEGORY ;HERE TO WRITE FEATURE TABLE MOVEI T1,.CAFET ;BEGIN FEATURE TABLE CATEGORY PUSHJ P,CATSTA ;INITIALIZE IT MOVEI P1,.GTFET ;THE TABLE WE WANT PUSHJ P,GTTBAL ;DUMP IT ALL PUSHJ P,CATEND ;END OF CATEGORY SUBTTL WRITE DDB'S FOR JOB ;STILL IFN FTUNSUPPORTED ;HERE TO WRITE ALL DDB'S FOR THIS JOB. WE FOLLOW THE LOW CORE DDB ;CHAIN INSTEAD OF LOOKING AT USRJDA BECAUSE USRJDA ONLY POINTS TO ;THOSE DDB'S WHICH HAVE A CHANNEL ASSIGNED. WE ALSO DUMP ALL ;FUNNY SPACE DDB'S BY FOLLOWING THE CHAIN POINTED TO BY .UPLST IN ;THE UPMP. MOVEI T1,.CADDB ;CATEGORY NUMBER FOR DDB'S PUSHJ P,CATSTA ;START UP THE CATEGORY MOVE T1,[%CNDEV] PUSHJ P,GTBSPY ;GET PTR TO LIST OF DDB'S SKIPA ;UNLIKELY PUSHJ P,DMPDDB ;DUMP ALL DDB'S FOR THIS JOB PUSHJ P,GTUPMP ;GET UPMP FOR THIS JOB JRST DDBCA2 ;CAN'T, GIVE UP SKIPE T1,.UPLST ;HAVE THE OFFSET FOR .UPLST? SKIPN T1,USRUPM(T1) ;YES, HAVE ANY DDB'S IN FUNNY SPACE SKIPA ;NO PUSHJ P,DMPDDB ;DUMP THOSE ALSO DDBCA2: PUSHJ P,CATEND ;END OF DDB CATEGORY SUBTTL WRITE LOW SEGMENT AND HIGH SEGMENT IF ANY ;STILL IFN FTUNSUPPORTED ;HERE WHEN ALL DDB'S DONE, GATHER CORE FROM JOB'S LOW SEGMENT EDDBS: MOVEI T1,.CACOR ;CATEGORY NUMBER FOR USER CORE PUSHJ P,CATSTA ;START UP CATEGORY SETZM THSOFF ;OFFSET FOR THIS SEGMENT=0 HRLZI T1,MAXUCR ;GET FIRST BLOCK OF USER CORE HRRZ T2,J ;SEGMENT NUMBER=JOB NUMBER PUSHJ P,GTUCOR ;GET THE CORE MOVE T1,J ;GET JOB NUMBER INTO T1 PUSHJ P,JSSIZE ;GET SIZE OF LOW SEGMENT JRST EDUMP ;??? MOVEM T1,SEGREL ;=SIZE OF THIS SEGMENT PUSHJ P,HSVADR ;GET START AND END OF HI SEG MOVEI T1,.JBHRL ;ADDR OF .JBHRL SKIPN USRCOR(T1) ;GET SIZE OF HI SEG FROM .JBHRL IN JOBDAT ;IF ITS ZERO,EDIT 465 SETZM HGHREL ;REMEMBER FOR LATER MOVE T1,J SETZB T2,USRADR ;START COMPRESSION AT LOCATION 0 PUSHJ P,COMPRS ;OUTPUT LOW SEGMENT AS ZERO-COMPRESSED DATA ;HERE TO WRITE HIGH SEGMENT IF ANY SKIPN T1,HGHREL ;SKIP IF ANY HIGH SEGMENT JRST NOHIGH JUMPLE S,NOHIGH ;EVEN IF HIGH SEG MUST KNOW ITS NUMBER MOVEM T1,SEGREL ;SIZE OF HIGH SEGMENT MOVE T1,HGHOFF ;OFFSET FOR HIGH SEGMENT MOVEM T1,THSOFF ;=SIZE OF THIS SEGMENT HRLZI T1,MAXUCR HRRZ T2,S ;SEGMENT NUMBER FOR HIGH SEGMENT PUSHJ P,GTUCOR ;GET FIRST BLOCK OF HIGH SEGMENT SETZB T2,USRADR ;START COMPRESSION AT ADDRESS 0 IN SEGMENT MOVE T1,S PUSHJ P,COMPRS ;WRITE HIGH SEGMENT AS ZERO-COMPRESSED DATA ;CONTINUED ON NEXT PAGE SUBTTL CLOSE OUT CORE-IMAGE FILE AND FINISH UP ;CONTINUED FROM PREVIOUS PAGE ;STILL IFN FTUNSUPPORTED ;HERE WHEN ALL DATA WRITTEN NOHIGH: MOVE T1,PATTERN ;END FILE WITH STANDARD PATTERN PUSHJ P,DWRITE PUSHJ P,CATEND JUMPGE BP,NOHGH1 ;JUMP IF NEVER WROTE ANYTHING PUSHJ P,BLKWRT ;WRITE LAST PARTIAL BUFFER ;HERE WHEN CORE-IMAGE FILE WRITTEN NOHGH1: JRST EDCORE ;CLOSE OFF THE DCORE FILE ;STILL IFN FTUNSUPPORTED ;HERE TO FINISH OFF DCORE/SAVE/ETC. EDCORE: MOVEI T1,DSK ;[536] SET UP CHANNEL PUSHJ P,RELDSK ;[536] RELEASE IT TLNE F,L.DUMP ;SKIP IF DCORE, NOT IF DUMP JRST EDUMP JRST EDECOM ;CAP OFF UUO/COMMAND AS NEEDED EDECOM: TLNE F,L.UUO ;SKIP IF COMMAND JRST UUOKX ;IF UUO, QUIT NOW PUSHJ P,CRLFPD ;PRINT . TO INDICATE MONITOR MODE PUSHJ P,DMPBUF ;DUMP BUFFER EECOM: MOVSI T2,(AT.UMM) ;ENSURE RE-ATTACH IS AT MONITOR LEVEL IORM T2,LINE ;BY SETTING BIT IN ATT FUNCTION EDUMP: TLNE F,L.UUO ;ATTACHED? JRST UUOKX ;NO--RETURN TO UUO. HRROI T1,.GTJLT ;GETTAB FOR JOB LOGIN TIME PUSHJ P,GTBDFL ;GET IT MOVEI T2,(J) ;[610] GET JOB NUMBER TRMNO. T2, ;[610] IS IT DETACHED? CAME T1,JOBJLT ;YES, LOGIN TIMES MATCH? JRST [MOVSI T2,-1 ;[610] NO--DON'T REATTACH THIS JOB TO IT JRST EDUMP0] ;[610] JUST DETACH THIS JOB HLLZ T2,LINE ;LH=LINE NUMBER OF USER'S TTY HRRI T2,(J) ;RH=USER'S JOB NUMBER EDUMP0: SETZM MSGLIN ;CLEAR MESSAGE LINE ATTACH T2, ;[610] GIVE USER BACK HIS TTY ERROR ,OPR > ;END IFN FTUNSUPPORTED ;HERE TO UUO USER OUT OF DAEMON REQUEST DETUSR: IFN FTUNSUPPORTED,< HRRZ T1,.JBDDT ;ADDR OF DDT IF ANY JUMPE T1,NOREAT ;DONT REATTACH ORIGINAL TTY IF NO DDT HRLZ T1,THSLIN ;LH T1=OUR ORIGINAL LINE NUMBER HRR T1,THSJOB ;RH=OUR JOB NUMBER TLO T1,(AT.UUM) ;SET TO USER LEVEL ATTACH T1, ;REATTACH TO OUR ORIGINAL LINE AOS ATTGUF > NOREAT: MOVEI T1,DALOOK ;NEW RESTART ADDR MOVEM T1,INTADR IFN FTUNSUPPORTED,< TLNN F,L.DUMP ;SKIP IF DUMP - MUST FORCE CCL RUN OF DUMP JRST EDUMP1 ;NO, DONT BOTHER MOVEI T1,T2 ;ADDRESS OF ARGUMENT LIST MOVE T2,[SIXBIT /.DUMP/] ;COMMAND TO FORCE MOVE T3,J ;JOB NUMBER FRCUUO T1, ;FORCE COMMAND TO RUN DUMP AT CCL ENTRY POINT AOS FRCGUF ;DEBUG - COUNT SHOULD NEVER HAPPEN'S > ;END IFN FTUNSUPPORTED EDUMP1: MOVEM J,DFNJOB ;SAVE JOB NUMBER FOR DEBUGGING MOVEI T1,J ;T1=ADDRESS OF ARGUMENT LIST=JOB NUMBER DAEFIN T1, ;ALL DONE, REQUE USER'S JOB AOS FINGUF ;DEBUG - NOTE AN SNH JRST NULEXT ;FINISH UP ;HERE TO RESET SEARCH LIST TO ORIGINAL STATE IFE FTSVSL,< NULEXT=DALOO2 ;IF DON'T CARE ABOUT SEARCH LIST, FORGET THIS> IFN FTSVSL,< ;IF PRESERVING OUR SEARCH LIST NULEXT: MOVE T1,PSRCH ;POINTER TO ORIGINAL SEARCH LIST STRUUO T1, ;RESTORE ORIGINAL SEARCH LIST AOSA STRGUF ;[524] COUNT ERROR, SKIP JRST DALOO2 ;[524] I HAVE NO PROBLEMS WITH CRUMMY STRUUO! CAIE T1,FSSNF% ;[524] RECOVERABLE IF FAILED BECAUSE UNIT NOT FOUND CAIN T1,FSSSA% ;[524] OR IF FAILED BECAUSE UNIT SINGLE ACCESS SKIPA T1,PSRCH ;[524] THIS IS RECOVERABLE! PICK UP POINTER JRST DALOO2 ;[524] GIVE UP HLRZ T2,T1 ;[524] GET LENGTH OF ARG LIST (=4+(3*# OF STR'S)) IDIVI T2,3 ;[524] GETS # OF STR'S + 1 IN T2 SOJE T2,DALOO2 ;[524] SNH -- CHECK FOR NO STR'S NULEX1: ADDI T1,3 ;[524] INCREMENT PTR BY ONE STR NULX1A: MOVEI T3,1(T1) ;[524] T3 POINTS TO SIXBIT STR NAME HRLI T3,.DCNAM+1 ;[524] LH SHOWS SINGLE ARG FOR DSKCHR DSKCHR T3, ;[524] GET BITS ABOUT THIS STR IN AC JRST NULEX2 ;[524] STR MUST HAVE BEEN DISMOUNTED TLNN T3,(DC.OFL!DC.SAF!DC.STS!DC.NNA) ;[524] CHECK FOR ;[524] ANYTHING BAD ABOUT THIS FILE STR JRST NULEX3 ;[524] NO REASON IT SHOULD NOT BE ON OUR SEARCH LIST NULEX2: MOVSI T3,-3 ;[524] HERE TO REMOVE STR -- GET -3 ADDB T3,PSRCH ;[524] DECREMENT LENGTH OF ARG LIST, GET IN T3 MOVEI T4,1(T1) ;[524] T4 PNTS TO START OF BAD 3 WORD BLOCK SUBI T4,(T3) ;[524] SUBTRACT BASE TO GET OFFSET HLRZ T3,T3 ;[524] GET NEW LENGTH IN T3 SUBI T3,(T4) ;[524] NOW SUBTRACT OFFSET TO SEE HOW MUCH TO BLT MOVEI T4,1(T1) ;[524] NOW POINT TO BLOCK TO REMOVE HRLI T4,3(T4) ;[524] LH OF BLT PTR SHOWS WHERE TO READ FROM ADDI T3,-1(T4) ;[524] POINT TO LAST WORD TO WRITE TO CAIE T2,1 ;[524] IF THIS IS LAST STR, NOTHING TO WRITE BLT T4,(T3) ;[524] MOVE END OF STR LIST SOJG T2,NULX1A ;[524] IF REMOVED STR, DON'T INCREMENT PTR NULEX3: SOJG T2,NULEX1 ;[524] LOOP FOR ALL STR'S MOVE T1,PSRCH ;[524] NOW GET NEW (SHOULD BE, ANYWAY) PTR STRUUO T1, ;[524] SET OUR SEARCH LIST JRST DALOO2 ;[524] CAN'T DO IT SOS STRGUF ;[524] WE ARE SAVED -- DON'T COUNT ERROR JRST DALOO2 ;[524] MOVING RIGHT ALONG ... > ;END OF FTSVSL CONDITIONAL SUBTTL ERRORS E.GTBF: ERROR ,STOP FBMTRY: SOJLE P1,CPOPJ1 ;EXIT IF FINISHED RETRYING CAIE T1,ERFBM% ;SKIP IF FILE BEING MODIFIED JRST CPOPJ1 ;NO, SOME OTHER ERROR MOVEI T1,1 SLEEP T1, POPJ P, IFN FTUNSUPPORTED,< E.SPTR: AOS SPTGUF ;COUNT THE ERROR ERROR ,OPR PJRST SNH E.HSTS: AOS HSSGUF ERROR ,OPR PJRST SNH E.UPMP: AOS UPMGUF ERROR ,OPR PJRST SNH E.SOPN: AOS SUOGUF ERROR ,NOCRLF MOVE T2,T3 ;GET SWAP UNIT NAME PUSHJ P,TSIXN JRST E.SWP1 ;JOIN COMMON CODE E.SWPE: AOS SWPGUF ;COUNT ERROR ERROR ,NOCRLF MOVE T1,SEGSWP ;GET THE POINTER PUSHJ P,THALF ;TYPE AS HALFWORDS E.SWP1: PUSHJ P,OCRLF ;FORCE MESSAGE TO OPR PJRST SNH E.NDSK: PUSHJ P,CWF ;CHECK FOR UUO ERROR JRST E.DCOR E.CCLE: PUSHJ P,CWF ;CHECK FOR UUO ERROR ,NOCRLF JRST E.DAE1 ; STILL IFN FTUNSUPPORTED E.DAEF: PUSHJ P,CWF ;CHECK FOR UUO AND ATTACH ERROR ,NOCRLF E.DAE1: PUSH P,T1 ;SAVE CODE PUSHJ P,TOCT ;TYPE CODE POP P,T1 ;GET CODE BACK CAILE T1,MAXERR ;BIGGER THAN ASCIZ TABLE? JRST E.DAE2 ;YES MOVEI T1,@ERRTBL(T1) ;POINT TO APPROPRIATE STRING PUSHJ P,TYPSTR ;TYPE IT E.DAE2: PUSHJ P,PCRLF ;PLUS CRLF ;; PJRST E.DCOR ;FALL INTO E.DCOR E.DCOR: TLZ F,L.DUMP ;TURN OFF DUMP FLAG PJRST EDCORE ;AND END SAVE/DUMP CWF: TLNN F,L.UUO ;THIS A UUO? POPJ P, ;NO, RETURN POP P,(P) ;FLUSH RETURN ADDRESS FROM STACK PJRST UUERR5 ;AND GIVE UUO ERROR ERRTBL: [ASCIZ/, File not found/] [ASCIZ/, No directory for PPN/] [ASCIZ/, Protection failure/] [ASCIZ/, File being modified/] [ASCIZ/, File already exists/] [ASCIZ/, Illegal sequence of UUOs/] [ASCIZ/, RIB error/] MAXERR==.-ERRTBL-1 ;STILL IFN FTUNSUPPORTED SNH: TLNN F,L.UUO ;THIS A UUO? POPJ P, ;NO, RETURN POP P,(P) ;FLUSH RETURN ADDRESS FROM STACK PJRST UUERR4 ;AND GIVE UUO ERROR CRLFPD: PUSHJ P,PCRLF ;START WITH A CRLF DOT: MOVEI SC,"." ;GET A PERIOD PJRST TYPCHR ;TYPE IT AND RETURN TABDOT: MOVEI SC," " ;GET A TAB PUSHJ P,TYPCHR ;TYPE IT PJRST DOT ;TYPE A DOT AND RETURN ATTCHK: PUSH P,T1 ;SAVE T1 GETLIN T1, ;GET OUR LINE NO TLNN T1,-1 ;DO WE HAVE ONE? AOSA OUTGUF ;COUNT NUMBER OF FAILURES > ;END IFN FTUNSUPPORTED TPOPJ1: AOS -1(P) ;BUMP RETURN TPOPJ: POP P,T1 ;YES, RESTORE T1 POPJ P, ;RETURN OCRLF: TLO F,L.OPR ;FORCE MESSAGE TO OPR PUSHJ P,PCRLF ;OUTPUT THE CRLF TLZ F,L.OPR ;CLEAR THE BIT POPJ P, ;RETURN PCRLF: MOVEI SC,.CHCRT ;GET A CARRIAGE RETURN PUSHJ P,TYPCHR ;TYPE IT MOVEI SC,.CHLFD ;GET A LINE FEED PJRST TYPCHR ;TYPE IT AND RETURN ;ROUTINE TO PROCESS THE ERROR, WARN, AND TELL MACROS. ;CALL PUSHJ P,ERRMSG ; CAI BITS,[PREFIX,[MESSAGE]] ; RETURN HERE UNLESS ER.STP IS SET ERRMSG: PUSH P,T1 ;SAVE ALL THE AC'S THAT PUSH P,SC ;WE USE IN THIS ROUTINE PUSH P,P1 ;... MOVE P1,@-3(P) ;GET CAI WORD TLNE P1,(ER.STP!ER.OPR) ;WANT THIS MESSAGE ISSUED TO OPR? TLO F,L.OPR ;YES, TELL TYPCHR HLRZ SC,(P1) ;GET MESSAGE PREFIX SKIPE SC ;ANY THERE? PUSHJ P,TYPCHR ;YES, TYPE IT HRRZ T1,(P1) ;GET MESSAGE ADDRESS PUSHJ P,TYPSTR ;TYPE IT TLNN P1,(ER.NCR) ;WANT CRLF AT END OF THIS MESSAGE? PUSHJ P,PCRLF ;YES, ADD ONE TLZ F,L.OPR ;CLEAR OPR MESSAGE FLAG TLNE P1,(ER.STP) ;STOP ON THIS ERROR? PJRST DAEREN ;YES, TAKE IT DOWN POP P,P1 ;RESTORE THE AC'S SAVED ON ENTRY POP P,SC ;... JRST TPOPJ1 ;AND RETURN IFN FTUNSUPPORTED,< DEFINE .ADCHR (CHR),< .STRG==.STRG+<_.SHFT> .SHFT==.SHFT-7 IFL .SHFT,> DEFINE .ADSTR (STR),< IRPC STR,<.ADCHR ("STR") >> DEFINE VERSTR (NAME,MAJOR,MINOR,EDIT,WHO),< XLIST .STRG==0 .SHFT==^D29 .ADSTR (['NAME' ) .ADSTR (\MAJOR) IFN MINOR,<.ADCHR (MINOR+"A"-1)> IFN EDIT,<.ADCHR "(" .ADSTR (\EDIT) .ADCHR ")"> IFN WHO,<.ADCHR ("-") .ADSTR (\WHO)> .ADCHR ("]") .ADCHR (15) .ADCHR (12) EXP .STRG LIST> PDAEVR: PJSP T1,TYPSTR ;TYPE STRING AND RETURN DAEVER: VERSTR (DAEMON,VDAEMON,VMINOR,VEDIT,VWHO) PURGE .ADCHR,.ADSTR,VERSTR,.STRG,.SHFT SUBTTL SUBROUTINES ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO START A CATEGORY ;ARGS T1=CATEGORY NUMBER CATSTA: PUSHJ P,DWRITE ;WRITE THE CATEGORY NUMBER PJRST MRKSPT ;AND MARK THE SPOT FOR THE LENGTH TO BE WRITTEN LATER ;SUBROUTINE TO END A CATEGORY CATEND: MOVE T1,WRDCNT ;WORDS WRITTEN PJRST WRTSPT ;REWRITE THE SPOT MARKED FOR THE LENGTH OF THE CAT ;SUBROUTINE TO GET VALUES FOR JOB AND SEGMENT AND WRITE ;ARGS T1=GETTAB TABLE ; J=JOB NUMBER ; S=SEGMENT NUMBER ;ENTER WGTJOB TO WRITE JOB ENTRY ; WGTSEG TO WRITE SEGMENT ENTRY ; WGTBTH TO WRITE JOB THEN SEGMENT ENTRIES WGTBTH: TLO F,L.WS ;WRITE JOB AND SEGMENT WGTJOB: TLOA F,L.WJ ;WRITE JOB WGTSEG: TLO F,L.WS ;WRITE SEGMENT TLZN F,L.WJ ;SKIP IF WANT JOB ENTRY JRST WGTSG1 ;NO, TRY FOR SEGMENT HRLM T1,(P) ;SAVE GETTAB TABLE HRLI T1,(J) ;LH=JOB NUMBER PUSHJ P,GTBDFL ;GET VALUE PUSHJ P,DWRITE ;WRITE THAT HLRZ T1,(P) ;RESET THE GETTAB TABLE WGTSG1: TLZN F,L.WS ;SKIP IF SEGMENT ENTRY WANTED POPJ P, ;NO, EXIT JUMPLE S,WGTSG2 ;DON'T TRY IF NO HIGH SEG (INCLUDING SPY) HRLI T1,(S) ;LH=SEGMENT NUMBER PUSHJ P,GTBSPY ;GET VALUE WGTSG2: SETZ T1, ;0 OTHERWISE PJRST DWRITE ;WRITE AND EXIT ;STILL IFN FTUNSUPPORTED ;TABLE OF GETTAB'S TO WRITE FOR JOB INFORMATION ;RH=TABLE NUMBER ;LH=0 IF BOTH JOB AND SEGMENT ENTRIES WANTED ; =1 IF JOB ONLY ; =2 IF SEGMENT ONLY ;G MACRO HAS PARAMETERS TABLE NAME, B OR J OR S FOR BOTH OR JOB OR SEGMENT DEFINE G(X,Y)< XLIST ..Z==3 IFIDN ,<..Z==0> IFIDN ,<..Z==1> IFIDN ,<..Z==2> XWD ..Z,X LIST > GTTABL: G .GTSTS,B G .GTPPN,B G .GTPRG,B G .GTTIM,J G .GTKCT,J G .GTPRV,J G .GTSWP,B G .GTRCT,J G .GTWCT,J G .GTTDB,J G .GTDEV,S G .GTNM1,J G .GTNM2,J G .GTCNO,J G .GTTMP,J G .GTWCH,J G .GTSPL,J G .GTRTD,J G .GTLIM,J G .GTSPS,J G .GTRSP,J G .GTTRQ,J G .GTUPM,B G .GTCVL,J G .GTMVL,J G .GTIPA,J G .GTIPP,J G .GTIPI,J G .GTIPQ,J G .GTDVL,J G .GTABS,J G .GTVRT,J GTTBLN==.-GTTABL ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO OUTPUT ALL ENTRIES OF A GETTAB TABLE ;ARGS P1=TABLE NUMBER GTTBAL: MOVSS P1 ;LH=TABLE NUMBER, RH=0 GTTBA1: MOVS T1,P1 ;T1=ENTRY NUMBER,TABLE NUMBER PUSHJ P,GTBSPY POPJ P, ;NO MORE PUSHJ P,DWRITE ;WRITE THE WORD AOJA P1,GTTBA1 ;LOOP TIL END OF TABLE ;SUBROUTINE TO FOLLOW A DDB CHAIN AND DUMP ALL DDB'S FOR THIS JOB ;ARGS T1=FIRST DDB ADDR,,0 ; J=JOB NUMBER DMPDDB: PUSHJ P,SAVE1 ;SAVE P1 DMPDD1: HLRZS T1 ;MOVE NEXT ADDRESS TO RH JUMPE T1,CPOPJ ;DONE IF AT END OF CHAIN MOVEI P1,(T1) ;COPY TO P1 PUSHJ P,DDBJOB ;GET JOB NUMBER FROM THIS DDB CAIE T1,(J) ;THIS ONE OF OURS? JRST DMPDD2 ;NO, TRY NEXT MOVN T2,LDDBSH ;ASSUME SHORT DDB MOVEI T1,DEVSTA(P1) ;ADDRESS OF DEVSTA PUSHJ P,PEKSPY ;GET IT TLNE T1,(DEPSPL) ;IS IT SPOOLED DEVICE? MOVN T2,LDDBDS ;YES, REALLY A DISK MOVEI T1,DEVMOD(P1) ;GET DEVMOD WORD PUSHJ P,PEKSPY ; FROM DDB TLNE T1,(DV.LNG) ;LONG DDB? MOVN T2,LDDBLN ;YES. TLNE T1,(DV.DSK) ;DISK DDB? MOVN T2,LDDBDS ;YES HRLI P1,(T2) ;P1=-LENGTH,ADDR PUSHJ P,WRTDDB ;WRITE OUT THE DDB DMPDD2: MOVEI T1,DEVSER(P1) ;ADDR OF PTR TO NEXT DDB PUSHJ P,PEKSPY ;GET IT JRST DMPDD1 ;LOOP FOR NEXT ;SUBROUTINE TO OUTPUT A DDB ;ARGS P1=XWD -WORDS, ADDR OF BEGINNING OF DDB ;VALUES P1=ADDR OF DDB WRTDDB: HRLM P1,(P) ;SAVE ADDR OF DDB HLRE T1,P1 ;T1=MINUS LENGTH OF DDB MOVNS T1 ;POSITIVE LENGTH OF DDB HRL T1,P1 ;SAVE ADDR ALONG WITH LENGTH PUSHJ P,DWRITE ;WRITE OUT LENGTH OF NEXT DDB WRTDD1: MOVEI T1,(P1) ;ADDR OF NEXT WORD PUSHJ P,PEKSPY ;GET NEXT WORD FROM DDB PUSHJ P,DWRITE ;WRITE THE WORD AOBJN P1,WRTDD1 ;LOOP FOR THE DDB HLRZ P1,(P) ;RESET ADDR OF DDB POPJ P, ;AND EXIT SUBTTL SUBROUTINE TO COMPRESS AND OUTPUT A SEGMENT ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO COMPRESS AND OUTPUT A SEGMENT ;ARGS T1=INDEX OF SEGMENT=JOB OR SEGMENT NUMBER ; T2=ADDRESS AT WHICH TO START COMPRESSION ; SEGREL=ADDRESS AT WHICH TO END COMPRESSION ; THSOFF=OFFSET FOR ADDR OF FIRST WORD OF THE SEGMENT ; USRADR=ADDRESS OF START OF BLOCK IN USRCOR ; USRCOR=FIRST BLOCK OF USER'S CORE FOR SEGMENT COMPRS: PUSHJ P,SAVE4 ;SAVE P1-P4 PUSH P,REMBLK ;SAVE POINTER TO BEGINNING OF CATAGORY PUSH P,REMWRD PUSH P,WRDCNT MOVE P1,T2 ;GET ADDRESS AT WHICH TO START MOVE P2,T2 ;AND ALSO INTO P2 ANDI P2,PG.BDY ;GET START MODULO PAGE SIZE MOVEM T1,THSSEG ;SAVE SIZE OF THIS SEGMENT COMPR1: SKIPE USRCOR(P2) JRST COMPR2 ;FOUND NEXT NON-ZERO WORD SETCM T1,P1 ;GET COMPLEMENT OF ADDRESS TRNE T1,PG.BDY ;SKIP IF END OF PAGE JRST COMP1A ;NOT END, PROCEED TLZN F,L.ZPGF ;SKIP IF JUST FINISHED A ZERO PAGE JRST COMP1B ;NO, PROCEED ON TO NEXT PAGE HRRO T1,P1 ;GET CURRENT ADDRESS SUBI T1,1000 ;MAKE AN IOWD FOR START OF PAGE PUSHJ P,DWRITE ;WRITE IT SETZ T1, ;THEN MAKE A ZERO WORD PUSHJ P,DWRITE ;AND WRITE IT COMP1A: TRNE P1,PG.BDY ;START OF NEW PAGE? JRST COMP1B ;NO, JUST KEEP ROLLING ALONG TLNN F,L.UPMP ;HAVE UPMP IN CORE? JRST COMP1B ;NO, PROBABLY MEANS WE JUST GOT PAGE VIA JOBPEK MOVE T1,P1 ;YES, MEANS PAGE COULD BE NON-EXISTANT PUSHJ P,VIRADR ;GET UPMP ENTRY FOR THE PAGE JUMPE T1,COMP1C ;IF NON-ZERO, PAGE EXISTS TLO F,L.ZPGF ;PAGE EXISTS, SET ZERO PAGE FLAG COMP1B: CAML P1,SEGREL ;SKIP IF MORE IN SEGMENT JRST CPREND ;NO, END OF COMPRESSING ADDI P1,1 ;BUMP COUNTER TO NEXT ADDR CAIGE P2,MAXUCR-1 ;SKIP IF END OF BUFFER AOJA P2,COMPR1 ;NO, KEEP GOING PUSHJ P,NXTUBK ;GET NEXT BLOCK OF USER CORE SETZ P2, ;RESET PTR TO BEGINNING OF BUFFER JRST COMPR1 ;AND KEEP GOING ;HERE FOR NON EXISTENT PAGE COMP1C: ADDI P1,PG.BDY ;BUMP TO END OF PAGE ADDI P2,PG.BDY ;AND STEP THAT FAR IN BUFFER JRST COMP1B ;AND CONTINUE ;STILL IFN FTUNSUPPORTED COMPR2: HRRZM P1,PTRADR ;SAVE ADDR OF BEGINNING OF NON-ZERO REGION TLZ F,L.ZPGF ;FOUND A NON-ZERO WORD, CLEAR FLAG PUSHJ P,MRKSPT ;MARK THE SPOT SO CAN WRITE IOWD LATER SETZ P3, ;[755] ZERO A COUNTER FOR WORDS IN IOWD COMP2A: ADDI P2,1 ;BUMP PTR IN BUFFER, LOOK AT NEXT WORD SKIPE T1,USRCOR-1(P2) ;SKIP IF FOUND A ZERO WORD JRST COMPR3 ;NO, JUST WRITE AND KEEP ON CAML P1,SEGREL ;SKIP IF MORE IN SEGMENT JRST CPREND ;END OF COMPRESSING CAIGE P2,MAXUCR ;SKIP IF THE FIRST ZERO WAS THE END OF THE BUFFER JRST COMP2B ;NO, GO AHEAD PUSHJ P,NXTUBK ;YES, GET NEXT BLOCK SETZB P2,T1 ;RESET TO BEGINNING OF BUFFER AND REMEMBER ZERO DATA COMP2B: SKIPN USRCOR(P2) ;IF ONLY 1 ZERO, PRETEND REGULAR DATA JRST COMPR4 ;2 CONSECUTIVE ZEROS END THIS PIECE COMPR3: PUSHJ P,DWRITE ;WRITE THE WORD CAIL P3,400000 ;[755] MORE THAN 17 BITS FOR THE IOWD? JRST COMPR4 ;[755] IF SO, END THIS PIECE OF DATA CAML P1,SEGREL ;SKIP IF NOT END OF SEGMENT JRST COMPR4 ;END OF SEGMENT, END OF THIS PIECE ADDI P1,1 ;BUMP ADDR ADDI P3,1 ;[755] INCREMENT THE IOWD COUNTER CAIGE P2,MAXUCR ;SKIP IF NOW OFF END OF BUFFER JRST COMP2A ;NO, LOOK AT NEXT WORD PUSHJ P,NXTUBK ;YES, GET NEXT BLOCK OF USER CORE SETZ P2, ;RESET PTR TO BEGINNING OF BUFFER JRST COMP2A ;AND KEEP GOING COMPR4: SOS T1,PTRADR ;T1=ADDR-1 IN SEGMENT OF BEGINNING OF THIS PIECE ADD T1,THSOFF ;ADD OFFSET FOR SEGMENT MOVN T2,WRDCNT ;-WORDS WRITTEN HRL T1,T2 ;T1=IOWD PTR FOR PIECE PUSHJ P,WRTSPT ;REWRITE THE IOWD IN THE FILE AOS T1,WRDCNT ;WORDS WRITTEN INCLUDING THE IOWD ADDM T1,(P) ;COUNT WORDS IN THIS CATEGORY SETZ P3, ;[755] ZERO THE IOWD COUNTER CAMGE P1,SEGREL ;SKIP IF END OF THIS SEGMENT AOJA P1,COMPR1 ;NO, LOOK FOR NEXT NON-ZERO PIECE CPREND: POP P,WRDCNT ;RESTORE WORDS WRITTEN POP P,REMWRD ;AND THE REST OF THE CATAGORY POINTERS POP P,REMBLK POPJ P, ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO SET UP HGHOFF AND HGHREL FOR ANY JOB WITH HIGH SEGMENT ;ARGS J=JOB NUMBER ; USRUPM=USER'S UPM ;VALUES HGHOFF=STARTING ADDRESS OF HIGH SEGMENT ; HGHREL=LAST ADDRESS IN HIGH SEGMENT HSVADR: HRROI T1,.GTSGN ;[532] GETTAB INDEX TO JBTSGN PUSHJ P,GTBDFL ;GET SEGMENT NUMBER JUMPLE T1,HSVAD1 ;SPY SEG (ALWAYS STARTS AT 400000) MOVE T4,T1 ;SAVE HIGH SEGMENT NUMBER MOVSS T1 HRRI T1,.GTUPM ;JBTUPM PUSHJ P,GTBDFL LDB T3,[POINT 9,T1,8] ;GET JBYHSO BYTE JUMPE T3,HSVAD1 ;IF JBYHSO=0, GO TRY KA STYLE LSH T3,P2WLSH ;MAKE AN ADDRESS JRST HSVAD2 ;NOW STORE T3 AS START OF HI SEG HSVAD1: HRROI T1,.GTADR ;[532] GETTAB INDEX TO JBTADR PUSHJ P,GTBDFL ;GET LOW SEG PROT,,RELOC MOVEI T2,377777 ;ASSUME START AT 400000 TRNE T1,400000 ;DOS IT START HIGHER? MOVE T2,T1 ;NO, START AT NEXT K ABOVE LOW END MOVEI T3,1(T2) ;T3=START OF HI SEG HSVAD2: MOVE T1,T4 ;RESTORE HIGH SEGMENT NUMBER MOVEM T3,HGHOFF ;STORE START OF HIGH SEGMENT JUMPL T1,HSVAD3 ;SPY SEG? MOVS T1,T1 ;NO, GET SIZE OF HIGH SEG HRRI T1,.GTADR ;INDEX OF JBTADR PUSHJ P,GTBDFL ; HLRZ T1,T1 ;SIZE OF HIGH SEGMENT JUMPN T1,HSVAD3 ;JUMP IF IN CORE MOVS T1,T4 ;GET HIGH SEGMENT NUMBER HRRI T1,.GTSWP ;JBTSWP PUSHJ P,GTBDFL ;GET SIZE IN SOME FORM MOVE T2,T4 ;GET HIGH SEGMENT NUMBER AGAIN TLNN T2,JSHR ;SHARABLE HIGH SEG? MOVSS T1 ;NO,GET LEFT HALF ANDI T1,PG.BDY ;NUMBER OF PAGES IN HIGH SEG LSH T1,P2WLSH ;CONVERT TO WORDS SUBI T1,1 ;AND GET HIGHEST ADDRESS HSVAD3: HRRZS T1 ;CLEAR POSSIBLE SPYSEG BIT MOVEM T1,HGHREL ;AND STORE HIGHEST ADDRESS POPJ P, ;AND RETURN SUBTTL SUBROUTINE TO OUTPUT A NON-COMPRESSED HIGH SEGMENT ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO OUTPUT A NON-COMPRESSED HIGH SEGMENT ;ARGS T1=SEGMENT NUMBER ; SEGREL=LENGTH OF SEGMENT ; THSOFF=OFFSET FOR ADR OF FIRST WORD OF SEGMENT ; USRCOR=FIRST BLOCK OF USER'S CORE FOR SEGMENT SAVHGH: PUSHJ P,SAVE4 ;SAVE P1-P4 PUSH P,REMBLK PUSH P,REMWRD PUSH P,WRDCNT SETZB P1,USRADR ;START AT ADDRESS 0 IN SEGMENT SETZ P2, ;POINTER TO BUFFER OF USER'S CORE MOVEM T1,THSSEG ;SAVE SEGMENT NUMBER SAVHG1: ADDI P2,1 ;BUMP POINTER IN BUFFER MOVE T1,USRCOR-1(P2) ;GET PREVIOUS WORD PUSHJ P,DWRITE ;WRITE THE WORD CAML P1,SEGREL ;SKIP IF NOT END OF SEGMENT JRST SAVHG2 ;END OF SEGMENT, EXIT ADDI P1,1 ;BUMP ADDR CAIGE P2,MAXUCR ;SKIP IF NOW OFF END OF BUFFER JRST SAVHG1 ;NOT, GET NEXT WORD PUSHJ P,NXTUBK ;GET NEXT BLOCK OF USER CORE SETZ P2, ;RESET POINTER TO START OF BUFFER JRST SAVHG1 ;AND CONTINUE SAVHG2: ANDI P1,177 ;COMPUTE NUMBER OF WORDS IN LAST BLOCK TLZE F,L.NHRL ;WAS LH(.JBHRL)=0 MOVEI P,200 ;YES, THEN LAST IS ALWAYS FULL BLOCK MOVNS P1,P1 ;SET UP IOWD FOR HRLS P1,P1 ;EXACT NUMBER OF WORDS HRR P1,DLIST ;IN P1 EXCH P1,DLIST ;AND SET UP TO USE IT FOR OUTPUT PUSHJ P,BLKWRT ;OUTPUT LAST PARTIAL BLOCK EXCH P1,DLIST ;RESTORE OLD IOWD FOR FULL BLOCK POP P,WRDCNT POP P,REMWRD POP P,REMBLK POPJ P, ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO DELETE THE FILE NAMED IN D.XXX DELETE: MOVSI T1,DSK+<(FO.PRV)> ;CHANNEL+INVOKE PRIVS HRRI T1,.FODLT ;DELETE FUNCTION MOVEM T1,D.FLOP+.FOFNC ;SAVE IN BLOCK MOVEI T1,.IODMP ;DUMP MODE MOVEM T1,D.FLOP+.FOIOS ;SAVE IN BLOCK MOVE T1,D.DEV ;GET DEVICE NAME MOVEM T1,D.FLOP+.FODEV ;SAVE IN BLOCK SETZM D.FLOP+.FOBRH ;NO BUFFERS SETZM D.FLOP+.FONBF ;AND NO BUFFER COUNT MOVEI T1,D.LKB ;ADDRESS OF LOOKUP BLOCK MOVEM T1,D.FLOP+.FOLEB ;SAVE IN BLOCK SETZM D.FLOP+.FOPAT ;NO PATH BLOCKS MOVE T1,USRPPN ;PPN OF USER WHO WOULD DELETE MOVEM T1,D.FLOP+.FOPPN ;SAVE IN BLOCK SETZM D.LKB ;CLEAR FIRST WORD OF LOOKUP BLOCK MOVE T1,[D.LKB,,D.LKB+1] ;MAKE BLT POINTER BLT T1,D.LKB+.RBSIZ ;CLEAR BLOCK MOVE T1,D.NAM ;GET FILENAME MOVEM T1,D.LKB+.RBNAM ;SAVE IN LOOKUP BLOCK MOVE T1,D.EXT ;GET EXTENTION MOVEM T1,D.LKB+.RBEXT MOVE T1,D.DIR ;GET PPN MOVEM T1,D.LKB+.RBPPN ;SAVE IN BLOCK MOVEI T1,.RBSIZ ;NUMBER OF WORDS IN LOOKUP BLOCK MOVEM T1,D.LKB+.RBCNT ;SAVE IN BLOCK MOVE T1,[.FOPPN+1,,D.FLOP] ;POINT TO FILOP. BLOCK FILOP. T1, ;DELETE THE FILE JFCL ;OH WELL POPJ P, ;RETURN > ;END IFN FTUNSUPPORTED SUBTTL SUBROUTINES TO WRITE USER CORE IFE FTUNSUPPORTED,< ;SUBROUTINE TO WRITE IN USER CORE TO STORE VALUES AT THE END OF ;A DAEMON UUO. MAKES NO ADDRESS CHECKS SINCE JOBPEK WILL DO THAT ;FOR US. ;ARGS T1=+LENGTH,,ADDR IN JOB ; J=JOB NUMBER ; USRCOR CONTAINS CORE TO BE WRITTEN OUT WTUCOR: MOVSI T3,<(JK.WRT)>(J) ;JOB NUMBER AND WRITE FLAG TO LH HLR T3,T1 ;NUMBER OF WORDS TO RH HRRZ T4,T1 ;DESTINATION ADDRESS IN RH OF T4 HRLI T4,USRCOR ;SOURCE IS USRCOR MOVEI T2,T3 ;SETUP ADDRESS OF JOBPEK BLOCK PUSHJ P,DOJBPK ;DO THE JOBPEK TO WRITE THE CORE POPJ P, ;JOBPEK SUCCEEDED JFCL ;ADDRESS CHECK, SHOULDN'T HAPPEN HERE ERROR ,OPR,JPKUER ;HERE IF THE JOBPEK FAILED FOR A READ OR WRITE DONE AS THE RESULT OF ;A DAEMON UUO. DUMP THE UUO FUNCTION AND XWD TO MAKE IT EASIER TO ;DEBUG JPKUER: TELL ,NOCRLF ;INDICATE THAT THIS IS THE FUNCTION MOVE T1,UUOFNC ;GET THE UUO FUNCTION CODE PUSHJ P,THALF ;TYPE IT TELL <, SAVXWD=>,NOCRLF ;NOW THE XWD MOVE T1,SAVXWD ;GET THE UUO XWD PUSHJ P,THALF ;TYPE IT PJRST OCRLF ;END THE LINE AND RETURN > IFN FTUNSUPPORTED,< ;SUBROUTINE TO WRITE IN USER'S CORE - MAKES NO ADDRESS CHECKS ;ARGS T1=+LENGTH, ADDR IN SEGMENT ; T2=INDEX OF SEGMENT=JOB OR SEGMENT NUMBER ; J=JOB NUMBER ; THSOFF=OFFSET FOR BEGINNING OF SEGMENT ; USRCOR CONTAINS CORE TO BE WRITTEN OUT WTUCOR: PUSHJ P,SAVE4 ;SAVE P1-P4 MOVEM T2,SEGSWP ;SAVE SEGMENT NUMBER MOVSI T3,<(JK.WRT)>(J) ;JOB NUMBER AND WRITE FLAG TO LH HLR T3,T1 ;NUMBER OF WORDS TO RH HRRZ T4,T1 ;ADDR IN SEGMENT ADD T4,THSOFF ;PLUS OFFSET FOR BEGINNING=ACTUAL ADDRESS HRLI T4,USRCOR ;SOURCE=USRCOR MOVEI T2,T3 ;ADDR OF JOBPEK BLOCK PUSHJ P,FINCHK ;WAIT A SEC IF HE'S BEING SWAPPED WRTPEK: PUSHJ P,DOJBPK ;TRY TO WRITE USER'S CORE JRST WRTSWP ;NOT IN CORE, MUST REWRITE SWAPPING SPACE POPJ P, ;HERE IF MUST REWRITE SWAPPING SPACE WRTSWP: PUSHJ P,FINCHK ;IF LOST BECAUSE HE'S BEING SWAPPED, WAIT TRZE F,R.SWIN ;DID HE JUST COME IN? JRST WRTPEK ;YES, GO PEEK AGAIN PUSH P,T3 ;SAVE JOBPEK ARGS PUSH P,T4 ; .. MOVE P1,T1 ;SAVE PTR TO CORE TO BE WRITTEN MOVEI P2,USRCOR ;CURRENT ADDR IN OUR BUFFER HRRZ T3,P1 ;ADDR OF USER'S CORE TO BE WRITTEN IDIVI T3,BLKSIZ ;T3=BLOCKS TO SKIP, T4=WORDS TO SKIP IN BLOCK MOVE P3,T3 ;REMEMBER BLOCKS TO SKIP MOVE P4,T4 ;SAVE T4, (CLOBBERRED BY GTUPMP) PUSHJ P,GTUPMP ;GET THE JOBS UPMP JRST E.SPTR ;??? MOVE T4,P4 ;RESTORE T4 WRTSW3: MOVEI T1,(P1) ;GET ADDRESS TO WRITE PUSHJ P,VIRADR ;GET UPMP ENTRY FOR THIS PAGE HRLM T1,SEGSWP ;SAVE SWAPPING POINTER MOVEI T3,(P3) ;[525] GET BLOCK OFFSET FROM PAGE 0 ANDI T3,3 ;[525] MAKE BLOCK OFFSET FROM THIS PAGE ;HERE IF NOT FRAGMENTED WRTSW0: SKIPA P3,T3 ;REMEMBER BLOCKS SKIPPED WRTSW1: AOS T3,P3 ;SKIP ANOTHER BLOCK THIS TIME TRNE T3,4 ;[525] ABOUT TO CROSS PAGE BOUNDARY? JRST WRTSW3 ;[525] YES, FIND NEW PAGE ON SWAP SPACE WRTSW4: PUSHJ P,WRTPEC ;DO WHAT YOU CAN IN THIS BLOCK SETZ T4, ;SKIP NO MORE WORDS IN BLOCKS TLNE P1,-1 ;SKIP IF ALL DONE JRST WRTSW1 ;NO, DO NEXT BLOCK JRST REDEN1 ;ALL DONE, RELEASE SWP AND EXIT ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO REWRITE ONE BLOCK ON THE SWAPPING SPACE ;ARGS T3=BLOCKS TO SKIP IN THIS PIECE OF THE SWAPPING SPACE ; T4=WORDS TO SKIP IN THIS BLOCK ; SEGSWP=SWAPPING PTR ; P1=XWD +WORDS LEFT, ADDR IN USER'S SEGMENT ; P2=ADDR IN USRCOR OF CURRENT BEGINNING OF DATA WRTPEC: PUSH P,T4 ;SAVE WORDS TO SKIP MOVE T2,UPDLST ;IOWD TO AVAILABLE UPDATE BUFFER PUSHJ P,REDPEC ;READ IN THE BLOCK POP P,T2 ;RESTORE WORDS TO PRESERVE IN THIS BLOCK MOVEI T3,BLKSIZ ;WORDS IN THE BLOCK SUB T3,T2 ;T3=WORDS AVAILABLE IN THIS BLOCK HLRZ T4,P1 ;T4=WORDS YET TO TRANSFER CAMLE T3,T4 ;MINIMUM OF AVAILABLE, LEFT TO TRANSFER MOVE T3,T4 ;=WORDS TO WRITE IN THIS BLOCK MOVE T4,T3 ;SAVE IN T4 ADDI T2,SECBUF ;ADDR OF FIRST AVAILABLE WORD HRL T2,P2 ;ADDR OF NEXT DATA WORD ADDI T3,(T2) ;+WORDS TO TRANSFER=LAST WORD+1 BLT T2,-1(T3) ;TRANSFER NEW DATA INTO BUFFER MOVEI T2,SWP+4000 ;SET UP LH FOR SUSET. PUSH P,T1 ;SAVE T1 IN CASE SUSET. LOSES DPB T2,[POINT 13,T1,12] SUSET. T1, USETO SWP,(P) ;TRY SUPER USETO POP P,T1 ;GET T1 BACK OUTPUT SWP,UPDLST ;REWRITE BLOCK HLRZ T2,P1 ;WORDS LEFT SUB T2,T4 ;-WORDS DONE=NEW WORDS LEFT HRL P1,T2 ADDI P1,(T4) ;NEW ADDR IN USER'S SEGMENT ADDI P2,(T4) ;AND NEW ADDR IN USRCOR STATO SWP,IO.ERR ;SKIP IF ERRORS POPJ P, AOS SWWGUF ;NOTE SWAP WRITE ERROR ERROR ,NOCRLF PJRST SWPIO1 ;REPORT REST OF ERROR > ;END IFN FTUNSUPPORTED SUBTTL SUBROUTINES TO READ USER CORE IFE FTUNSUPPORTED,< ;SUBROUTINE TO GET CORE FROM USER'S JOB - MAKES NO ADDRESS CHECKS SINCE ;JOBPEK WILL DO THAT FOR US. ;ARGS: T1=+LENGTH,ADDRESS IN USER'S JOB ; J=JOB NUMBER ;RETURNS CPOPJ IF COULDN'T GET DATA (MESSAGE ISSUED IF NECESSARY) ; CPOPJ1 IF DATA IS IN USRCOR GTUCOR: SETZM USRCOR ;ZERO FIRST WORD OF BUFFER MOVE T3,[USRCOR,,USRCOR+1] ;MAKE BLT POINTER BLT T3,USRCOR+MAXUCR-1 ;CLEAR THE BUFFER HLRZ T3,T1 ;PUT LENGTH INTO RH OF T3 HRL T3,J ;AND JOB NUMBER INTO LH HRLZ T4,T1 ;PUT READ ADDRESS INTO LH OF T4 HRRI T4,USRCOR ;PLUS ADDRESS OF OUR BUFFER IN RH MOVEI T2,T3 ;POINT TO ARG BLOCK PUSHJ P,DOJBPK ;TRANSFER THE DATA JRST CPOPJ1 ;GOOD RETURN POPJ P, ;ADDRESS CHECK ERROR ,OPR,JPKUER > IFN FTUNSUPPORTED,< ;SUBROUTINE TO GET NEXT BLOCK OF USER CORE NXTUBK: MOVEI T1,MAXUCR ;SIZE OF BLOCK TO GET ADDB T1,USRADR ;ADDR OF THIS BLOCK IN SEGMENT MOVEI T2,MAXUCR ;MAXIMUM TRANSFER POSSIBLE ADDI T2,-1(T1) ;T2=ADDR OF LAST POSSIBLE WORD CAMLE T2,SEGREL ;SKIP IF WITHIN SEGMENT MOVE T2,SEGREL ;LAST WORD OF SEG IS LAST WORD OF TRANSFER SUBI T2,(T1) ;MINUS START OF TRANSFER=WORDS-1 HRLI T1,1(T2) ;WORDS THIS TRANSFER TO LEFT HALF MOVE T2,THSSEG ;SEGMENT NUMBER ; PJRST GTUCOR ;FALL INTO GTUCOR ;SUBROUTINE TO GET CORE FROM USER'S JOB - MAKES NO ADDRESS CHECKS ;ARGS T1=+LENGTH, ADDR IN SEGMENT ; T2=INDEX OF SEGMENT=JOB OR SEGMENT NUMBER ; J=JOB NUMBER ; THSOFF=OFFSET FOR BEGINNING OF THIS SEGMENT GTUCOR: PUSHJ P,SAVE4 ;SAVE P1-P4 SETZM USRCOR ;FIRST CLEAR THE BUFFER IN CASE SOMETHING GOES WRONG MOVE T3,[USRCOR,,USRCOR+1] BLT T3,USRCOR+MAXUCR-1 HRRZM T2,SEGSWP ;SAVE SEGMENT NUMBER HLRZ T3,T1 ;RH=NUMBER OF WORDS HRL T3,J ;LH=JOB NUMBER HRRZ T4,T1 ;ADDR IN SEGMENT ADD T4,THSOFF ;ADD OFFSET FOR BEGINNING OF SEGMENT HRLZS T4 ;LH=ADDR HRRI T4,USRCOR ;RH=ADDR OF OUR BUFFER MOVEI T2,T3 MOVE P1,T1 ;SAVE POINTER TO CORE WANTED TLNN F,L.UPMP ;HAVE UPMP IN CORE? JRST GTUCR1 ;NO, PROCEED TLZ T1,-1 ;CLEAR LH OF T1 PUSHJ P,VIRADR ;GET UPMP ENTRY JUMPE T1,CPOPJ ;EXIT WITH EMPTY BUFFER IF NO PAGE CAIN T1,PM.ZER ;ALLOCATED BUT ZERO? POPJ P, ;YES, EXIT GTUCR1: PUSHJ P,FINCHK ;WATCH OUT FOR HIS GETTING SWAPPED REDPEK: PUSHJ P,DOJBPK ;TRY TO READ CORE JRST REDSWP ;NOT IN CORE, READ SWAPPING SPACE POPJ P, ;THAT WAS NICE ;STILL IFN FTUNSUPPORTED ;HERE TO CHECK WHETHER JOB IN J IS BEING SWAPPED NOW. ; IF SO, WAIT UNTIL HE GETS IN OR OUT, AND GIVE ; NON-SKIP RETURN IF HE JUST CAME IN ;READS THSOFF AND ASSUMES HI SEG WANTED IF NON-ZERO FINCHK: PUSH P,T1 ;SAVE WORK REG TRZ F,R.SWIN ;ASSUME NO KNOWLEDGE FINCK1: HRROI T1,.GTSGN ;[531] GET SEGMENT NUMBER FOR JOB SKIPE THSOFF ;[531] SKIP IF EXAMINING LOW SEG PUSHJ P,GTBSPY ;[531] DON'T COME BACK WITHOUT IT! MOVEI T1,(J) ;[531] IF NO HI SEG, USE JOB NUMBER MOVEM T1,FNCJBJ ;SAVE FOR DEBUGGING MOVSI T1,(T1) ;[531] INDEX IN LH HLLM T1,-1(P) ;[531] REMEMBER THIS! IFN .GTSTS, ;[531] PLAN AHEAD PUSHJ P,GTBSPY ;[531] GET STATUS JRST TPOPJ ;[531] WE TRIED MOVEM T1,FNCJBS ;SAVE FOR DEBUGGING TLNN T1,JNSWP ;[531] RETURN IF SEGMENT LOCKED TLNN T1,JSWP ;[531] LEARN MORE IF SWAPPED OR SWAPPING JRST TPOPJ ;[531] GO HOME, BOY HLL T1,-1(P) ;[531] RESTORE INDEX HRRI T1,.GTADR ;[531] GET PROTECTION AND RELOCATION PUSHJ P,GTBSPY ;[531] FIND IT JRST TPOPJ ;[531] LOSE MOVEM T1,FNCJBA ;SAVE FOR DEBUGGING JUMPE T1,FINCK2 ;JUMP IF SWAPPED AND QUIESCENT TRO F,R.SWIN ;SWAPPING NOW, ASSUME COMING IN MOVEI T1,1 ;GET A SMALL CONSTANT HIBER T1, ;WAIT A JIFFIE SLEEP T1, ;OR A SECOND IF NO HIBER JRST FINCK1 ;LOOK AGAIN FINCK2: TRZ F,R.SWIN ;ON SWAPPING SPACE, CAN'T BE COMING IN JRST TPOPJ ;AND PROCEED ;SUBROUTINE TO GET UPMP ENTRY FOR VIRTUAL ADDRESS ;ARGS T1=VIRTUAL ADDRESS ; THSOFF=START OF THIS SEGMENT ; USRUPM=USER'S PAGE MAP PAGE ;VALUES T1=UPMP ENTRY FOR PAGE VIRADR: ADD T1,THSOFF ;GET START OF SEGMENT ROT T1,-^D10 ;GET (PAGE NUMBER)/2 SKIPGE T1 ;IF NEGATIVE, USE RH(POINTER) FROM UPMP SKIPA T1,USRUPM(T1) ;GET RH (POINTER) AND SKIP MOVS T1,USRUPM(T1) ;GET LH(POINTER) TLZ T1,-1 ;CLEAR LH POPJ P, ;AND RETURN ;STILL IFN FTUNSUPPORTED ;HERE IF MUST READ SWAPPING SPACE REDSWP: PUSHJ P,FINCHK ;DID WE LOSE BECAUSE MON DECIDED TO SWAP? TRZE F,R.SWIN ;DID WE SEE HIM COME IN? JRST REDPEK ;YES, AND HE'S NOW IN CORE PUSH P,T3 ;SAVE JOBPEK ARGS PUSH P,T4 HRRZ T1,SEGSWP ;GET SEGMENT NUMBER CAIN T1,(J) ;HIGH SEGMENT? JRST REDSW7 ;NO,PROCEED HRLZ T1,SEGSWP ;YES, GET SEGMENT NUMBER IFN .GTSTS, ;JOB STATUS TABLE PUSHJ P,GTBSPY ;GET HIGH SEGMENT STATUS JRST [PUSHJ P,E.HSTS ;PRINT MESSAGE JRST REDEND] TLNE T1,JSHR ;SHARABLE HIGH SEGMENT? JRST REDSW1 ;YES, TREAT AS PER PRE 6.01 REDSW7: PUSHJ P,GTUPMP ;GET THE JOB'S UPMP JRST [PUSHJ P,E.UPMP ;PRINT MESSAGE JRST REDEND] MOVEI T1,(P1) ;GET SOURCE ADDRESS PUSHJ P,VIRADR ;GET UPMP ENTRY FOR ADDRESS HRLM T1,SEGSWP ;SET UP POINTER FOR REDPEC HLRZ T1,P1 ;GET LENGTH ADDI T1,-1(P1) ;GET LAST ADDRESS XORI T1,(P1) ;[530] CANCEL ALL BITS WHICH AGREE TRNN T1,-1-PG.BDY ;IF LEFTMOST 9 BITS=0, ALL ON ONE PAGE JRST REDSW6 ;ON ONE PAGE, CONTINUE ;HERE IF "FRAGMENTED" I.E. CORE TO GET FLOWS ACROSS PAGE BOUNDARY MOVEI P2,USRCOR-1 ;FIRST ADR FOR IOWD HLRZ P3,P1 ;GET NUMBER OF WORDS TO GET HRRZ T1,P1 ;GET ADDRESS OF FIRST WORD TRZ T1,-BLKSIZ ;WORDS TO BE SKIPPED IN FIRST BLOCK ADD P3,T1 ;MUST READ NOT WANTED WORDS TOO MOVE P4,T3 ;SAVE POINTER TO UPMP MOVE T4,P1 ;GET ADDRESS PUSH P,P1 ;SAVE USER ARGUMENT POINTER REDSW3: MOVE T3,-2(P) ;GET JOBPEK ARG TRZ T4,BLKSIZ-1 ;[567] ROUND OFF ADR TO BLOCK SIZE HRLI T4,1(P2) ;SET UP DESTINATION ADDRESS HRRZ T1,T4 ;[572]GET START ADDRESS TRZ T1,PG.BDY ;GET FIRST ADDRESS IN PAGE ADDI T1,PG.SIZ ;GET NEXT PAGE ADDRESS HRRZ T2,T4 ;[572]GET START ADDRESS AGAIN SUB T1,T2 ;GET WORD COUNT CAIL T1,(P3) ;LESS THAN TOTAL? MOVEI T1,(P3) ;NO, USE SHORTER OF TOTAL OR BOUND HRR T3,T1 ;AND SET UP JOBPEC ARG MOVEI T2,T3 ;SET UP JOBPEK POINTER AC PUSHJ P,DOJBPK ;AND TRY TO GET FROM CORE JRST REDSW4 ;FAIL, GET FROM SWAPPING SPACE ADDI P2,(T3) ;UPDATE ADDRESS IN BUFFER SUB P3,T1 JRST REDSW5 REDSW4: SUB P3,T1 MOVN T2,T1 HRLZS T2 HRR T2,P2 ADDM T1,P2 HLRZ T4,SEGSWP ;GET SWAPPING POINTER JUMPE T4,REDSW5 ;IF DOESN'T EXIST, DON'T TRY TO READ HRRZ T3,P1 ;[567] ADDR IN USER SPACE LSH T3,-B2WLSH ;[567] CONVERT TO BLOCKS ANDI T3,<1_BLKSPP>-1 ;[567] BLOCK OFFSET WITHIN PAGE CAIE T4,PM.ZER ;SKIP IF ALLOCATED BUT ZERO PAGE PUSHJ P,REDPEC ;READ FROM SWAPPING SPACE REDSW5: JUMPE P3,REDSW8 ;FINISHED IF ZERO, CLEAN UP BUFFER MOVEI T1,(P1) ;GET ORIGINAL ADDRESS ADDI T1,PG.SIZ ;BUMP TO NEXT PAGE PUSHJ P,VIRADR HRLM T1,SEGSWP ;SET UP POINTER FOR REDPEC ADDI P1,PG.SIZ TRZ P1,PG.BDY MOVEI T4,(P1) ;NEXT ADDRESS IN USER CORE JRST REDSW3 ;GET REST OF USER CORE REDSW8: POP P,P1 ;RESTORE USER CORE POINTER JRST REDEND ;AND CLEAN UP REDSW1: HRLZ T1,SEGSWP ;LH=SEGMENT NUMBER HRRI T1,.GTSWP ;SWAPPING PTR TABLE PUSHJ P,GTBSPY ;GET SWAP PTR JRST [PUSHJ P,E.SPTR JRST REDEND] HLLM T1,SEGSWP ;SAVE PTR TO SEGMENT ON SWAPPING SPACE HLRE T3,T1 ;T1=SWAP PTR OR -1 IF IN CORE AOJE T3,REDEN2 ;EXIT IF IN CORE - TRY JOBPEK AGAIN HRRZ T3,P1 ;ADDR DESIRED LSH T3,-B2WLSH ;T3=BLOCKS TO SKIP JUMPL T1,FRAG ;JUMP IF FRAGMENTED JRST REDSW2 ;ALL ONE PIECE REDSW6: MOVEI T3,(P1) ;GET START ADDRESS ANDI T3,600 ;GET BLOCK RELATIVE TO PAGE START ROT T3,-7 ;GET INTO PROPER POSITION FOR REDPEC ;STILL IFN FTUNSUPPORTED ;HERE IF NOT FRAGMENTED, ALL ONE PIECE REDSW2: HLRZ T2,P1 ;LENGTH IN WORDS HRRZ T1,P1 ;ADDR DESIRED TRZ T1,-BLKSIZ ;MAKE WORDS TO SKIP IN FIRST BLOCK ADD T2,T1 ;MUST READ THE WORDS TO SKIP TOO MOVNS T2 ;MINUS LENGTH HRLZS T2 ;IN LH HRRI T2,USRCOR-1 ;MAKE IOWD PTR HLRZ T4,SEGSWP ;GET POINTER FROM UPMP JUMPE T4,REDEND CAIE T4,PM.ZER ;SKIP IF 'ALLOCATED BUT ZERO' PAGE PUSHJ P,REDPEC ;READ IT JRST REDEND ;ALL DONE ;STILL IFN FTUNSUPPORTED ;HERE IF FRAGMENTED ON SWAPPING SPACE FRAG: TLZ T1,400000 ;LH T1=ADDR OF BLOCK OF PTRS HLRZ T2,T1 ;IN RH OF T2 MOVEI P2,USRCOR-1 ;FIRST ADDR FOR IOWD HLRZ P3,P1 ;LENGTH OF PIECE DESIRED=WORDS LEFT TO DO HRRZ T1,P1 ;ADDR OF FIRST WORD TRZ T1,-BLKSIZ ;WORDS WHICH WILL BE SKIPPED IN FIRST BLOCK ADD P3,T1 ;MUST READ THEM TOO PUSHJ P,FRGFND ;FIND FIRST BLOCK TO READ JUMPE T1,REDEND ;EXIT IF NO MORE TO READ FRAGS1: HRLM T1,SEGSWP ;SAVE THE PTR, SWAPPED FOR BYTE PTRS HLRZS T1 ;K IN THIS PIECE LSH T1,BLKSPP ;CONVERT TO BLOCKS SUB T1,T3 ;MINUS BLOCKS TO SKIP IN THIS PIECE LSH T1,B2WLSH ;T1=TOTAL DATA WORDS IN THIS PIECE CAML T1,P3 ;SKIP IF LESS THAN WORDS STILL NOT READ MOVE T1,P3 ;THAT'S ALL WE NEED SUB P3,T1 ;SUBTRACT FROM WORDS LEFT TO DO MOVN T2,T1 ;T2=-WORDS THIS TRANSFER HRLZS T2 HRR T2,P2 ;ADDR IN CORE FOR THIS PIECE ADDM T1,P2 ;NEW ADDR AFTER THIS PIECE READ PUSHJ P,REDPEC ;READ THIS PIECE JUMPE P3,REDEND ;JUMP IF NO MORE NEEDED AOS T1,SWPADR ;ADDR OF NEXT SWAPPING PTR FRAG4: PUSHJ P,PEKSPY ;GET NEXT PTR JUMPE T1,REDEND ;QUIT NOW IF NO MORE PTRS SETZ T3, TLC T1,-1 ;SET TO TEST IF PTR TO NEW PTRS TLCE T1,-1 ;SKIP IF PTR TO NEW BLOCK OF PTRS JRST FRAGS1 ;COME BACK THROUGH MOVEM T1,SWPADR ;STORE ADDR OF NEW BLOCK OF PTRS JRST FRAG4 ;AND LOOK FOR NEXT PTR ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO FIND FIRST BLOCK TO READ ;ARGS T2=ADDR OF NEXT WORD OF SWAPPING PTRS ; T3=BLOCKS TO SKIP ;VALUES T1=NEXT SWAPPING PTR ; SWPADR=ADDR OF SWAPPING PTR FRGFND: HRRZ T1,T2 ;T1=ADDR OF NEXT WORD OF SWAPPING PTRS PUSHJ P,PEKSPY ;T1=NEXT SWAPPING PTR JUMPE T1,CPOPJ ;QUIT NOW IF NO MORE TLC T1,-1 ;SET TO TEST IF REAL PTR TLCN T1,-1 ;SKIP IF REAL PTR JRST FRAG2 ;ADDR OF NEW BLOCK OF PTRS JUMPE T3,FRAGST ;START HERE IF NO MORE BLOCKS TO SKIP HLRZ T4,T1 ;T4=K IN THIS PIECE LSH T4,BLKSPP ;CONVERT TO BLOCKS SUB T3,T4 ;T3=BLOCKS LEFT TO SKIP JUMPL T3,FRAG3 ;USE THIS IF STARTS IN THIS PIECE AOJA T2,FRGFND ;RH=ADDR OF NEXT PTR FRAG2: HRRZ T2,T1 ;RH=ADDR OF NEW BLOCK OF PTRS JRST FRGFND ;START CHASING THAT FRAG3: ADD T3,T4 ;T3=BLOCKS TO SKIP IN THIS PIECE FRAGST: MOVEM T2,SWPADR ;SAVE ADDR OF THIS PTR POPJ P, ;STILL IFN FTUNSUPPORTED ;HERE WHEN ALL THE PIECES READ REDEND: HRRZ T1,P1 ;ADDR DESIRED TRZ T1,-BLKSIZ ;CLEAR OUT ALL BUT ADDR IN 1ST BLOCK JUMPE T1,REDEN0 ;JUMP IF FIT EXACTLY AT BEGINNING OF BLOCK HRLZI T1,USRCOR(T1) ;ADDR OF ACTUAL START OF DATA HRRI T1,USRCOR ;BEGINNING OF BUFFER HLRZ T2,P1 ;LENGTH OF DATA BLT T1,USRCOR-1(T2) ;MOVE UP DATA TO BEGINNING OF BUFFER REDEN0: HLRZ T2,P1 ;RE-GET LEN IN CASE JUMPED HERE CAIE T2,MAXUCR ;UNLESS FULL BUFFER, SETZM USRCOR(T2) ;CLEAR FIRST UNUSED LOC CAIL T2,MAXUCR-1 ;MORE THAN 1 UNUSED LOC? JRST REDEN1 ;NO, CLEAR NO MORE HRLZI T1,USRCOR(T2) ;FIRST UNUSED LOC HRRI T1,USRCOR+1(T2) ;SECOND " " BLT T1,USRCOR+MAXUCR-1 ;CLEAR TO END OF BUFFER REDEN1: MOVEI T1,SWP ;[535] SET UP CHANNEL PUSHJ P,RELDSK ;[535] GO RELEASE IT REDEN2: POP P,T4 ;RESTORE JOBPEK ARGS POP P,T3 MOVEI T2,T3 ;ADDR OF JOBPEK BLOCK PUSHJ P,DOJBPK ;TRY AGAIN IN CASE JUST CAME INTO CORE JFCL ;COULD HAPPEN FOR SHARABLE HIGH SEG POPJ P, ;SUBROUTINE TO READ SWAPPING SPACE ;ARGS T2=IOWD ; T3=BLOCKS TO SKIP ; SEGSWP=SWAPPING PTR ;VALUES T1=BLOCK NUMBER READ REDPEC: PUSH P,T2 ;SAVE IOWD LDB T4,JBYSUN ;LOGICAL UNIT IN SWAPPING LIST LDB T1,JBYLKN ;LOGICAL K IN SWAPPING SPACE LSH T1,BLKSPP ;CONVERT TO BLOCKS PUSHJ P,GETSWP ;SETUP SWPUNI AND SWPSLB JRST E.SWPE ;ERROR ADD T1,SWPSLB ;+FIRST BLOCK FOR SWAPPING=BEGINNING ON SWAP SPACE ADD T1,T3 ;PLUS BLOCKS TO SKIP MOVEI T2,.IODMP ;DUMP MODE MOVE T3,SWPUNI ;GET NAME OF UNIT SETZ T4, OPEN SWP,T2 JRST [POP P,T2 ;RESTORE T2 JRST E.SOPN] ;GIVE MESSAGE AND RETURN PUSH P,T1 ;SAVE BLOCK NUMBER TLO T1,SWP_5 ;(555) (WAS HRLI)PUT CHANNEL NUMBER IN LH SUSET. T1, ;DO THE SUSET. USETI SWP,(P) ;TRY SUPER USETI IF SUSET. FAILS POP P,T1 ;RESTORE THE BLOCK NUMBER POP P,T2 ;RESTORE IOWD ;CONTINUED ;STILL IFN FTUNSUPPORTED SETZ T3, INPUT SWP,T2 ;READ STATO SWP,IO.ERR!IO.EOF ;SKIP IF ERRORS POPJ P, AOS SWRGUF ;COUNT SWAP READ ERROR ERROR ,NOCRLF SWPIO1: PUSH P,T1 ;SAVE BLOCK NUMBER READ GETSTS SWP,T1 ;READ ERROR STATUS HRLM T1,-1(P) ;SAVE NEXT TO RETURN ADDR LDB T2,JBYSUN ;GET SWAP UNIT NUMBER MOVE T2,SWPUNI ;T2=UNIT NAME PUSHJ P,TSIXN ;TYPE IT TELL < Status >,NOCRLF HLRZ T1,-1(P) ;SAVE STATUS PUSHJ P,TOCT ;TYPE STATUS TELL < Pntr >,NOCRLF MOVE T1,SEGSWP ;GET BAD POINTER PUSHJ P,TOCT ;TYPE IN OCTAL TELL < SLB >,NOCRLF MOVE T1,SWPSLB ;GET 1ST LOGICAL BLOCK FOR SWAPPING PUSHJ P,TOCT ;TYPE IN OCTAL PUSHJ P,OCRLF ;FORCE MESSAGE TO OPR HLRZ T1,-1(P) ;RESTORE STATUS TRZ T1,IO.ERR!IO.EOF ;CLEAR ERROR BITS SETSTS SWP,(T1) ;CLEAR ERROR PUSHJ P,SNH ;CHECK FOR UUO JRST TPOPJ ;RESTORE T1 AND EXIT ;SUBROUTINE TO SETUP SWPUNI AND SWPSLB FOR THE SWAP UNIT WHICH ;WE WANT TO READ. ;ARGS T4=OFFSET IN SWPTAB ;VALUES SWPUNI=SIXBIT NAME OF UNIT ; SWPSLB=LOGICAL BLOCK OF START OF SWAPPING SPACE ON THIS UNIT ;RETURNS CPOPJ IF INCONSISTENCY DETECTED ; CPOPJ1 IF ALL OK GETSWP: CAML T4,SWPMAX ;IS SWPTAB OFFSET LEGAL? POPJ P, ;NO, RETURN ERROR PUSH P,T1 ;SAVE T1 MOVE T1,SWPTAB ;GET ADDRESS OF SWPTAB ADD T1,T4 ;INCLUDE OFFSET PUSHJ P,PEKSPY ;GET ADDRESS OF UDB JUMPE T1,TPOPJ ;ERROR IF ZERO PUSH P,T1 ;SAVE ADDRESS FOR LATER PUSHJ P,PEKSPY ;READ UDBNAM JUMPE T1,[POP P,(P) ;CLEAN UP STACK JRST TPOPJ] ;GIVE NON-SKIP RETURN MOVEM T1,SWPUNI ;SAVE FOR CALLER POP P,T1 ;GET UDB ADDRESS BACK ADD T1,UNISLB ;PLUS OFFSET TO UNISLB PUSHJ P,PEKSPY ;READ FIRST BLOCK FOR SWAPPING JUMPLE T1,TPOPJ ;MUST BE POSITIVE MOVEM T1,SWPSLB ;SAVE FOR CALLER JRST TPOPJ1 ;GIVE SUCCESS RETURN SUBTTL SUBROUTINES ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO OUTPUT A CARRIAGE RETURN LINE FEED FOR DUMP CCL FILE CCCRLF: MOVEI SC,.CHCRT ;CARRIAGE RETURN PUSHJ P,CCOUT ;OUTPUT CHAR TO CCL FILE MOVEI SC,.CHLFD ;LINE FEED - FALL INTO CCOUT ;SUBROUTINE TO OUTPUT A CHARACTER ON DUMP CCL FILE ;ARGS SC(=16)=CHAR CCOUT: SOSG C.BH+2 OUTPUT DSK, IDPB SC,C.BH+1 POPJ P, > ;END IFN FTUNSUPPORTED IFN FTSVSL!FTUNSUPPORTED,< ;SUBROUTINE TO COPY USER'S SEARCH LIST ;ARGS T1=JOB NUMBER ; T2=PPN ; T3=ADDRESS-1 OF BLOCK TO STORE SEARCH LIST GETSRC: MOVEM T1,GOBBUF+.DFGJN ;USER'S JOB NUMBER MOVEM T2,GOBBUF+.DFGPP SETOM GOBBUF+.DFGNM ;START AT BEGINNING OF JOB'S SEARCH LIST GETSR1: MOVE T1,[.DFGST+1,,GOBBUF] GOBSTR T1, ;GET NEXT STR IN JOB'S SEARCH LIST POPJ P, ;ALL DONE MOVE T1,GOBBUF+.DFGNM ;NEXT STR JUMPE T1,CPOPJ ;EXIT IF FENCE OR AOJE T1,CPOPJ ; IF END OF LIST PUSH T3,GOBBUF+.DFGNM ;STORE NAME PUSH T3,GOBBUF+.DFGNM+1 ;AND UNUSED WORD PUSH T3,GOBBUF+.DFGST ;AND STATUS WORD JRST GETSR1 ;LOOP TILL END OF LIST > ;END IFN FTSVSL!FTUNSUPPORTED IFN FTUNSUPPORTED,< ;SUBROUTINE TO GET JOB'S DEFAULT PATH ;ARGS J=JOB NUMBER WHOSE PATH TO READ ;VALUE T1=POINTER TO PATH SPEC, OR PPN IF SFD'S NOT IMPLEMENTED GETPTH: HRLOI T1,(J) ;READ JOB'S PATH FUNCTION MOVEM T1,D.DPTH ;AT TOP OF PATH BLOCK MOVE T1,[XWD .PTMAX,D.DPTH] PATH. T1, PJRST GETPPN ;NO SFD'S-RETURN PPN MOVEI T1,D.DPTH ;POINT TO PATH LIST POPJ P, > ;END FTUNSUPPORTED ;SUBROUTINE TO GET JOB'S PPN ;ARGS J=JOB NUMBER ;VALUE T1=PPN GETPPN: HRROI T1,.GTPPN ;SETUP JBTPPN INDEX GTBDFL: PUSHJ P,GTBSPY SETZ T1, POPJ P, ;SUBROUTINE TO GET JOB # FROM DDB ;ARGS T1=ADDRESS OF DDB ;VALUES T1=JOB # DDBJOB: ADD T1,LDDBSH ;ADD IN LENGTH OF SHORT DDB SUBI T1,1 ;DEVJOB IS LAST WORD IN SHORT DDB PUSHJ P,PEKSPY ;GO PICK IT UP ANDI T1,777 ;ONLY RIGHT 9 BITS ARE JOB NUMBER POPJ P, ;RETURN ;HERE TO RELEASE A CHANNEL ;ARG=CHANNEL # IN T1 T1,T2,T3 DESTROYED ;THIS ROUTINE KEEPS CHANNEL DDB AROUND IN CASE OF A SOFT ERROR ; ON OURSELF THAT WE MAY SHORTLY BE ASKED TO RECORD RELFCT: MOVEI T1,FCT ;ENTER HERE TO GIVE UP FCT CHANNEL RELDSK: DPB T1,[POINT 4,RELINS,12] ;[535] PUT CHANNEL IN RELEASE INSTR. SETZ T2, ;[535] GIVE TO JOB 0 (DEASSIGN) MOVSI T3,'KLG' ;[535] LOGICAL NAME WE WANT REASSI T2, ;[535] GIVE AWAY IF ALREADY EXISTS MOVSI T2,'KLG' ;[535] SET UP KLUDGE AGAIN DEVLNM T1, ;[535] GIVE OUR CHANNEL THAT LOGICAL NAME JRST RELDS1 ;[535] SNH SETO T1, ;[535] REASSIGN TO OUR JOB LDB T2,[POINT 4,RELINS,12] ;[535] CHANNEL NO. TO ASSIGN REASSI T1, ;[535] GET IT RELDS1: XCT RELINS ;[535] NOW RELEASE FOR REAL POPJ P, ;[535] DONE IFE FTUNSUPPORTED,< ;SUBROUTINE TO PERFORM A JOBPEK UUO AND CHECK THE ERROR CODE IF ;THE UUO TAKES THE ERROR RETURN. FOR READS, THE CALLER MUST HAVE ;ZEROED THE BUFFER BEFORE THE CALL SINCE THIS ROUTINE GIVES A ;SUCCESSFUL RETURN ON JKABZ% (ALLOCATED BUT ZERO) ERRORS. ;CALL: MOVE T2,JOBPEK ARG ; PUSHJ P,DOJBPK ;RETURNS CPOPJ IF THE JOBPEK SUCCEEDED WITH THE DATA TRANSFERRED ; CPOPJ1 IF THE JOBPEK CAUSED AN ILLEGAL ADDRESS ERROR ; (JKIAD%) ; CPOPJ2 IF THE JOBPEK CAUSED ANY OTHER ERROR WITH AN APPROPRIATE ; ERROR MESSAGE ISSUED ;RESPECTS T1 DOJBPK: PUSHJ P,SAVE4 ;GET SOME AC'S TO USE PUSH P,0(T2) ;HAVE TO MOVE THE ARGS TO P1 AND P2 VIA PUSH P,1(T2) ; THE STACK SINCE WE DON'T KNOW WHERE POP P,P2 ; THE ARGS ARE (THEY MAY BE P1 AND POP P,P1 ; P2 MOVEI P3,(P1) ;SET P3:=WORDS LEFT TO DO DOJBP1: HRRZ T2,P2 ;ASSUME WRITING, GET WRITE ADDRESS TXNN P1,JK.WRT ;ARE WE WRITING USER CORE? HLRZ T2,P2 ;NO, GET READ ADDRESS MOVEI P4,(T2) ;COPY THE USER ADDRESS TO P4 TRO P4,PG.BDY ;INCREASE TO LAST WORD IN PAGE SUBI P4,-1(T2) ;COMPUTE NUMBER OF WORDS LEFT IN PAGE CAIGE P4,(P3) ;DO WE HAVE MORE THAN WE NEED? HRRM P4,P1 ;NO, USE WHAT WE HAVE SUBI P3,(P1) ;ACCOUNT FOR THOSE THAT WE CAN DO MOVEI T2,P1 ;GET ADDRESS OF OUR JOBPEK BLOCK JOBPEK T2, ;TRANSFER THE DATA JRST DOJBP3 ;FAILED, ANALYZE THE ERROR DOJBP2: JUMPLE P3,CPOPJ ;RETURN IF ALL WORDS ARE DONE MOVEI P4,(P1) ;GET THE NUMBER OF WORDS WE DID HRLS P4 ;DUPLICATE IN BOTH HALVES ADD P2,P4 ;STEP THE ADDRESSES FOR THOSE THAT WE DID HRRM P3,P1 ;TRY FOR THE REST THIS TIME JRST DOJBP1 ;TRY FOR MORE DOJBP3: CAIN T2,JKABZ% ;WAS THE PAGE ALLOCATED BUT ZERO? JRST DOJBP2 ;YES, THAT'S OK. CAIN T2,JKIAD% ;ILLEGAL ADDRESS? JRST CPOPJ1 ;YES, WE EXPECT THAT ONE AOS 0(P) ;SETUP FOR CPOPJ2 RETURN ;CONTINUED ON THE NEXT PAGE ;CONTINUED FROM THE PREVIOUS PAGE ;HERE IF THE JOBPEK FAILED WITH A CODE THAT WE DON'T EXPECT. PRINT ;EVERYTHING WE KNOW ABOUT THE FAILURE IN THE HOPE THAT SOMEBODY CAN ;DEBUG IT. WARN ,OPR TELL ,NOCRLF ;DUMP WHAT WE KNOW ABOUT THE ERROR MOVE T1,T2 ;GET THE ERROR CODE PUSHJ P,TOCT ;TYPE IT TELL <, JOBPEK wd1=>,NOCRLF MOVE T1,P1 ;GET FIRST WORD OF ARG BLOCK PUSHJ P,THALF ;TYPE IT TELL <, JOBPEK wd2=>,NOCRLF MOVE T1,P2 ;GET SECOND WORD OR ARG BLOCK PUSHJ P,THALF ;TYPE IT PUSHJ P,OCRLF ;END THE LINE AND PUT IT OUT TELL ,NOCRLF MOVE T1,J ;JOB NUMBER PUSHJ P,TDEC ;... TELL <, JBTSTS=>,NOCRLF HRROI T1,.GTSTS ;GETTAB FOR JBTSTS PUSHJ P,GTBDFL ;GET THE VALUE PUSHJ P,THALF ;TYPE IT TELL <, JBTADR=>,NOCRLF HRROI T1,.GTADR ;GETTAB FOR JBTADR PUSHJ P,GTBDFL ;GET THE VALUE PUSHJ P,THALF ;TYPE IT PUSHJ P,OCRLF ;END THE LINE JRST CPOPJ1 > IFN FTUNSUPPORTED,< ;SUBROUTINE TO PERFORM A JOBPEK UUO AND CHECK THE ERROR CODE IF ;THE UUO TAKES THE ERROR RETURN. ;CALL: MOVE T2,JOBPEK ARG ; PUSHJ P,DOJBPK ;RETURNS CPOPJ IF JOB NOT IN CORE ;RETURNS CPOPJ1 IF DATA READ/WRITTEN ;RESPECTS T1 DOJBPK: JOBPEK T2, ;TRANSFER THE DATA CAIA ;FAILED, ANALYZE ERROR CODE JRST CPOPJ1 ;AND GIVE SKIP RETURN CAIE T2,JKSWP% ;JOB SWAPPED? CAIN T2,JKPNC% ; OR PAGE NOT IN CORE? POPJ P, ;YES, GIVE NON-SKIP RETURN WARN ,NOCRLF MOVE T1,T2 ;GET THE ERROR CODE PUSHJ P,TOCT ;TYPE IT TELL < for job >,NOCRLF MOVE T1,J ;GET JOB NUMBER PUSHJ P,TDEC ;TYPE IT PUSHJ P,E.SWP1 ;CLEAN UP LINE; DON'T RETURN IF UUO JSP T1,INTRE1 ;ABORT FUNCTION > ;END IFN FTUNSUPPORTED ;ROUTINE TO RESTART AFTER ERROR INTERCEPT ;ARGS INTRES CONTAINS ADDRESS TO RESTART AT INTRES: SKIPE .JBBPT ;IS DDT PROBABLY LOADED? JSR @.JBBPT ;YEAH, CALL IT IN THEN PUSH P,INTBLK+2 ;[537] SAVE INT PC PUSH P,T1 ;[537] SAVE AC FOR INT ROUTINE SETZB T1,INTBLK+2 ;[537] AND ENABLE INTERRUPTS AGAIN EXCH T1,INTBLK+3 ;[537] GRAB & CLEAR REASONS MOVEM T1,INTFLG ;SAVE FOR DEBUG IFN FTUNSUPPORTED,< TLNE F,L.SAVE ;ARE WE IN THE MIDDLE OF A SAVE? TLNN T1,2 ;[537] AND IS THIS A CONTROL-C SKIPA T1,-1(P) ;NO, GET PC AND CONTINUE JRST TPOPJ ;[537] RESTORE T1 AND RETURN > IFE FTUNSUPPORTED,< MOVE T1,-1(P) ;GET PC > INTRE1: TLZ F,L.OPR!L.QUE ;MAKE SURE OPR MESSAGE BIT IS CLEAR IFN FTUNSUPPORTED,< SETZM MSGLIN ;CLEAR MESSAGE LINE > MOVEM T1,INTPC ;SAVE PC FOR DEBUG GETLIN T1, ;GET LINE NUMBER TLNN F,L.INI ;ERROR DURING INITIALIZATION? TLNN T1,-1 ;ATTACHED? JRST REGO ;NO--RESTART SETO T1, ;INDICATE CURRENT LINE "7-53" GETLCH T1 ;GET LINE NUMBER SKIPE .JBDDT ;GOT DDT LOADED? JRST REGO1 ;YES, DON'T DETATCH HRLZI T1,(T1) ;LH=LINE, RH=DETACH ATTACH T1, ;DO A DET AOS ATTGUF ;WE TRIED REGO: IFN FTUNSUPPORTED,< HRRZ T1,.JBDDT ;ADDR OF DDT IF ANY JUMPE T1,REGO1 ;DONT ATTACH ORIGINAL LINE IF NO DDT HRLZ T1,THSLIN ;OUR LINE NUMBER HRR T1,THSJOB ;OUR JOB NUMBER TLO T1,(AT.UUM) ;SET TO USER LEVEL ATTACH T1, ;TRY TO REATTACH OUR TTY AOS ATTGUF ;DEBUG - COUNT ATTACH FAILURES > REGO1: AOS T1,INTGUF ;COUNT THE INTERCEPTS CAIL T1,MAXINT ;TOO MANY? ERROR ,STOP HRRZ T1,-1(P) ;[537] RETURN WITH PC IN T1 IFN FTUNSUPPORTED,< TLZ F,L.DUMP ;NOT IN A DUMP ANYMORE ;DUMP BECOMES DCORE, SINCE DUMP INCOMPLETE > TLNE F,L.DSK ;READING FROM A CRASH FILE? JRST E.CRSE ;YES, SPECIAL HANDLING MOVE P,PDL ;RESET PUSH DOWN POINTER JRST @INTADR ;COME HERE ON INTERCEPT DURING STARTUP E.EINT: PUSHJ P,TYPIPC ;TYPE MESSAGE AND PC PUSHJ P,OCRLF ;END LINE JRST DAEREN ;QUIT ;COME HERE ON INTERCEPT DURING CRASH FILE PROCESSING E.CRSE: PUSHJ P,TYPIPC ;TYPE MESSAGE AND PC TELL < reading crash file from >,NOCRLF MOVE T2,D.DEV ;GET DEVICE PUSHJ P,TSIX ;TYPE IT PUSHJ P,OCRLF ;END THE LINE JRST CRSEND ;GIVE UP ;HERE TO TYPE MESSAGE AND PC FOR ERROR DURING STARTUP TYPIPC: ERROR ,NOCRLF PJRST TOCT ;PRINT IN OCTAL IFN FTUNSUPPORTED,< ;SUBROUTINE TO CHECK USER ADDRESS ;ARGS T1=XWD +LENGTH,START ; J=JOB NUMBER ;VALUES T1=XWD +LENGTH, ADDR IN SEGMENT ; T2=JOB OR SEGMENT ; THSOFF SET IF HISEG ;RETURN CPOPJ IF BAD ADDRESS ; CPOPJ1 IF ADDRESS IS VALID ;ALL AC'S RESPECTED UADCHK: PUSH P,T1 ;PRESERVE LEN,START HLRE T2,T1 SOJL T2,TPOPJ ;NEG OR ZERO LEN NO FAIR PUSHJ P,GTUPMP ;YES, GET THE UPMP FOR THE JOB JRST TPOPJ ;CAN'T FIND ONE?? HLRZ T2,(P) ;GET LENGTH OF BLOCK HRRZ T1,(P) ;GET STARTING ADDRESS SETZ T4, ;CLEAR STORAGE POINTER UADCK1: PUSHJ P,CHKADR ;CHECK C(T1)+C(T4) JRST UADCK3 ;BAD.. CHECK HIGH SEGMENT ADDI T4,^D512 ;ADD SIZE OF PAGE TO STORAGE CAIGE T4,(T2) ;SIZE .GT. 512 WORDS JRST UADCK1 ;YES, CHECK START+512 MOVEI T4,-1(T2) ;NO, NOW CHECK END OF BLOCK PUSHJ P,CHKADR ;CHECK C(T1)+C(T4) JRST UADCK3 ;DOESN'T CHECK, LOOK AT HIGH SEG MOVE T1,(P) ;RESTORE LEN,START ADDI T2,-1(T1) ;[526] ADDR OF LAST WORD IN GROUP UADCK2: POP P,T1 ;RESTORE LEN,,START CAIGE T2,17 ;END IN AC'S? JRST LOSOK ;YES, ITS OK MOVEI T2,(T1) ;GET START CAIGE T2,.JBPFI ;PAST MONITOR RESERVED AREA? POPJ P, ;NO, ERROR LOSOK: MOVEI T2,(J) ;RETURN JOB NUMBER SETZM THSOFF ;AND LOW SEG FLAG JRST CPOPJ1 ;GOOD RETURN ;HERE IF BLOCK NOT IN LOW SEGMENT, CHECK HIGH UADCK3: ADDI T2,(T1) ;T2=END OF GROUP HRROI T1,.GTSGN ;SEGMENT TABLE PUSHJ P,GTBSPY ;GET SEGMENT NUMBER FOR JOB JRST TPOPJ ;VERY STRANGE!! JUMPLE T1,TPOPJ ;NO HIGH SEGMENT, FAIL MOVSI T1,(T1) ;SEGMENT NUMBER AS ITEM HLLM T1,-1(P) ;SAVE ON STACK HRRI T1,.GTUPM ;JBTUPM TABLE PUSHJ P,GTBSPY ;GET ADDRESS JRST TPOPJ ;??? HLRZ T1,T1 ;GET LEFT HALF TRZ T1,PG.BDY ;CLEAR LOW ORDER BITS MOVEM T1,THSOFF ;USE THAT AS OFFSET SUBI T2,(T1) ;GET END RELATIVE TO HIGH SEG JUMPL T2,TPOPJ ;TOO LOW FOR HIGH SEG EXCH T1,0(P) ;PREPARE TO... SUBB T1,0(P) ;GET ADJUSTED LEN,,START ON STACK TRNE T1,400000 ;TROUBLE IF JRST TPOPJ ;START NOT IN HIGH SEG HRROI T1,.GTSGN ;SEGMENT TABLE PUSHJ P,GTBSPY ;FIND SEG NO FOR HI SEG JRST TPOPJ ;STRANGE INDEED JUMPLE T1,TPOPJ ;BOMB IF NO HIGH SEGMENT HRLM T1,-1(P) ;SAVE WITH RETURN ADDR PUSHJ P,JSSIZE ;GET HIGH SEG SIZE JRST TPOPJ CAILE T2,(T1) ;IS END WITHIN HIGH SEG? JRST TPOPJ ;NO HLRZ T2,-1(P) ;GET SEG NO JRST TPOPJ1 ;RESTORE ADJUSTED LEN,,START AND GIVE GOOD RETURN ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO GET THE LENGTH OF A JOB OR SEGMENT ;ARGS T1=JOB OR SEGMENT # ;VALUES T1=0,,HIGHEST LEGAL ADDR RELATIVE TO START OF SEGMENT ;RETURN CPOPJ IF NO SUCH JOB OR SEG NO ; CPOPJ1 IF SUCCESSFUL JSSIZE: MOVSI T1,(T1) ;JOB OR SEG NO AS ITEM HLLM T1,0(P) ;SAVE IT HRRI T1,.GTADR ;PROT,,RELOC TABLE IF JOB IN CORE PUSHJ P,GTBSPY POPJ P, HLRZS T1 ;PROT = LEN OF SEGMENT JUMPN T1,CPOPJ1 ;RETURN UNLESS SWAPPED OUT HLLZ T1,0(P) ;RE-GET JOB (SEG) NO HRRI T1,.GTSWP ;JOBS SWAPPING PARAMS PUSHJ P,GTBSPY POPJ P, ANDI T1,-1-PG.BDY ;NO OF PAGES ON SWAPPING DEVICE SOJA T1,CPOPJ1 ;SUCCESSFUL ;SUBROUTINE TO CHECK AN ADDRESS FOR A 6.01 AND LATER MONITOR ;ARGS T1=0,,BASE ADDRESS ; T3=POINTER TO UPMP ; T4=0,,DISPLACEMENT ;RETURN CPOPJ IF BAD ADDRESS ; CPOPJ1 IF OK ;ALL AC'S RESPECTED CHKADR: PUSH P,T1 ;SAVE T1 ADD T1,T4 ;AND BUILD ADDRESS WE WANT PUSHJ P,VIRADR ;GET UPMP ENTRY FOR ADDRESS SKIPE T1 ;IF ZERO, BAD CHECK CAIN T1,PM.ZER ;SKIP IF NOT AN ALLOCATED BUT ZERO PAGE JRST TPOPJ ;ERROR RETURN JRST TPOPJ1 ;GOOD RETURN ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO READ A JOB'S USER PAGE MAP PAGE (UPMP) INTO CORE ;EITHER VIA A JOBPEK OR BY READING THE JOB'S SWAPPING SPACE. ;DEBUGGERS, NOTE: THIS JOBPEK WORKS INCORRECTLY FOR YOUR OWN JOB!! ;ARGS J=JOB NUMBER ;VALUES T3=0,,ADDRESS OF UPMP BUFFER ;RETURN CPOPJ IF CAN'T GET UPMP FOR ANY REASON ; CPOPJ1 IF SUCCESSFUL ;T1,T2,T4 NOT RESPECTED GTUPMP: TLZ F,L.UPMP ;CLEAR IN CASE WE FAIL SETZM EVAADR ;FORCE NEW READ IN PEKUSR SETZM USRUPM ;CLEAR UPMP BUFFER MOVE T3,[USRUPM,,USRUPM+1] BLT T3,USRUPM+MAXUPM-1 MOVSI T3,<(JK.UPM)>(J) ;GET JOB NUMBER AND UPMP BIT IN LH HRRI T3,MAXUPM ;PLUS NUMBER WORDS TO READ IN RH HRRZI T4,USRUPM ;SET UP DESTINATION ADDRESS MOVEI T2,T3 ;SET UP JOBPEK AC PUSHJ P,DOJBPK ;TRY TO READ UPMP FROM CORE JRST GTUPM1 ;NOT IN CORE, TRY SWAPPING SPACE JRST GTUPM2 ;AND RETURN GTUPM1: PUSHJ P,FINCHK ;MAKE SURE JOB IS NOT CURRENTLY BEING SWAPPED HRROI T1,.GTSWP ;[532] SWAPPING POINTER TABLE PUSHJ P,GTBSPY ;GET SWAPPING POINTER JRST CPOPJ ;CAN'T FIND IT?? HLLM T1,SEGSWP ;SAVE POINTER FOR REDPEC HLRE T2,T1 ;GET THE POINTER AOJE T2,CPOPJ ;IF -1, WE HAVE A PROBLEM MOVSI T2,-MAXUPM ;GET WORD COUNT OF BUFFER HRRI T2,USRUPM-1 ;MAKE AN IOWD SETZ T3, ;CLEAR BLOCK OFFSET PUSHJ P,REDPEC ;READ THE SWAPPING SPACE GTUPM2: MOVE T1,.UPJOB ;GET OFFSET OF JOB # WORD IN UPMP CAME J,USRUPM(T1) ;GOT THE RIGHT UPMP? POPJ P, ;NO, ERROR TLO F,L.UPMP ;MARK THAT A UPMP IS NOW IN CORE MOVEI T3,USRUPM ;[563] JRST CPOPJ1 ;AND GIVE GOOD RETURN SUBTTL OUTPUT SUBROUTINES ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO MARK THE SPOT FOR DATA TO COME LATER IN THE CORE-IMAGE FILE MRKSPT: MOVE T1,PATTERN ;WRITE STANDARD PATTERN PUSHJ P,DWRITE MOVE T1,CURBLK ;CURRENT BLOCK IN FILE MOVEM T1,REMBLK ;SAVE FOR REWRITING LATER MOVEM BP,REMWRD ;AND WORD ADDR SETZM WRDCNT ;START COUNTING WORDS WRITTEN POPJ P, ;SUBROUTINE TO WRITE ONE WORD IN THE CORE-IMAGE FILE ;ARGS T1=WORD TO WRITE DWRITE: AOS WRDCNT ;COUNT WORDS WRITTEN AOBJN BP,DWRT1 ;JUMP IF BUFFER NOT FULL SKIPE CURBLK ;SKIP IF FIRST BLOCK OF FILE PUSHJ P,BLKWRT ;NO, WRITE OUT OLD BLOCK SETZM DAEBUF+1 MOVE BP,[DAEBUF+1,,DAEBUF+2] BLT BP,DAEBUF+177 MOVE BP,BPSTRT ;RESET BYTE PTR TO BEGINNING OF BLOCK ADDI BP,1 ;POINT TO BUFFER AOS CURBLK ;AND BUMP CURRENT BLOCK NUMBER DWRT1: MOVEM T1,(BP) ;STORE WORD IN BLOCK POPJ P, ;SUBROUTINE TO WRITE A BLOCK ;ARGS CURBLK=BLOCK NUMBER TO WRITE BLKWRT: MOVE T2,CURBLK ;BLOCK NUMBER IN FILE SKIPE UPDFLG ;SKIP IF DON'T NEED TO DO USETO USETO DSK,(T2) ;SET TO WRITE THIS BLOCK SETZM UPDFLG ;NOTE THAT WE DONT NEED USETO NEXT TIME OUTPUT DSK,DLIST ;WRITE THE BLOCK STATO DSK,IO.ERR!IO.EOF ;SKIP IF ERRORS ON THE WRITE POPJ P, JRST E.OERR ;STILL IFN FTUNSUPPORTED ;SUBROUTINE TO UPDATE THE WORD MARKED BEFORE FOR UPDATING ;ARGS T1=ACTUAL DATA ; REMBLK=BLOCK NUMBER IN FILE CONTAINING WORD TO WRITE ; REMWRD=ADDR IN DAEBUF OF WORD TO WRITE WRTSPT: MOVE T2,REMBLK ;T2=BLOCK WHICH CONTAINS THE WORD MOVE T4,REMWRD ;T4=ADDR OF WORD IN DAEBUF CAME T2,CURBLK ;SKIP IF STILL IN CURRENT BLOCK JRST WRTSP1 ;NO, MUST UPDATE PREVIOUSLY WRITTEN BLOCK EXCH T1,(T4) ;STORE IN CORE CAME T1,PATTERN ;AND SEE IF WE FOUND THE RIGHT WORD JRST E.BPT ;NO, SOMETHING WENT WRONG POPJ P, ;BEAUTIFUL! ;HERE TO UPDATE A PREVIOUSLY WRITTEN BLOCK WRTSP1: USETI DSK,(T2) ;SET TO READ THE BLOCK INPUT DSK,UPDLST ;READ THE BLOCK STATZ DSK,IO.ERR!IO.EOF ;TEST FOR ERRORS JRST E.WRD ;DIDN'T MAKE IT ADDI T4,SECBUF-DAEBUF;CHANGE ADDR TO POINT TO SECBUF EXCH T1,(T4) ;STORE DATA, GET OLD WORD CAME T1,PATTERN ;COMPARE WITH PATTERN JRST E.BPT ;SOMETHING WENT WRONG USETO DSK,(T2) ;NOW SET TO WRITE THE BLOCK BACK OUT SETOM UPDFLG ;NOTE THAT NEXT REGULAR OUTPUT MUST DO USETO OUTPUT DSK,UPDLST ;REWRITE THE BLOCK STATO DSK,IO.ERR!IO.EOF ;CHECK FOR ERRORS POPJ P, ;OK E.OERR: AOS WRTGUF ;NOTE ERROR ERROR ,NOCRLF JRST E.WRD1 E.WRD: ERROR ,NOCRLF E.WRD1: TELL < error, status = >,NOCRLF GETSTS DSK,T1 PUSHJ P,TOCT PUSHJ P,PCRLF PUSHJ P,SNH ;CHECK FOR UUO JRST E.EEND ;[471]CLOSE AND ABORT E.BPT: EXCH T1,(T4) ;RESTORE ORIGINAL WORD ERROR ,OPR PUSHJ P,SNH E.EEND: MOVEI T2,DSK ;[471]SET UP AND THEN RESDV. T2, ;[471]RELEASE DSK JFCL ;[471]OH WELL... POP P,(P) ;[471]CLEAN UP THE STACK JRST EDECOM ;[471]ABORT THE FUNCTION ;HERE TO OUTPUT A HALF WORD OCTAL NUMBER WITHOUT SUPRESSING LEADING ZEROS TOCTAL: HRLI T1,400000 ;PUT A FLAG IN LH(T1) TOCTA1: MOVEI T2,7 ;GET MASK TO T2 AND T2,T1 ;EXTRACT LOW ORDER 3 BITS LSH T1,-3 ;SHIFT THREE BITS TO RIGHT HRLM T2,(P) ;SAVE LAST NUMBER ON PUSH DOWN LIST TRNN T1,400000 ;FLAG REACHED RH YET? PUSHJ P,TOCTA1 ;NO, LOOP BACK ON PDL HLRZ T1,(P) ;GET LAST NUMBER MOVEI SC,"0"(T1) ;CONVERT TO ASCII PUSHJ P,TYPCHR ;TYPE IT POPJ P, ;AND RETURN > ;END IFN FTUNSUPPORTED ;SUBROUTINE TO PERFORM GETTAB VIA SPY IF POSSIBLE ;ARGS T1=GETTAB ARG ;VALUES T1=GETTAB VALUE ;THERE IS NO NEED TO SUPPORT -2 ITEM (JOBS HIGH SEG) GTBSPY: TLNE F,L.DSK ;[551]ARE WE READING FROM DSK? PJRST GTBDSK ;YES, GET FROM DISK PUSHJ P,SAVE4 ;SAVE P1-P4 MOVEI P1,(T1) ;P1=TABLE NUMBER CAMLE P1,MAXGTB ;SKIP IF LEGAL TABLE JRST GTBGTB ;NO, TRY GETTAB ANYWAY ADD P1,GTBST ;ADDR OF PTR FOR THIS TABLE LDB P3,[POINT 3,0(P1),11] ;GET TYPE OF TABLE CAIE P3,.SLIXI ;RANDOM TABLE? CAIN P3,.SLIXR ; OR RANGED GETTAB? JRST GTBSP2 ;YES, LH=-1 IS NOT OUR JOB JUMPGE T1,GTBSP2 ;IF LH IS NEGATIVE, MAKE INDEX HRLI T1,(J) ; JOB IN J GTBSP2: CAIN P3,.SLIXP ;IS DATUM IN THE PDB? JRST GTBPDB ;YES, GO GET IT CAIN P3,.SLIXS ;INDEXED BY JOB OR SEGMENT NUMBER? SKIPA P2,JBTMXL ;YES, MAX IS JOBN+SEGN-1 LDB P2,[POINT 9,0(P1),8] ;NO. GET MAX ITEM VALUE CAIE P3,.SLIXR ;IS THIS A RANGED GETTAB? JRST GTBSP1 ;NO, P2 CONTAINS 0,,MAX SKIPN P3,RNGTAB ;DO WE HAVE THE ADDRESS OF RNGTAB? JRST GTBGTB ;NO, USE A GETTAB ADDI P2,(P3) ;ADD OFFSET INTO RNGTAB FOR THIS ENTRY MOVE P2,400000(P2) ;GET MIN,,MAX FROM RNGTAB ENTRY GTBSP1: HLRE P3,T1 ;GET ITEM NUMBER CALLER WANTS HRRE P4,P2 ;GET MAX VALUE OF TABLE CAMLE P3,P4 ;.LE. MAX? JRST GTBGTB ;NO, TRY A GETTAB HLRE P4,P2 ;KEEP JUST MIN CAMGE P3,P4 ;AND .GE. MIN? JRST GTBGTB ;NO, TRY A GETTAB MOVE T1,@(P1) ;GET VALUE JRST CPOPJ1 ;GOOD RETURN GTBPDB: SKIPN PDBPTR ;IS JBTPDB BASE AVAILABLE? JRST GTBGTB ;NO. USE A GETTAB HLRZS T1 ;JOB NUMBER ADD T1,PDBPTR ;PLUS JBTPDB ADDRESS MOVE T1,400000(T1) ;GET ADDRESS OF WD 0 OF JOBS PDB JUMPE T1,CPOPJ1 ;RETURN ZERO IF NO PDB ADD T1,(P1) ;ADD ON SPY OFFSET AND ITEM NUMBER ; WHICH WERE BOTH IN GTBST TABLE MOVE T1,(T1) ;GET THE WORD FROM THE PDB JRST CPOPJ1 ;GIVE GOOD RETURN GTBGTB: GETTAB T1, ;TRY GETTAB POPJ P, AOS GTBGUF ;DEBUG--COUNT TIMES WE THOUGHT GETTAB ; WOULD LOSE BUT IT DIDNT JRST CPOPJ1 ;WINS ;SUBROUTINE TO GET DATA FROM GETTAB SUB-TABLE ;ARGS T3= GETTAB ARG FOR SUB-TABLE POINTER ; T2= SUBTABLE ARG: TABLE# CONTAINING SUBTABLE,,ITEM # ;VALUE T1= DESIRED ITEM ;SKIP RETURN IF ITEM DEFINED GSUBTB: PUSH P,T3 ;SAVE THAT ARG CAMN T3,LSTSTP ;SAME SUBTABLE POINTER AS LAST TIME? JRST [MOVE T1,LSTSTV ;YES, GET LAST VALUE JRST GSUBT1] ;AND JOIN COMMON CODE MOVEM T3,LSTSTP ;SAVE THIS SUBTABLE POINTER FOR NEXT TIME MOVE T1,T3 ;GET SUBTABLE POINTER PUSHJ P,GTBSPY JRST GSUBTX ;TOO BAD, NO SUBTABLE MOVEM T1,LSTSTV ;SAVE VALUE OF POINTER FOR QUICK CHECK GSUBT1: JUMPE T1,GSUBTX ;NO SUBTABLE EXISTS LDB T3,[POINT 9,T1,8] ;GET UPPER LIMIT ON SUBTABLE CAIGE T3,0(T2) ;COMPARE DESIRED ITEM # JRST GSUBTX ;OOPS, OFF THE END HRRZS T1 ;SUBTABLE POINTER IS AN ITEM NUMBER ADD T1,T2 ;WITH SUB-ITEM AND TABLE MOVSS T1 ;SWAP TO GETTAB FORM PUSHJ P,GTBSPY ;GETTAB THAT JRST GSUBTX ;LOSE AOS -1(P) ;WIN, TAKE SKIP RETURN GSUBTX: POP P,T3 ;RESTORE T3 POPJ P, ;SUBROUTINE TO READ MONITOR LOW SEGMENT VIA SPY OR PEEK. ALSO HANDLES ;PER-PROCESS ADDRESSES FOR THE CURRENT JOB (C(EVAPPB) THRU C(EVAPPE)-1) ;ARGS T1=ADDR OF LOCATION DESIRED ;VALUES T1=CONTENTS OF LOCATION PEKSPY: TLNE F,L.DSK ;READING FROM DSK? PJRST PEKDSK ;YES, GET FROM DISK SKIPN FTKLP ;THIS KL PAGING? TLZA T1,-1 ;NO, MAKE IT AN 18 BIT ADDRESS TLNN T1,777776 ;YES, IS IT SECTION 0 OR 1? TLZ T1,-1 ;YES, MAP SECTION 1 TO 0 CAML T1,EVAPPB ;IN FUNNY SPACE FOR THIS CAML T1,EVAPPE ; JOB? CAIA ;NO PJRST PEKUSR ;YES, GO GET IT TDNN T1,[-1,,400000] ;IF NOT IN MONITOR LOW SEG, DO PEEK SKIPA T1,400000(T1) ;OK, GET CONTENTS OF LOC PEEK T1, ;CANT, TRY PEEK POPJ P, ;SUBROUTINE TO READ A WORD FROM THE PER-PROCESS AREA FOR A JOB. ;ARGS T1=EXEC VIRTUAL ADDRESS MAPPED THROUGH JOB'S UPMP ; IN THE RANGE C(EVAPPB) THRU C(EVAPPE)-1 ; J=JOB NUMBER ;VALUES T1=CONTENTS OF LOCATION OR 0 IF ERROR PEKUSR: PUSHJ P,SAVE2 ;SAVE P1-P2 MOVE P1,EVAADR ;GET ADDR OF FIRST WORD IN CORE CAIL T1,(P1) ;IF WORD WE WANT IS ALREADY IN CAILE T1,EVASIZ-1(P1) ; CORE, JUST PICK IT UP CAIA ;NO, MUST READ IT JRST PEKUS2 ;GET IT FROM CORE SETZM EVAADR ;FORCE READ NEXT TIME MOVSI P1,<(JK.EVA)>(J) ;JOB NUMBER+READ EVA FLAG TO LH HRRI P1,EVASIZ ;NUMBER WORDS TO READ TO RH MOVSI P2,(T1) ;ADDRESS TO READ IN LH TLZ P2,EVASIZ-1 ;MOVE BACK TO BUFFER BOUNDARY HRRI P2,EVABUF ;ADDR IN OUR CORE TO RH PUSH P,T2 ;SAVE T2 (USE T2 BECAUSE OF DOJBPK) MOVEI T2,P1 ;POINT TO BLOCK PUSHJ P,DOJBPK ;READ IT IFN FTUNSUPPORTED,< JRST PEKUS3 ;HAVE TO READ IT FROM SWAPPING SPACE > IFE FTUNSUPPORTED,< JRST PEKUS1 ;GOT THE DATA, GO GET IT JFCL ;ADDRESS CHECK MOVEI T1,0 ;ON ERROR, RETURN 0 POP P,T2 ;PRUNE THE STACK POPJ P, ;GIVE ERROR RETURN > PEKUS1: POP P,T2 ;RESTORE T2 HLRZM P2,EVAADR ;UPDATE FIRST ADDRESS IN CORE PEKUS2: SUB T1,EVAADR ;COMPUTE OFFSET IN BLOCK MOVE T1,EVABUF(T1) ;GET WORD FROM BUFFER POPJ P, ;RETURN IFN FTUNSUPPORTED,< ;HERE TO READ THE DATA FROM THE SWAPPING SPACE PEKUS3: ;PEKSPY ONLY DESTROYS T1 SO WE HAVE PUSH P,T3 ;TO SAVE ALL THE TEMP REGISTERS WHICH PUSH P,T4 ;ARE ZAPPED BY GTUPMP, REDPEC, ETC. PUSH P,THSOFF ;ALSO SAVE THIS FOR SAFETY SETZM THSOFF ;INSURE THAT ALL THE CALCULATIONS WORK MOVEI P1,(T1) ;COPY ADDRESS CALLER WANTED PUSHJ P,GTUPMP ;GET THE PAGE MAP FROM THE SWAPPING ; SPACE. GTUPMP CALLS FINCHK. JRST PEKUS4 ;FAILED FOR SOME REASON MOVEI T1,(P1) ;RESTORE DESIRED ADDRESS ADDI T1,440000 ;ADD OFFSET THAT WILL POINT US TO THE ;PER-PROCESS SLOTS IN THE UPMP (400-417) PUSHJ P,VIRADR ;GET MAP SLOT FOR THIS PAGE JUMPE T1,PEKUS4 ;RETURN ZERO IF NO PAGE THERE HRLM T1,SEGSWP ;STORE PAGE POINTER FOR REDPEC MOVEI T3,(P1) ;GET ADDRESS BACK TRZ T3,EVASIZ-1 ;FORCE ADDRESS TO BLOCK BOUNDARY MOVEM T3,EVAADR ;AND STORE AS NEW CORE ADDRESS ANDI T3,PG.BDY ;ISOLATE OFFSET OF BLOCK IN PAGE IDIVI T3,BLKSIZ ;AND COMPUTE BLOCK OFFSET IN PAGE MOVSI T2,-EVASIZ ;-NUMBER WORDS TO READ IN LH HRRI T2,EVABUF-1 ;MAKE IOWD TO OUR BUFFER PUSHJ P,REDPEC ;READ THE BLOCK(S) FROM THE SWAPPING SPACE SKIPA T1,P1 ;GET ADDRESS USER WANTED BACK PEKUS4: MOVEI T1,0 ;RETURN ZERO ON ERROR POP P,THSOFF ;RESTORE THE STUFF WE SAVED POP P,T4 ;... POP P,T3 ;... POP P,T2 ;... JUMPN T1,PEKUS2 ;IF NO ERROR, GET DATA FROM BUFFER POPJ P, ;ELSE RETURN A ZERO > ;END IFN FTUNSUPPORTED SUBTTL CLOCK QUEUE SUBROUTINES ;HERE WHEN A TIMER RUNS OUT WAKJOB: HRRE J,NEXTJB ;GET THE JOB NUMBER SETZM @JBTCLK ;CLEAR OUT ENTRY PUSHJ P,CLEANQ ;CLEAN THE QUEUE JUMPLE J,WAKSLF ;JOBS .LE. 0 ARE INTERNAL WAKE J, ;WAKE THE JOB AOS WAKGUF ;WE TRIED JRST DALOOK ;RESCAN THE QUEUE WAKSLF: PUSHJ P,@CLKDSP(J) ;INVOKE INTERNAL ROUTINE JRST DALOOK EXP AVLSCN ;(-3) AVAIL.SYS UPDATE SCAN EXP IOECLR ;(-2)CLEAR I/O ERROR ON ERROR.SYS EXP FRCFCT ;(-1) FORCE OUT THE FACT BUFFER CLKDSP: EXP CHECK ;(0) CHECKPOINT JOBS DEFINE .IFNFT (COND,FT,LBL),< IF'COND FT,> ..IFFT==0 .IFNFT (E,FTCHKPNT,CHECK) .IFNFT (LE,FTFACT,FRCFCT) .IFNFT (E,MAXAGE,FRCFCT) IFN ..IFFT,< AOS CLKGUF ;NOTE A REQUEST THAT SNH POPJ P, > PURGE .IFNFT,..IFFT AVLSCN: PUSHJ P,AVLAGE ;SEE IF TIME TO START A NEW AVAIL.SYS HRREI J,AVLRQ ;SET FOR NEXT WAKEUP MOVEI T1,AVLTIM ;FOR AVAIL.SYS SCAN PJRST CLKREQ ;ENTER THE REQUEST AND RETURN ;SUBROUTINE TO ENTER A REQUEST INTO THE QUEUE ;ARGS T1=NUMBER OF SEC TO SLEEP ; J=JOB NUMBER ;USES T1-T4 CLKREQ: JUMPE T1,NULREQ ;NULL REQUEST - CLEAN Q AND WAKE IMMEDIATELY MUL T1,JIFSEC ;CONVERT TO JIFFIES IN T2 PUSHJ P,GETUPT ;GET THE UPTIME IN TICKS ADD T2,T1 ;TIME TO GET UP MOVEM T2,@JBTCLK ;STORE IN QUEUE PJRST CLEANQ ;CLEAN THE QUEUE NULREQ: SETZM @JBTCLK ;CLEAR THE REQUEST JUMPLE J,CLEANQ ;NO WAKE IF INTERNAL REQUEST WAKE J, ;WAKE THE JOB IMMEDIATELY AOS WAKGUF ;WE TRIED AND FAILED ; PJRST CLEANQ ;FALL THROUGH TO RE-SCAN Q ;HERE TO SORT THE QUEUE CLEANQ: SETZB T2,NEXTUP ;FLAG QUEUE EMPTY ; T2 GETS NEXT JOB TO WAKE PUSH P,J ;SAVE AC J MOVE J,QPNTR ;GET THE AOBJN POINTER HRLOI T1,377777 ;T1_UPTIME OF NEXT WAKE FNDMIN: SKIPE T3,@JBTCLK ;GET FIRST TIME CAMG T1,T3 ;YES--IS IT BETTER JRST NXTREQ ;NO--TRY NEXT MOVE T1,T3 ;T1_SHORTEST TIME HRREI T2,(J) ;T2_JOB WITH THAT TIME NXTREQ: AOBJN J,FNDMIN ;LOOP OVER ALL JOBS MOVEM T1,NEXTUP ;SAVE T1 MOVEM T2,NEXTJB ;SAVE JOB NUMBER POP P,J POPJ P, ;SUBROUTINE TO ENSURE THAT ANY FACT FILE ENTRY ;GETS OUT IN MAXAGE SECONDS IFG FTFACT,< IFN MAXAGE,< BUFAGE: SKIPE FACTSZ ;IF ANYTHING THERE, REQUEST IS ALREADY IN POPJ P, PUSH P,J ;SAVE J HRREI J,AGERQ ;SET OUR REQUEST TYPE MOVEI T1,MAXAGE ;SET MAX TIME IN BUFFER PUSHJ P,CLKREQ ;MAKE THE REQUEST POP P,J POPJ P, ;DONE FRCFCT: TLO F,L.FORC ;ENSURE IT GETS DUMPED SOON POPJ P, >;END MAXAGE COND IFE MAXAGE, >;END FTFACT COND IOECLR: SETZM IOERR ;[62]CLEAR FLAG SO ERRFIN RETRIES NOW POPJ P, ;[62] ;SUBROUTINE TO RETURN JOB'S CONTROLLING TTY NUMBER ;ARG J=JOB NUMBER ;VALUE T1=TTY NUMBER (-1 IF CTY) ;NON-SKIP RETURN IF JOB DETACHED GETTTY: HRROI T1,.GTTTY ;GET JOB'S TTY DDB ADDR PUSHJ P,GTBSPY ;GET ADDR OF DDB FOR USER JOB POPJ P, ;CAN'T FIND IT!!! JUMPE T1,CPOPJ ;GIVE UP IF JOB IS DETACHED MOVEI T1,DEVNAM(T1) ;ADD OFFSET AND MASK TO 18 BITS PUSHJ P,PEKSPY ;GET TTY NAME FROM DDB TLNN T1,-1 ;LEFT HALF 0 IF DETACHED POPJ P, ;LOSE... HRLZI T2,(T1) ;LINE NUMBER IN SIXBIT TO LEFT HALF JUMPE T2,TTYCTY ;ONLY CTY HAS NO LINE NO SETZ T1, DAGLIN: LSH T2,3 ;IGNORE 3 BITS OF OCTAL SIXBIT CODE LSHC T1,3 ;BUT GET THE NUMERIC QUANTITY JUMPN T2,DAGLIN ;LOOP IF ANY MORE DIGITS JRST CPOPJ1 ;THAT'S ALL THERE IS TO IT TTYCTY: SETO T1, ;NOTE CTY JRST CPOPJ1 ;AND RETURN SUCCESSFUL SUBTTL ROUTINES TO RECORD HARDWARE ERROR INFO IN ERROR.SYS ;ROUTINE TO DUMP DISK STATISTICS INTO ONE OR MORE .ESDSC ENTRIES. DSCNBK==/ ;NUMBER OF BLOCKS THAT WILL FIT ;INTO EACH .ESDSC ENTRY DSCNEN==^D250/DSCNBK ;LIMIT THE NUMBER OF UNITS DUMPED TO ;250 TO AVOID LOOPS IN THE UDB'S DMPDSK: PUSHJ P,SAVE3 ;SAVE P1-P3 MOVEI P3,DSCNEN ;GET MAX NUMBER OF ENTRIES TO DUMP MOVE T1,[%LDUNI] ;POINTER TO UDB CHAIN PUSHJ P,GTBSPY ;GET IT POPJ P, ;NONE, FORGET IT HLRZ P2,T1 ;FIRST ADDRESS TO RH OF P2 JUMPE P2,CPOPJ ;NONE THERE DMPDS1: MOVSI T1,.ESDSC_9 ;ERROR CODE FOR ERRINI PUSHJ P,ERRINI ;SETUP BUFFER AND P4 DSCSTP==0 ;OFFSET OF POINTER TO FIRST BLOCK PUSH P4,[0,,DSC1ST] ;MAKE IT 0,,OFFSET TO FIRST BLOCK DSC1ST==1 ;OFFSET OF FIRST BLOCK MOVSI P1,-DSCNBK ;AOBJN POINTER OF BLOCKS TO DO DMPDS2: MOVE T2,XUSCL ;GET AOBJN POINTER OF WORDS IN BLOCK HLLZ T1,T2 ;-WORDS,,0 PUSH P4,T1 ;SAVE AS POINTER FOR SYSERR PUSHJ P,UNIDMP ;DUMP THE WORDS FOR THIS BLOCK MOVEI T1,UNISYS(P2) ;POINT TO LINK WORD IN UDB PUSHJ P,PEKSPY ;READ IT HLRZ P2,T1 ;MOVE TO RH OF P2 AOBJP P1,DMPDS3 ;QUIT IF FILLED THIS ENTRY JUMPN P2,DMPDS2 ;LOOP IF MORE TO DO DMPDS3: MOVNI T1,(P1) ;GET -BLOCKS IN ENTRY HRLM T1,ERABFS+DSCSTP ;STORE IN ENTRY PUSHJ P,ERRFIN ;CLOSE THIS ENTRY AND WRITE FILE SOSLE P3 ;QUIT IF DUMPED TOO MANY JUMPN P2,DMPDS1 ;LOOP IF MORE BLOCKS POPJ P, ;DONE ;SUBROUTINE TO DUMP SELECTED MONITOR ITEMS ;ARGS T2=AOBJN WORD FOR LIST OF ITEMS ; P4=AOBJN WORD FOR OUTPUT BUFFER ;VALUES P4=UPDATED BUFFER POINTER ;RETURN CPOPJ, T1-2 BLOWN, OTHERS INTACT UNIDMP: MOVEI T1,@(T2) ;GET ADDRESS TO DUMP PUSHJ P,PEKSPY PUSH P4,T1 ;STORE IN ERROR.SYS BUFFER AOBJN T2,UNIDMP ;LOOP FOR ALL ITEMS POPJ P, ;TABLES FOR UNIT DATA BLOCK ITEMS TO BE DUMPED XDVEL: XWD .-ZDVEL,.+1 Z UDBNAM(P3) ;(R0) PHYSICAL UNIT NAME Z UNIHID(P3) ;(R1) PACK (HOME BLOCK) ID Z UNIHCT(P3) ;(R2) HARD ERROR COUNT Z UNISCT(P3) ;(R3) SOFT ERROR COUNT Z UNIECT(P3) ;(R4) RETRY COUNT Z UNISOF(P3) ;(R5) 1CONI - ERROR CONI AFTER INITIAL ATTEMPT Z UNIERR(P3) ;(R6) 2CONI - ERROR CONI AFTER 1ST RECALIBRATE Z UNISDI(P3) ;(R7) 1DATAI - AFTER INITIAL ATTEMPT Z UNIHDI(P3) ;(R10) 2DATAI - AFTER 1ST RECALIBRATE Z UNIHBN(P3) ;(R11) BLOCK NO OF LAST HARD ERROR Z UNIMCT(P3) ;(R12) SOFTWARE-DETECTED ERROR COUNTS Z UNIPCT(P3) ;(R13) SEEK INCOMPLETE ERRORS Z UNIHNG(P3) ;(R14) HUNG COUNTS ZDVEL==.-1 XUSCL: XWD .-ZUSCL,.+1 ;AOBJN WORD FOR TABLE OUTPUT BY DMPDSK Z UDBNAM(P2) ;(R1) DEV NAM Z UNIHID(P2) ;(R2) PACK ID Z UNIHCT(P2) ;(R3) HARD ERROR COUNT Z UNISCT(P2) ;(R4) SOFT ERROR COUNT Z UNIPCT(P2) ;(R5) SEEK ERROR COUNT Z UNIHNG(P2) ;(R6) HUNG COUNTS Z UNIMCT(P2) ;(R7) SOFTWARE-DETECTED ERRORS Z UNIBRC(P2) ;(R10) BUFFERED READS Z UNIBWC(P2) ;(R11) BUFFERED WRITES Z UNIDRC(P2) ;(R12) DUMP READS Z UNIDWC(P2) ;(R13) DUMP WRITES Z UNIMRC(P2) ;(R14) MONITOR READS Z UNIMWC(P2) ;(R15) MONITOR WRITES Z UNIICT(P2) ;(R16) SWAP READS Z UNIOCT(P2) ;(R17) SWAP WRITES Z UNIMSC(P2) ;(R20) MONITOR SEEKS Z UNIUSC(P2) ;(R21) USER SEEKS ZUSCL==.-1 XMDVEL: XWD .-ZMDVEL,.+1 Z UDBNAM(P3) ;(R0)PHYSICAL UNIT NAME Z UNIHID(P3) ;(R1)PACK ID (HOME BLOCK ID) Z UNILOG(P3) ;(R2)LOGICAL NAME OF UNIT (STR NAME) Z UNIHBN(P3) ;(R3)BLOCK OF LAST HARD ERROR Z UNIECT(P3) ;(R4)RETRY COUNT Z UNISOF(P3) ;(R5)1CONI - ERROR CONI AFTER INITIAL ATTEMPT Z UNIERR(P3) ;(R6)2CONI - ERROR CONI AFTER 1ST RECALIBRATE Z UNIMCT(P3) ;(R7)SOFTWARE DETECTED ERROR COUNTS Z UNIPCT(P3) ;(R10)SEEK INCOMPLETE ERRORS Z UNIHNG(P3) ;(R11)HUNG COUNTS ZMDVEL==.-1 XTPEL: XWD .-ZTPEL,.+1 Z TUBRID(P1) ;(R1)REELID Z TUBFIL(P1) ;(R2)FILES FROM BOT Z TUBREC(P1) ;(R3)RECORDS FROM LAST EOF Z TUBTRY(P1) ;(R4)RETRY COUNT + HARD ERROR BIT Z TUBCCR(P1) ;(R5)CHARACTERS INTO CURRENT RECORD Z TUBPBE(P1) ;(R6)POSITION BEFORE ERROR Z TUBFES(P1) ;(R7)FINAL ERROR STATE ZTPEL==.-1 XTPUL: XWD .-ZTPUL,.+1 Z DEVNAM(P3) ;(R0)DEVICE NAME Z TUBRID(P1) ;(R1)REELID Z TUBCRD(P1) ;(R2)CHARACTERS READ Z TUBCWR(P1) ;(R3)CHARACTERS WRITTEN Z TUBSRE(P1) ;(R4)SOFT READ ERRORS Z TUBHRE(P1) ;(R5)HARD READ ERRORS Z TUBSWE(P1) ;(R6)SOFT WRITE ERRORS Z TUBHWE(P1) ;(R7)HARD WRITE ERRORS ZTPUL==.-1 XTPEL1: XWD .-ZTPEL1,.+1 ; Z TUBUID(P1) ;(R12)P,PN OF USER Z TUBPGM(P1) ;(R13) SIXBIT PROGRAM NAME Z TUBDVC(P1) ;(R14) DEVICE CODE/UNIBUS ADDRESS Z TUBKTY(P1) ;(R15) KONTROLLER TYPE ZTPEL1==.-1 ; XD2EL: XWD .-ZD2EL,.+1 Z TUBPBE(P3) ;(R3) POSITION BEFORE ERROR Z TUBFES(P3) ;(R4) FINAL ERROR STATE Z TD2CNI(P1) ;(R5) CONI INITIAL Z TD2CIF(P1) ;(R6) CONI FINAL Z TD2ZRO(P1) ;(R7) NUMBER OF SEEKS (0 FOR MAGTAP) Z TD2RED(P1) ;(R10) NUMBER OF FRAMES READ Z TD2WRT(P1) ;(R11) NUMBER OF FRAMES WRITTEN Z TD2ZRO(P1) ;(R12) SIXBIT FILENAME Z TUBUID(P3) ;(R13) [P,PN] OF USER MAKING REQUEST Z TUBPGM(P3) ;(R14) SIXBIT NAME OF PROGRAM RUNNING Z TD2D1I(P1) ;(R15) DATAI PTCR INITIAL Z TD2D1F(P1) ;(R16) DATAI PTCR FINAL Z TD2D2I(P1) ;(R17) DATAI PBAR INITIAL Z TD2D2F(P1) ;(R20) DATAI PBAR FINAL Z TUBSRE(P3) ;(R21) SOFT READ ERRORS Z TUBSWE(P3) ;(R22) SOFT WRITE ERRORS Z TUBHRE(P3) ;(R23) HARD READ ERRORS Z TUBHWE(P3) ;(R24) HARD WRITE ERRORS Z TUBFIL(P3) ;(R25) FILE POSITION Z TUBREC(P3) ;(R26) RECORD POSITION Z TD2CS0(P1) ;(R27) CHANNEL LOGOUT 0 Z TD2CS1(P1) ;(R30) CHANNEL LOGOUT 1 Z TD2CS2(P1) ;(R31) CHANNEL LOGOUT 2 Z TD2CC1(P1) ;(R32) FIRST CCW Z TD2CC2(P1) ;(R33) SECOND CONTROL WORD Z TD2MPE(P1) ;(R34) COUNT OF MPE Z TD2NXM(P1) ;(R35) COUNT OF NXM Z TD2ZRO(P1) ;(R36) SOFT POSITIONING ERRORS Z TD2ZRO(P1) ;(R37) HARD POSITIONING ERRORS Z TD2OVR(P1) ;(R40) NUMBER OF OVERRUNS Z TD2ICR(P1) ;(R41) CONTENTS OF INITIAL CONTROL REG Z TD2VER(P1) ;(R42) DX20 MICRO-CODE VERSION # ZD2EL==.-1 XR2EL1: XWD .-ZR2EL1,.+1 Z UDBNAM(P3) ;(R0) SIXBIT DEVICE NAME Z UNILOG(P3) ;(R1) VOLUME ID ZR2EL1==.-1 XR2EL2: XWD .-ZR2EL2,.+1 Z UNIHBN(P3) ;(R3) LOC OF ERROR Z UNIECT(P3) ;(R4) FINAL ERROR STATE Z UNISOF(P3) ;(R5) CONI INITIAL Z UNIERR(P3) ;(R6) CONI FINAL ZR2EL2==.-1 XR2EL3: XWD .-ZR2EL3,.+1 Z 0(P1) ;(R15) DATAI PTCR INITIAL (UNISCR) Z 1(P1) ;(R16) DATAI PTCR FINAL (UNIHCR) Z 2(P1) ;(R17) DATAI PBAR INITIAL (UNISDR) Z 3(P1) ;(R20) DATAI PBAR FINAL (UNIHDR) Z UNIHCT(P3) ;(R21) HARD ERROR STATISTICS Z UNISCT(P3) ;(R22) SOFT ERROR STATISTICS Z UNIMCT(P3) ;(R23) SOFTWARE ERROR STATISTICS Z UNIHNG(P3) ;(R24) HUNG COUNTS ZR2EL3==.-1 ;ROUTINES TO SET UP FOR CALL TO ROUTINE TO PUT ACTUAL ENTRY INTO ERROR ; FILE ;ALL HAVE SAME CALLING SEQUENCE ;ARGS: T2 -- CODE FOR ERROR SYS ENTRY ; T1 -- ADDRESS OF BLOCK RETURNED BY ERRPT. UUO ;RETURNS CPOPJ, NO AC'S PRESERVED ;ROUTINE TO REPORT SYSTEM RELOAD (CODE 1) SRLERR: MOVSI T1,.ESWHY_9 ;CODE FOR WHY RELOAD PUSHJ P,ERRINI ;STORE HEADER, SETUP P4 AND CLEAR BUFFER MOVE T2,[%CNFG0] ;5 WORDS OF SYSTEM NAME, 2 DATE SUB T2,[%CNDT1+<1,,0>] HLR T2,[%CNFG0] CNFLUP: MOVEI T1,.GTCNF ;FROM CNFTBL HRLI T1,(T2) PUSHJ P,GTBVAR ;(R0-R6) SAVE NEXT WORD OF SYSTEM NAME/DATE AOBJN T2,CNFLUP ;GET IT ALL MOVE T1,[%CNSTS] PUSHJ P,GTBVAR ;(R7) SAVE STATES WORD PUSH P4,MONVER ;(R10) MONITOR VERSION MOVE T1,[%CNSER] PUSHJ P,GTBVAR ;(R11) SAVE CPU0 SERIAL NUMBER MOVE T1,[%CNWHY] PUSHJ P,GTBVAR ;(R12) SAVE WHY RELOAD CODE IN SIXBIT PUSH P,T1 ;SAVE FOR AVAIL BELOW EW%COM==13 ;RELATIVE LOC'N OF POINTER WORD AOBJN P4,.+1 ;(R13) LEAVE SPACE FOR POINTER WORD MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE HRLI T1,707070 ;ADD A STRANGE CODE FOR SYSERR TO RECOGNIZE THIS WORD PUSH P4,T1 ;(R14) AND SAVE IN ERROR BUFFER EW%NPT==15 ;OFFSET FOR POINTER TO NXMTAB IN ENTRY AOBJN P4,.+1 ;(R15) LEAVE ROOM FOR POINTER PUSH P,P4 ;SAVE CURRENT BUFFER LOC MOVEI T2,0 ;START AT FIRST WORD OF OPR COMMENTS WHYLUP: MOVEI T1,.GTWHY ;GETTAB FOR WHY-RELOAD COMMENTS IN ASCIZ HRLI T1,(T2) ;DESIRED WORD THEREOF PUSHJ P,GTBSPY ;GET IT JRST WHYCLS ;MUST NOT BE ONE JUMPE T1,WHYCLS ;STOP AT END OF STRING PUSH P4,T1 ;(R16-) SAVE 5 CHARACTERS AOJA T2,WHYLUP ;GO FOR NEXT WORD WHYCLS: POP P,T1 ;GET BACK START LOC OF COMMENTS MOVNI T2,(T2) ;GET -VE LENGTH OF COMMENTS JUMPE T2,WHYOUT ;LEAVE POINTER ZERO IF NONE HRLI T2,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO COMMENTS MOVSM T2,ERABFS+EW%COM ;SAVE AOBJN POINTER TO COMMENTS WHYOUT: MOVN T2,NXMLEN ;GET -VE LENGTH OF NXMTAB JUMPGE T2,SRLERX ;IF NONE, QUIT NOW HRLZS T2 ;MOVE TO LH HRRI T2,1-ERABFH(P4) ;OFFSET TO FIRST TO RH MOVEM T2,ERABFS+EW%NPT ;SAVE AS POINTER TO NXMTAB HRR T2,NXMTAB ;GET CORE POINTER TO NXMTAB PUSH P4,(T2) ;SAVE NEXT WORD IN BUFFER AOBJN T2,.-1 ;LOOP FOR ALL WORDS SRLERX: PUSHJ P,ERRFIN ;CLOSE FILE IFN FTMCNF,< PUSHJ P,APPCNF ;APPEND MAXCNF ENTRY AS NECESSARY > MOVSI T1,.ESMRV_9 ;GET ENTRY CODE FOR MONITOR RUN VALUES PUSHJ P,ERRINI ;SETUP THE BUFFER MOVE T1,[MRVBDY,,ERABFS] ;MAKE BLT POINTER BLT T1,ERAEND ;MOVE TO BUFFER POP P,ERABFS+MRVWHY ;SAVE RELOAD CODE IN BUFFER PUSHJ P,NBSDAT ;GET CURRENT DATE/TIME MOVE T3,T1 ;SAVE PUSHJ P,UPTIME ;GET UPTIME SUB T3,T1 ;COMPUTE TIME OF RELOAD MOVEM T3,ERABFS+MRVRTM ;SAVE IN BUFFER PUSHJ P,SYSNAM ;UPDATE MRV BLOCK TO REFLECT NEW MOVE T1,MONVER ; MONITOR NAME AND VERSION MOVEM T1,MRVBDY+MRVVER ; FOR NEXT RELOAD SETZM MRVBDY+MRVIDT ;START WITH NO DATE/TIME CHANGES LDB P4,[POINT 9,MRVBLK,35] ;GET LENGTH OF BODY ADDI P4,ERABFS-1 ;ADJUST FOR CALCULATION AT ERFILL PUSHJ P,AVLFIN ;APPEND THE ENTRY TO AVAIL PJRST UPDAVL ; AND DO AN IMMEDIATE UPDATE IFN FTUNSUPPORTED,< ;ROUTINE TO REPORT DISK AND MASSBUS ERRORS, CODES 10 AND 11 SDVERR: TDZA P1,P1 ;SET FLAG FOR DISPATCH LATER SMDVER: MOVEI P1,1 ;DITTO FOR MASSBUS DEVICE ERROR PUSHJ P,PROTJB ;INSURE THAT JOB WILL BE FREED HRRZ P3,1(T1) ;GET UDB ADDR INTO P3 FOR GIVE ROUTINE HLRZ P2,1(T1) ;ADDR OF DDB INTO P2 JUMPE P2,CPOPJ ;IF NO DDB, EXIT JUMPE P3,CPOPJ ;LIKEWISE IF NO UDB MOVEI T1,UDBKDB(P3) ;ADDRESS OF KONTROLLER DATA BLOCK PUSHJ P,PEKSPY HRRZS T1 ;KEEP JUST ADDRESS ADD T1,KONREG ;NUMBER OF DRIVE REGS ON THIS CONTROLLER PUSHJ P,PEKSPY MOVEI T3,(T1) ;PUT NUMBER OF REGS INTO T3 SKIPN P1 ;IF THIS IS A MASSBUS ERROR SKIPN T3 ;OR NOT A DISK ERROR WITH REGISTERS JRST SDVER1 ;THEN ALL IS OK ADDI T2,.ESMDE-.ESHDE ;MUST BE PRE-701, MAKE IT MASSBUS ERROR ;IF A DISK ERROR WITH REGISTERS MOVEI P1,1 ;AND SET FLAG FOR MASSBUS ERROR DISPATCH SDVER1: MOVEI T1,UNIDES(P3) ;GET ADDRESS OF UNIDES OF UDB PUSHJ P,PEKSPY ;GET UNIDES LDB T1,[POINTR T1,DC.CNT] ;GET CONTROLLER TYPE CAIE T1,.DCCRN ;RP20? JRST SDVER2 ;NO MOVEI P1,2 ;SETUP DISPATCH OFFSET MOVEI T2,.ESDXE ;MAKE IT A DX20 DEVICE ERROR SDVER2: MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;STORE CODE IN T1 FOR ERRINI PJRST @[EXP GDVERR,GMDVER,D2DSER](P1) ;DISPATCH TO CORRECT ROUTINE > ;END IFN FTUNSUPPORTED IFE FTUNSUPPORTED,< ;ROUTINE TO REPORT DISK AND MASSBUS ERRORS, CODES 10 AND 11 SDVERR: SMDVER: PUSHJ P,PROTJB ;INSURE THAT JOB WILL BE FREED HRRZ P3,1(T1) ;GET UDB ADDR INTO P3 FOR GIVE ROUTINE HLRZ P2,1(T1) ;ADDR OF DDB INTO P2 JUMPE P2,CPOPJ ;IF NO DDB, EXIT JUMPE P3,CPOPJ ;LIKEWISE IF NO UDB MOVEI T1,UDBKDB(P3) ;ADDRESS OF KONTROLLER DATA BLOCK PUSHJ P,PEKSPY HRRZS T1 ;KEEP JUST ADDRESS ADD T1,KONREG ;NUMBER OF DRIVE REGS ON THIS CONTROLLER PUSHJ P,PEKSPY MOVE T3,T1 ;PUT NUMBER OF REGS INTO T3 MOVEI T2,.ESMDE ;ASSUME A MASSBUS DISK ENTRY MOVEI T1,UNIDES(P3) ;GET ADDRESS OF UNIDES OF UDB PUSHJ P,PEKSPY ;GET UNIDES LDB T1,[POINTR T1,DC.CNT] ;GET CONTROLLER TYPE CAIN T1,.DCCRN ;RP20? MOVEI T2,.ESDXE ;YES, IT'S REALLY A DX20 ERROR CAIN T1,.DCCRA ;CI DISK? MOVEI T2,.ESCIE ;YES, DIFFERENT CODE MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;STORE CODE IN T1 FOR ERRINI CAIN T2,.ESCIE ;CI DISK ERROR? JRST GCIFER ;YES, PROCESS CI DISK ERROR CAIE T2,.ESDXE ;DX20 ERROR? JRST GMDVER ;NO, PROCESS MASSBUS ENTRY JRST D2DSER ;YES, PROCESS DX20 DISK ENTRY > ;END IFE FTUNSUPPORTED ;ROUTINE TO REPORT TAPE ERRORS, CODE 21 AND TAPE STATS, CODE 41 STPERR: PUSHJ P,PROTJB ;ASSURE JOB WILL BE FREED FROM ^D HLRZ P3,1(T1) ;GET DDB ADDR IN P3 HRRZ P4,1(T1) ;MAKE P4 A POINTER TO THE TUB MOVE T1,[%CNMER] ;GETTAB FOR MAGTAPE INFO PUSHJ P,GTBSPY POPJ P, ;OOPS HLRZ P2,T1 ;GET OFFSET OF TUBRID IN RH OF P2 ADDI P4,(P2) ;AND MAKE P4 POINTER TO CURR. TUBRID SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE IN T1 CAIN T2,.ESTPS ;IS THIS MAG TAPE STATS? PJRST GTPSTU ;YES, RECORD THEM PJRST GTPERR ;GO REPORT TAPE ERROR ;ROUTINE TO REPORT DX20 DEVICE ERRORS, CODE 12. DX2ERR: PUSHJ P,PROTJB ;INSURE JOB WILL BE FREED FROM ^D HLRZ P2,1(T1) ;GET DDB ADDRESS IN P2 HRRZ P3,1(T1) ;GET UBD ADDRESS IN P3 MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE IN T1 PJRST D2TPER ;PROCESS TU7X TAPE ERROR ;ROUTINE TO REPORT SOFTWARE ERROR (CODE 17), DL10 ERROR (CODE 50), ;LP100 ERROR (CODE 71), OR HARD COPY CONTROLLER ERROR (CODE 72) SDIERR: PUSHJ P,PROTJB ;[544] [550] MAKE SURE JOB WILL BE FREED HLRZ T1,(T1) ;GET POINTER TO AOBJN WORD INTO RH OF T1 PUSHJ P,PEKSPY ;GET AOBJN WORD MOVE P1,T1 ;PUT IT INTO P1 SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT CODE INTO T1 PUSHJ P,ERRINI ;INITIALIZE ERROR ENTRY DLELP: HRRZ T1,P1 ;GET POINTER PART INTO T1 PUSHJ P,PEKSPY ;GET NEXT WORD PUSH P4,T1 ;AND SAVE IT IN BUFFER AOBJN P1,DLELP ;STEP POINTER PJRST ERRFIN ;[544] [550] ALL DONE, WRITE ENTRY AND CLOSE FILE ;ROUTINE TO PROCESS ERROR CODE 75 (IPA20 DRAM DUMP) ICDERR: HLRZ P3,(T1) ;GET POINTER TO KONTROLLER DATA BLOCK MOVE T1,[%CNIDB] ;GET OFFSET TO DRAM DUMP BUFFER IN KDB PUSHJ P,GTBSPY ;ASK POPJ P, ;SORRY ADD T1,P3 ;ADD IN OFFSET TO DUMP BUFFER PUSHJ P,PEKSPY ;GET ADDRESS OF DUMP BUFFER SKIPN P2,T1 ;COPY BUFFER ADDRESS TO P2 POPJ P, ;NOTHING THERE? STRANGE! MOVSI T1,DSK+<(FO.PRV)> ;CHANNEL IS DSK PLUS PRIVS HRRI T1,.FOWRT ;FUNCTION IS WRITE MOVEM T1,D.FLOP+.FOFNC MOVEI T1,.IODMP ;SET I/O MODE MOVEM T1,D.FLOP+.FOIOS ; . . MOVSI T1,'XPN' ;GET DEVICE MOVEM T1,D.DEV ;SET UP FOR ERROR ROUTINES MOVEM T1,D.FLOP+.FODEV ;AND STORE IT SETZM D.FLOP+.FOBRH ;NO BUFFERS SETZM D.FLOP+.FONBF ; . . MOVEI T1,D.LKB ;ADDR. OF LOOKUP BLOCK MOVEM T1,D.FLOP+.FOLEB ; . . MOVEI T1,KDBNAM(P3) ;GET ADDRESS OF KDB NAME WORD PUSHJ P,PEKSPY ;GET SIXBIT KDB NAME MOVEM T1,D.LKB+.RBNAM ;STORE IT IN LOOKUP BLOCK MOVSI T1,'D00' ;ASSUME FIRST DUMP FILE MOVEM T1,D.LKB+.RBEXT ;STORE IT ICDER1: SETZM D.LKB+.RBPPN ;ZAP PPN MOVEI T1,.RBSIZ!RB.NSE ;GET EXTENDED LOOKUP BLOCK SIZE MOVEM T1,D.LKB+.RBCNT ;STORE IT IN LOOKUP BLOCK MOVE T1,[XWD .FOLEB+1,D.FLOP] ;POINT TO FILOP. BLOCK FILOP. T1, ;ENTER DUMP FILE SKIPA ;ERROR JRST ICDER2 ;SUCCESS, CONTINUE HRRZ T1,D.LKB+.RBEXT ;GET ENTER ERROR CODE CAIE T1,ERAEF% ;ALREADY EXISTING FILE? WARN ,OPR HLRZ T1,D.LKB+.RBEXT ;GET EXTENSION OF DUMP FILE CAIN T1,'D99' ;TRIED ALL OF THEM? WARN ,OPR ADDI T1,1 ;BUMP THE EXTENSION TRC T1,12 ;SEE IF OVERFLOW INTO TENS DIGIT TRCN T1,12 ;... ADDI T1,100-'9'+'0'-1 ;YES, RESET UNITS TO ZERO AND BUMP TENS HRLZM T1,D.LKB+.RBEXT ;SAVE NEW EXTENSION JRST ICDER1 ;TRY AGAIN ICDER2: MOVSI P4,-DRMSIZ/BLKSIZ ;SET UP AOBJN WORD FOR DUMPING DRAM ICDER3: MOVSI P3,-BLKSIZ ;SET UP TO WRITE ONE DISK BLOCK'S WORTH OF DATA ICDER4: MOVE T1,P2 ;GET AN ADDRESS PUSHJ P,PEKSPY ;SNIFF IT OUT MOVEM T1,DSKBUF(P3) ;STORE IT AWAY ADDI P2,1 ;BUMP POINTER TO DRAM DATA AOBJN P3,ICDER4 ;LOOP FOR ALL REMAINDER OF THIS BLOCK OUTPUT DSK,[IOWD BLKSIZ, DSKBUF 0] ;WRITE OUT THE BLOCK AOBJN P4,ICDER3 ;LOOP FOR REMAINING BLOCKS CLOSE DSK, ;CLOSE DOWN THE CHANNEL RELEAS DSK, ;... POPJ P, ;AND ALL DONE ;ROUTINE TO PROCESS SYSTEM ERROR BLOCKS ;NOTE THAT THE MONITOR ATTEMPTS TO BUILD A "STANDARD" FORMAT ;ERROR.SYS HEADER. IF THE LENGTH THE MONITOR SUPPLIES DIFFERS ;FROM DAEMON'S IDEA A WARNING MESSAGE IS PRINTED ON THE CTY. RSEBLK: TLNE F,L.DSK ;READING FROM DISK? JRST RSEBL2 ;YES, THAT'S A LITTLE HARDER RSEBL1: MOVE T1,[XWD ,ERABUF] ;POINT AT BUFFER AREA SEBLK. T1, ;ASK MONITOR FOR NEXT SYSTEM ERROR BLOCK POPJ P, ;NO MORE ERROR BLOCKS CAILE T1, ;DID THIS ONE GET TRUNCATED? WARN ,OPR LDB T1,[POINTR ERABUF+.EHTYP,EH.HLN] ;GET PURPORTED HEADER LENGTH CAXE T1,EL.HED ;DOES MONITOR'S IDEA AND OURS AGREE? ERROR ,OPR,RSEBL1 PUSHJ P,SEBLOG ;LOG THE SYSTEM ERROR BLOCK JRST RSEBL1 ;LOOP FOR ANY OTHER BLOCKS ;HERE TO PROCESS SYSTEM ERROR BLOCKS FROM A CRASH FILE. RSEBL2: MOVX T1,%LDSEB ;POINTER TO TOP OF SYSTEM ERROR BLOCK QUEUE PUSHJ P,GTBDSK ;RUMMAGE AROUND THE CRASH FILE POPJ P, ;OLD CRASH FILE? PUSHJ P,PEKDSK ;GET THE ADDRESS OF THE FIRST ENTRY RSEBL3: MOVE P1,T1 ;COPY POINTER TO NEXT BLOCK TO P1 JUMPE P1,CPOPJ ;RETURN IF NO MORE ERROR BLOCKS MOVEI T1,1+.EHTYP(P1) ;POINT AT TYPE WORD (SKIP LINK WORD) PUSHJ P,PEKDSK ;INSERT OUR NOSES INTO THE CRASH FILE LDB T2,[POINTR T1,EH.HLN] ;GET THE HEADER LENGTH CAXE T2,EL.HED ;MAKE A QUICK SANITY CHECK ERROR ,OPR,CPOPJ ANDI T1,777 ;KEEP JUST THE BODY LENGTH FIELD ADD T1,T2 ;INCLUDE IN HEADER LENGTH CAILE T1, ;WILL WE TRUNCATE THIS ONE? WARN ,OPR CAILE T1, ;DON'T COPY MORE THAN WE CAN STORE INTERNALLY MOVEI T1, ;USE THE MINIMUM OF ENTRY AND OUR INTERNAL BLOCK MOVN P2,T1 ;GET -VE NUMBER OF WORDS TO COPY HRLZS P2 ;MOVE TO LH HRRI P2,ERABUF ;BUFFER ADDRESS TO P2 MOVEI P3,1(P1) ;FIRST WORD TO COPY RSEBL4: MOVE T1,P3 ;GET THE ADDRESS PUSHJ P,PEKDSK ;READ FROM THE CRASH FILE MOVEM T1,(P2) ;STORE IN ERABUF ADDI P3,1 ;NEXT WORD TO COPY AOBJN P2,RSEBL4 ;LOOP FOR REST OF THIS ERROR BLOCK PUSHJ P,SEBLOG ;INSERT THIS ENTRY INTO ERROR.SYS MOVE T1,P1 ;GET THE ERROR BLOCK ADDRESS PUSHJ P,PEKDSK ;GET ADDRESS OF NEXT BLOCK JRST RSEBL3 ;LOOP FOR ANY OTHER BLOCKS ;MINOR SUBROUTINE TO INSERT THE SYSTEM ERROR BLOCK IN ERABUF ;INTO THE ERROR.SYS FILE. SEBLOG: TLO F,L.ANY ;NOTE WE GOT SOMETHING MOVE T1,HEADR0 ;GET THE STANDARD FIELD DEFINITIONS TLNE F,L.DSK ;READING FROM DISK? TXO T1,EH.CRS ;YES, SET THE FLAG IORM T1,ERABUF+.EHTYP ;MAKE THIS LOOK LIKE A GOOD ERROR ENTRY AOS T1,ERRSEQ ;INCREMENT SEQUENCE NUMBER MOVEM T1,ERABUF+.EHSEQ ;(4) SEQUENCE NUMBER LDB P4,[POINT 9,ERABUF+.EHTYP,35] ;GET MONITOR-SUPPLIED LENGTH ADDI P4,ERABFS-1 ;ACCOUNT FOR SUBTRACT AT ERFILL PJRST ERRFIN ;STUFF THIS ENTRY IN ERROR.SYS AND RETURN ;ROUTINE TO REPORT SOFTWARE EVENT OF INTEREST, CODE 14. SWEERR: HLRZ P1,(T1) ;GET EVENT TYPE MOVE P2,1(T1) ;GET FUNCTION SPECIFIC DATA PUSHJ P,PROTJB ;INSURE THE JOB IS RELEASED MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;STORE ERROR CODE PUSHJ P,ERRINI ;SETUP BUFFER AND P4 PUSH P4,P1 ;(R0) SAVE EVENT CODE PUSH P4,J ;(R1) SAVE JOB NUMBER HRROI T1,.GTPPN ;NEED USER'S PPN PUSHJ P,GTBVAR ;(R2) SAVE IT HRROI T1,.GTPRG ;NEED USER'S PROGRAM NAME PUSHJ P,GTBVAR ;(R3) SAVE IT ALSO MOVEI P1,0 ;START OUT WITH NO TTY NUMBER PUSHJ P,GETTTY ;GET NUMBER OF CONTROLLING TTY JRST SWEER1 ;CAN'T, SKIP THE REST SKIPGE T1 ;IF THIS IS THE CTY MOVE T1,CTYLIN ;GET THE CTY DPB T1,[POINT 12,P1,35] ;SAVE IN P1 TRO T1,.UXTRM ;MAKE IT A UDX FOR GTNTN. TLNN F,L.DSK ;FORGET REST IF READING FROM DISK GTNTN. T1, ;GET NODE,,LINE ON NODE JRST SWEER1 ;CAN'T, USE ZERO DPB T1,[POINT 12,P1,23] ;SAVE LINE ON NODE IN P1 HLRZS T1 ;MOVE NODE TO RH DPB T1,[POINT 12,P1,11] ;SAVE IN P1 SWEER1: PUSH P4,P1 ;(R4) BYTE (12) NODE,LINE ON NODE,TTY PUSH P4,[-1,,SWEDTA] ;(R5) POINTER TO FUNCTION SPECIFIC DATA SWEDTA==6 ;OFFSET TO FIRST WORD OF FUNCTION DATA PUSH P4,P2 ;(R6-) FUNCTION SPECIFIC DATA PJRST ERRFIN ;CLOSE FILE AND RETURN ;HERE TO REPORT CONFIGURATION STATUS CHANGE, CODE = 15 SCSCER: LDB T3,[POINT 6,(T1),17] ;GET BYTE WHICH TELLS US WHAT CHANGE CAILE T3,CSCTBL ;GREATER THAN WE KNOW ABOUT? POPJ P, ;YES, GIVE UP PJRST @CSCTAB(T3) ;NO, DISPATCH ;DISPATCH TABLE INDEXED BY CHANGE CODE CSCTAB: EXP ATTUNI ;(0) ATTACH EXP ATTUNI ;(1) DETATCH EXP XCHNGE ;(2) EXCHANGE EXP DATCHG ;(3) DATE/TIME CHANGE EXP CPOPJ ;(4) UNDEFINED EXP CPOPJ ;(5) UNDEFINED EXP NODONL ;(6) NODE OFF-LINE EXP NODONL ;(7) NODE ON-LINE EXP MEMOFL ;(10) MEMORY ONLINE EXP MEMOFL ;(11) MEMORY OFFLINE EXP MEMOFL ;(12) MONITOR SET MEMORY OFFLINE CSCTBL==.-CSCTAB-1 ATTUNI: HRRZ P1,1(T1) ;ATT OR DET- GET UDB ADDR HLLZ P2,(T1) ;AND GET COMMENT+COD INTO P2 SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8];PUT ERROR CODE INTO T1 PUSHJ P,ERRINI ;AND CALL ERROR INITIALIZER MOVEI T1,UDBNAM(P1) ;GET UDB ADDR INTO T1 PUSHJ P,PEKSPY ;AND GET FIRST WORD (UDBNAM) PUSH P4,T1 ;(R0) STORE IT AWAY FOR ERROR FILE PUSH P4,[0] ;(R1) STORE SECOND NAME OF ZERO PUSH P4,P2 ;(R2) AND STORE COMMENTS+CODE PJRST SCSEND ;CLOSE ERROR FILE AND RETURN XCHNGE: HLRZ P1,1(T1) ;GET FIRST UDB ADDR INTO P1 HRRZ P2,1(T1) ;AND SECOND UDB ADDR INTO P2 HLLZ P3,(T1) ;GET COMMENTS+CODE INTO P3 SETZ T1, ;NOW CLEAR T1 DPB T2,[POINT 9,T1,8];AND PUT .ESCSC INTO T1 PUSHJ P,ERRINI ;INITIALIZE FOR ERROR MOVEI T1,UDBNAM(P1) ;ADDR OF FIRST UDB PUSHJ P,PEKSPY ;PICK UP UNIT NAME PUSH P4,T1 ;(R0) AND PUT IT INTO ERROR BUFFER MOVEI T1,UDBNAM(P2) ;NOW SAME FOR SECOND UNIT PUSHJ P,PEKSPY ;... PUSH P4,T1 ;(R1) ... PUSH P4,P3 ;(R2) AND NOW COMMENTS+CODE PJRST SCSEND ;CLOSE FILE AND RETURN MEMOFL: HLLZ P3,(T1) ;COMMENTS+CODE INTO P3 SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8];AND PUT .ESCSC INTO T1 PUSHJ P,ERRINI ;INITIALIZE FOR ERROR MOVN T1,NXMLEN ;GET NEGATIVE LENGTH OF NXMTAB HRLZS T1 ;AND PUT IN LH FOR POINTER CSCNAM==0 ;OFFSET OF POINTER TO FIRST TABLE PUSH P4,T1 ;(R0) SAVE -LEN,,0 FOR POINTER CSCNM2==1 ;OFFSET OF POINTER TO SECOND TABLE PUSH P4,T1 ;(R1) SAVE -LEN,,0 FOR THIS ONE ALSO HRRI P3,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE PUSH P4,P3 ;(R2) COMMENTS+CODE MOVEI T2,1-ERABFH(P4) ;GET OFFSET OF START OF FIRST NXM TABLE HRRM T2,ERABFS+CSCNAM ;SAVE IN RH OF POINTER HRR T1,NXMTAB ;MAKE AOBJN POINTER TO NXMTAB PUSH P4,(T1) ;PUSH A WORD ONTO THE BUFFER AOBJN T1,.-1 ;AND STEP TO NEXT WORD MOVEI T2,1-ERABFH(P4) ;GET OFFSET OF START OF SECOND NXM TABLE HRRM T2,ERABFS+CSCNM2 ;SAVE IN RH OF POINTER MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB PUSHJ P,GTBDFL MOVE T3,T1 ;USE T3 AS AOBJN POINTER MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE MOFLOP: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1 PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR MOVEM T1,(T2) ;STASH IT AWAY PUSH P4,(T2) ;PUT IT INTO ERROR BUFFER ALSO AOS T2 ;INCREMENT T2 AOBJN T3,MOFLOP ;INCREMENT T3 AND LOOP JRST SCSEND ;JOIN COMMON CODE DATCHG: PUSHJ P,PROTJB ;INSURE THAT JOB IS RELEASED FROM ^D MOVE P1,1(T1) ;GET DATE/TIME INCREMENT ADDM P1,MRVBDY+MRVIDT ;SUM DATE/TIME INCREMENTS HLLZ P2,(T1) ;GET CODE MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;STORE ENTRY CODE IN T1 FOR ERRINI PUSHJ P,ERRINI ;SETUP BUFFER PUSH P4,P1 ;(R0) INCREMENTAL DATE/TIME CHANGE PUSHJ P,FLSPAK ;FLUSH INPUT QUEUE AND CLEAR BLOCK MOVEI T1,.USSDT ;GET CODE FOR DATE CHANGE FOR %SIACT MOVEM T1,SSELBK ;STORE IN BLOCK MOVEM P1,SSELBK+1 ;SAVE INCREMENT IN MESSAGE BLOCK PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME MOVEM T1,SSELBK+2 ;SAVE IN BLOCK PUSH P4,T1 ;(R1) CURRENT DATE/TIME PUSH P4,P2 ;(R2) REASON CODE (I.E., DATE/TIME) MOVE T1,[SIXBIT/DAEMON/] ;GET OUR NAME MOVEM T1,SSELBK+3 ;SAVE IN BLOCK MOVE T1,.JBVER ;GET OUR VERSION NUMBER MOVEM T1,SSELBK+4 ;SAVE IN BLOCK PUSHJ P,FNDACT ;FIND PID OF [SYSTEM]ACCOUNTING JRST SCSEND ;NOT THERE, JUST WRITE FILE PUSHJ P,SNDPAK ;SEND MESSAGE TO %SIACT JRST SCSEND ;JOIN COMMON CODE NODONL: HLLZ P1,0(T1) ;GET SUB-CODE IN P1 HRRZ P2,1(T1) ;GET NODE NUMBER IN P2 HLRZ P3,1(T1) ;GET ADDITIONAL INFORMATION IN P3 MOVEI T1,0 ;SETUP FOR ERRINI DPB T2,[POINT 9,T1,8] ;STORE CODE PUSHJ P,ERRINI ;SETUP BUFFER AND P4 PUSH P4,P2 ;(R0) NODE NUMBER PUSH P4,P3 ;(R1) ADDITIONAL INFO PUSH P4,P1 ;(R2) CODE FOR NODE ON/OFF LINE ;; JRST SCSEND ;JOIN COMMON CODE SCSEND: TRO F,R.AVL ;APPEND THIS ENTRY TO AVAIL.SYS ALSO PJRST ERRFIN ;CLOSE FILE AND RETURN IFN FTUNSUPPORTED,< ;HERE TO REPORT NXM ERROR - CODE 4 OR 67 SNXMER: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;GET CPU NUMBER LSH P2,1 ;DOUBLE IT PUSHJ P,ISKL10 ;IS THIS A KL10? SKIPA ;NO MOVEI T2,.ESKAE ;FUDGE CODE FOR KL10 NXM SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSHJ P,ERRINI ;INITIALIZE THE ERROR BUFFER MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVTNE] ;COUNT OF ERROR ON SWEEP OF CORE PUSHJ P,GCPVAR ;(R1)STASH IT MOVE T1,[%CVSNE] ;NOT REPRODUCIBLE ERROR COUNT PUSHJ P,GCPVAR ;(R2) MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR PUSHJ P,GCPVAR ;(R3) MOVE T1,[%CVNJA] ;NUMBER OF JOBS AFFECTED BY THIS NXM PUSHJ P,GCPVAR ;(R4) MOVE T1,[%CVMNA] ;FIRST BAD ADDR FROM SWEEP PUSHJ P,GCPVAR ;(R5) MOVE T3,[%CCNXT] ;GET POINTER TO NXM SUBTABLE ADD T3,P2 ;POINTER IS IN CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN VARIABLES TABLE NXMSLP: PUSHJ P,GSUBTB ;GET AN ITEM FROM THE SUBTABLE JRST ENXSTB ;END OF THE SUBTABLE PUSH P4,T1 ;(R6-R15)STICK IT IN THE BUFFER AOJA T2,NXMSLP ;LOOP OVER ENTIRE SUBTABLE ENXSTB: MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE HRLI T1,707070 ;FLAG FOR SYSERR PUSH P4,T1 ;(R16)SAVE IT MOVN T2,NXMLEN ;GET NEGTIVE LENGTH OF NXMTAB HRLZS T2 ;PUT IT IN LH OF T2 FOR POINTER EN%BEF==17 ;OFFSET OF FIRST POINTER TO NXMTAB PUSH P4,T2 ;(R17)SAVE AS POINTER TO FIRST COPY OF NXMTAB PUSH P4,T2 ;(R20)SAVE AS POINTER TO SECOND COPY OF NXMTAB EN%BAT==21 ;OFFSET FOR POINTER TO BAD ADDR SUBTABLE AOBJN P4,.+1 ;(R21)SPACE FOR BAD ADDRESS SUBTABLE MOVE T1,[%SYSPP] ;GETTAB FOR PPN OF USER CRASHED BY NXM PUSHJ P,GTBVAR ;(R22) SAVE PPN MOVE T1,[%SYSPN] ;PROGRAM NAME ON NXM PUSHJ P,GTBVAR ;(R23) SAVE PROGRAM NAME PUSHJ P,KLCPU ;(R24-R26 ON KL)REPORT CONI APR, AND RDERA IF KL10 MOVEI T1,1-ERABFH(P4) ;GET RELATIVE POSITION TO NXM TABLE HRRM T1,ERABFS+EN%BEF ;SAVE AS RIGHT HALF OF POINTER HLLZ T2,ERABFS+EN%BEF ;GET BACK NEG LENGTH HRR T2,NXMTAB ;AND GET POINTER TO TABLE PUSH P4,(T2) ;PUSH WORD OF NXMTAB INTO BUFFER AOBJN T2,.-1 ;STEP TO NEXT WORD MOVEI T1,1-ERABFH(P4) ;GET RELATIVE OFFSET TO 2ND TABLE HRRM T1,ERABFS+EN%BEF+1 ;SAVE IT AS RIGHT HALF OF POINTER MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB PUSHJ P,GTBDFL MOVE T3,T1 ;USE T3 AS AOBJN POINTER MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE NXELOP: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1 PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR MOVEM T1,(T2) ;STASH IT AWAY PUSH P4,T1 ;PUT IT INTO ERROR BUFFER ALSO AOS T2 ;INCREMENT T2 AOBJN T3,NXELOP ;INCREMENT T3 AND LOOP PUSH P,P4 ;SAVE CURRENT LOC IN BUFFER MOVE T3,[%CCNXT] ;SUBTABLE POINTER FOR NXM ADD T3,P2 ;IN THE CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;THE SUBTABLE IS IN VARIABLES TABLE HRRI T2,%CVNTS ;ITEM FOR # OF NXM'S FOUND ON SWEEP PUSHJ P,GSUBTB ;GO GET IT JRST CKLSBD ;NONE IF NO POINTER JUMPE T1,CKLSBD ;OR IF POINTER IS ZERO MOVE T4,T1 ;GET COUNT INTO T4 HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW HLLZS T2 ;AND START AT ITEM 0 NBTSLP: PUSHJ P,GSUBTB ;GET A WORD JRST ENBTTB ;ALL DONE PUSH P4,T1 ;SAVE IT IN BUFFER AOJ T2, ;STEP TO NEXT ENTRY SOJG T4,NBTSLP ;LOOP BACK FOR NUMBER OF ENTRIES ENBTTB: POP P,T1 ;GET BACK START LOC OF TABLE MOVNI T2,(T2) ;GET NEGATIVE NUMBER OF ITEMS STORED JUMPE T2,KLSBDG ;IF NONE, JUST FINISH HRLI T2,1-ERABFH(T1) ;COMPUTE RELATIVE OFFSET OF TABLE MOVSM T2,ERABFS+EN%BAT ;SAVE POINTER IN BUFFER PJRST KLSBDG ;WRITE SBDIAG SUBTABLE IF KL10, THEN CLOSE ERROR FILE ;STILL IFN FTUNSUPPORTED ;HERE TO REPORT CPU PARITY ERROR - CODE 3 OR 62 SCPERR: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;COPY CPU # LSH P2,1 ;DOUBLE IT PUSHJ P,ISKL10 ;IS THIS A KL10? SKIPA ;NO MOVEI T2,.ESMOT ;YES, FUDGE CODE FOR KL10 PARITY INTERRUPT SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PJRST GCPERR ;LOG THE ERROR ;HERE TO REPORT KL10 DATA PARITY TRAP -- CODE 60 SKLTRP: PUSHJ P,PROTJB ;[544] MAKE SURE JOB IS FREED HLRZ P3,(T1) ;GET CPU DATA BLOCK ADDR INTO P3 PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;COPY CPU NUMBER LSH P2,1 ;AND DOUBLE IT FOR GETTABS SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 PUSHJ P,ERRINI ;WRITE ENTRY HEADER MOVE T1,[%CVPFW] ;PAGE FAIL WORD PUSHJ P,GCPVAR ;(R0) MOVE T1,[%CVTBD] ;BAD DATA PUSHJ P,GCPVAR ;(R1) MOVE T1,[%CVTGD] ;GOOD DATA PUSHJ P,GCPVAR ;(R2) MOVE T1,[%CVBPA] ;BAD PHYSICAL ADDR PUSHJ P,GCPVAR ;(R3) MOVE T1,[%CVPTR] ;RETRY WORD PUSHJ P,GCPVAR ;(R4) MOVE T1,[%CVSPT] ;NUMBER OF SOFT TRAPS PUSHJ P,GCPVAR ;(R5) MOVE T1,[%CVHPT] ;NUMBER OF HARD TRAPS PUSHJ P,GCPVAR ;(R6) MOVE T1,[%CVPPC] ;PC AT TIME OF TRAP PUSHJ P,GCPVAR ;(R7) PJRST ERRFIN ;CLOSE FILE AND RETURN > ;END IFN FTUNSUPPORTED ;HERE TO REPORT CONTINUABLE STOPCD - CODE =2 SCNSTD: MOVSI P1,-21 ;NUMBER OF CRASH AC'S + CRASH PI HLR P1,(T1) ;LOCATION SAVED AT IN MONITOR SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 PUSHJ P,ERRINI ;AND INITIALIZE ERROR MOVE T2,[%CNFG0] ;5 WORDS OF SYSTEM NAME, 2 DATE SUB T2,[%CNDT1+<1,,0>] HLR T2,[%CNFG0] MONLUP: MOVEI T1,.GTCNF ;FROM CNFTBL HRLI T1,(T2) PUSHJ P,GTBVAR ;(R0-R6) SAVE A WORD OF SYSTEM NAME/DATE AOBJN T2,MONLUP ;GO GET NEXT WORD MOVE T1,[%CNSER] ;GET CPU0 SERIAL NUMBER PUSHJ P,GTBVAR ;(R7) SAVE CPU0 SERIAL NUMBER PUSH P4,MONVER ;(R10) SAVE MONITOR VERSION MOVE T1,[%SYSCD] ;GET NAME OF LAST STOPCD PUSHJ P,GTBVAR ;(R11) SAVE NAME OF LAST STOPCODE MOVE T1,[%SYSJN] ;JOB # ON LAST STOPCD PUSHJ P,GTBVAR ;(R12) SAVE JOB NUMBER ON LAST STOPCODE MOVE T1,[%SYSTN] ;TTY NAME ON LAST STOPCD PUSHJ P,GTBVAR ;(R13) SAVE TTY ON LAST STOPCODE MOVE T1,[%SYSPN] ;PROG NAME ON LAST STOPCD PUSHJ P,GTBVAR ;(R14) SAVE PROGRAM NAME ON LAST STOPCODE MOVE T1,[%SYSPP] ;PPN OF USER, LAST STOPCD PUSHJ P,GTBVAR ;(R15) SAVE PPN MOVE T1,[%SYNJS] ;NUMBER OF JOB STOPCDS PUSHJ P,GTBVAR ;(R16) SAVE NUMBER MOVE T1,[%SYNDS] ;NUMBER OF DEBUG STOPCD PUSHJ P,GTBVAR ;(R17) SAVE NUMBER CACLUP: MOVEI T1,(P1) ;ADDRESS OF NEXT CRASH AC (OR PI STATUS) PUSHJ P,PEKSPY PUSH P4,T1 ;(R20-R40) AOBJN P1,CACLUP ;NOW GO TO NEXT ONE TRO F,R.AVL ;APPEND THIS ENTRY TO AVAIL.SYS ALSO PJRST ERRFIN ;ALL DONE, CLOSE FILE AND RETURN ;HERE TO REPORT FRONT END SUPPLIED KL CPU ERROR INFORMATION KLEERR: LDB P1,[POINT 3,2(T1),17] ;GET CPU NUMBER FROM ERROR BLOCK PUSH P,P1 ;SAVE ON STACK FOR LATER TLNN F,L.DSK ;READING FROM DISK? JRST KLEER1 ;NO MOVEI P2,1 ;GET A BIT TO SHIFT LSH P2,(P1) ;POSITION FOR THIS CPU TDNE P2,KLEFLG ;ALREADY BEEN HERE FOR THIS CPU? JRST TPOPJ ;YES, DONE THEM ALL ALREADY IORM P2,KLEFLG ;SET FLAG FOR NEXT TIME KLEER1: HLRZ P1,(T1) ;GET ADDRESS OF FIRST ERROR BLOCK IN MONITOR PUSH P,T2 ;SAVE CODE ON STACK KLEER2: JUMPE P1,KLEER6 ;DONE IF ZERO TLNE F,L.DSK ;READING FROM DISK? JRST KLEER3 ;YES, IT'S NOT GOING TO GO AWAY MOVE T1,[.DTERT,,T3] HRLZ T3,-1(P) ;GET CPU,,0 FROM STACK DTE. T1, ;RESET THE TIMER SO THE KL ERROR DATA DOESN'T GO AWAY JRST KLEER6 ;SORRY, IT'S ALREADY GONE. KLEER3: MOVE T2,0(P) ;GET CODE OFF STACK SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT CODE IN T1 PUSHJ P,ERRINI ;SETUP P4 (0-2) PUSH P4,[-1] ;(R0)JOB NUMBER PUSH P4,[0] ;(R1)DIRECTORY PUSH P4,[0] ;(R2)FRONT END SOFTWARE VERSION PUSH P4,[0] ;(R3)SIXBIT NAME OF PROGRAM (NONE) MOVEI T1,.KEDEV(P1) ;GET ADDRESS IN BLOCK WHERE PROTOCOL DEVICE IS PUSHJ P,PEKSPY ;GET THE DATA LDB T2,KLEDEV ;GET PROTOCOL DEVICE CODE LDB T3,KLEUNI ;AND UNIT NUMBER HRL T2,T3 ;UNIT#,,PROTOCOL DEVICE CODE PUSH P4,T2 ;(R4)PROTOCOL DEVICE CODE LDB T1,KLECNT ;GET SIZE OF ERROR DATA IN 8 BIT BYTES PUSH P,T1 ;SAVE FOR LATER ADDI T1,^D36/^D8-1 ;ROUND UP TO NEAREST 36 BIT WORD ASH T1,-2 ;CONVERT TO 36 BIT WORD COUNT MOVNS T1 ;GET MINUS COUNT HRLZS T1 ;-COUNT,,0 FE%OFF==5 ;OFFSET OF SUB-BLOCK POINTER PUSH P4,T1 ;(R5)-LENGTH,,0 HLLZ P3,T1 ;GET -COUNT,,0 IN P3 FOR AOBJN LATER MOVEI T1,.KECPU(P1) ;WORD WITH CPU, DTE, LINK PUSHJ P,PEKSPY ;GET NEXT WORD IN T1 LDB T2,KLEDTN ;GET DTE NUMBER LDB T3,KLECPN ;AND CPU NUMBER HRL T2,T3 ;CPU#,,DTE# PUSH P4,T2 ;(R6)CPU#,,DTE# POP P,T2 ;GET SAVED COUNT OF 8 BIT DATA BYTES PUSH P4,T2 ;(R7)COUNT OF 8 BIT DATA BYTES LDB P2,KLELNK ;GET LINK ADDRESS JUMPE P3,KLEER5 ;GO IF NO DATA TO STORE HRRI P3,.KEDAT(P1) ;GET ADDRESS OF DATA MOVEI T1,1-ERABFS(P4) ;GET RELATIVE OFFSET OF START OF TABLE HRRM T1,ERABFS+FE%OFF ;SAVE IN POINTER KLEER4: HRRZ T1,P3 ;GET ADDRESS IN MONITOR IN T1 PUSHJ P,PEKSPY ;GET THE DATA PUSH P4,T1 ;(R10-)SAVE THE DATA AOBJN P3,KLEER4 ;LOOP FOR ALL WORDS KLEER5: HRRZ T1,ERABFS+FE%OFF-1 ;UNIT,,DEVICE CODE CAIN T1,210 ;KLINIK DEVICE? TLNE F,L.DSK ;FROM MONITOR? JRST KLER5A ;NO, NO NEED TO QUEUE. HRRZI T4,ERABFS+FE%OFF+3 ;POINT TO FIRST DATA WORD HRLI T4,(POINT 16,,) ;THUS ILDB T1,T4 ;GET STATUS WORD JUMPE T1,KLER5A ;IF NO BITS ON, XFER DIDN'T HLRZ T1,F ;SAVE A COPY OF THE FLAGS TRZ T1,^-L.QUE ;ONLY THE ONES WE MESS WITH PUSH P,T1 ;FOR WHEN WE'RE DONE TLO F,L.QUE ;TELL TYPCHR WHAT WE WANT PUSH P,MSGPTR ;SAVE POINTER PUSH P,MSGCNT ;AND COUNTER DMOVE T1,[POINT 7,KLQHDR EXP ^D80] ;BUFFER LENGTH DMOVEM T1,MSGPTR ;STORE A NEW ONE MOVEI T1,[ASCIZ .CPU.] PUSHJ P,TYPSTR ;TYPE HLRZ T1,ERABFS+FE%OFF+1 ;CPU,,DTE WORD PUSHJ P,TDEC MOVEI T1,[ASCIZ . KLINIK Status Change.];END PUSHJ P,TYPSTR HRRZ T1,MSGPTR ;GET POINTER SUBI T1,KLQHDR-1 ;GET NUMBER OF WORDS IN HEADER HRLM T1,KLQLEN ;STORE FOR QUEUE. POP P,MSGCNT ;RESTORE COUNTER POP P,MSGPTR ;AND POINTER ILDB T1,T4 ;NEXT, GET EVENT CODE WORD MOVE T3,T1 ;COPY CODE,,TYPE LSH T3,-8 ;CODE ANDI T1,377 ;TYPE CAIN T1,377 ;CLEAR? JRST KLEKWC ;(377) WINDOW CLOSED CAILE T1,0 ;IF LE ZERO CAILE T1,7 ;OR GT MAX JRST KLER5B ;INVALID FORMAT, FORGET IT JRST @.(T1) ;DISPATCH Z KLEKOW ;(1) OPEN WINDOW Z KLEKLR ;(2) LINE RANG Z KLEKLD ;(3) LINE DISCONNECT Z KLEKLC ;(4) LINE CONNECT Z KLEKBP ;(5) BAD PASSWORD Z KLEKLF ;(6) LOGIN FAILED Z KLEKAR ;(7) ACTIVE ON REBOOT KLEKWC: MOVEI T1,[ASCIZ .Access window closed.] JRST KLEKST ;OUTPUT STRING KLEKOW: MOVEI T1,[ASCIZ .Access window opened Window opened on .] PUSHJ P,TYPSTR ;TYPE IT PUSHJ P,KLEKDT ;TYPE DATE MOVEI T1,[ASCIZ . Window closes on .] PUSHJ P,TYPSTR ;DELIMIT PUSHJ P,KLEKDT ;TYPE DATE MOVEI T1,[ASCIZ . KLINIK mode: .] PUSHJ P,TYPSTR ;TYPE ILDB T1,T4 ;FETCH CSL,,KLINIK MOVE T3,T1 ;SAVE CSL ANDI T1,377 ;GET KLINIK CAIN T1,377 ;USER MODE? JRST [MOVEI T1,[ASCIZ .USER.] JRST KLEKST] ;YES, DONE MOVEI T1,[ASCIZ .REMOTE Console mode: .] PUSHJ P,TYPSTR MOVE T1,T3 ;GET CSL MODE LSH T1,-8 ; ;ONLY CSL MODE IDIVI T1,3 ;XLATE (1,3,7) TO (0,1,2) AOJ T1, ;MAKE (1,2,3) KLEKLM: MOVE T1,[[ASCIZ .OPERATOR.] [ASCIZ .PROGRAMMER.] [ASCIZ .MAINTENANCE.]]-1(T1) JRST KLEKST ;TYPE AND SEND MESSAGE KLEKLR: MOVEI T1,[ASCIZ .Dataset rang - .] PUSHJ P,TYPSTR MOVEI T1,[ASCIZ .???.] CAIN T3,1 ;ACCEPTED? MOVEI T1,[ASCIZ .Accepted.] CAIN T3,377 ;REJECTED MOVEI T1,[ASCIZ .Window closed.] JRST KLEKST ;TYPE AND SEND MESSAGE KLEKLD: MOVEI T1,[ASCIZ .Dataset disconnected .] PUSHJ P,TYPSTR ;SAY SO MOVEI T1,[ASCIZ .???.] CAIN T3,1 ;INTENTIONAL? MOVEI T1,[ASCIZ .from CTY or Timeout.] CAIN T3,377 ;LINE DROP? MOVEI T1,[ASCIZ .due to carrier loss.] JRST KLEKST ;TYPE AND SEND KLEKLC: MOVEI T1,[ASCIZ .Remote user connected in .] PUSHJ P,TYPSTR ;WHAT HAPPENED KLEKC0: MOVE T1,T3 ;GET EVENT CODE CAIN T1,377 ;IS IT USER? JRST [MOVEI T1,[ASCIZ .USER.] JRST KLEKC1] ;YES CAIL T1,1 ;RANGE CHECK CAILE T1,3 ;OP, PRG, MNT SKIPA T1,[[ASCIZ .???.]] ;FAILS XCT KLEKLM ;GET ADDRESS OF MODE PUSH P,T1 ;SAVE MOVEI T1,[ASCIZ .REMOTE .] PUSHJ P,TYPSTR ;SAY POP P,T1 ;RESTORE ADDRESS OF MODE STRING KLEKC1: PUSHJ P,TYPSTR ;TYPE IT MOVEI T1,[ASCIZ . mode.] JRST KLEKST ;TYPE AND SEND KLEKBP: MOVEI T1,[ASCIZ .Bad password #.] PUSHJ P,TYPSTR ;LABEL MOVE T1,T3 ;GET NUMBER PUSHJ P,TDEC ;TYPE MOVEI T1,[ASCIZ . entered.] JRST KLEKST ;DON'T TYPE WHAT WAS TRIED KLEKLF: MOVEI T1,[ASCIZ .Remote access failed - .] PUSHJ P,TYPSTR MOVE T1,T3 ;HOW MANY PASSWORDS PUSHJ P,TDEC ;SAY MOVEI T1,[ASCIZ . passwords attempted.] JRST KLEKST ;TYPE AND SEND KLEKAR: MOVEI T1,[ASCIZ .Active during reload in .] PUSHJ P,TYPSTR JRST KLEKC0 ;TYPE CODE KLEKDT: ILDB T1,T4 ;FETCH THE TIME(SEC/2) PUSH P,T1 ;SAVE TIME ILDB T1,T4 ;GET MON,,YR PUSH P,T1 ;SAVE ILDB T1,T4 ;GET 0,,DAY ANDI T1,377 ;BETTER BE DAY PUSHJ P,TDEC ;TYPE DAY MOVE T1,(P) ;MONTH,,YR LSH T1,-8 ;MONTH CAILE T1,^D12 ;BETTER BE LEGAL SETZ T1, ;GLAD WE CHECKED MOVEI T1,[0 ASCIZ /-Jan/ ASCIZ /-Feb/ ASCIZ /-Mar/ ASCIZ /-Apr/ ASCIZ /-May/ ASCIZ /-Jun/ ASCIZ /-Jul/ ASCIZ /-Aug/ ASCIZ /-Sep/ ASCIZ /-Oct/ ASCIZ /-Nov/ ASCIZ /-Dec/](T1) PUSHJ P,TYPSTR ;TYPE THIS MOVEI SC,"-" ;NEXT PUSHJ P,TYPCHR ;TYPE IT POP P,T1 ;GET YEAR ANDI T1,377 ;THUS PUSHJ P,TDEC02 ;DONE WITH DATE MOVEI T1,[ASCIZ . at .] PUSHJ P,TYPSTR ;SIGH POP P,T1 ;RESTORE TIME LSH T1,1 ;MAKE SECONDS IDIVI T1,^D60 ;MIN:SEC PUSH P,T2 ;SEC IDIVI T1,^D60 ;HR:MIN PUSH P,T2 ;MIN PUSHJ P,TDEC02 ;PRINT 2 DIGITS MOVEI SC,":" ; PUSHJ P,TYPCHR ;TYPE COLON POP P,T1 ;MIN PUSHJ P,TDEC02 ;MIN MOVEI SC,":" PUSHJ P,TYPCHR ;COLON POP P,T1 ;SEC PJRST TDEC02 ;TYPE AND RETURN KLEKST: PUSHJ P,TYPSTR ;TYPE STRING KLEKSM: PUSHJ P,PCRLF ;DO A CRLF PUSHJ P,DMPBUF ;DUMP THE BUFFER KLER5B: TLZ F,L.QUE ;CLEAR L.QUE POP P,T1 ;GET OLD VALUE TLO F,(T1) ;RESTORE IT KLER5A: PUSHJ P,ERRFIN ;OK, CLOSE OFF ENTRY MOVE P1,P2 ;GET NEW NEXT BLOCK JRST KLEER2 ;GO SEE IF THERE IS MORE KLEER6: POP P,(P) ;FLUSH CODE FROM STACK MOVE T1,[.DTERC,,T3] ;RELEASE THE ERROR CORE NOW POP P,T3 ;GET CPU NUMBER HRLZS T3 ;MAKE IT CPU,,0 TLNN F,L.DSK ;DON'T TOUCH RUNNING MONITOR IF FROM DISK DTE. T1, ;DO IT JFCL ;GIVES NO ERROR RETURN POPJ P, ;RETURN KLEDEV: POINT 9,T1,8 ;PROTOCOL DEVICE CODE KLEUNI: POINT 9,T1,17 ;UNIT NUMBER KLECNT: POINT 18,T1,35 ;COUNT OF 8 BIT BYTES KLECPN: POINT 9,T1,8 ;CPU NUMBER KLEDTN: POINT 9,T1,17 ;DTE NUMBER KLELNK: POINT 18,T1,35 ;LINK TO NEXT BLOCK IF ANY ;HERE TO DUMP CPU STATUS BLOCK - CODE 63 CSBERR: HLRZ P3,(T1) ;GET CDB ADDRESS PUSHJ P,FNDCPU ;FIND CPU NUMBER THAT WANTS TO DUMP BLOCK POPJ P, ;NONE, GIVE UP LSH P1,1 ;DOUBLE IT MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 PUSHJ P,ERRINI ;SETUP BUFFER AND P4 MOVE T3,[%CCCSB] ;SUBTABLE POINTER TO CPU STATUS BLOCK ADDI T3,(P1) ; FROM THIS CPU CONSTANT TABLE MOVSI T2,.GTC0V(P1) ;SUBTABLE IS IN CPU VARIABLE TABLE CSBER1: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE PJRST CSBER2 ;END OF TABLE, CLEAN UP PUSH P4,T1 ;PLACE IN BUFFER AOJA T2,CSBER1 ;LOOP FOR ENTIRE TABLE CSBER2: MOVEI T1,1(P4) ;GET CURRENT BUFFER ADDRESS CSBSBD==142 ;OFFSET IN BLOCK OF SBDIAG POINTER CAILE T1,ERABFS+CSBSBD ;DID WE DO THAT MANY ENTRIES? SKIPL ERABFS+CSBSBD ;AND SBDIAG POINTER LOOK OK? PJRST ERRFIN ;NO TO ONE, DON'T TOUCH POINTER MOVEI T3,CSBSBD ;GET OFFSET OF SBDIAG POINTER ADDM T3,ERABFS+CSBSBD ;MAKE IT OFFSET FROM START OF BLOCK PJRST ERRFIN ;CLOSE ERROR FILE AND RETURN ;HERE TO DUMP DEVICE STATUS BLOCK - CODE 64 DSBERR: HLRZ P3,(T1) ;GET CDB ADDRESS PUSHJ P,FNDCPU ;FIND CPU THAT WANTS TO DUMP BLOCK POPJ P, ;NONE, GIVE UP LSH P1,1 ;DOUBLE IT MOVEI T1,0 ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;STORE ERROR CODE IN T1 PUSHJ P,ERRINI ;SETUP BUFFER AND P4 DSBIOI==0 ;OFFSET OF POINTER TO I/O INSTRUCTIONS AOBJN P4,.+1 ;(R0) LEAVE ROOM FOR POINTER DSBRSV==1 ;OFFSET OF POINTER TO RESULTANT VALUES AOBJN P4,.+1 ;(R1) LEAVE ROOM FOR POINTER PUSH P,P4 ;SAVE INITIAL VALUE OF BUFFER POINTER MOVEI T2,0 ;INITIALIZE COUNT DSBER1: HRLI T1,(T2) ;ITEM NUMBER TO LH HRRI T1,.GTDCD ;TABLE NUMBER TO RH PUSHJ P,GTBSPY ;GET NEXT I/O INSTRUCTION FROM DVCSTS JRST DSBER2 ;END OF TABLE PUSH P4,T1 ;SAVE IN BUFFER AOJA T2,DSBER1 ;BUMP ITEM NUMBER AND LOOP DSBER2: MOVNI T2,(T2) ;GET NEGATIVE LOOP COUNT POP P,T1 ;RESTORE POINTER TO INITIAL LOC JUMPE T2,DSBER3 ;IF NONE, LEAVE POINTER ZERO HRLI T2,1-ERABFS(T1) ;MAKE SWAPPED AOBJN POINTER TO I/O INSTNS MOVSM T2,ERABFS+DSBIOI ;SAVE POINTER IN BUFFER DSBER3: PUSH P,P4 ;SAVE CURRENT BUFFER LOC FOR NEXT POINTER MOVE T3,[%CCDSB] ;SUBTABLE POINTER TO DEVICE STATUS BLOCK ADDI T3,(P1) ; FROM THIS CPU CONSTANT TABLE MOVSI T2,.GTC0V(P1) ;SUBTABLE IS IN CPU VARIABLE TABLE DSBER4: PUSHJ P,GSUBTB ;GET VALUE FROM SUBTABLE JRST DSBER5 ;END OF TABLE PUSH P4,T1 ;SAVE VALUE IN BUFFER AOJA T2,DSBER4 ;BUMP INDEX AND LOOP DSBER5: MOVNI T2,(T2) ;GET NEGATIVE COUNT POP P,T1 ;GET BACK START LOC OF TABLE PJUMPE T2,ERRFIN ;IF NONE, CLOSE ERROR FILE HRLI T2,1-ERABFS(T1) ;MAKE SWAPPED AOBJN POINTER TO TABLE MOVSM T2,ERABFS+DSBRSV ;SAVE IN BUFFER PJRST ERRFIN ;CLOSE FILE AND RETURN ;SUBROUTINE TO RECORD A CPU-DETECTED ERROR ;ARGS T1=ERROR.SYS CODE IN BITS 0-8 ; P1=CPU # ; P2=CPU # TIMES 2 (FOR GETTAB CPU TABLES) ;RETURNS CPOPJ, P1 AND P2 INTACT, P4, T1-4 BLOWN GCPERR: PUSHJ P,ERRINI ;SETUP BUFFER AND P4 MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVTPE] PUSHJ P,GCPVAR ;(R1)TOTAL ERRORS WHICH RECURRED ON SWEEP OF CORE MOVE T1,[%CVSPE] PUSHJ P,GCPVAR ;(R2) TOTAL NOT REPRODUCABLE MOVE T1,[%CVMPC] ;MEM PAR CONTINUES PUSHJ P,GCPVAR ;(R3) MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR PUSHJ P,GCPVAR ;(R4) PC (EXEC OR USER) MOVE T1,[%CVMPW] ;1ST WORD FOUND IN ERROR PUSHJ P,GCPVAR ;(R5) MOVE T1,[%CVMPA] ;FIRST BAD ADDRESS PUSHJ P,GCPVAR ;(R6) EC%PAR==7 ;PARITY DATA SUBTABLE POINTER AOBJN P4,.+1 ;(R7) SAVE SPACE FOR IT EC%BAT==10 ;BAD ADDRESS SUBTABLE POINTER AOBJN P4,.+1 ;(R10) SAVE SPACE FOR IT MOVE T1,[%SYSPP] ;[463]PPN OF USER, LAST STOPCD PUSHJ P,GTBVAR ;(R11) SAVE PPN MOVE T1,[%SYSPN] ;PROG NAME ON LAST STOPCD PUSHJ P,GTBVAR ;(R12) SAVE PROGRAM NAME PUSHJ P,KLCPU ;(R13-R15 ON KL)REPORT KL10 CONI AND RDERA ;KLCPU SET UP P3 WITH LOCATION OF POINTER TO SBDIAG SUBTABLE FOR ;CALL TO KLSBDG PUSH P,P4 ;SAVE START ADDRESS OF SUBTABLE MOVE T3,[%CCPAR] ;SUB-TABLE POINTER FOR OTHER PAR STUFF ADD T3,P2 ;FROM THIS CPU CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN CPU VAR TABLE PARSLP: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE JRST EPARTB ;END OF PARITY SUBTABLE PUSH P4,T1 ;GIVE AOJA T2,PARSLP ;GET WHOLE SUBTABLE EPARTB: POP P,T1 ;GET BACK START LOC OF SUBTABLE MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT JUMPE T4,KLSBDG ;IF NONE, THEN NO BAD ADDR'S EITHER HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE MOVSM T4,ERABFS+EC%PAR ;SAVE AS POINTER TO SUBTABLE PUSH P,P4 ;SAVE START LOC OF BAD ADDR SUBTABLE ;HERE TO RECORD BAD ADDRESSES HRRI T2,%CVPTS ;OTHER POINTERS ARE ALREADY SET PUSHJ P,GSUBTB ;NO OF BAD ADDRESSES SAVED JRST CKLSBD ;NONE IF NO TABLE FOR THEM MOVEI T4,(T1) ;KEEP THE COUNT JUMPE T4,CKLSBD ;QUIT IF NONE HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW HLLZS T2 ;START AT BEGINNING OF TABLE BATSLP: PUSHJ P,GSUBTB ;GET NEXT BAD ADDRESS JRST EBATTB ;END OF SUB-TABLE MOVEM T1,1(P4) ;SAVE THE BAD ADDR AOBJP P4,EBATTB ;CHECK FOR BUFFER OVERFLOW AOJ T2, ;READY FOR NEXT ENTRY SOJG T4,BATSLP ;GET IT IF ONE WAS STORED EBATTB: POP P,T1 ;GET BACK START LOC OF TABLE MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT JUMPE T4,KLSBDG ;GO IF NONE HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE MOVSM T4,ERABFS+EC%BAT ;STORE AS POINTER TO SUBTABLE PJRST KLSBDG ;GET SBDIAGS IF ON A KL GCPVAR: ADD T1,P2 ;CUT DOWN THE TYPING BY PUTTING THIS GTBVAR: PUSHJ P,GTBDFL ; ALL IN ONE PLACE PUSH P4,T1 ;SAVE AN ITEM IN THE ERROR FILE POPJ P, ;HERE TO FIND CPU NUMBER CORRESPONDING TO CDB ADDRESS ;CALLED WITH P3 CONTAINING CDB ADDR ;RETURNS WITH P1 CONTAINING CPU # IN RIGHT HALF ;NON SKIP RETURN MEANS NO CPU MATCHED FNDCPU: MOVSI P1,-CPUN ;GET NUMBER OF CPUS WE KNOW ABOUT FNDCP1: HRRZ T1,P1 ;GET CPU NUMBER INTO T1 LSH T1,1 ;DOUBLE IT FOR .GTC0C, ETC. HRLI T1,.GTC0C(T1) ;GET .GTCNC FOR THIS CPU HRRI T1,.GTSLF ;SET UP TO GETTAB START OF .GTCNC PUSHJ P,GTBDFL CAIN P3,(T1) ;IS THIS THE CPU JRST CPOPJ1 ;YES, GIVE SKIP RETURN AOBJN P1,FNDCP1 ;NO, TRY NEXT POPJ P, ;NONE MATCH, GIVE ERROR RETURN ;HERE TO DETERMINE IS THIS IS A KL10 PROCESSOR ;ALL REGS PRESERVED ;SKIPS IF CPU IS A KL10 ISKL10: PUSH P,T1 ;SAVE T1 MOVEI T1,0 ;CLEAR AN AC BLT T1,0 ;AND DO A ZERO LENGTH BLT SKIPE T1 ;IF NON-ZERO, NO KL10 AOS -1(P) ;IF KL, SKIP POP P,T1 ;GET OLD T1 BACK POPJ P, ;AND RETURN ;HERE TO PUT SPECIAL STUFF INTO ERROR FILE ENTRY IF THIS IS A KL10 KLCPU: PUSHJ P,ISKL10 ;IS THIS A KL10? POPJ P, ;NO, EXIT MOVE T1,[%CVPCN] ;RESULTS OF CONI APR, PUSHJ P,GCPVAR MOVE T1,[%CVAER] ;RESULTS OF RDERA PUSHJ P,GCPVAR AOBJN P4,.+1 ;RESERVE THE SPACE ALSO HRRZ P3,P4 ;SAVE CURRENT ERROR FILE LOC FOR LATER POPJ P, ;AND RETURN ;HERE TO WRITE SBDIAG SUBTABLE IF PROCESSOR IS A KL10 ;ARGS P2=CPU NUMBER TIMES 2 ; P3=ADDRESS IN BUFFER OF POINTER CKLSBD: POP P,(P) ;BRING STACK INTO PHASE AND ;FALL INTO KLSBDG KLSBDG: PUSHJ P,ISKL10 ;IS THIS A KL10? PJRST ERRFIN ;NO, EXIT CLOSING FILE MOVE T3,[%CCSDP] ;GET POINTER TO SBDIAG SUBTABLE ADDI T3,(P2) ;IN THIS CPU'S CONSTANT TABLE MOVSI T2,.GTC0V(P2) ;TABLE IS IN CDB VARIABLE TABLE PUSHJ P,GSUBTB ;GET FIRST WORD (-# BLKS,,OFFSET TO 1ST) PJRST ERRFIN ;NOT DEFINED, FORGET IT JUMPGE T1,ERRFIN ;IF NO BLOCKS, GIVE UP ADDI T2,(T1) ;BUMP ITEM NUMBER BY OFFSET OF FIRST HRRI T1,1-ERABFH(P4) ;MAKE IT OFFSET TO START OF BLOCK MOVEM T1,(P3) ;SAVE IN POINTER WORD IN BUFFER KLSBD1: PUSHJ P,GSUBTB ;GET NEXT ITEM IN TABLE PJRST ERRFIN ;DONE, CLOSE FILE PUSH P4,T1 ;SAVE ITEM IN BUFFER AOJA T2,KLSBD1 ;BUMP ITEM NUMBER AND LOOP ;SUBROUTINE TO RECORD A CHANNEL-DETECTED PARITY ERROR OR NON-EX MEM CHNERR: HLRZ P2,(T1) ;GET CDB ADDRESS SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSHJ P,ERRINI ;HEADER, SET UP P4, CLEAR BUFFER ADD P2,CHNLUE ;GET POINTER TO LAST UNIT WITH ERROR PUSHJ P,PEKSPY ANDI T1,-1 ;RH ONLY JUMPE T1,CHNER1 ;STORE 0 IF DEVICE UNKNOWN IFN UDBNAM, ;ADDR OF NAME OF ERROR UNIT PUSHJ P,PEKSPY ;PICK UP UNIT NAME CHNER1: PUSH P4,T1 ;(R0) UNIT NAME ADD P2,CHNNXM ;INDEX INTO CHANNEL DATA BLOCK PUSHJ P,PEKSPY ;GET NXM COUNT FOR THIS CHANNEL PUSH P4,T1 ;(R1) NON-EX MEM COUNT ADD P2,CHNMPE ;INDEX INTO CHANNEL DATA BLOCK PUSHJ P,PEKSPY PUSH P4,T1 ;(R2) MEM PAR ERR COUNT THIS CHANNEL ; ADD P2,CHNDPE ;INDEX INTO CHANNEL DATA BLOCK ; PUSHJ P,PEKSPY ; PUSH P4,T1 ;(R3) DEVICE PARITY ERRORS AOBJN P4,.+1 ;(R3) OBSOLETE MOVN T1,CHNICL ;-WORDS POINTED TO BY CHNICW MOVE T2,P2 ;CHANNEL DATA BLOCK ADDRESS ADD T2,CHNICW ;OFFSET TO INITIAL CONTROL WORD HRL T2,T1 ;MAKE AN AOBJN POINTER CHNER2: MOVEI T1,(T2) ;GET ADDR TO EXAMINE PUSHJ P,PEKSPY PUSH P4,T1 ;(R4-R13) CONTROL AND DATA WORDS AOBJN T2,CHNER2 ADD P2,CHNTCW ;INDEX INTO CHANNEL DATA BLOCK PUSHJ P,PEKSPY ;READ CHANNEL TERMINATION WORD CHNER3: PUSH P4,T1 ;(R14)EXPECTED TERM WD[463] PJRST ERRFIN ;WRITE THE STUFF AND RETURN ;SUBROUTINE TO RECORD MAGTAPE STATISTICS ON UNLOAD (TAPSER) ;ARGS P2=OFFSET OF TUBRID IN TUB ; P3=DDB ADDRESS ; P4=POINTER TO TUBRID IN CURRENT TUB ;RETURN CPOPJ,P1-P4 INTACT,T1-T4 BLOWN GTPSTU: PUSH P,P1 ;PRESERVE P1 PUSH P,P4 ;PRESERVE P4 PUSH P,P3 ;PRESERVE P3 MOVEI P1,TUBDDA-TUBRID(P4) ;GET ADDRESS OF SHADOW AREA FOR CURRENT ; TUB INTO P1 PUSHJ P,ERRINI ;HEADER, SETUP P4 AND BUFFER MOVE T1,[%CNTDB] ;FIND TUBDDB PUSHJ P,GTBSPY JRST GTPST1 ;NOT THERE, USE OLD STYLE ADDI T1,(P1) ;COMPUTE TUBDDB SUBI T1,TUBDDA-TUBRID(P2) PUSHJ P,PEKSPY MOVEI P3,(T1) ;USE DDB ADDRESS FROM TUB GTPST1: MOVE T2,XTPUL ;LIST OF ITEMS TO DUMP PUSHJ P,UNIDMP ;(R0-R7)DUMP THEM POP P,P3 ;RESTORE P3 MOVEI T1,(P3) ;DDB ADDR TO T1 PUSHJ P,DDBJOB ;GET OWNER'S JOB NUMBER MOVEI J,(T1) ;AND PUT IT INTO J PUSHJ P,GETPPN ;GET PPN PUSH P4,T1 ;(R10)SAVE IT IN BUFFER PUSHJ P,ERRFIN ;CLOSE ERROR FILE POP P,P4 ;RESTORE ADDR OF TUB+TUBRID POP P,P1 ;RESTORE AOBJN WORD FOR ALL UNITS POPJ P, ;RETURN ;SUBROUTINE TO RECORD A MAGTAPE ERROR (TAPSER) ;ARGS AS IN GTPSTU ON LAST PAGE GTPERR: PUSH P,P1 ;PRESERVE POINTER TO BLOCK FOR TAPES PUSH P,P3 ;SAVE DDB ADDRESS PUSH P,P4 ;SAVE POINTER TO TUBRID MOVEI P1,0(P4) ;GET OFFSET TO TUBRID IN TUB INTO P1 PUSHJ P,ERRINI ;SET UP P4, PRODUCE HEADER MOVE T1,[%CNTDB] ;FIND TUBDDB PUSHJ P,GTBSPY JRST GTPER1 ;NOT THERE, USE OLD STYLE ADDI T1,(P1) ;COMPUTE TUBDDB SUBI T1,(P2) PUSHJ P,PEKSPY MOVEI P3,(T1) ;SAVE DDB ADDRESS FROM TUB TO P3 GTPER1: MOVEI T1,DEVNAM(P3) PUSHJ P,PEKSPY PUSH P4,T1 ;(R0)PUT IT INTO BUFFER MOVEM T1,ERPTBK+1 ;REMEMBER DEVICE NAME IN ERPTBK TO USE FOR TAPOP MOVE T2,XTPEL ;SET UP LIST OF ITEMS TO DUMP PUSHJ P,UNIDMP ;(R1-R7)DUMP THEM MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP. CALL MOVEI T2,.TFKTP ;FUNCTION FOR TAPOP. MOVEM T2,ERPTBK ;SAVE IT IN BLOCK FOR UUO TAPOP. T1, ;WHAT KIND OF DEVICE? SETZ T1, ;OOPS TAPTRY==4 ;WORD CONTAINING CONTROLLER TYPE DPB T1,[POINT 3,ERABFS+TAPTRY,14] ;SAVE IN BUFFER MOVE T1,[2,,T2] ;SET UP FOR DIAG. MOVEI T2,7 ;GET CONTROLLER NUMBER MOVE T3,ERPTBK+1 ;UNIT NAME DIAG. T1, ;WHAT CONTROLLER? SETZ T1, ;BEFORE 603, ASSUME RH10 HLRZS T1 ;MOVE DEVICE CODE TO RH, CLEAR LH CAIL T1,540 ;IS IT IN THE RANGE OF CAILE T1,574 ;LEGAL RH20 DEVICE CODES? TDZA T2,T2 ;NO MOVSI T2,(1B11) ;YES--1B11 FOR RH20 MOVE T1,[%FTERR] ;GET OPTIONS PUSHJ P,GTBDFL TRNE T1,F%KS10&777777;ARE WE REPORTING FOR A KS10 SYSTEM? MOVSI T2,(1B10) ;YES--ONLY RH11 CONTROLLERS IORM T2,ERABFS+TAPTRY ;SET CHANNEL TYPE IN RETRY WORD MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP. MOVEI T2,.TFIEP ;AND GET ARG FOR POINTER TO INITIAL MOVEM T2,ERPTBK ; ERROR AREA INTO BLOCK FOR TAPOP. TAPOP. T1, ;GO GET IT SETZ T1, ;OOPS MOVE T4,T1 ;SAVE UNRELOCATED POINTER IN T4 TAPIEP==10 ;OFFSET OF POINTER TO INITIAL BLOCK PUSH P4,T1 ;(R10)PUT IT IN BUFFER MOVEI T1,.TFFEP ;FUNCTION FOR TAPOP. TO GET POINTER MOVEM T1,ERPTBK ; TO FINAL ERROR STATUS AREA MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP. TAPOP. T1, ;GO GET FINAL ERROR POINTER SETZ T1, ;OOPS MOVE T3,T1 ;SAVE UNRELOCATED POINTER IN T3 TAPFEP==11 ;OFFSET OF POINTER TO FINAL BLOCK PUSH P4,T1 ;(R11)PUT IN BUFFER MOVE T2,XTPEL1 ;GET EXTRA ITEMS PUSHJ P,UNIDMP ;(R12-R13) MOVEI T1,1-ERABFH(P4) ;GET OFFSET OF IEP BLOCK HRRM T1,ERABFS+TAPIEP ;COMPLETE POINTER ADDI T4,(P1) ;RELOCATE INITIAL POINTER WITH SUBI T4,(P2) ;START OF UDB IERLUP: MOVEI T1,(T4) ;GET NEXT WORD TO RECORD PUSHJ P,PEKSPY ;PICK IT UP PUSH P4,T1 ;AND PUT IT IN THE BUFFER AOBJN T4,IERLUP ;LOOP ON INITIAL ERROR AREA MOVEI T1,1-ERABFH(P4) ;GET OFFSET OF FEP BLOCK HRRM T1,ERABFS+TAPFEP ;COMPLETE POINTER ADDI T3,(P1) ;ADD OFFSET OF TUBRID+START OF TUB SUBI T3,(P2) ;SUBTRACT OFFSET OF TUBRID IN TUB FERLUP: MOVEI T1,(T3) ;GET NEXT WORD TO RECORD PUSHJ P,PEKSPY ;PICK IT UP PUSH P4,T1 ;AND PUT IT IN THE BUFFER AOBJN T3,FERLUP ;LOOP ON FINAL ERROR AREA PUSHJ P,ERRFIN ;CLOSE ERROR FILE POP P,P4 ;RESTORE P4 POP P,P3 ;RESTORE P3 POP P,P1 ;RESTORE POINTER TO MAGTAPE ERROR AREA POPJ P, ;SUBROUTINE TO RECORD DX20 DEVICE ERRORS FROM TAPSER ;ARGS T1=WORD 0 OF HEADER BLOCK FOR ERRINI ; P2=DDB ADDRESS ; P3=UDB ADDRESS ;RETURN CPOPJ, P1-P3 INTACT; P4, T1-T4 DESTROYED D2TPER: PUSH P,P1 ;SAVE P1-P3 PUSH P,P2 ;... PUSH P,P3 ;... PUSHJ P,ERRINI ;SETUP P4, PRODUCE HEADER MOVE T1,[%CNTDB] ;GETTAB TO RETURN VALUE OF TUBDDB PUSHJ P,GTBSPY ;GET IT JRST D2TPE1 ;USE WHAT TAPSER GAVE US ADDI T1,(P3) ;ADD IN BASE OF TUB PUSHJ P,PEKSPY ;GO GET DDB ADDRESS MOVEI P2,(T1) ;MOVE TO P2 D2TPE1: MOVEI T1,DEVNAM(P2) ;POINT TO DEVICE NAME PUSHJ P,PEKSPY ;GET IT MOVEM T1,ERPTBK+1 ;SAVE FOR TAPOP'S/DIAG'S PUSH P4,T1 ;(R0) SAVE IN BUFFER MOVEI P1,.TFFEP ;TAPOP. FUNCTION TO RETURN TUBFEP MOVEM P1,ERPTBK ;BUILD UUO BLOCK MOVE P1,[2,,ERPTBK] ;POINT TO IT TAPOP. P1, ;GET TUBFEP FOR THIS UDB MOVEI P1,0 ;CAN'T DO MUCH ADDI P1,(P3) ;OFFSET TO FIRST WORD OF TUBFEP ENTRIES MOVE T1,[%CNMER] ;GETTAB TO RETURN TUBRID,,?????? PUSHJ P,GTBSPY ;GET VALUE MOVSI T1,11 ;TAKE A GUESS HLRZS T1 ;REALLY ONLY NEED TUBRID ADDI P3,(T1) ;COMPUTE UDB+TUBRID MOVEI T1,TUBRID(P3) ;POINT AT REELID IN TUB PUSHJ P,PEKSPY ;GET IT PUSH P4,T1 ;(R1) SAVE IN BUFFER MOVE T1,[2,,T2] ;LEN,,ADR FOR DIAG. MOVEI T2,7 ;FUNCTION=READ KON NUMBER MOVE T3,ERPTBK+1 ;GET DEVICE NAME BACK DIAG. T1, ;READ RH20 DEVICE CODE MOVEI T1,0 ;FAILED, USE 0 MOVE T2,T1 ;SAVE IN T2 MOVEI T1,TD2VER(P1) ;GET POINTER TO DX20 ADDRESS PUSHJ P,PEKSPY ;READ IT IOR T2,T1 ;OR TOGETHER HRRI T2,001001 ;CODES FOR RH20/MAGTAP PUSH P4,T2 ;(R2) SAVE IN BUFFER MOVE T2,XD2EL ;GET AOBJN POINT TO INFO TO DUMP PUSHJ P,UNIDMP ;(R3-R42) DUMP REST MOVEI T1,TD2MBR(P1) ;POINTER TO MASSBUS REGISTER POINTER PUSHJ P,PEKSPY ;READ IT DXEMBR==43 ;OFFSET IN DX20 ERROR ENTRY OF MBR SUB-BLOCK POINTER SKIPE T2,T1 ;SKIP IF ZERO, SAVE IN T2 ADDI T1,DXEMBR ;OFFSET FROM START OF ERROR BLOCK PUSH P4,T1 ;(R43) SAVE IN BUFFER MOVEI T1,TD2DVL(P1) ;POINTER TO DEVICE SUB-BLOCK POINTER PUSHJ P,PEKSPY ;READ IT PUSH P,T1 ;SAVE FOR LATER DXEDVL==44 ;OFFSET IN DX20 ERROR ENTRY OF DX20 REG SUB-BLOCK POINTER SKIPE T1 ;SKIP IF NO REGISTERS ADDI T1,DXEDVL ;OFFSET FROM START OF ERROR BLOCK PUSH P4,T1 ;(R44) SAVE IN BUFFER JUMPE T2,D2TPE5 ;SKIP LOOP IF NO MASSBUS REGISTERS ADDI T2,TD2MBR(P1) ;OFFSET TO START OF BLOCK HLRZ T1,T2 ;GET +NUMBER OF REGS TO READ MOVNS T1 ;MAKE IT NEGATIVE HRL T2,T1 ;MAKE AN AOBJN POINTER D2TPE4: MOVEI T1,(T2) ;GET ADDRESS OF NEXT WORD OF BLOCK PUSHJ P,PEKSPY ;READ IT PUSH P4,T1 ;SAVE IN BUFFER AOBJN T2,D2TPE4 ;LOOP FOR ALL ENTRIES D2TPE5: POP P,T2 ;GET BACK DEVICE BLOCK POINTER JUMPE T2,D2TPE7 ;SKIP IF NONE ADDI T2,TD2DVL(P1) ;OFFSET TO START OF BLOCK HLRZ T1,T2 ;GET +NUMBER OF REGS TO READ MOVNS T1 ;MAKE IT NEGATIVE HRL T2,T1 ;MAKE AN AOBJN POINTER D2TPE6: MOVEI T1,(T2) ;GET ADDRESS OF NEXT WORD OF BLOCK PUSHJ P,PEKSPY ;READ IT PUSH P4,T1 ;SAVE IN BUFFER AOBJN T2,D2TPE6 ;LOOP FOR ALL ENTRIES D2TPE7: PUSHJ P,ERRFIN ;CLOSE ERROR FILE POP P,P3 ;RESTORE UDB ADDRESS MOVEI T1,UDBKDB(P3) ;OFFSET TO KDB POINTER PUSHJ P,PEKSPY ;READ KDB ADDRESS MOVEI T1,KDBCHN(T1) ;OFFSET TO CHANNEL DATA BLOCK PUSHJ P,PEKSPY ;READ CDB ADDRESS POP P,P2 ;RESTORE DDB ADDRESS POP P,P1 ;AND P1 POPJ P, ;RETURN ;SUBROUTINE TO RECORD DX20 DEVICES ERRORS FROM FILIO (RP20) ;ARGS T1=WORD 0 OF HEADER BLOCK FOR ERRINI ; P2=DDB ADDRESS ; P3=UDB ADDRESS ;RETURN CPOPJ D2DSER: PUSHJ P,ERRINI ;SETUP BUFFER, P4 MOVE T2,XR2EL1 ;GET ARG FOR UNIDMP PUSHJ P,UNIDMP ;(R0-R1) STORE VALUES IN BUFFER DXENAM==0 ;OFFSET OF UNIT NAME IN ENTRY PUSH P4,[001002] ;(R2) CODE FOR RH20/DISK DXETYP==2 ;OFFSET IN ENTRY OF DX20/CONTROLLER ADDRESS MOVE T2,XR2EL2 ;GET ARG FOR UNIDMP PUSHJ P,UNIDMP ;(R3-R6) STORE VALUES IN BUFFER MOVEI T1,UNIMSC(P3) ;POINT TO COUNT OF MONITOR SEEKS PUSHJ P,PEKSPY ;GET IT MOVE P1,T1 ;SAVE IN P1 MOVEI T1,UNIUSC(P3) ;POINT TO COUNT OF USER SEEKS PUSHJ P,PEKSPY ;GET IT ADD T1,P1 ;ADD TOGETHER PUSH P4,T1 ;(R7) NUMBER OF SEEKS MOVEI T1,UNIBRC(P3) ;POINT TO BUFFERED READ COUNT PUSHJ P,PEKSPY ;GET IT MOVE P1,T1 ;SAVE IN P1 MOVEI T1,UNIDRC(P3) ;POINT TO DUMP READ COUNT PUSHJ P,PEKSPY ;GET IT ADD P1,T1 ;ACCUMULATE TOTAL MOVEI T1,UNIMRC(P3) ;POINT TO MONITOR READ COUNT PUSHJ P,PEKSPY ;GET IT ADD P1,T1 ;ACCUMULATE TOTAL PUSH P4,P1 ;(R10) NUMBER OF BLOCKS READ MOVEI T1,UNIBWC(P3) ;POINT AT BUFFERED WRITE COUNT PUSHJ P,PEKSPY ;GET IT MOVE P1,T1 ;SAVE IN P1 MOVEI T1,UNIDWC(P3) ;POINT AT DUMP WRITE COUNT PUSHJ P,PEKSPY ;GET IT ADD P1,T1 ;ACCUMULATE TOTAL MOVEI T1,UNIMWC(P3) ;POINT AT MONITOR WRITE COUNT PUSHJ P,PEKSPY ;GET IT ADD P1,T1 ;ACCUMULATE TOTAL PUSH P4,P1 ;(R11) NUMBER OF BLOCK WRITTEN MOVE T1,LDDBSH ;DEVFIL=DEVJOB+1=LEN(SHORT DDB) ADDI T1,(P2) ;MAKE IT AN ADDRESS PUSHJ P,PEKSPY ;GET IT PUSH P4,T1 ;(R12) STORE FILENAME MOVEI T1,(P2) ;PUT DDB ADDRESS IN T1 PUSHJ P,DDBJOB ;GET JOB NUMBER FROM DDB MOVSS P1,T1 ;PUT IN LH AND SAVE IN P1 HRRI T1,.GTPPN ;SETUP TO GET PPN OF USER PUSHJ P,GTBVAR ;(R13) SAVE PPN IN BUFFER MOVE T1,P1 ;GET JOB NUMBER BACK HRRI T1,.GTPRG ;SETUP TO GET NAME OF PROGRAM RUNNING PUSHJ P,GTBVAR ;(R14) SAVE PROGRAM NAME IN BUFFER HRRZ P1,UNISCR ;GET OFFSET TO UNISCR ADDI P1,(P3) ;MAKE IT AN ADDRESS MOVE T2,XR2EL3 ;SETUP ARG FOR UNIDMP PUSHJ P,UNIDMP ;(R15-R24) STORE VALUES IN BUFFER PUSH P4,[0] ;(R25) UNUSED PUSH P4,[0] ;(R26) UNUSED MOVEI T1,.DIAKU ;FUNCTION CODE FOR DIAG. MOVE T2,ERABFS+DXENAM ;GET UNIT NAME MOVE T3,[2,,T1] ;POINT AT BLOCK DIAG. T3, ;GET DEVICE CODE MOVEI T3,0 ;FAILED? HRRZ P1,UNISCR ;GET OFFSET OF UNISCR ADDI P1,4(P3) ;UNIEBK=UNISCR+4 MOVEI T1,(P1) ;MOVE POINTER TO T1 PUSHJ P,PEKSPY ;GET DX20/CONT ADDR,,MICROCODE VER PUSH P,T1 ;SAVE MICROCODE VERSION FOR LATER IOR T1,T3 ;OR DX20 ADDRESS WITH RH20 DEVICE CODE HLLM T1,ERABFS+DXETYP ;STORE ADDRESSES IN BLOCK HRLI P1,- ;SETUP AOBJN POINTER TO VALUES D2DSE1: MOVEI T1,1(P1) ;GET NEXT ADDRESS PUSHJ P,PEKSPY ;GET NEXT VALUE FROM UNIEBK PUSH P4,T1 ;(R27-R35) SAVE VALUE IN BLOCK AOBJN P1,D2DSE1 ;LOOP FOR ALL PUSH P4,[0] ;(R36) UNUSED PUSH P4,[0] ;(R37) UNUSED PUSH P4,[0] ;(R40) UNUSED MOVEI T1,UDBKDB(P3) ;GET KDB ADDRESS PUSHJ P,PEKSPY ;READ IT HRRZS T1 ;KEEP JUST ADDRESS ADD T1,KONREG ;OFFSET TO NUMBER OF REGS TO SAVE PUSHJ P,PEKSPY ;READ THAT ADD T1,UNISCR ;SKIP PAST THE REGS TO GET THE INITIAL ADDI T1,4(P3) ; CONTROL REGISTER (UNIEBK=UNISCR+4) PUSHJ P,PEKSPY ;READ THE INITIAL CONTROL REGISTER PUSH P4,T1 ;(R41) SAVE IN THE BUFFER POP P,T1 ;GET MICROCODE VERSION BACK TLZ T1,-1 ;CLEAR JUNK PUSH P4,T1 ;(R42) SAVE IN BUFFER AOS T1,P1 ;STEP TO POINTER TO MASSBUS REGISTERS PUSHJ P,PEKSPY ;READ IT SKIPE T2,T1 ;DON'T DO ADD IF ZERO, MOVE TO T2 ADDI T1,DXEMBR ;OFFSET FROM FIRST WORD IN ENTRY PUSH P4,T1 ;(R43) SAVE IN BUFFER AOS T1,P1 ;STEP TO POINTER TO DEVICE REGISTERS PUSHJ P,PEKSPY ;READ IT PUSH P,T1 ;SAVE FOR LATER SKIPE T1 ;DON'T DO ADD IF ZERO ADDI T1,DXEDVL ;OFFSET FROM FIRST WORD IN ENTRY PUSH P4,T1 ;(R44) SAVE IN BUFFER JUMPE T2,D2DSE3 ;GO IF NO MASSBUS REGISTERS TO READ ADDI T2,-1(P1) ;COMPUTE FIRST MASSBUS REGISTER ADDR HLRZ T1,T2 ;GET THE LENGTH OF THE BLOCK MOVNS T1 ;MAKE IT NEGATIVE HRL T2,T1 ;MAKE T2 AN AOBJN POINTER TO THE BLOCK D2DSE2: MOVEI T1,(T2) ;GET NEXT ADDRESS PUSHJ P,PEKSPY ;READ THE NEXT REGISTER PUSH P4,T1 ;SAVE IN BUFFER AOBJN T2,D2DSE2 ;LOOP FOR ALL MASSBUS REGISTERS D2DSE3: POP P,T2 ;RESTORE DEVICE REGISTER POINTER JUMPE T2,D2DSE5 ;GO IF NONE TO READ ADDI T2,(P1) ;COMPUTE FIRST DEVICE REGISTER ADDR HLRZ T1,T2 ;GET LENGTH OF BLOCK MOVNS T1 ;MAKE IT NEGATIVE HRL T2,T1 ;MAKE T2 AN AOBJN POINTER TO THE BLOCK D2DSE4: MOVEI T1,(T2) ;GET NEXT ADDRESS PUSHJ P,PEKSPY ;READ THE NEXT REGISTER PUSH P4,T1 ;STORE IN BUFFER AOBJN T2,D2DSE4 ;LOOP FOR ALL WORDS IN BLOCK D2DSE5: HLRZ T1,ERPTBK ;[1010] GET SOFTWARE-DETECTED ERROR CODE PUSH P4,T1 ;[1010] AND SAVE IT TOO PJRST ERRFIN ;CLOSE FILE AND RETURN IFN FTUNSUPPORTED,< ;SUBROUTINE TO RECORD A DISK ERROR ;ARGS P2=ADDR OF DDB WITH ERROR ; P3=ADDR OF UNIT DATA BLOCK IN ERROR ;RETURN CPOPJ, P1-P3 INTACT; P4,T1-4 BLOWN GDVERR: PUSHJ P,ERRINI ;HEADER, SETUP P4, CLEAR BUFER MOVE T2,XDVEL ;LIST OF ITEMS TO DUMP PUSHJ P,UNIDMP ;(R0-R14) DUMP THEM MOVEI T1,UNIBRC(P3) ;BUFFERED READ COUNT PUSHJ P,PEKSPY MOVE T2,T1 MOVEI T1,UNIDRC(P3) ;DUMP-MODE READ COUNT PUSHJ P,PEKSPY ADD T2,T1 MOVEI T1,UNIMRC(P3) ;MONITOR READ COUNT PUSHJ P,PEKSPY ADD T2,T1 ;GET THEM ALL TOGETHER PUSH P4,T2 ;(R15) TOTAL READS ON THIS UNIT MOVEI T1,UNIBWC(P3) ;BUFFERED WRITE COUNT PUSHJ P,PEKSPY MOVE T2,T1 MOVEI T1,UNIDWC(P3) ;DUMP MODE WRITES PUSHJ P,PEKSPY ADD T2,T1 MOVEI T1,UNIMWC(P3) ;MONITOR WRITES PUSHJ P,PEKSPY ADD T2,T1 PUSH P4,T2 ;(R16) TOTAL WRITES ON THIS UNIT MOVEI T1,UNIMSC(P3) ;MONITOR SEEK COUNT PUSHJ P,PEKSPY MOVE T2,T1 MOVEI T1,UNIUSC(P3) ;USER SEEK COUNT PUSHJ P,PEKSPY ADD T2,T1 PUSH P4,T2 ;(R17) TOTAL SEEKS ON THIS UNIT MOVEI T1,UDBNAM(P3) PUSHJ P,PEKSPY ;RE-GET UNIT NAME MOVEI T2,T1 ;SET POINTER TO IT DSKCHR T2, SETZ T2, ;LOSE PUSH P4,T2 ;(R20) DSKCHR INFO FOR THIS UNIT MOVEI T1,UNILOG(P3) ;LOGICAL NAME OF UNIT PUSHJ P,PEKSPY PUSH P4,T1 ;(R21) SAVE UNILOG MOVE T1,UNICCT ADDI T1,0(P3) ;OFFSET PUSHJ P,PEKSPY PUSH P4,T1 ;(R22) # BAT SLOTS LEFT MOVEI T2,(P2) ;GET DDB ADDRESS IN T2 ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB HRLI T2,-2 ;WANT 2 WORDS FROM THE DDB GDVER1: MOVEI T1,(T2) ;GET ADDRESS FOR PEKSPY PUSHJ P,PEKSPY ;READ THE WORD IN THE DDB PUSH P4,T1 ;(R23-R24) SAVE IN BUFFER AOBJN T2,GDVER1 ;LOOP FOR ALL HLLZS 0(P4) ;SAVE ONLY LH OF EXTENSION WORD MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1 PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN HRRI T1,.GTPPN ; FOR THIS JOB PUSHJ P,GTBVAR ;(R25) SAVE PPN MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM HRRI T1,.GTPRG ; NAME FOR THIS JOB PUSHJ P,GTBVAR ;(R26) SAVE PROGRAM NAME PJRST ERRFIN ;FALL INTO CLOSE AND RETURN > ;END IFN FTUNSUPPORTED ;SUBROUTINE TO RECORD A MASSBUS DEVICE ERROR (CODE 11) IN ERROR.SYS ;ARGS T3=NUMBER OF DRIVE REGISTRS SAVED ON THIS UNIT ; P2=ADDR OF DDB WITH ERROR ; P3=ADDR OF UNIT DATA BLOCK IN ERROR ;RETURN CPOPJ, P1-P3 INTACT; T1-T4,P4 BLOWN GMDVER: PUSH P,T3 ;SAVE T3 FOR LATER PUSHJ P,ERRINI ;WRITE HEADER MOVE T2,XMDVEL ;GET AOBJN WORD FOR TABLE PUSHJ P,UNIDMP ;(R0-R11) AND DUMP THE TABLE'S ITEMS MOVEI T2,(P2) ;GET DDB ADDRESS INTO T2 ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB HRLI T2,-2 ;WANT FILENAME AND EXT FROM DDB GMDVR1: MOVEI T1,(T2) ;GET ADDRESS OF WORD PUSHJ P,PEKSPY ;GET THE WORD PUSH P4,T1 ;(R12-R13) SAVE IN BUFFER AOBJN T2,GMDVR1 ;LOOP FOR ALL HLLZS 0(P4) ;SAVE ONLY LH OF EXTENSION WORD MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1 PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN HRRI T1,.GTPPN ; FOR THIS JOB PUSHJ P,GTBVAR ;(R14) SAVE PPN MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM HRRI T1,.GTPRG ; NAME FOR THIS JOB PUSHJ P,GTBVAR ;(R15) SAVE PROGRAM NAME POP P,T2 ;GET NUMBER OF REGS MONITOR SAVED CAILE T2,MAXREG ;MORE THAN ALLOWED MAXIMUM? MOVEI T2,MAXREG ;YES, REDUCE TO ALLOWED MAXIMUM HRREI T3,-MAXREG(T2) ;GET NUMBER OF FILLERS MOVNI T2,4(T2) ;T2=-(NUMBER TO SAVE+4 DATAI'S) HRLZS T2 ;T2=AOBJN WORD FOR REGS TO SAVE HRR T2,UNISCR ;MUST POINT INTO UDB ADDI T2,(P3) ;INTO THIS UDB MBDRLP: MOVEI T1,(T2) ;GET POINTER TO NEXT REG PUSHJ P,PEKSPY PUSH P4,T1 ;(R16-R41) SAVE THIS REGISTER AOBJN T2,MBDRLP ;AND LOOP TO NEXT REGISTER JUMPE T3,MBDVDN ;NO MORE REGS, MONITOR SAVED ALL? SETZ T1, ;SAVE SOME ZEROES FOR PUSH P4,T1 ; SYSERR AOJL T3,.-1 ;T3 HAS NUMBER TO SAVE MBDVDN: MOVE T1,UNISCR ;GET OFFSET OF UNISCR IN UDB ADDI T1,-1(P3) ;UNILAS=UNISCR-1 PUSHJ P,PEKSPY PUSH P4,T1 ;(R42) PUT IT IN ERABUF MOVE T1,UNICCT ;[463] ADDI T1,0(P3) ;OFFSET PUSHJ P,PEKSPY PUSH P4,T1 ;(R43) # OF BAT SLOTS MOVEI T1,(P3) ;ADDRESS OF UDB PUSHJ P,PEKSPY ;GET UNIT NAME MOVE T3,T1 ;SAVE FOR DIAG. MOVE T1,[2,,T2] ;SET UP CALL MOVEI T2,7 ;GET CONTROLLER UNIT DIAG. T1, ;DO IT SETZ T1, ;BEFORE 603 ASSUME RH10 HLRZ T2,T1 ;[703]MOVE KONT ADDR TO T2 LSH T2,-2 ;[703]RIGHT JUSTIFY FOR BYTE MDETYP==4 ;WORD CONTAINING DEVICE CODE AND TYPE DPB T2,[POINT 7,ERABFS+MDETYP,11] ;[703] SAVE FOR SYSERR CAMGE T1,[540,,0] ;RH10? SKIPA T2,[RH10CD] ;YES MOVEI T2,RH20CD ;NO MOVE T1,[%FTERR] ;GET OPTIONS PUSHJ P,GTBDFL TRNE T1,F%KS10&777777;ARE WE REPORTING FOR A KS10 SYSTEM? MOVEI T2,RH11CD ;YES, THEN ONLY RH11 CONTROLLERS DPB T2,[POINT 3,ERABFS+MDETYP,14] ;SAVE CODE IN RETRIES WORD HLRZ T1,ERPTBK ;[1010] GET POSSIBLE SOFT ERROR CODE PUSH P4,T1 ;[1010] AND TACK IT ON END OF ENTRY PJRST ERRFIN ;CLOSE FILE AND RETURN ;SUBROUTINE TO RECORD A FILIO-DETECTED CI DISK ERROR (CODE 74) IN ERROR.SYS ;ARGS P2=ADDR OF DDB WITH ERROR ; P3=ADDR OF UNIT DATA BLOCK IN ERROR ;RETURN CPOPJ, P1-P3 INTACT; T1-T4,P4 BLOWN GCIFER: PUSHJ P,ERRINI ;WRITE HEADER MOVE T2,XMDVEL ;GET AOBJN WORD FOR TABLE (SAME AS MASSBUSS) PUSHJ P,UNIDMP ;(R0-R11) AND DUMP THE TABLE'S ITEMS MOVEI T2,(P2) ;GET DDB ADDRESS INTO T2 ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB MOVEI T1,(T2) ;GET ADDRESS OF WORD PUSHJ P,PEKSPY ;GET THE FILE NAME PUSH P4,T1 ;(R12) SAVE IN BUFFER MOVEI T1,1(T2) ;GET ADDRESS OF WORD PUSHJ P,PEKSPY ;GET THE EXTENSION HLLZS T1 ;ISOLATE EXTENSION (IN LEFT HALF) PUSH P4,T1 ;(R13) SAVE IN BUFFER MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1 PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN HRRI T1,.GTPPN ; FOR THIS JOB PUSHJ P,GTBVAR ;(R14) SAVE PPN MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM HRRI T1,.GTPRG ; NAME FOR THIS JOB PUSHJ P,GTBVAR ;(R15) SAVE PROGRAM NAME MOVE T1,UNICCT ;[463] ADDI T1,0(P3) ;OFFSET PUSHJ P,PEKSPY PUSH P4,T1 ;(R16) # OF BAT SLOTS HLRZ T1,ERPTBK ;[1010] GET POSSIBLE SOFT ERROR CODE PUSH P4,T1 ;[1010] (R17) AND TACK IT ON END OF ENTRY PJRST ERRFIN ;CLOSE FILE AND RETURN ;SUBROUTINE TO RECORD KI/KL PARITY/NXM INTERRUPTS KPARNX: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;COPY CPU # LSH P2,1 ;DOUBLE IT SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSH P,T2 ;SAVE IT FOR A WHILE PUSHJ P,ERRINI ;SETUP BUFFER AND P4 MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR PUSHJ P,GCPVAR ;(R1) PC (EXEC OR USER) MOVE T1,[%CVPCN] ;CONI APR, AT ERROR PUSHJ P,GCPVAR ;(R2) CONI APR, MOVE T1,[%CVPPI] ;CONI PI, AT ERROR PUSHJ P,GCPVAR ;(R3) CONI PI, POP P,T2 ;GET BACK ERROR CODE CAIE T2,.ESKIP ;IS THIS A KI? JRST KPARN1 ;NO--A KL MOVE T1,[%CVEJN] ;PPN OF USER PUSHJ P,GTBVAR ;(R4) SAVE PPN MOVE T1,[%CVEPN] ;PROGRAM NAME PUSHJ P,GTBVAR ;(R5) SAVE PROGRAM NAME PJRST ERRFIN ;END OF KI ENTRY KPARN1: MOVE T1,[%CVAER] ;RDERA PUSHJ P,GCPVAR ;(R4) RDERA AOBJN P4,.+1 ;(R5) SPACE FOR SBDIAG POINTER HRRZ P3,P4 ;SAVE CURRENT LOCATION HERE PJRST KLSBDG ;WRITE THE SBDIAG SUB-TABLE ;SUBROUTINE TO RECORD KS NXM TRAPS AND KL/KS PARITY TRAPS KLSTRP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;COPY CPU # LSH P2,1 ;DOUBLE IT SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSHJ P,ERRINI ;SETUP BUFFER AND P4 MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVPPC] ;PC AT TIME OF TRAP PUSHJ P,GCPVAR ;(R1) PC AT TIME OF TRAP MOVE T1,[%CVPFW] ;PAGE FAIL WORD PUSHJ P,GCPVAR ;(R2) PAGE FAIL WORD MOVE T1,[%CVBPA] ;MAPPED PHYSICAL ADDRESS PUSHJ P,GCPVAR ;(R3) MAPPED PHYSICAL ADDRESS MOVE T1,[%CVTBD] ;INCORRECT DATA PUSHJ P,GCPVAR ;(R4) INCORRECT DATA MOVE T1,[%CVTPI] ;CONI PI, AT TRAP PUSHJ P,GCPVAR ;(R5) CONI PI, AT TRAP MOVE T1,[%CVEJN] ;JOB NUMBER PUSHJ P,GCPVAR ;(R6) JOB NUMBER THAT TRAPPED MOVE T1,[%CVEPN] ;JOB NAME PUSHJ P,GCPVAR ;(R7) JOB NAME THAT TRAPPED MOVE T1,[%CVTGD] ;CORRECT DATA PUSHJ P,GCPVAR ;(R8) CORRECT DATA MOVE T1,[%CVPTR] ;RETRY WORD PUSHJ P,GCPVAR ;(R9) RETRY WORD MOVE T1,[%CVSPT] ;NUMBER OF RECOVERABLE TRAPS PUSHJ P,GCPVAR ;(R10) RECOVERABLE TRAP COUNT MOVE T1,[%CVHPT] ;NUMBER OF NON-RECOVERABLE TRAPS PUSHJ P,GCPVAR ;(R11) NON-RECOVERABLE TRAP COUNT MOVE T1,[%CVTGD] ;CORRECT DATA PJRST ERRFIN ;CLOSE OUT ENTRY ;HERE TO RECORD NXM SWEEPS - CODE 56 NXMSWP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;GET CPU NUMBER LSH P2,1 ;DOUBLE IT SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSHJ P,ERRINI ;INITIALIZE THE ERROR BUFFER MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVTNE] ;COUNT OF ERROR ON SWEEP OF CORE PUSHJ P,GCPVAR ;(R1)STASH IT MOVE T1,[%CVSNE] ;NOT REPRODUCIBLE ERROR COUNT PUSHJ P,GCPVAR ;(R2) MOVE T1,[%CVMNA] ;FIRST BAD ADDR FROM SWEEP PUSHJ P,GCPVAR ;(R3) MOVE T3,[%CCNXT] ;GET POINTER TO NXM SUBTABLE ADD T3,P2 ;POINTER IS IN CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN VARIABLES TABLE NXMSW1: PUSHJ P,GSUBTB ;GET AN ITEM FROM THE SUBTABLE JRST NXMSW2 ;END OF THE SUBTABLE PUSH P4,T1 ;(R4-R11)STICK IT IN THE BUFFER AOJA T2,NXMSW1 ;LOOP OVER ENTIRE SUBTABLE NXMSW2: MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE HRLI T1,707070 ;FLAG FOR SYSERR PUSH P4,T1 ;(R12)SAVE IT MOVN T2,NXMLEN ;GET NEGTIVE LENGTH OF NXMTAB HRLZS T2 ;PUT IT IN LH OF T2 FOR POINTER EN%NX1==13 ;OFFSET OF FIRST POINTER TO NXMTAB PUSH P4,T2 ;(R13)SAVE AS POINTER TO FIRST COPY OF NXMTAB PUSH P4,T2 ;(R14)SAVE AS POINTER TO SECOND COPY OF NXMTAB EN%BTB==15 ;OFFSET FOR POINTER TO BAD ADDR SUBTABLE AOBJN P4,.+1 ;(R15)SPACE FOR BAD ADDRESS SUBTABLE MOVEI T1,1-ERABFH(P4) ;GET RELATIVE POSITION TO NXM TABLE HRRM T1,ERABFS+EN%NX1 ;SAVE AS RIGHT HALF OF POINTER HLLZ T2,ERABFS+EN%NX1 ;GET BACK NEG LENGTH HRR T2,NXMTAB ;AND GET POINTER TO TABLE PUSH P4,(T2) ;PUSH WORD OF NXMTAB INTO BUFFER AOBJN T2,.-1 ;STEP TO NEXT WORD MOVEI T1,1-ERABFH(P4) ;GET RELATIVE OFFSET TO 2ND TABLE HRRM T1,ERABFS+EN%NX1+1 ;SAVE IT AS RIGHT HALF OF POINTER MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB PUSHJ P,GTBDFL MOVE T3,T1 ;USE T3 AS AOBJN POINTER MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE NXMSW3: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1 PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR MOVEM T1,(T2) ;STASH IT AWAY PUSH P4,T1 ;PUT IT INTO ERROR BUFFER ALSO AOS T2 ;INCREMENT T2 AOBJN T3,NXMSW3 ;INCREMENT T3 AND LOOP PUSH P,P4 ;SAVE CURRENT LOC IN BUFFER MOVE T3,[%CCNXT] ;SUBTABLE POINTER FOR NXM ADD T3,P2 ;IN THE CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;THE SUBTABLE IS IN VARIABLES TABLE HRRI T2,%CVNTS ;ITEM FOR # OF NXM'S FOUND ON SWEEP PUSHJ P,GSUBTB ;GO GET IT JRST CRRFIN ;NONE IF NO POINTER JUMPE T1,CRRFIN ;OR IF POINTER IS ZERO MOVE T4,T1 ;GET COUNT INTO T4 HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW HLLZS T2 ;AND START AT ITEM 0 NXMSW4: PUSHJ P,GSUBTB ;GET A WORD JRST NXMSW5 ;ALL DONE PUSH P4,T1 ;SAVE IT IN BUFFER AOJ T2, ;STEP TO NEXT ENTRY SOJG T4,NXMSW4 ;LOOP BACK FOR NUMBER OF ENTRIES NXMSW5: POP P,T1 ;GET BACK START LOC OF TABLE MOVNI T2,(T2) ;GET NEGATIVE NUMBER OF ITEMS STORED JUMPE T2,ERRFIN ;IF NONE, JUST FINISH HRLI T2,1-ERABFH(T1) ;COMPUTE RELATIVE OFFSET OF TABLE MOVSM T2,ERABFS+EN%BTB ;SAVE POINTER IN BUFFER PJRST ERRFIN ;CLOSE OUT ENTRY ;HERE TO RECORD PARITY SWEEPS - CODE 57 PARSWP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR POPJ P, ;NOT ANY CPU, GIVE IT UP MOVEI P2,(P1) ;COPY CPU # LSH P2,1 ;DOUBLE IT SETZ T1, ;CLEAR T1 DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI PUSHJ P,ERRINI ;SETUP BUFFER AND P4 MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME MOVE T1,[%CVTPE] PUSHJ P,GCPVAR ;(R1)TOTAL ERRORS WHICH RECURRED ON SWEEP OF CORE MOVE T1,[%CVSPE] PUSHJ P,GCPVAR ;(R2) TOTAL NOT REPRODUCABLE MOVE T1,[%CVMPW] ;CONTENTS OF FIRST BAD WORD PUSHJ P,GCPVAR ;(R3) MOVE T1,[%CVMPA] ;FIRST BAD ADDRESS PUSHJ P,GCPVAR ;(R4) EC%PRT==5 ;PARITY DATA SUBTABLE POINTER AOBJN P4,.+1 ;(R5) SAVE SPACE FOR IT EC%BTA==6 ;BAD ADDRESS SUBTABLE POINTER AOBJN P4,.+1 ;(R6) SAVE SPACE FOR IT PUSH P,P4 ;SAVE START ADDRESS OF SUBTABLE MOVE T3,[%CCPAR] ;SUB-TABLE POINTER FOR OTHER PAR STUFF ADD T3,P2 ;FROM THIS CPU CONSTANTS TABLE MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN CPU VAR TABLE PARSW1: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE JRST PARSW2 ;END OF PARITY SUBTABLE PUSH P4,T1 ;GIVE AOJA T2,PARSW1 ;GET WHOLE SUBTABLE PARSW2: POP P,T1 ;GET BACK START LOC OF SUBTABLE MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT JUMPE T4,ERRFIN ;IF NONE, THEN NO BAD ADDR'S EITHER HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE MOVSM T4,ERABFS+EC%PRT ;SAVE AS POINTER TO SUBTABLE PUSH P,P4 ;SAVE START LOC OF BAD ADDR SUBTABLE HRRI T2,%CVPTS ;OTHER POINTERS ARE ALREADY SET PUSHJ P,GSUBTB ;NO OF BAD ADDRESSES SAVED JRST CRRFIN ;NONE IF NO TABLE FOR THEM MOVEI T4,(T1) ;KEEP THE COUNT JUMPE T4,CRRFIN ;QUIT IF NONE HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW HLLZS T2 ;START AT BEGINNING OF TABLE PARSW3: PUSHJ P,GSUBTB ;GET NEXT BAD ADDRESS JRST PARSW4 ;END OF SUB-TABLE MOVEM T1,1(P4) ;SAVE THE BAD ADDR AOBJP P4,PARSW4 ;CHECK FOR BUFFER OVERFLOW AOJ T2, ;READY FOR NEXT ENTRY SOJG T4,PARSW3 ;GET IT IF ONE WAS STORED PARSW4: POP P,T1 ;GET BACK START LOC OF TABLE MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT JUMPE T4,ERRFIN ;GO IF NONE HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE MOVSM T4,ERABFS+EC%BTA ;STORE AS POINTER TO SUBTABLE PJRST ERRFIN ;CLOSE OUT ENTRY ;SUBROUTINE TO APPEND TO ERROR.SYS ;ARGS P4=LAST ADDR STORED IN ERRBUF ;BLOWS T1-3 ;ALWAYS RETURNS CPOPJ CRRFIN: POP P,(P) ;PRUNE STACK ERRFIN: SKIPE IOERR ;[62]CAN WE WRITE IN ERROR.SYS JRST ERRFIX ;NO, CLEAR FLAGS AND RETURN MOVEM P4,SAVEP4 ;SAVE P4 PUSHJ P,FLSPAK ;FLUSH INPUT QUEUE AND CLEAR BLOCK TRZA F,R.PAE ;INSURE THAT R.PAE IS NOT SET AVLFIN: TRO F,R.PAE ;SET PROCESSING AVAIL.SYS FLAG TRZ F,R.INF ;MAKE SURE THIS BIT IS OFF INIFIN: MOVX T1,.IODMP ;OPEN IN DUMP MODE MOVE T2,CERDEV ;GET DEVICE MOVEI T3,0 ;NO BUFFERS OPEN FCT,T1 ;OPEN THE CHANNEL JRST E.IEF ;CAN'T INIT ERROR FILE MOVE T1,CERDEV ;[602] GET DEVICE WHERE ERROR.SYS LIVES MOVEM T1,SSELBK+4 ;[602]INTO THE IPCF MSG MOVEI T1,RBSIZE-RBCNTE ;LENGTH OF DESIRED EXTENDED LOOKUP MOVEM T1,RBCNTE MOVE T1,CERPPN ;GET PPN OF ERROR FILE MOVEM T1,RBPPNE ;STORE DIRECTORY MOVEM T1,SSELBK+7 ;[602] IN IPCF MSG TOO MOVE T1,[SIXBIT/ERROR/] TRNE F,R.PAE ;DOING AVAIL.SYS? MOVE T1,[SIXBIT/AVAIL/] ;YES, CHANGE NAME MOVEM T1,RBNAME ;STORE FILNAM MOVEM T1,SSELBK+5 ;[602]IN IPCF PACKET TOO HRLZ T1,ERREXT ;[62]GET CURRENT ERROR EXTENSION TRNE F,R.PAE ;DOING AVAIL.SYS? MOVSI T1,'SYS' ;YES, EXTENSION IS ALWAYS SYS MOVEM T1,RBEXTE ;STORE EXT MOVEM T1,SSELBK+6 ;[602]IN IPCF TOO MOVSI T1,(155B8) ;IF NOT FOUND, MAKE IT READ-ONLY MOVEM T1,RBPRVE SETZM RBSIZE ;IF LOOKUP FAILS, LEN IS ZERO MOVEI T1,ERRBUF-1 ;PREPARE IOWD HRRM T1,ILIST ; FOR INPUT HRRM T1,OLIST ; AND FOR OUTPUT MOVEI T1,-200 ;PUT WORD COUNT INTO OUTPUT HRLM T1,OLIST ; IOWD FOR FULL BLOCK MOVEI T1,-1 ;MASK IN RIGHT HALF FOR ERROR CODE TXNN F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION? JRST INIFI1 ;YES, DO NORMAL STUFF LOOKUP FCT,EBLOCK ;DO EXTENDED LOOKUP JRST E.INF1 ;FAILED JRST INIFI2 ;JUMP AROUND OTHER STUFF INIFI1: LOOKUP FCT,EBLOCK ;DO EXTENDED LOOKUP TDZN T1,RBEXTE ;IF FILE NOT FOUND, MAKE ONE, ELSE BOMB ENTER FCT,EBLOCK ;DO UPDATE JRST E.EEF ;WHAT? INIFI2: MOVE T1,RBSIZE ;GET SIZE IN WORDS TRNE F,R.PAE ;IF WE ARE DOING AVAIL.SYS AND CAIE T1,BLKSIZ*AVLWRK ;THE SIZE IS THE LENGTH OF THE SKIPA ;WORKING ENTRY, JUST APPEND JRST ERFIL5 ;TO THE FILE SOJL T1,ERFIL0 ;DECR FOR LAST WORD ROT T1,-B2WLSH ;COMPUTE LAST BLOCK MOVEI T2,1(T1) ;START AT BLOCK 1 MOVEM T2,SSELBK+1 ;[602]PUT LAST BLOCK NUMBER IN IPCF PACKET USETI FCT,(T2) ;READ LAST BLOCK ROT T1,B2WLSH ;RESTORE WORD COUNT ANDI T1,BLKSIZ-1 ;RELATIVE LAST WORD IN BLOCK INPUT FCT,ILIST ;READ THE LAST BLOCK STATZ FCT,IO.ERR ;OK? JRST [TXNN F,R.INF ;DOING SEQ NUMBER INITIALIZATION? JRST E.INEF ;OOPS JRST E.INF] ;YES ;HERE TO CHECK FOR MESS-UPS IN ERROR.SYS SKIPN T3,ERRBUF(T1) ;PICK UP LAST WORD JRST ERBAK ;IF 0, BACK UP TO FIND GOOD ENTRY LSH T3,-^D27 ;KEEP JUST TYPE CODE CAIN T3,.ESEOF ;EOF MARKER? JRST ERFEOF ;YES, INSERT NEW ENTRY OVER IT ;HERE, WE FOUND SOMETHING THAT WAS NOT AN EOF MARKER AT THE END ;OF THE FILE. IT MIGHT BE A LEGITIMATE ENTRY HEADER IF WE ;CRASHED AFTER WRITING A NEW ENTRY, BUT BEFORE RECORDING NEW SIZE IN ;THE RIB. IF IT "LOOKS LIKE" AN ENTRY HEADER, THEN CALCULATE WHERE ;THE END OF THE ENTRY SHOULD BE. LOOK THERE FOR AN EOF. IF THERE IS ;AN EOF MARK THERE, USE IT AS THE PROPER END OF FILE. ; CAIN T3,.ESHIA ;IS IT AN OLD HIATUS MARK? JRST ERPHIA ;YES, OVERWRITE IT WITH NEW ONE PUSH P,T2 ;SAVE BLOCK NUMBER PUSH P,T4 ;SUPERSTITION MOVE T2,ERRBUF(T1) ;GET POSSIBLE ENTRY HEADER WORD LDB T3,[POINTR T2,EH.HFM] ;GET HDR FMT LDB T4,[POINTR T2,EH.HLN] ; AND HDR LEN CAIL T3,EL.HVR ;HEADER VERSION OK? CAIGE T4,EL.HED ;LENGTH OK? JRST ERPHI0 ;NO, WRITE A HIATUS MARK ; ;IT LOOKS LIKE WE ARE ABOUT TO STEP ON A REAL ENTRY HEADER ; ANDI T2,777 ;KEEP BODY LENGTH ADD T2,T4 ;ADD HEADER LENGTH ADDI T2,(T1) ;AND POINT TO WHERE NEXT ENTRY SHOULD START CAILE T2,BLKSIZ-1 ;IF IT'S NOT IN THE BLOCK WE READ JRST ERPHI0 ;THEN FORGET IT LDB T3,[POINTR ERRBUF(T2),EH.TYP] ;GET ENTRY TYPE CAIE T3,.ESEOF ;IF IT'S NOT AN EOF MARK JRST ERPHI0 ;THEN WE WERE WRONG, GO WRITE NORMAL HIATUS HRR T1,T2 ;WE WERE GOING TO WIPE A REAL ENTRY, SO POP P,T4 ;JUST POINT TO NEWLY FOUND EOF POP P,T2 JRST ERFEOF ;AND PRETEND NOTHING HAPPENED ERPHI0: POP P,T4 POP P,T2 ;RESTORE BLOCK NUMBER ERPHIA: TXNE F,R.INF ;DOING SEQUENCE NUBMER INITIALIZATION? JRST E.INF ;YES, ERROR MOVSI T3,.ESHIA_9 ;MARK HIATUS MOVEM T3,ERRBUF(T1) ;IN THE BUFFER USETO FCT,(T2) ;WHEN WE MARK HAITUS, OUTPUT FCT,OLIST ;WE USE NEW BLOCK STATZ FCT,IO.ERR ;OK JRST E.OUEF ;NOPE! AOJA T2,ERFIL3 ;[534] AND GO PUT THIS ENTRY INTO NEXT BLOCK ERBAK: JUMPE T1,ERPHIA ;STOP BACKING AT BEGINNING OF BUFFER SOJ T1, ;ELSE BACK UP SKIPN T3,ERRBUF(T1) ;GET NEXT WORD JRST ERBAK ;BACK UP AGAIN IF STILL ZERO LSH T3,-^D27 ;KEEP JUST TYPE CODE CAIE T3,.ESEOF ;EOF MARKER? AOJA T1,ERPHIA ;NO, DO NOT OVERWRITE IT ERFEOF: MOVEM T1,SSELBK ;[602]SAVE WC FOR IPCF PACKET TXNN F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION? JRST ERFILL ;NO, GO STORE OVER CODE MOVE T1,ERRBUF(T1) ;GET THE EOF MARKER BACK TXZ T1,EH.TYP ;KEEP JUST SEQUENCE NUMBER JUMPE T1,E.INF ;MUST HAVE BEEN WRITTEN BY OLD DAEMON MOVEM T1,ERRSEQ ;SETUP INITIAL SEQUENCE NUMBER JRST RELFCT ;RELEASE CHANNEL AND RETURN ERFIL0: TRNE F,R.PAE!R.INF ;THINGS ARE VERY BAD IF AVAIL.SYS DOESN'T JRST ERRFIX ;EXIST, SO GIVE UP NOW SKIPA T2,[1] ;SO USETO WILL WRITE FIRST BLOCK ERFIL5: MOVEI T2,AVLWRK+1 ;APPEND TO WORKING ENTRY IN AVAIL.SYS ERFIL3: SETZM ERRBUF ;[534] CLEAR FIRST WORD MOVE T1,[ERRBUF,,ERRBUF+1] ;[534] SET UP TO CLEAR ANY JUNK BLT T1,ERRBFE ;[534][1004] BLITTTT! MOVE T1,[.ESOFF_9,,1];[534] PUT POINTER TO FIRST ENTRY IN BLOCK MOVEM T1,ERRBUF ;[534] INTO FIRST WORD OF BLOCK ;+[1004] ; Here to write out the entry in one swell I/O command so we ; don't end up writing a partial entry if the monitor crashes. ; The following will only work on a KL or KS since it assumes ; that the contents of a BLT pointer is known after the BLT ; Also BEWARE heavy use of 18 bit address arithmetic which will ; not work in non-zero section. ; ; T1 has OFFSET to first word to write in ERRBUF ; P4 has ADDRESS of last word written in ERABUF ; ERFILL: USETO FCT,(T2) ;SET UP THE BLOCK NUMBER TO OUTPUT HRLI T1,ERABUF ;STUFF SOURCE FIELD INTO BLT POINTER ADDI T1,ERRBUF ;MAKE DESTINATION FIELD SUBI P4,ERABFS-1 ;P4 NOW HAS # OF WORDS OF DATA DPB P4,[POINT 9,ERABUF,35] ;SAVE LENGTH IN HEADER ADDI P4,EL.HED ;AND ACCOUNT FOR HEADER WORDS NOW ERFIL1: HRREI T3,-1(P4) ;GET WORDS - 1 JUMPL T3,ERFIL2 ;DONE IF NEGATIVE MOVEI T2,-ERRBUF(T1) ;GET INDEX INTO ERRBUF ADD T3,T2 ;CALCULATE LAST WORD TO WRITE IORI T2,BLKSIZ-1 ;AND LAST WORD IN THIS BLOCK CAIL T3,(T2) ;CAN WE WRITE IT ALL? JRST ESPLIT ;NOPE, SPLIT IT UP BLT T1,ERRBUF(T3) ;WRITE THE REMAINING PART ERFIL2: MOVSI T3,.ESEOF_9 ;STUFF CODE IOR T3,ERRSEQ ;INCLUDING SEQ NUMBER MOVEM T3,(T1) ;TO MARK EOF MOVNI T1,-(T1) ;CALCULATE HOW MANY WORDS WE WROTE HRLM T1,OLIST ;AND STUFF IT INTO IO COMMAND ;-[1004] OUTPUT FCT,OLIST STATZ FCT,IO.ERR ;OK? JRST E.OUEF ;BAD EGGS TRNE F,R.PAE ;DOING AVAIL.SYS? JRST ERFIL4 ;YES, DON'T SEND ANOTHER MESSAGE MOVE T1,ERABUF ;[602]GET HEADER WD 0 MOVEM T1,SSELBK+2 ;[602]INTO THE IPCF PACKET MOVE T1,ERABUF+1 ;[602] GET HEADER WD 1 MOVEM T1,SSELBK+3 ;[602] INTO IPCF PACKET PUSHJ P,SNDSEL ;SEND PACKET TO SYSTEM ERROR LOGGER MOVEI T1,^D10 ;[62]REINITIALIZE NUMBER MOVEM T1,IERCNT ;[62]OF ERROR RETRIES MOVEM T1,NEWEXT ;[62]AND COUNT ON NEW EXTENSIONS IN ROW ERFIL4: PUSHJ P,RELFCT ;RELEASE THE FCT CHANNEL TRZN F,R.AVL ;WANT THIS ENTRY APPENDED TO AVAIL.SYS? JRST ERRFIX ;NO, EXIT CLEARING ALL FLAGS MOVE P4,SAVEP4 ;RESTORE ORIGINAL VALUE OF P4 PJRST AVLFIN ;AND CALL OURSELVES ;+[1004] ESPLIT: BLT T1,ERRBUF(T2) ;COPY AS MUCH AS WILL FIT SUBI T3,-1(T2) ;CALCULATE REMAINING WORDS MOVEI P4,-1(T3) ;PUT IT WHERE IT BELONGS CAIL T3,BLKSIZ ;STILL MORE THAN A BLOCK? MOVEI T3,BLKSIZ ;SAY A BLOCK HRLI T3,.ESOFF_9 ;STUFF SYNC CODE MOVEM T3,(T1) ;INTO BUFFER AOJA T1,ERFIL1 ;ADVANCE BLT POINTER AND CONTINUE ;-[1004] ;SUBROUTINE TO INITIALIZE FOR WRITING IN ERROR.SYS OR AVAIL.SYS ;ARGS T1=FIRST (TYPE) WORD OF ENTRY ;VALUES P4=IOWD ERRSIZ,ERABUF SUITABLE FOR PUSH-ING ; HEADER WORD SETUP (EXCEPT LENGTH) ; DATE & TIME IN WORD 1 ; UPTIME IN WORD 2 ; CPU SERIAL NUMBER IN WORD 3 ; SEQUENCE NUMBER IN WORD 4 ;RETURN CPOPJ, T1-4 BLOWN ERRINB: TROA F,R.NEB ;SET FLAG TO CALL BOOTCP ERRINI: TRZ F,R.NEB ;CLEAR FLAG FOR CALL TO ERRINI TLO F,L.ANY ;NOTE SOMETHING DONE SETZM ERABUF ;CLEAR BUFFER MOVE T2,[XWD ERABUF,ERABUF+1] BLT T2,ERAEND ;CLEAR TO END AVLINI: HRR T1,HEADR0 ;FORMAT VERS & HEADER LEN TLNE F,L.DSK ;ENTRY COMING FROM A CRASH FILE? TXO T1,EH.CRS ;YES-SAY SO MOVEM T1,ERABUF+.EHTYP ;(0) HEADER TYPE IDENTIFIER PUSHJ P,NBSDAT ;GET DATE AND TIME MOVEM T1,ERABUF+.EHDTM ;(1) DATE (LH) AND TIME (RH) PUSHJ P,UPTIME ;COMPUTE UPTIME MOVEM T1,ERABUF+.EHUPT ;(2) UPTIME IN STD FORMAT TRNN F,R.NEB ;WANT BOOT CPU SERIAL NUMBER? PUSHJ P,CPUASN ;NO, GET CPU SERIAL NUMBER TRZE F,R.NEB ;REVERSE SENSE OF TEST PUSHJ P,BOOTCP ;AND GET BOOT CPU SERIAL NUMBER MOVEM T1,ERABUF+.EHASN ;(3) CPU S/N [464] AOS T1,ERRSEQ ;INCREMENT SEQUENCE NUMBER MOVEM T1,ERABUF+.EHSEQ ;(4) SEQUENCE NUMBER MOVE P4,[IOWD ERRSIZ,ERABUF+EL.HED] ;SETUP FOR PUSHING POPJ P, ;SO FAR SO GOOD ;ROUTINE TO COMPUTE UPTIME IN UNIVERSAL DATE/TIME FORMAT. ;ENTER AT UPTCNV IF HAVE UPTIME IN JIFFIES IN T1. UPTIME: PUSHJ P,GETUPT ;GET THE UPTIME IN TICKS UPTCNV: SETZ T2, ASHC T1,-^D17 ;JIFFIES*2**18 IN T2[7(55)] DIV T1,JIFDAY ;DAYS IN LH, FRACTION IN RH POPJ P, ;RETURN ;ROUTINE TO RETURN THE UPTIME IN TICKS IN T1. GETUPT: MOVE T1,[%CNSUP] ;GETTAB ARG FOR SYSTEM UPTIME PUSHJ P,GTBSPY ;GET IT SKIPA T1,[%NSUPT] ;SHOULDN'T FAIL, BUT TRY THIS ONE ANYWAY POPJ P, ;RETURN PJRST GTBDFL ;GET THE CPU0 UPTIME AND RETURN ;ROUTINE TO RETURN THE CPU SERIAL NUMBER OF THE CPU ON WHICH AN ERROR ;WAS DETECTED. CPUASN: LDB T1,[POINT 3,ERPTBK+2,17] ;GET CPU NUMBER FROM ERROR BLOCK LSH T1,1 ;TIMES 2 ADD T1,[%CCSER] ;SET TO READ CPU SERIAL NUMBER SKIPE ERPTBK+2 ;IS THIS AN OLD MONITOR? PUSHJ P,GTBSPY ;NO, GET IT CAIA ;FAILED, DO IT THE OLD WAY POPJ P, ;RETURN WITH NUMBER IN T1 BOOTCP: MOVE T1,[%CNSER] ;GET SERIAL NUMBER OF BOOT CPU PJRST GTBDFL ;GET IT AND RETURN ;NEW ROUTINES TO PROCESS I/O ERRORS ON ERROR.SYS ;HERE IF INIT FAILS E.IEF: TRNN F,R.PAE!R.INF ;DOING AVAIL.SYS? SETOM IOERR ;SET FLAG SO WE STOP TRYING PUSHJ P,RELFCT ;RELEASE FCT CHANNEL ERRFIX: TXNE F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION JRST E.INF1 ;YES, GIVE UP TRZ F,R.AVL!R.PAE ;CLEAR ALL FLAGS POPJ P, ;AND RETURN ;HERE IF LOOKUP/ENTER ERROR E.EEF: CAIN T1,-1 ;LOOKUP HAS CODE IN T1 TDZ T1,RBEXTE ;ENTER HAD -1 IN T1, THIS GETS CODE XORI T1,-1 ;CODE WAS IN ONE'S COMPLEMENT CAIN T1,ERTRN% ;BAD RIB OR UFD? JRST NEREXT ;YES, TRY NEW FILE NOW CAIE T1,ERFBM% ;FILE BEING MODIFIED? CAIN T1,ERNRM% ;OR DISK FULL? JRST ERRCLK ;YES, DO SOME RETRIES CAIE T1,ERNET% ;NO MONITOR FREE CORE? CAIN T1,ERSLE% ;OR EMPTY SEARCH LIST JRST ERRCLK ;YES, DO SOME RETRIES PJRST E.IEF ;ALL OTHERS FATAL, TREAT LIKE INIT ERROR ;HERE ON INPUT/OUTPUT ERROR E.INEF: E.OUEF: GETSTS FCT,T1 ;GET STATUS IN T1 TRNE T1,IO.BKT ;DISK FULL PJRST ERRCLK ;YES,DO SOME RETRIES ;ROUTINE TO TRY NEW EXTENSIONS.INPUT/OUTPUT ERRORS FALL THROUGH ;EXCEPT IO.BKT NEREXT: TRNN F,R.PAE ;DOING AVAIL.SYS? SOSG NEWEXT ;HERE TOO MANY TIMES IN A ROW? PJRST E.IEF ;YES, GIVE UP HRRZ T1,ERREXT ;TRY NEW FILE. FIRST GET CURRENT EXT CAIN T1,'SYS' ;IS IT SYS? MOVEI T1,'X00' ;YES, SET UP X00 ADDI T1,1 ;INCREMENT TO GET NEW EXTENSION TRNN T1,7 ;SHOULD WE CARRY TO SECOND DIGIT? ADDI T1,100-10 ;YES,CAUSE THE SIXBIT TO CARRY CAILE T1,'X77' ;HAS THE EXTENSION OVERFLOWED? PJRST E.IEF ;YES, FATAL HRRZM T1,ERREXT ;GOOD NEW EXT., STORE IT PUSHJ P,RELFCT ;RELEASE THE FCT CHANNEL MOVE P4,SAVEP4 ;RESTORE P4 IN CASE WE GOT TO ERFILL PJRST ERRFIN ;AND TRY THE NEW FILE ; HERE ON ERRORS DETECTED DURING SEQUENCE NUMBER INITIALIZATION. E.INF: USETI FCT,1 ;SET TO READ BLOCK 1 OF FILE INPUT FCT,ILIST ;READ FIRST 200 WORDS STATZ FCT,IO.ERR ;ERRORS? JRST E.INF1 ;YES, GIVE UP MOVE T1,ERRBUF ;GET FIRST WORD OF FILE CAME T1,[.ESOFF_9,,1] ;BETTER BE RESYNC WORD JRST E.INF1 ;NO LDB T1,[POINTR ERRBUF+1+.EHTYP,EH.HFM] ;GET HDR FMT LDB T2,[POINTR ERRBUF+1+.EHTYP,EH.HLN] ; AND HDR LEN CAIL T1,EL.HVR ;HEADER VERSION OK? CAIGE T2,EL.HED ;LENGHT OK? JRST E.INF1 ;NO MOVE T1,RBSIZE ;GET SIZE OF ERROR FILE IDIVI T1,EL.HED+1 ;COMPUTE MAX ENTRIES IN FILE ADD T1,ERRBUF+1+.EHSEQ ;COMPUTE A SEQUENCE NUMBER MOVEM T1,ERRSEQ ;USE THAT ONE TO START WARN ,OPR WARN ,NOCRLF PUSHJ P,TDEC ;TYPE THE NUMBER PUSHJ P,OCRLF ;END MESSAGE AND RETURN JRST RELFCT ;RELEASE CHANNEL E.INF1: WARN ,OPR WARN ,OPR JRST RELFCT ;RELEASE CHANNEL ;ROUTINE FOR RETRIES ON SAME FILE. USES INTERNAL CLOCK REQUEST TO ;WAIT BETWEEN RETRIES. AFTER 10 RETRIES WITH NO LUCK,IT TRIES A NEW FILE ERRCLK: TRNN F,R.PAE ;DOING AVAIL.SYS? SOSG IERCNT ;DECREMENT COUNT OF RETRIES LEFT PJRST NEREXT ;TOO MANY RETRIES, TRY NEW FILE SETOM IOERR ;NO IO TO ERROR FILE UNTIL CLOCK EXPIRES PUSHJ P,RELFCT ;RELEASE FCT CHANNEL PUSH P,J ;SAVE J HRREI J,IOERQ ;SET UP Q # FOR INTERNAL CLOCK REQUEST MOVEI T1,ERRTIM ;SET UP TIME FOR CLOCK REQUEST PUSHJ P,CLKREQ ;DO THE CLOCK REQUEST POP P,J ;RESTORE J POPJ P, ;RETURN ;SUBROUTINE TO INITIALIZE EXTENSION FOR ERROR FILE ;NO ARGS ;CHANGES ERREXT TO THE EXTENSION OF THE LAST ERROR FILE ; FOUND ON ERRDEV ;RETURNS CPOPJ, DESTROYS T1,T2,T3 ERRSTR: SETZM ERRDTM ;INIT SAVED ENTRY DATE/TIME MOVEI T1,ERRBUF-1 ;I/O BUFFER HRRM T1,ILIST ;SAVE FOR LATER MOVX T1,.IODMP ;INIT A CHANNEL FOR LOOKUPS MOVE T2,CERDEV ;GET DEVICE MOVEI T3,0 ;NO BUFFERS OPEN FCT,T1 ;OPEN THE CHANNEL JRST E.INF1 ;CAN'T INIT ERRDEV MOVEI T1,RBEXTE-RBCNTE ;LENGTH FOR EXTENDED LOOKUP MOVEM T1,RBCNTE ;SAVE IN LOOKUP BLOCK MOVE T1,[SIXBIT/ERROR/] ;AND SET UP NAME MOVEM T1,RBNAME ; FOR LOOKUP MOVEI T1,'SYS' ;START AT SYS ERRST1: HRLZM T1,RBEXTE ;SAVE EXT FOR LOOKUP MOVE T2,CERPPN ;SET UP DIRECTORY MOVEM T2,RBPPNE ; FOR LOOKUP LOOKUP FCT,EBLOCK ;LOOK UP THIS ONE JRST ERRST3 ;FAILED ERRST2: HRRZM T1,ERREXT ;SAVE EXTENSION PUSHJ P,NXTEXT ;STEP TO NEXT EXTENSION ERROR ,OPR,E.IEF INPUT FCT,ILIST ;READ A BUFFER MOVE T2,ERRBUF+1+.EHDTM ;GET FIRST ENTRY DATE/TIME MOVEM T2,ERRDTM ;SAVE JRST ERRST1 ;TRY NEXT EXTENSION ERRST3: HRRZ T2,RBEXTE ;GET ERROR CODE CAIE T2,ERFNF% ;FILE NOT FOUND? JRST ERRST2 ;NO, KEEP LOOKING CAIN T1,'SYS' ;FIND NO FILES AT ALL? POPJ P, ;NO, USE DEFAULT SEQUENCE NUMBER PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME SUB T1,ERRDTM ;COMPUTE DIFFERENCE HLRZS T1 ;KEEP ONLY DAYS CAIGE T1,7 ;OLDER THAN A WEEK? JRST ERRST4 ;NO PUSHJ P,NXTEXT ;STEP TO NEXT EXTENSION ERROR ,OPR,E.IEF MOVEM T1,ERREXT ;SAVE STARTING EXTENSION TXZA F,R.INF ;VIRGIN FILE ERRST4: TXO F,R.INF ;FLAG SEQ NUMBER INITIALIZATION PUSHJ P,INIFIN ;GO INITIALIZE ERRSEQ TXZ F,R.INF ;TURN OFF FLAG POPJ P, ;RETURN ;SUBROUTINE TO STEP TO NEXT EXTENSION NXTEXT: MOVE T1,ERREXT ;GET EXTENSION CAIN T1,'SYS' ;THIS THE FIRST ONE MOVEI T1,'X01'-1 ;YES, SETUP NEXT ONE ADDI T1,1 ;INCREMENT EXTENSION TRNN T1,7 ;SHOULD WE CARRY TO SECOND DIGIT? ADDI T1,100-10 ;YES, CAUSE THE SIXBIT TO CARRY CAIG T1,'X77' ;HAS THE EXTENSION OVERFLOWED? AOS (P) ;NO POPJ P, ;RETURN ;SUBROUTINE TO RETURN DATE AND TIME IN NBS FORMAT, ; DAYS SINCE NOV 17, 1858 IN LH, FRACTION OF DAY IN RH NBSDAT: MOVE T1,[%CNDTM] ;[562] WAS %CNDAT PJRST GTBDFL ;GET DATE AND RETURN ;ROUTINE TO FLUSH ANY IPCF PACKETS IN DAEMON'S INPUT QUEUE CAUSED ;BY PREVIOUS SENDS THAT FAILED. ALSO CLEARS BLOCK BEFORE RETURN. ;CALL: PUSHJ P,FLSPAK ; RETURN ;DESTROYS T1,T2 FLSPAK: MOVEI T2,0 ;START WITH ZERO FLAGS FLSPA1: PUSHJ P,CLRIPC ;CLEAR RECEIVE BLOCK TLO T2,(IP.CFB!IP.CFT) ;NON-BLOCKING AND TRUNCATE LENGTH MOVEM T2,IPCPDB+.IPCFL ;STORE IN FLAGS WORD MOVEI T1,SSELBK ;LEN=0,,ADDRESS OF MESSAGE BLOCK MOVEM T1,IPCPDB+.IPCFP ;STORE IN BLOCK MOVE T1,[4,,IPCPDB] ;GET LEN,,ADDR OF BLOCK IPCFR. T1, ;GET ANY PACKETS JRST [CAIE T1,IPCPR% ;PAGE MODE? PJRST CLRIPC ;NO, CLEAR IPCF BLOCK AND RETURN MOVEI T2,IP.CFV ;GET PAGE MODE FLAG JRST FLSPA1] ;TRY IT THIS WAY JRST FLSPAK ;GET ANY REMAINING PACKETS ;ROUTINE TO CLEAR THE IPCF MESSAGE AREA. ;CALL: PUSHJ P,CLRIPC ; RETURN ;DESTROYS T1 CLRIPC: MOVE T1,[IPCPDB,,IPCPDB+1] ;SETUP FOR BLT SETZM IPCPDB+.IPCFL ;CLR FIRST WD BLT T1,SSELBK+7 ;CLEAR THE REST POPJ P,0 ;RETURN ;ROUTINE TO SEND A MESSAGE TO THE ON-LINE SYSTEM ERROR LOGGER TO ;TELL IT THAT AN ERROR HAS OCCURRED. CALL WITH DATA TO SEND IN SSELBK. ;CALL: PUSHJ P,SNDSEL ; RETURN ;DESTROYS T1 SNDSEL: MOVEI T1,001001 ;MSG TYPE,FORMAT HRLM T1,SSELBK ;INTO THE MSG PUSHJ P,FNDSEL ;FIND SEL POPJ P, ;NOT THERE, GIVE UP ;; PJRST SNDPAK ;AND SEND HIM A PRESENT ;ROUTINE TO SEND A MESSAGE TO ANOTHER PROCESS. ;CALL: MOVEI T1,PID OF RECEIVER ; PUSHJ P,SNDPAK ; RETURN ;DESTROYS T1 SNDPAK: MOVEM T1,IPCPDB+.IPCFR ;SAVE RECEIVER'S PID MOVE T1,[^D8,,SSELBK] ;GET POINTER TO MESSAGE MOVEM T1,IPCPDB+.IPCFP;INTO THE PDB MOVE T1,[6,,IPCPDB] ;GET LEN,,ADDR OF BLOCK IPCFS. T1, ;SEND THE MSG JFCL ;DON'T CARE ABOUT ERRORS POPJ P,0 ;RETURN ;ROUTINE TO FIND THE PID OF A SYSTEM PROCESS. ENTER AT FNDSEL TO ;FIND THE SYSTEM ERROR LOGGER PID, FNDACT TO FIND THE ACCOUNTING ;PID. ;CALL: PUSHJ P,FNDXXX ; NOT THERE ; RETURN WITH T1=PID FNDACT: SKIPA T1,ACTPTR ;SETUP TO GET [SYSTEM]ACCOUNTING PID FNDSEL: MOVE T1,SELPTR ;SET UP TO GET SEL'S PID PUSHJ P,GTBSPY ; GET IT POPJ P, ;NOT THERE, GIVE ERROR SKIPE T1 ;GET BACK ONE? CPOPJ1: AOS (P) ;YES RETURN +1 CPOPJ: POPJ P,0 ;NO RETURN NORMALLY SUBTTL AVAIL.SYS UPDATE ROUTINE ;ROUTINE TO UPDATE THE WORKING ENTRY IN AVAIL.SYS. UPDAVL: PUSHJ P,SAVE4 ;SAVE P1-P4 MOVE T1,[MRVBLK,,ERABUF] ;MAKE BLT POINTER BLT T1,ERAEND ;MOVE THE ENTRY TO THE BUFFER LDB P2,[POINT 9,ERABUF,35] ;GET LEN OF BODY FOR LATER MOVSI T1,FCT+<(FO.PRV)> ;CHANNEL IS FCT HRRI T1,.FOSAU ;FUNCTION IS SINGLE ACCESS UPDATE MOVEM T1,D.FLOP+.FOFNC;STORE IN BLOCK MOVEI T1,.IODMP ;USE DUMP MODE MOVEM T1,D.FLOP+.FOIOS MOVE T1,CERDEV ;DEVICE IS ERRDEV MOVEM T1,D.FLOP+.FODEV SETZM D.FLOP+.FOBRH ;NO BUFFERS SETZM D.FLOP+.FONBF ;AND NO BUFFER COUNT MOVEI T1,D.LKB ;POINT AT LOOKUP BLOCK MOVEM T1,D.FLOP+.FOLEB SETZM D.LKB ;CLEAR FIRST WORD OF LOOKUP BLOCK MOVE T1,[D.LKB,,D.LKB+1] ;MAKE BLT POINTER BLT T1,D.LKB+.RBSIZ ;CLEAR ENTIRE BLOCK MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL MOVEM T1,D.LKB+.RBNAM MOVSI T1,'SYS' ;EXTENSION IS SYS MOVEM T1,D.LKB+.RBEXT MOVSI T1,155000 ;MAKE PROTECTION 155 MOVEM T1,D.LKB+.RBPRV MOVEI T1,.RBSIZ ;COUNT IS .RBSIZ MOVEM T1,D.LKB+.RBCNT MOVEI P1,5 ;NUMBER OF TIMES TO RETRY ON ERFBM% UPDAV1: MOVE T1,CERPPN ;GET PPN INTO WHICH TO WRITE FILE MOVEM T1,D.LKB+.RBPPN ;STORE IN BLOCK HLLZS D.LKB+.RBEXT ;CLEAR ANY ERROR CODE MOVE T1,[.FOLEB+1,,D.FLOP] ;POINT TO FILOP. BLOCK FILOP. T1, ;OPEN THE FILE JRST [PUSHJ P,FBMTRY ;CHECK FOR ERFBM% JRST UPDAV1 ;IS, RETRY POPJ P,] ;NOT, GIVE UP MOVNI T1,AWELEN(P2) ;GET -VE LENGTH OF BODY PLUS HEADER HRLI T1,ERABUF-1 ;MAKE SWAPPED IOWD MOVSS T1 ;MAKE IT RIGHT MOVEI T2,0 ;MAKE IOWD TERMINATE ON A ZERO OUTPUT FCT,T1 ;WRITE THE WORKING ENTRY STATZ FCT,IO.ERR ;ANY ERRORS? JRST RELFCT ;YES, RELEASE CHANNEL AND QUIT ADDI P2,AWELEN+BLKSIZ-1 ;ROUND UP TO A BLOCK BOUNDARY LSH P2,-B2WLSH ;COMPUTE NUMBER BLOCKS WRITTEN SUBI P2,AVLWRK ;COMPUTE -NUMBER BLOCKS LEFT IN AVLWRK SETZM ERABUF ;CLEAR FIRST WORD OF BLOCK MOVE T3,[ERABUF,,ERABUF+1] ;MAKE BLT POINTER BLT T3,ERABUF+BLKSIZ-1 ;CLEAR ENTIRE BLOCK HRLI T1,-BLKSIZ ;SETUP IOWD TO ZERO FILL BLOCK UPDAV2: AOJG P2,RELFCT ;LOOP UNTIL ALL AVLWRK BLOCKS ARE OUTPUT FCT,T1 ; ZERO FILLED STATO FCT,IO.ERR ;ANY ERRORS? JRST UPDAV2 ;NO, LOOP PJRST RELFCT ;RELEASE CHANNEL AND RETURN ;ROUTINE TO SEE IF THE AGE OF AVAIL.SYS IS GREATER THAN 7 DAYS ;AND RENAME IT TO AVAIL.ANN IF IT IS. ;RETURNS CPOPJ ALWAYS WITH DISK COPY UPDATED IF LESS THAN 7 DAYS ; AND NEW FILE CREATED IF OLDER THAN 7 DAYS ;[1005] CHANGE TO RENAME .LWK TO .ANN, THEN RENAME .SYS TO .LWK AVLAGE: PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME SUB T1,MRVBLK+AWECDA ;SUBTRACT CREATION DATE OF THIS AVAIL HLRZS T1 ;KEEP JUST DIFFERENCE IN DAYS CAIGE T1,7 ;OLDER THAN A WEEK? JRST [PUSHJ P,MRVSCN ;NO, UPDATE CORE COPY OF MRV ENTRY PJRST UPDAVL] ;AND UPDATE FILE COPY OF WORKING ENTRY PUSHJ P,SAVE1 ;GET A REGISTER TO USE PUSHJ P,ENDAVL ;APPEND .ESEAV ENTRY TO FILE MOVEI P1,'A01' ;FIRST EXTENSION TO TRY IS A01 AVLAG1: MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL MOVEI T4,(P1) ;EXTENSION IS XNN PUSHJ P,OPNFIE ;TRY TO LOOKUP THE FILE TRNE T2,-1 ;ERROR CODE MUST BE FILE NOT FOUND SKIPA ;TRY NEXT EXTENSION JRST AVLAG2 ;FOUND ONE, RENAME TO THAT ADDI P1,1 ;BUMP EXTENSION BY 1 TRNN P1,7 ;NEED TO CARRY INTO THE 10S DIGIT? ADDI P1,100-10 ;YES, CARRY CAILE P1,'A77' ;TRIED THEM ALL? WARN ,OPR,RELFCT ;[1005] YES, RELEASE CHANNEL AND GIVE UP AND COMPLAIN JRST AVLAG1 ;LOOP FOR NEXT AVLAG2: MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL MOVEI T4,'LWK' ;[1005] SEE IF "LAST WEEK" FILE IS THERE PUSHJ P,OPNFIE ;[1005] JRST AVLAG3 ;[1005] IF CAN'T FIND IT, DON'T RENAME IT HRLI T2,(P1) ;GET EXTENSION WE FOUND RENAME FCT,T1 ;RENAME THE FILE PJRST RELFCT ;FAILED, GIVE UP AVLAG3: MOVE T1,[SIXBIT/AVAIL/] ;[1005] NOW SETUP PUSHJ P,OPNFIL ;[1005] TO RENAME AVAIL.SYS PJRST RELFCT ;[1005] GIVE UP ON FAILURE HRLI T2,'LWK' ;[1005] RENAME .SYS TO .LWK RENAME FCT,T1 ;[1005] PJRST RELFCT ;[1005] AND GIVE UP IF WE CAN'T PJRST REDNAV ;CREATE NEW FILE AND RETURN ;ROUTINES TO APPEND BEGINNING/END OF AVAIL.SYS TIMESTAMPS. ;RETURNS CPOPJ ALWAY BEGAVL: SKIPA T1,[.ESBAV_9,,0] ;GET CODE FOR BEGINNING OF AVAIL.SYS ENDAVL: MOVSI T1,.ESEAV_9 ;DITTO FOR END OF AVAIL.SYS PUSH P,P4 ;SAVE P4 PUSHJ P,ERRINI ;SETUP BUFFER, P4 PUSH P4,.JBVER ;BODY CONTAINS DAEMON VERSION # PUSHJ P,AVLFIN ;APPEND ENTRY TO FILE POP P,P4 ;RESTORE P4 POPJ P, ;RETURN ;ROUTINE TO BUILD A NEW CORE COPY OF THE AVAIL.SYS WORKING ENTRY. ;RETURNS CPOPJ ALWAYS MRVNEW: MOVSI T1,.ESMRV_9 ;GET ENTRY CODE MOVEM T1,MRVBLK+AWEHDR ;SAVE IN BLOCK SETZM MRVBLK+AWECDM ;FORCE APPEND OF MAXCNF BY CLEARING DATE PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME HLRZS T1 ;KEEP ONLY DATE MOVEI T2,-4(T1) ;MOVE TO T2 AND SHIFT SO THAT THE ;IDIVI GIVES 0=SUNDAY, 1=MONDAY, ETC. IDIVI T2,7 ;DIVIDE BY DAYS/WEEK. REMDR=DAY IN WEEK SUBI T1,(T3) ;COMPUTE DATE OF PREVIOUS SUNDAY HRLZM T1,MRVBLK+AWECDA ;MAKE CREATION DATE BE SUNDAY AT 00:00 PUSHJ P,MRVSCN ;BUILD NEW BODY MOVE T1,MONVER ;GET CURRENT MONITOR VERSION MOVEM T1,MRVBDY+MRVVER ;SAVE IN BLOCK SETZM MRVBDY+MRVIDT ;START WITH NO DATE/TIME INCREMENT PJRST SYSNAM ;GET NEW SYSTEM NAME AND RETURN ;ROUTINE TO UPDATE THE CORE COPY OF THE AVAIL.SYS WORKING ENTRY. ;RETURNS CPOPJ ALWAYS. MRVSCN: PUSH P,P4 ;SAVE CALLER'S P4 MOVE P4,[IOWD ERRSIZ,MRVBDY] ;SETUP BUFFER POINTER AOBJN P4,.+1 ;(R0) AOBJN POINTER TO SYSTEM NAME AOBJN P4,.+1 ;(R1) MONITOR VERSION NUMBER PUSHJ P,UPTIME ;GET MONITOR UPTIME PUSH P4,T1 ;(R2) MONITOR UPTIME (UNIV DATE/TIME) PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME MOVEM T1,MRVBLK+AWEDAT ;SAVE IN BLOCK PUSH P4,T1 ;(R3) MONITOR CRASH TIME (+/- 6 MIN) AOBJN P4,.+1 ;(R4) MONITOR RELOAD TIME AOBJN P4,.+1 ;(R5) SIXBIT WHY RELOAD CODE AOBJN P4,.+1 ;(R6) SUM OF INCREMENTAL DATE/TIME CHANGES ADD P4,[5,,5] ;(R7-R13) ASCIZ MONITOR NAME SUBI P4,MRVBDY-1 ;COMPUTE LENGTH OF BODY DPB P4,[POINT 9,MRVBLK,35] ;SAVE IN HEADER POP P,P4 ;RESTORE P4 POPJ P, ;AND RETURN ;ROUTINE TO READ THE WORKING ENTRY FROM AVAIL.SYS INTO CORE WHEN ;DAEMON STARTS UP. IF AVAIL.SYS DOESN'T EXIST OR THE WORKING ;ENTRY IS BAD FOR SOME REASON, A NEW ENTRY IS BUILT. REDAVL: SETZM MRVBLK ;CLEAR FIRST WORD OF BLOCK MOVE T1,[MRVBLK,,MRVBLK+1] ;MAKE BLT POINTER BLT T1,MRVEND ;CLEAR ENTIRE BLOCK MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL PUSHJ P,OPNFIL ;OPEN THE FILE JRST REDNAV ;BUILD NEW ENTRY HLRES T4 ;GET 36 BIT NEGATIVE SIZE OF FILE MOVNS T4 ;MAKE IT POSITIVE CAIGE T4,AVLWRK*BLKSIZ ;BETTER BE AT LEAST THIS LONG JRST REDNAV ;MUST BE BAD MOVSI T1,- ;ONLY NEED THIS MANY WORDS HRRI T1,MRVBLK-1 ;MAKE AN IOWD MOVEI T2,0 ;TERMINATE LIST WITH A ZERO INPUT FCT,T1 ;READ THE OLD ENTRY STATZ FCT,IO.ERR!IO.EOF ;ANY ERRORS? JRST REDNAV ;YES, REBUILD IT LDB T1,[POINT 9,MRVBLK,8] ;GET ENTRY CODE CAIN T1,.ESMRV ;HAS TO BE THE RIGHT ONE PJRST RELFCT ;RELEASE CHANNEL AND RETURN ;HERE IF WE HAVE TO BUILD A NEW FILE FOR SOME REASON REDNAV: PUSHJ P,RELFCT ;RELEASE CHANNEL PUSHJ P,MRVNEW ;BUILD NEW ENTRY ON ERRORS PUSHJ P,UPDAVL ;UPDATE WORKING ENTRY IN FILE PUSHJ P,BEGAVL ;TIMESTAMP BEGINNING OF FILE IFN FTMCNF,< PUSHJ P,APPCNF ;APPEND MAXCNF ENTRY > POPJ P, ;RETURN ;ROUTINE TO UPDATE THE SYSTEM NAME IN THE AVAIL.SYS WORKING ;ENTRY IN CORE. SYSNAM: MOVE T2,[-5,,MRVSNM] ;GET AOBJN POINTER TO SYSTEM NAME MOVEM T2,MRVBDY+MRVPSN ;SAVE AS POINTER TO NAME IN BLOCK MOVS T3,[%CNFG0] ;GETTAB POINTER TO FIRST WORD OF NAME SYSNA1: MOVS T1,T3 ;GET CURRENT WORD POINTER PUSHJ P,GTBDFL ;GET THE WORD MOVEM T1,MRVBDY(T2) ;SAVE IN BLOCK ADDI T3,1 ;BUMP GETTAB ITEM NUMBER AOBJN T2,SYSNA1 ;LOOP FOR ALL 5 WORDS POPJ P, ;RETURN IFN FTMCNF,< ;ROUTINE TO APPEND THE MAX CONFIGURATION ENTRY FROM MAXCNF.SYS TO ;AVAIL.SYS IF IT HAS CHANGED. ;RETURNS CPOPJ ALWAYS APPCNF: MOVE T1,[SIXBIT/MAXCNF/] ;FILENAME IS MAXCNF PUSHJ P,OPNFIL ;OPEN THE FILE, RETURN LOOKUP BLK IN T1-T4 PJRST RELFCT ;FILE NOT THERE LDB T1,[POINT 3,T2,20] ;GET HIGH 3 BITS OF CREATION DATE LSH T1,^D12 ;MAKE ROOM FOR OTHER 12 LDB T2,[POINT 12,T3,35] ;GET OTHER 12 IORI T1,(T2) ;OR TOGETHER LDB T2,[POINT 11,T3,23] ;GET CREATION TIME HRLI T2,(T1) ;MAKE IT DATE,,TIME CAMN T2,MRVBLK+AWECDM ;SAME AS THE LAST TIME? PJRST RELFCT ;YES, RELEASE CHANNEL AND RETURN MOVEM T2,MRVBLK+AWECDM ;SAVE FOR NEXT CHECK SKIPL T1,T4 ;INSURE THAT SIZE OF FILE IS OK PJRST RELFCT ;EITHER ZERO OR HUGE, FORGET IT HLRES T4 ;GET 36 BIT NEGATIVE SIZE MOVNS T4 ;MAKE IT POSITIVE CAILE T4,EL.HED+ERRSIZ ;TOO BIG FOR OUR BUFFER? PJRST RELFCT ;YES, MUST BE BAD HRRI T1,ERABUF-1 ;MAKE IOWD TO OUR BUFFER MOVEI T2,0 ;TERMINATE IOWD LIST WITH ZERO INPUT FCT,T1 ;READ IN THE FILE STATZ FCT,IO.ERR!IO.EOF ;GET IT OK? PJRST RELFCT ;NO, RELEASE CHANNEL AND RETURN LDB T1,[POINT 9,ERABUF,8] ;GET ENTRY CODE LDB P4,[POINT 9,ERABUF,35] ;GET LENGTH OF BODY CAIN T1,.ESCFG ;ENTRY CODE BETTER BE THIS CAIE P4,-EL.HED(T4) ;AND FILE SIZE BETTER MATCH BODY LEN PJRST RELFCT ;MUST BE BAD PUSH P,P4 ;SAVE LENGTH OF BODY AROUND CALLS PUSHJ P,RELFCT ;RELEASE THE CHANNEL MOVSI T1,.ESCFG_9 ;SETUP HEADER CODE FOR MAXCNF PUSHJ P,AVLINI ;BUILD ENTRY HEADER POP P,P4 ;RESTORE LEN OF BODY ADDI P4,ERABFS-1 ;REVERSE CALCULATION AT ERFILL PJRST AVLFIN ;APPEND MAXCNF ENTRY TO AVAIL AND RETURN >;END IFN FTMCNF ;ROUTINE TO LOOKUP ERRDEV:??????.SYS ON CHANNEL FCT. ;CALL WITH T1=FILENAME ;RETURNS CPOPJ IF OPEN OR LOOKUP FAILED, ; CPOPJ1 WITH CHANNEL OPEN AND LOOKUP BLOCK IN T1-T4 OPNFIL: MOVEI T4,'SYS' ;EXTENSION IS SYS OPNFIE: PUSH P,T1 ;SAVE FILENAME MOVEI T1,.IODMP ;USE DUMP MODE MOVE T2,CERDEV ;DEVICE IS ERRDEV MOVEI T3,0 ;NO BUFFERS OPEN FCT,T1 ;OPEN THE CHANNEL JRST TPOPJ ;CAN'T, GIVE ERROR RETURN POP P,T1 ;RESTORE FILENAME MOVSI T2,(T4) ;SETUP EXTENSION MOVEI T3,0 ;NO PROTECTION MOVE T4,CERPPN ;GET PPN LOOKUP FCT,T1 ;LOOKUP THE FILE POPJ P, ;NOT THERE, RETURN JRST CPOPJ1 ;GIVE SKIP RETURN ;ROUTINE TO ALLOCATE A BLOCK OF CORE. ;ARGS T2=NUMBER OF WORDS TO ALLOCATE ;RETURNS CPOPJ IF CAN'T GET THE CORE ; CPOPJ1 WITH CORE ZEROED AND T2=ADDRESS OF FIRST WORD GETCOR: PUSH P,.JBFF ;SAVE CURRENT VALUE OF .JBFF ADDB T2,.JBFF ;COMPUTE NEW .JBFF CAMG T2,.JBREL ;HAVE THAT MUCH? JRST GETCO1 ;YES CORE T2, ;GET ANOTHER PAGE JRST [POP P,.JBFF ;CAN'T, RESTORE ORIGINAL .JBFF POPJ P,] ;AND RETURN GETCO1: SETZM @0(P) ;ZERO FIRST WORD OF CORE HRRZ T2,(P) ;GET ADDRESS OF FIRST WORD HRLI T2,1(T2) ;MAKE SWAPPED BLT POINTER MOVSS T2 ;MAKE IT ADDR,,ADDR+1 BLT T2,@.JBFF ;CLEAR THROUGH NEW .JBFF POP P,T2 ;RETURN ADDRESS OF FIRST WORD JRST CPOPJ1 ;GIVE GOOD RETURN SUBTTL ROUTINE TO WRITE CHKPNT INFO INTO FACT FILE IFN FTCHKPNT,< CHECK: PUSHJ P,SAVE4 ;SAVE THE ACS MOVE P4,FACTSZ ;CURRENT SIZE OF BUFFER CONTENTS MOVN J,HJOB ;HIGHEST JOB # IN SYS HRLZS J HRRI J,1 ;START WITH JOB 1 (0 IS NULL) CHKLUP: HRROI T1,.GTSTS ;JOB'S STATUS PUSHJ P,GTBSPY JRST CHKEND ;NO MORE JOBS TLNN T1,JLOG ;IS THIS JOB LOGGED IN? JRST CHKNXT ;NO, LOOK AT NEXT PUSHJ P,BUFAGE ;ENABLE BUFFER DUMP WHEN IT GETS TOO OLD MOVE T1,[201000,,10] ;FIRST WORD, NEW TYPE[7(57)] MOVEM T1,FACTBF(P4) ;(0) CONTROL WORD WITH LENGTH DPB J,[POINT 9,FACTBF(P4),17] ;(0) JOB NUMBER PUSHJ P,GETTTY ;GET JOB'S TTY NUMBER MOVNI T1,2 ;DETACHED-MARK SO DPB T1,[POINT 12,FACTBF(P4),29] ;(0) LINE NUMBER ;STILL IN FTCHKPNT CONDITIONAL ;HERE TO FILL IN REST OF ENTRY HRROI T1,.GTPPN ; JBTPPN PUSHJ P,GTBSPY ;GET THE DATA JRST CHKEND ;END OF TABLE MOVEM T1,FACTBF+1(P4) ;(1) PPN PUSHJ P,NBSDAT ;GET DATE AND TIME MOVEM T1,FACTBF+2(P4) ;(2) DATE AND TIME HRROI T1,.GTTIM ;RUNTIME PUSHJ P,GTBDFL ;GO GET IT IMULI T1,^D1000 ;AVOID MILJIF FOR PRECISION IDIV T1,JIFSEC ;CONVERT TO MILLISECONDS MOVEM T1,FACTBF+3(P4) ;(3) RUN TIME HRROI T1,.GTKCT ;KILLO-CORE-TICKS PUSHJ P,GTBDFL ;GO READ THEM IMULI T1,^D100 ;CONVERT JIFFIES TO 1/100THS[7(57)] IDIV T1,JIFSEC ;[7(57)] MOVEM T1,FACTBF+4(P4) ;(4) KCT HRROI T1,.GTRCT ;READ COUNT PUSHJ P,GTBDFL ;GET OUT OF MONITOR TLZ T1,777700 ;CLEAR OUT JUNK BITS MOVEM T1,FACTBF+5(P4) ;(5) DISK READS HRROI T1,.GTWCT ;WRITE COUNT PUSHJ P,GTBDFL ;GET FROM MONITOR TLZ T1,777700 ;CLEAR INCR. BITS MOVEM T1,FACTBF+6(P4) ;(6) DISK WRITES HRROI T1,.GTPRG ;NAME TABLE PUSHJ P,GTBDFL ;GET BY SPYING MOVEM T1,FACTBF+7(P4) ;(7) PROGRAM NAME ADDI P4,10 ;UPDATE SIZE TO NOTE 10 WORDS STORED CAIGE P4,MAXFCT ;HAVE WE FILLED THE BUFFER? JRST CHKNXT ;NO, LOOK FOR NEXT JOB HRLZI P1,(P4) ;YES, GET LEN IN P1 LEFT HRRI P1,FACTBF ;AND ADDRESS IN P1 RIGHT PUSHJ P,APPEND ;UPDATE FILE SETZ P4, ;NOTE BUFFER EMPTY CHKNXT: AOBJN J,CHKLUP ;LOOP FOR MORE JOBS CHKEND: SKIPE P4 ;[753] ANYTHING IN OUTPUT BUFFER? TLO F,L.FORC ;[753] FORCE A FACT.SYS UPDATE ON NEXT PASS MOVEM P4,FACTSZ ;RESTORE SIZE OF FACT THINGS MOVEI T1,CHKTIM ;SETUP TIME FOR NEXT CHECKPOINT HRREI J,CHKRQ ;DUMMY JOB NO FOR CHKPNT PJRST CLKREQ ;MAKE THE CLOCK REQUEST AND QUIT >;END FTCHKPNT CONDITIONAL SUBTTL FACT FILE UPDATE ROUTINE IFG FTFACT,< ;SUBROUTINE TO APPEND AN ENTRY TO A FILE IN THE ACCOUNTING SYSTEM. ; THIS ROUTINE FIRST ATTEMPTS TO APPEND TO THE FILE NAMED FACT.SYS, BUT IF THIS FILE ; IS UNAVAILABLE, THEN FILES NAMED FACT.X01, FACT.X02,..., FACT.X77 WILL BE ATTEMPTED ; ;CALLING SEQUENCE: ; MOVE P1,[XWD SIZE,ADDRESS] ;POINTER TO ENTRY TO BE APPENDED. ; PUSHJ P,APPEND ; RETURNS HERE IN ANY EVENT. BLOWING P1 AND P2, T1-4 ; GUARANTEE 200 WORDS FREE ABOVE ENTRY ; APPEND: HLRZ P2,P1 ;CONVERT P1 TO MOVNI P2,(P2) ; AN AOBJN POINTER HRL P1,P2 ; .. PUSH P,P1 ;SAVE P1 MOVEI T2,(SIXBIT /SYS/) ;TRY FACT.SYS FIRST. APPLUP: PUSH P,T2 ;SAVE LAST EXTENSION TRIED. APPLP1: MOVSS T2 ;SET UP ACCUMULATORS FOR THE APPNDF MOVE P1,-1(P) ; SUBROUTINE (WHICH DOES THE ACTUAL APPEND). PUSHJ P,APPNDF ;TRY TO APPEND ENTRY TO TRANSACTION FILE. JRST APPERR ;ERROR ON THAT TRANSACTION FILE--TRY NEXT. JRST APPBZY ;TRANSACTION FILE BUSY--TRY ANOTHER. POP P,T2 ;NORMAL EXIT--FILE SUCCESSFULLY UPDATED. APPXIT: POP P,P1 ;RESTORE STACK AND P1 SETZM FACTSZ POPJ P, ;*** SUBROUTINE EXIT. *** APPERR: POP P,T2 ;NON-RECOVERABLE ERROR--TRY NEXT FILE. CAIN T2,(SIXBIT /SYS/) ;WAS .SYS THE LAST EXTENSION ATTEMPTED? MOVEI T2,(SIXBIT /X00/) ;YES, TRY .X01 NEXT. APPERB: CAIN T2,(SIXBIT /X77/) ;NO, TRIED ALL 64 POSSIBLE FILES ? JRST APPXIT ;YES, GIVE UP. ADDI T2,1 ;NO, TRY NEXT FILE IN SEQUENCE. TRNN T2,7 ;CARRY INTO SECOND DIGIT ? ADDI T2,100-10 ;YES, CAUSE SIXBIT CARRY. JRST APPLUP ;TRY AGAIN. APPBZY: POP P,T2 ;SPECIFIED FILE WAS BUSY--GET ITS EXTENSION. CAIE T2,(SIXBIT /SYS/) ;WAS IT .SYS ? JRST APPERB ;NO, GO TRY NEXT FILE IN SEQUENCE. PUSH P,[SIXBIT / X00/] ;TRY .SYS TWICE JUST TO BE SURE. JRST APPLP1 ;STILL IN FTFACT CONDITIONAL ;SUBROUTINE TO APPEND A TRANSACTION ENTRY TO THE END OF THE ACCOUNTING FILE ; (NORMALLY, THIS IS THE FILE NAMED FACT.SYS, BUT THE EXTENSION IS A PARAMETER ; SUPPLIED TO THIS SUBROUTINE SO THAT IF FACT.SYS BECOMES FOULED UP, AN ENTRY ; MAY BE APPENDED TO AN ALTERNATE FACT.XXX FILE.) ;CALLING SEQUENCE: ; MOVSI T2,(SIXBIT /EXT/) ;DESIRED EXTENSION FOR FACT FILE (NORMALLY .SYS) ; MOVE P1,[XWD -SIZE,ADDRESS] ;POINTER TO ENTRY TO BE APPENDED ; PUSHJ P,APPNDF ; NON-RECOVERABLE ERROR RETURN -- CAN'T APPEND TO FILE. ; BUSY ERROR RETURN -- FILE HAS BEEN BUSY EVERY SECOND FOR TEN SECONDS. ; NORMAL RETURN -- ENTRY HAS BEEN SUCCESSFULLY APPENDED TO THE FILE. APPNDF: MOVE T1,[XWD APPBLK,EBLOCK] BLT T1,RBNAME ;MOVE COUNT,PPN, & NAME INTO EBLOCK MOVEM T2,RBEXTE ;SAVE REQUESTED EXTENSION FOR FILENAME FACT MOVSI T1,(177B8) ;SETUP PROTECTION MOVEM T1,RBPRVE ;[7(56)] SETZM RBSIZE ;AND FILE SIZE MOVEI P2,^D10 MOVEM P2,TRYCTR ;SET NUMBER OF TIMES TO TRY IF BUSY. INIT FCT,.IODMP ;OPEN SOFTWARE I/O CHANNEL FOR FACT FILE FCTDEV ; IN DUMP MODE 0 JSP P2,APPNDR ;IMMEDIATE ERROR RETURN IF CAN'T GET DEVICE SYS. APPNDL: LOOKUP FCT,EBLOCK ;ATTEMPT TO OPEN FACT FILE FOR READING. JRST APPNDN ;LOOK-UP FAILED--PERHAPS FILE DOESN'T EXIST. PUSHJ P,APPNDE ;ATTEMPT TO GRAB THE FACT FILE. SKIPN P2,RBSIZE ;FILE SIZE IN WORDS JRST APPNDM ;IF ZERO LEN, NO INPUT SOJ P2, ;POINT TO LAST WORD CAMLE P2,[0,,777577] ;[577] WILL WE EXCEED 2**18? JSP P2,APPNDR ;[577] YES--TAKE ERROR EXIT MOVEI T3,200(P2) LSH T3,-7 ;COMPUTE LAST BLOCK OF FILE ANDI P2,177 ;P2 NOW HAS RELATIVE DEPTH (0-127) OF USETI FCT,(T3) ; LAST WORD IN LAST BLOCK. MOVEI T4,-201(P1) ;ADDR OF AVAILABLE CORE-1 HRRM T4,ILIST ;SAVE IN IOWDS HRRM T4,OLIST AOJ T4, ;BUMP FOR BUFFER POINTER HRLI T4,P2 ;MAKE INDEXABLE INPUT FCT,ILIST ;READ LAST BLOCK OF FACT FILE INTO DUMP BUFFER. STATZ FCT,IO.ERR JSP P2,APPNDR ;ERROR OR EOF WILL YIELD ERROR RETURN. ;STILL IN FTFACT CONDITIONAL APPNDA: MOVS T1,@T4 ;GET LAST WORD OF CURRENT FACT FILE. CAIN T1,777000 ;END-OF-FILE ENTRY ? JRST APPNDB ;YES, THINGS ARE LOOKING GOOD. SKIPN T1 ;NO, FACT FILE SCREWED UP! IS LAST WORD NON-ZERO ? TRNN P2,-1 ;OR IS THIS THE FIRST WORD OF A 200-WORD BLOCK ? JSP P2,APPNDR ;YES TO EITHER QUESTION. TAKE ERROR EXIT. SUB P2,[XWD 1,1] ;TRY BACKING UP OVER ZERO WORDS ATTEMPTING TO FIND JRST APPNDA ; THE END-OF-FILE ENTRY. APPNDB: TLNN P2,-1 ;WAS END-OF-FILE ENTRY WHERE IT WAS SUPPOSED TO BE ? JRST APPNDC ;YES, PROCEED. MOVE T1,[XWD 377000,1] ;NO, FILL WITH DUMMY ONE-WORD ENTRIES TO MOVEM T1,@T4 ; SHOW WHERE DATA LOSS MAY HAVE OCCURED. AOBJN P2,.-1 APPNDC: MOVE T1,0(P1) ;PICK UP ENTRY AS SPECIFIED IN CALLING SEQUENCE. MOVEM T1,@T4 ;STORE IN FACT FILE OUTPUT BUFFER. AOJ P2, ;NEXT AOBJN P1,APPNDC MOVSI T1,777000 ;LAY DOWN END-OF-FILE ENTRY AGAIN. MOVEM T1,@T4 SETCA P2,0 ;(IN PLACE OF AOS P2 FOLLOWED BY MOVNS P2) HRLM P2,OLIST ;STORE CORRECT NUMBER OF WORDS TO BE WRITTEN. USETO FCT,(T3) OUTPUT FCT,OLIST ;OUTPUT UPDATED FACT FILE. STATZ FCT,IO.ERR JSP P2,APPNDR ;ERROR OR EOF WILL YIELD ERROR EXIT. AOSA 0(P) ;DOUBLE SKIP EXIT FCTBSY: AOS BSYFCT ;COUNT BUSY ERRORS AOS 0(P) ;SINGLE SKIP EXIT PJRST RELFCT ;RELEASE FCT CHANNEL APPNDR: AOS FCTGUF ;COUNT ERRORS IN FACT FILE HRLM P2,FCTGUF ;AND SAVE ADDRESS WHERE DETECTED PJRST RELFCT ;EXIT AFTER RELEASING CHANNEL ;STILL IN FTFACT CONDITIONAL APPNDE: ENTER FCT,EBLOCK JRST .+2 POPJ P, ;**GOOD EXIT. THE FACT FILE IS OPEN FOR WRITING.** POP P,(P) ;CORRECT THE STACK, SINCE WE WON'T POPJ HRRZ P2,RBEXTE CAIE P2,ERFBM% ;ERROR CODE=3 FROM DSKSER MEANS FILE BEING MODIFIED JSP P2,APPNDR ; BY SOMEONE ELSE. ANY OTHER ERROR CODE LOSES. SOSG TRYCTR ;TRIED OFTEN ENOUGH? JRST FCTBSY ;YES, GIVE UP AFTER 10 TRIES MOVEI P2,1 ;WAIT A SECOND SLEEP P2, JRST APPNDL ;NO, TRY AGAIN BEGINNING WITH LOOK-UP. (FILE COULD ; HAVE COME INTO EXISTENCE OR DIED IN THE INTERIM.) APPNDN: HRRZ P2,RBEXTE ;ONLY ERROR CODE 0 IS REASONABLE ON LOOKUP FAILURE. JUMPN P2,APPNDR ;ERROR EXIT ON ANY OTHER LOOKUP FAILURE. PUSHJ P,APPNDE ;FACT FILE DIDN'T EXIST. TRY TO CREATE IT. APPNDM: MOVEI T3,1 ;POINT TO BEGIN OF FILE MOVEI T4,-201(P1) ;ADDR OF AVAILABLE CORE-1 HRRM T4,OLIST AOJ T4, ;BUMP TO BEGINNING OF BUFFER HRLI T4,P2 ;INDEX FOR INDIRECT ADDRESSING JRST APPNDC ;GO MOVE TRANSACTION ENTRY INTO FILE AND EXIT. ;STILL IN FTFACT COND TRYCTR: BLOCK 1 ;#OF TIMES TO TRY IF FACT FILE IS BUSY APPBLK: EXP ;LEN OF EXT LOOKUP,ENTER EXP FCTPPN ;PPN FOR FACTFILE SIXBIT /FACT/ ;NAME >;END FTFACT CONDITIONAL SUBTTL ROUTINES TO READ CRASH.EXE ;GENERAL PROCEDURE IS TO GET EACH STR IN THE SYSTEM SEARCH LIST ;LOOK UP "CRASH.EXE", IF PRESENT, READ THE FIRST REAL DATA BLOCK AND ;CHECK TO SEE IF THIS FILE HAS BEEN PROCESSED. WORD 116, .JBSYM, WILL BE NON- ;ZERO IF THIS FILE HASN'T BEEN PROCESSED. IF TRUE, EXTRACT ANY PENDING ENTRIES ;FROM THE CRASH VIA GETTAB AND PEKSPY SIMULATION, ;THEN CREATE A SEPARATE ENTRY CONTAINING INTERESTING INFORMATION FROM THIS ;CRASH SUCH AS UPTIME, DISK STATISTICS, PERFORMANCE STATS, DEVICE STATUS ;ETC. ALL ITEMS MUST BE EITHER DIRECTLY GETTAB'D OR THE STARTING ;ADDRESS MUST BE GETTABABLE. INFO ADDED TO THE LIST ;VIA FIELD EDITS WILL BE PRESERVED BUT ONLY LISTED IN ;OCTAL BY SYSERR. OTHERS WILL BE DECENTLY FORMATED INCLUDING ITEM NAME,ETC. ;ROUTINE TO LOOK FOR AND PROCESS UN-CHECKED CRASH.EXE FILES. ;CALL PUSHJ, RETURNS POPJ AND USES ALL AC'S CRSCHK: TLO F,L.DSK ;PEEK/SPY ARE SIMULATED TO DSK PUSH P,PDBPTR ;SAVE VALUES FOR CALLER SINCE WE PUSH P,MAXGTB ;CHANGE THESE VALUES IN OPNSTR PUSH P,RNGTAB ;... PUSH P,MONVER ;... PUSH P,GTBST ;... PUSH P,JBTMXL ;... PUSH P,ERPTSZ ;... PUSH P,FTKLP ;... PUSH P,EVAPPB ;... PUSH P,EVAPPE ;... PUSH P,.JBFF ;TO RECOVER CORE USED ON EXIT MOVEM P,CRSCHP ;SAVE P FOR ERROR RECOVERY TDZA P1,P1 ;1ST STR NAME TO GET ;LOOP FOR ALL STRUCTURES CHECKING CRASH.EXE[1,4] CRSNXT: MOVE P1,D.DEV ;LAST STRUCTURE NAME CHECKED PUSHJ P,NXTSTR ;GET A STR IN SSL OR SDL JUMPE P1,CRSEND ;END OF LIST, CLEAN UP AND RETURN MOVEM P1,D.DEV ;STORE STR NAME PUSHJ P,GETFIL ;DO A LOOKUP ON THIS STR JRST CRSNX7 ;***LOOKUP FAILED SETZM KLEFLG ;ZERO KLERR FLAG USETI DSKX,CRSBLK ;SET TO READ 1ST 200 WDS IN DSKX,DSKIOW ;GET THAT BLOCK SKIPA ;SKIP OVER ERROR JRST CRSNX7 ;***READ FAILED SKIPN DSKBUF+.JBSYM ;IF 0,FILE AS BEEN PROCESSED JRST CRSNX7 ;SO JUST ADVANCE TO THE NEXT ONE ;CONTINUED ON NEXT PAGE ;CONTINUED FROM PREVIOUS PAGE PUSHJ P,READCR ;GO PROCESS THIS FILE ;CRASH.EXE PROCESSED, CLEAR .JBSYM TO INDICATE THIS FILE IS FINISHED ; ;SINCE CRASH.EXE HAS RP.NDL SET WE RESORT TO SUPER I/O TO DO THIS . . . USETI DSKX,0 ;GET THE RIB IN DSKX,DSKIOW ;READ IT SKIPA JRST CRSNX7 ;***IN FAILED MOVE T1,DSKBUF+177 ;GET RIB'S SELF BLOCK # ADDI T1,CRSBLK ;POINT AT CORRECT BLOCK PUSH P,T1 ;SAVE IT MOVEI T1,DSKX ;[564] GET CHANNEL MOVEM T1,DSKBUF+.DCNAM;[564] FOR DSKCHR MOVE T1,[XWD .DCUPN+1,DSKBUF] DSKCHR T1, JRST CRSNX2 CLOSE DSKX, ;CLOSE THE FILE RELEAS DSKX, ;AND RELEASE THE CHANNEL MOVEI T1,.IODMP ;DUMP MODE MOVE T2,DSKBUF+.DCUPN;GET ACTUAL PACK NAME[564] MOVEI T3,0 ;NO BUFFERS OPEN DSKX,T1 ;REOPEN FOR SUSET JRST CRSNX2 ; TO GET RIGHT WORD MOVSI T1,(B12) ;POSITION CHANNEL NUMBER IOR T1,0(P) ;ADD IN BLOCK NUMBER SUSET. T1, ;SUPER IO JRST CRSNX2 IN DSKX,DSKIOW ;READ THE BLOCK SKIPA JRST CRSNX2 SETZM DSKBUF+.JBSYM ;CLEAR THAT WORD MOVSI T1,(SU.SOT+B12) ;CHANNEL FOR OUTPUT IOR T1,0(P) ;ADD IN BLOCK NUMBER SUSET. T1, JRST CRSNX2 ;ABORT OUT DSKX,DSKIOW ;REWRITE IT JFCL CRSNX2: POP P,T1 ;RESTORE STATE OF THE STACK CRSNX3: CLOSE DSKX, ;CLOSE OFF THE DISK RELEAS DSKX, ;AND LET GO OF IT COMPLETELY CRSNX7: MOVE T1,0(P) ;GET ORIGINAL CONTENTS OF .JBFF BACK MOVEM T1,.JBFF ;RECOVER GTBST TABLE SPACE JRST CRSNXT ;GET NEXT CRSEND: TLZ F,L.DSK ;USE REAL PEEK/SPY NOW RELEASE DSKX, ;[607] RELEASE THE CHANNEL MOVE P,CRSCHP ;MAKE SURE P IS CORRECT POP P,T1 ;RESTORE ORIGINAL MOVEM T1,.JBFF ; CONTENTS OF .JBFF SKIPN .JBDDT ;DON'T BLOW AWAY VMDDT IF DEBUGGING CORE T1, ;GET RID OF IT JFCL ;DON'T CARE POP P,EVAPPE POP P,EVAPPB POP P,FTKLP POP P,ERPTSZ POP P,JBTMXL POP P,GTBST POP P,MONVER POP P,RNGTAB POP P,MAXGTB ;RESTORE THESE VALUES POP P,PDBPTR ;TO THEIR VALUE ON ENTRY POPJ P,0 ;WER'E DONE ;ROUTINES TO CHECK FOR AND EXTRACT ENTRIES OR DATA FROM A CRASH.EXE ;FILE. ;CALL: PUSHJ P,READCR ; ALWAYS RETURN HERE READCR: PUSHJ P,SIMSPY ;SETUP TO SIMULATE SPY FROM DISK POPJ P, ;SOMETHING BAD, GIVE UP MOVE T1,[%LDESZ] ;GETTAB TO RETURN LENGTH OF ERPTBK ENTRY PUSHJ P,GTBSPY ;GET IT FOR THIS CRASH MOVEI T1,2 ;MUST BE OLD MONITOR MOVEM T1,ERPTSZ ;SAVE FOR LATER MOVE T1,[%LDERT] ;GETTAB ADDR FOR ST OF DAEMON Q TABLE PUSHJ P,GTBSPY ;GET IT PJRST CRSINF ;JUST RECORD CRASH ENTRY MOVEM T1,ESVIDX ;SAVE AS START ADDR OF TABLE MOVE T1,[%LDPT1] ;GETTAB FOR PNTR TO EXTRACT ENTRIES PUSHJ P,GTBSPY ;GET IT PJRST CRSINF ;LEAVE HERE PUSHJ P,PEKSPY ;NOW GET CONTENTS OF THE PNTR SKIPN T1 ;IF INITIAL IS ZERO MOVE T1,ERPTSZ ;0TH ENTRY IS BLANK MOVEI T3,(T1) ;COPY INITIAL OFFSET TO T3 MOVE T1,[%LDLTH] ;NOW GET MAX TABLE LENGTH PUSHJ P,GTBSPY ;GET IT PJRST CRSINF ;[603] TABLE IS BAD,EXIT. MOVEM T1,ERPTMX ;SAVE IT TOO IDIV T1,ERPTSZ ;COMPUTE NUMBER OF ENTRIES IN TABLE MOVNI T1,(T1) ;MAKE IT NEGATIVE MOVSI T1,(T1) ;MOVE TO LH HRRI T1,(T3) ;MAKE AOBJN POINTER TO TABLE READC1: MOVEM T1,EPKIDX ;SAVE NEW AOBJN POINTER MOVEI T2,(T1) ;COPY TO T2 CAML T2,ERPTMX ;OFF END? HLLZS T2,EPKIDX ;YES, RESET TO TOP ADD T2,ESVIDX ;OFFSET TO START OF TABLE MOVN T3,ERPTSZ ;GET -COUNT OF WORDS IN EACH ENTRY MOVSI T3,(T3) ;MAKE AOBJN POINTER SETZM ERPTBK+2 ;MAKE CPU NUMBER DEFAULT CORRECTLY SETZM ERPTBK+3 ; FOR OLD MONITORS READC2: MOVEI T1,(T2) ;COPY ADDRESS TO T1 PUSHJ P,PEKSPY ;GET NEXT WORD MOVEM T1,ERPTBK(T3) ;SAVE IN NEXT WORD OF BLOCK MOVEI T2,1(T2) ;INCREMENT POINTER TO NEXT WORD AOBJN T3,READC2 ;LOOP FOR ALL WORDS MOVEI T1,ERPTBK ;POINT TO THE BLOCK SKIPN (T1) ;THIS ENTRY EMPTY? JRST READC3 ;YES, DO SYSTEM ERROR QUEUE PUSHJ P,DSPERR ;GO PROCESS THIS ENTRY MOVE T1,EPKIDX ;GET POINTER TO TABLE BACK MOVE T2,ERPTSZ ;GET SIZE OF ENTRY ADDI T1,-1(T2) ;INCREMENT TO NEXT BLOCK-1 AOBJN T1,READC1 ;INCREMENT TO NEXT BLOCK AND LOOP READC3: PUSHJ P,RSEBLK ;PROCESS ANY SYSTEM ERROR BLOCKS ;FALL INTO CRSINF ;HERE TO CREATE AN ENTRY OF EXTRACTED INFO FROM THE CRASH ;SUCH AS UPTIME, DISK STATS,ETC CRSINF: MOVSI T1,.ESCIN_9 ;CODE FOR THIS ENTRY PUSHJ P,ERRINB ;CREATE HEADER AND PUSH LIST PUSH P4,D.DEV ;(R0) STR NAME FOR THIS CRASH MOVE T1,[%SYERR] ;SYS WIDE ERROR COUNT PUSHJ P,GTBSPY ;GET IT MOVE T1,PATTERN ;LOOSER? PUSH P4,T1 ;(R1) MOVE P1,CRSGTB ;START OF GETTAB TABLE MOVE T1,P1 HRRI T1,1 ;PNTR FOR SYSERR PUSH P4,T1 ;(R2) PUSHJ P,CRSDMP ;(R3-R110)DUMP GETTAB ENTRIES PUSH P4,[0] ;(R111) NO LONGER PUT DISK STUFF HERE ;NOW CHECK FOR CUSTOMER DEFINED ITEMS TO DUMP MOVE P1,CRSGT1 ;PNTR OF ITEMS TLNE P1,-1 ;NULL LIST? PUSHJ P,CRSDMP ;NO, DUMP THEM ALSO PUSHJ P,ERRFIN ;CLOSE THE ENTRY AND WRITE IT PUSHJ P,DMPDSK ;NOW DUMP ALL DISK STATS JRST DMPHSB ;CONTINUE AHEAD ;ROUTINE TO EXTRACT GETTAB ITEMS FROM A CRASH. ;CALL: MOVE P1,AOBJN POINTER TO TABLE OF GETTABS ; PUSHJ P,CRSDMP ; RETURN CRSDMP: MOVE T1,0(P1) ;GET NEXT GETTAB FROM TABLE TLNN T1,-1 ;IF LH=0, THIS IS A SUBTABLE JRST CRSDM1 ;SO GO DO THAT SPECIAL MOVE P3,T1 ;SAVE FOR POSSIBLE SUBTABLE FOLLOWING PUSHJ P,GTBSPY ;GET VALUE MOVE T1,PATTERN ;CAN'T, FLAG FOR SYSERR PUSH P4,T1 ;SAVE IN BUFFER JRST CRSDM2 ;JOIN COMMON ENDING CODE CRSDM1: MOVE T3,P3 ;GET BASE POINTER SET ABOVE MOVE T2,T1 ;MOVE SUBTABLE INDEX TO T2 HRLI T2,.GTC0V ;DO ONLY CPU0 FOR NOW PUSHJ P,GSUBTB ;GET VALUE FROM SUBTABLE MOVE T1,PATTERN ;CAN'T, FLAG FOR SYSERR PUSH P4,T1 ;SAVE IN BUFFER CRSDM2: AOBJN P1,CRSDMP ;LOOP FOR ENTIRE TABLE POPJ P, ;RETURN ;THIS IS THE TABLE OF GETTAB ITEMS TO BE EXTRACTED FROM A CRASH. ;ADDITIONAL ITEMS SHOULD NOT BE ADDED HERE BY A SITE BECAUSE IT WILL ;CONFUSE SYSERR VERY BADLY. USE THE TABLE CRSGT1 INSTEAD. ; ";***" INDICATES A SUBTABLE ITEM CRSGTB: XWD .-CRSGTE,.+1 ;PNTR FOR TABLE LENGTH %CNTIM ;(R3) TIME OF DAY %CNSIZ ;(R4) SYSTEM MEMORY SIZE %CNPOK ;(R5) LAST ADDR POKED %CNLNM ;(R6) # JOBS LOGGED IN %CNTIC ;(R7) #TICKS PER SECOND %CNVER ;(R10) MONITOR VERSION %CNDBG ;(R11) DEBUG STATUS WORD %CNHSO ;(R12) START OF MONITO HIGH SEG %CNNWC ;(R13) #OF WORDS OF CORE %NSUPT ;(R14) UPTIME IN TICKS %NSMMS ;(R15) MEMORY SIZE %NSTPE ;(R16) TOTAL MEM PAR ERRORS %NSSPE ;(R17) TOTAL SPURIOUS PARITY ERRORS %NSMPC ;(R20) MULTIPLE PARITY ERRORS %NSMPA ;(R21) LAST PARITY ADDR %NSMPW ;(R22) LAST PARITY WORD %NSMPP ;(R23) LAST PARITY PC %NSEPO ;(R24) # UNREC EXEC PDL OV %NSEPR ;(R25) # RECOVERED EXEC PDL OV %SWERC ;(R26) SWAP ERROR COUNT %SYDEL ;(R27) DISABLED HARDWARE ERROR COUNT %SYSCD ;(R30) LAST STOPCD %SYNDS ;(R31) # DEBUG STOPCDS %SYNJS ;(R32) # JOB STOPCDS %SYSJN ;(R33) LAST STOPCD-JOB NUMBER %SYSPN ;(R34) LAST STOPCD-PROGRAM NAME %SYSUU ;(R35) LAST STOPCD-UUO %SYSPP ;(R36) LAST STOPCD-P,PN %CCPAR ;(R37) PARITY SUBTABLE %CVPLA ;(R40) **HIGHEST ADDR OF PARITY ERROR %CVPMR ;(R41) **ADDRES IN SEGMENT OF PAR ERR %CVPTS ;(R42) **PAR ERRORS THIS SWEEP %CVPSC ;(R43) **#SWEEPS %CVPUE ;(R44) **USER ENABLED %CVPAA ;(R45) **LOGICAL AND OF ADDR %CVPAC ;(R46) **LOGICAL AND OF WORDS %CVPOA ;(R47) **LOG OR OF ADDR %CVPOC ;(R50) **LOG OR OF DATA %CVPCS ;(R51) **COUNT OF SPUR CHANNEL ERROS %CCRSP ;(R52) ADDR OF RESPONSE SUBTABLE %CVRSO ;(R53) **SUM TTY OUT UUO RES %CVRNO ;(R54) **NUM TTY OUT UUO %CVRHO ;(R55) **HI-SUM SQ TTY OUT UUO %CVRLO ;(R56) **LO-SUM " " %CVRSI ;(R57) **SUM TTY INP UUO %CVRNI ;(R60) **NUMBER TTY INP UUO %CVRHI ;(R61) **HI-SUM SQ TTY INP UUO %CVRLI ;(R62) **LO-SUMSQ TTY INP UUO %CVRSR ;(R63) **SUM QUANTUM REQ RES %CVRNR ;(R64) **NUMBER QUANTUM REQ RES %CVRHR ;(R65) **HI-SUM SQ QUANTUM RES %CVRLR ;(R66) **LO-SUM SQ QUANTUM REQ RES %CVRSX ;(R67) **SUM ONE OF ABOVE %CVRNX ;(R70) **NUMBER ONE OF ABOVE %CVRHX ;(R71) ** HI-SUM SQ ONE OF ABOVE %CVRLX ;(R72) **LO-SUM SQ ONE OF ABOVE %CVRSC ;(R73) **SUM CPU RES %CVRNC ;(R74) **NUMBER CPU RES %CVRHC ;(R75) **HI-SUM CPU RES %CVRLC ;(R76) **LO-SUM CPU RES %CVUPT ;(R77) UPTIME %CVLST ;(R100) LOST TIME %CVNUL ;(R101) NULTIME %CVOHT ;(R102) OVERHEAD TIME IN JIFFIES %CVTUC ;(R103) TOTAL UUO COUNT %CVTJC ;(R104) TOTAL JOB CONTEXT SWITCH COUNT %CVTNE ;(R105) TOTAL NXM %CVSNE ;(R106) TOTAL SPUR NXM %CVNJA ;(R107) # JOBS AFFECTED LAST NXM %CVMNA ;(R110) FIRST ADDR LAST NXM CRSGTE==.-1 ;END OF TABLE CRSGT1: XWD .-CRSGT2, .+1 ;PNTR FOR TABLE TO BE DEFINED BY CUSTOMER ;SYSERR WILL LIST TESE ITEMS IN OCTAL ONLY, IFF PRESENT CRSGT2==.-1 ;ROUTINE TO DETERMINE IF CRASH IS A KS10 SYSTEM DUMP AND IF SO ;MAKE A HALT STATUS BLOCK ENTRY DMPHSB: MOVE T1,[%FTERR] ;FEATURE SWITCH SETTINGS PUSHJ P,GTBSPY ;GET IT POPJ P, ;CAN'T, THEN FORGET THIS TRNN T1,F%KS10&777777;IS THIS A KS10 SYSTEM DUMP? POPJ P, ;NO--LET'S GO HOME MOVEI T1,424 ;ADDRESS OF FIRST WORD IN HSB PUSHJ P,PEKSPY ;GET IT JUMPE T1,CPOPJ ;IF IT'S ZERO, NO HSB HAS BEEN STORED MOVSI T1,.ESHSB_9 ;HSB ENTRY CODE PUSHJ P,ERRINB ;CREATE HEADER AND PUSH POINTER SETZ T1, ;GET HALT STATUS CODE (LOC 0) PUSHJ P,PEKSPY PUSH P4,T1 ;(R0)STORE IT MOVEI T1,1 ;GET HALT PC (LOC 1) PUSHJ P,PEKSPY PUSH P4,T1 ;(R1)STORE IT MOVE T1,[XWD -22,4] ;HSB POINTER PUSH P4,T1 ;(R2)STORE IT PUSH P4,[0] ;(R3)STORE IT MOVSI T2,-22 ;AOBJN WORD FOR SIZE OF HSB DMPHS0: MOVEI T1,424(T2) ;FORM ADDRESS TO WORD IN HSB PUSHJ P,PEKSPY ;GET IT PUSH P4,T1 ;STORE IT AOBJN T2,DMPHS0 ;GET'EM ALL PUSHJ P,ERRFIN ;CLOSE OUT ENTRY AND WRITE IT POPJ P, ;DONE ;ROUTINE TO SETUP TO SIMULATE SPYING FROM THE CRASH FILE AND ;GET ALL THE INITIAL DATA NEEDED TO PROCESS THE CRASH. ;CALL: PUSHJ P,SIMSPY ; ERROR RETURN ; ALL OK ; ;ASSUMPTION: ABSTAB, THE GETTAB TABLES THAT IT POINTS AT (NUMTAB), ;AND ALL GETTABS DONE BY THIS ROUTINE ARE MAPPED 1-FOR-1 VIRTUAL TO ;PHYSICAL. IN ORDER TO CORRECTLY SIMULATE PAGING, WE NEED ALL THE ;VALUES SETUP BY THIS ROUTINE. THEREFORE, WE MUST BE ABLE TO GET ;THE NECESSARY VALUES WITH SIMULATED PHYSICAL REFERENCES, HENCE 1-FOR-1. SIMSPY: SETOM DSKBLF ;CLEAR INITIAL DISK BLOCK TRO F,R.DINI ;FORCE ABSOLUTE ADDRESSING MOVEI T2,BLKSIZ ;NEED 1 BLOCK FOR THE .EXE DIRECTORY PUSHJ P,GETCOR ;GET IT POPJ P, ;FAILED, GIVE UP MOVEM T2,EXEADR ;STORE FOR PEKDSK SOS T1,T2 ;BACK UP 1 WORD AND MOVE TO T1 HRLI T1,-BLKSIZ ;MAKE AN IOWD MOVEI T2,0 ;TERMINATED BY A ZERO USETI DSKX,1 ;GET BLOCK 1 IN DSKX,T1 ;READ THE FIRST BLOCK OF THE DIRECTORY CAIA ;SKIP OVER FAIL RETURN POPJ P, ;READ FAILED HLRZ T2,1(T1) ;GET LH OF FIRST WORD HRRZ T1,1(T1) ;AND RH OF SAME WORD CAIN T2,.SVDIR ;MUST BE AN EXE DIRECTORY CAILE T1,BLKSIZ-1 ;WHICH IS LESS THAN A BLOCK LONG POPJ P, ;NO MOVEI T1,ABSTAB ;GET POINTER TO GETTABS PUSHJ P,REDDSK ;READ IT FROM UNMAPPED ADDRESSING TLNE T1,-1 ;MAKE SURE ZERO LH POPJ P, ;NO, GIVE UP CAILE T1,ABSTAB ;MAKE SURE IT MAKES SOME SENSE CAML T1,DSKFLG ; .. POPJ P, ;NO, GIVE UP HRRZ T2,T1 ;SAVE FOR TEST LATER ADDI T1,.GTSLF ;ADD OFFSET FOR GETTAB IMMEDIATE PUSHJ P,REDDSK ;READ THAT PLACE CAIE T2,(T1) ;SEE IF IT MATCHES POPJ P, ;NO, GIVE UP LSH T1,-^D27 ;KEEP JUST MAX ENTRY IN NUMTAB MOVEM T1,MAXGTB ;SAVE MAX GETTAB NUMBER MOVNI T3,1(T1) ;-NUMBER OF GETTABS TO T3 HRLI T3,(T2) ;MAKE SWAPPED AOBJN POINTER TO NUMTAB MOVSS T3 ;MAKE IT AOBJN POINTER MOVEI T2,1(T1) ;GET LENGTH OF NUMTAB PUSHJ P,GETCOR ;ALLOCATE THAT MUCH CORE POPJ P, ;CAN'T, GIVE UP MOVEM T2,GTBST ;SAVE ADDRESS OF START OF NUMTAB SIMSP2: MOVEI T1,(T3) ;GET ADDRESS OF NEXT ITEM IN NUMTAB PUSHJ P,REDDSK ;GET IT FROM UNMAPPED ADDRESS SPACE MOVEM T1,(T2) ;SAVE IN TABLE ADDI T2,1 ;BUMP TABLE ADDRESS AOBJN T3,SIMSP2 ;BUMP NUMTAB ADDRESS AND LOOP MOVE T2,GTBST ;GET ADDRESS OF START OF OUR NUMTAB MOVE T1,MAXGTB ;GET LARGEST GETTAB TABLE CAIGE T1,.GTIDX ;HAVE A RANGE TABLE? TDZA T1,T1 ;NO, USE ZERO HRRZ T1,.GTIDX(T2) ;GET ADDRESS OF RNGTAB FROM NUMTAB MOVEM T1,RNGTAB ;SAVE FOR GETTAB SIMULATION MOVE T1,[%VMPPB] ;GETTAB ARG POINTER TO PUSHJ P,GTBSPY ;GET BEGINNING OF PER PROCESS ADDRESS SPACE MOVX T1,EVDPPB ;DEFAULT MOVEM T1,EVAPPB ;SET IT MOVE T1,[%VMPPE] ;GETTAB ARG POINTER TO PUSHJ P,GTBSPY ;GET END (+1) OF PER PROCESS ADDRESS SPACE MOVX T1,EVDPPE ;DEFAULT MOVEM T1,EVAPPE ;SET IT MOVE T1,[%CNPDB] ;SET UP PDB POINTER FOR CRASH FILE PUSHJ P,GTBDFL ;SEE IF IT IS THERE MOVEM T1,PDBPTR ;STORE ZERO OR VALUE MOVE T1,[%CNVER] ; GET CRASHED MONITORS PUSHJ P,GTBDFL ; VERSION INTO A HRRZM T1,MONVER ; AND STORE IT AWAY MOVE T1,[%FTERR] ;GETTAB ARG FOR FEATURE TESTS PUSHJ P,GTBSPY ;GET IT POPJ P, ;MUST HAVE THAT ANDI T1, ;MASK OFF KL PAGING BIT MOVEM T1,FTKLP ;NOTE MUST PRECEDE %CNBCP/%CCTOS ;HERE TO READ THE EPT OF THE BOOT CPU FROM THE CRASH FILE INTO CORE ;AT THE ADDRESS POINTED TO BY THE LOCATION EPT. THIS AVOIDS DISK I/O ;EVERY TIME WE HAVE TO TRANSLATE A VIRTUAL TO PHYSICAL ADDRESS SINCE ;WE DON'T HAVE TO REPEATEDLY GO TO THE EPT. MOVE T1,[%CNBCP] ;GETTAB TO RETURN BOOT CPU'S PUSHJ P,GTBDFL ; CPU NUMBER LSH T1,1 ;OFFSET FROM CPU 0 GETTAB ADD T1,[%CCTOS] ;GET ADDRESS OF EPT FOR BOOT CPU PUSHJ P,GTBSPY ;GET IT MOVEI T1,1000 ;ASSUME PAGE 1 LSH T1,W2PLSH ;CONVERT TO A PAGE NUMBER PUSH P,T1 ; AND SAVE IT ON THE STACK MOVEI T2,PG.SIZ ;WANT 1 PAGE OF CORE SKIPE FTKLP ;UNLESS IT'S KL PAGING IN WHICH CASE MOVEI T2,PG.SIZ*2 ; WE WANT 2 PAGES PUSHJ P,GETCOR ;GET THE CORE JRST TPOPJ ;PRUNE STACK AND RETURN ERROR MOVEM T2,EPT ;STORE ADDRESS OF OUR COPY OF THE EPT ADDI T2,540 ;COMPUTE ADDRESS OF SECTION TABLE MOVEM T2,ESECTB ;STORE FOR KL PAGING SIMULATION ADDI T2,PG.SIZ-540 ;COMPUTE ADDRESS OF EXEC MAP MOVEM T2,EMAP ;STORE FOR KL PAGING SIMULATION MOVE T2,EPT ;GET EPT ADDRESS BACK POP P,T1 ;GET THE PAGE NUMBER BACK PUSHJ P,REDPAG ;READ THE EPT INTO CORE POPJ P, ;FAILED, RETURN ERROR ;IF WE'RE SIMULATING KL PAGING, WE ALSO NEED THE SECTION 0 SECTION ;TABLE. SINCE SECTIONS 0 AND 1 ARE MAPPED TOGETHER, THIS LETS ;US TRANSLATE VIRTUALLY ALL REFERENCES WITHOUT HAVING TO DO ANY ;DISK I/O. FOR KI PAGING, THE MAPPING IS DONE THRU THE EPT, SO WE ;DON'T HAVE TO DO ANYTHING MORE. SKIPN FTKLP ;DOING KL PAGING SIMULATION? JRST SIMSP1 ;NO, SKIP THIS MOVE T1,ESECTB ;GET ADDRESS OF SECTION TABLE MOVE T1,0(T1) ;GET SECTION 0 POINTER LDB T2,[POINT 3,T1,2] ;GET POINTER TYPE CAIE T2,1 ;MUST BE AN IMMEDIATE POINTER POPJ P, ;NOT. SOME SORT OF SCREWUP ANDI T1,-1 ;KEEP JUST THE PAGE NUMBER OF THE MAP MOVEM T1,EMAPAG ;STORE AS PAGE NUMBER OF EXEC MAP MOVE T2,EMAP ;GET ADDRESS TO READ IT INTO PUSHJ P,REDPAG ;READ THE PAGE POPJ P, ;FAILED. RETURN ERROR SIMSP1: MOVE T1,[%CNSJN] ;POINTER TO -SEGN,,JOBN PUSHJ P,GTBSPY ;GET IT MOVE T1,[-^D512,,^D512] ;LET ALL REFERENCES WIN HLRE T2,T1 ;GET -SEGN IN 36 BITS MOVNI T2,1(T2) ;MAKE IT SEGN-1 ADDI T2,(T1) ;COMPUTE JOBN+SEGN-1 HRRZM T2,JBTMXL ;SAVE FOR GETTAB SIMULATION TRZ F,R.DINI ;MAKE ALL REFERENCES VIRTUAL MOVE T1,[%CNDAE] ;GETTAB ARG FOR CORRECT DAEMON VERSION PUSHJ P,GTBDFL ;GET THE CORRECT DAEMON VERSION TLZ T1,-1 ;KEEP ONLY DAEMON VERSION CAIE T1,VMON ;CAN WE PROCESS THIS CRASH? JRST [WARN ,NOCRLF MOVE T2,D.DEV ;GET STR WHERE WE FOUND THE FILE PUSHJ P,TSIX ;TYPE IT PUSHJ P,OCRLF ;FORCE MESSAGE TO OPR WARN ,OPR POPJ P,] ;GIVE UP ON THIS CRASH JRST CPOPJ1 ;RETURN SUCCESS ;ROUTINE TO GET THE NEXT STRUCTURE FROM THE UNION OF THE SYSTEM SEARCH ;LIST AND THE SYSTEM DUMP LIST. ;CALL WITH P1=PREVIOUS NAME OR 0 IF FIRST CALL ;RETURNS CPOPJ ALWAYS WITH P1=NEW NAME OR 0 IF NO MORE NXTSTR: SYSSTR P1, ;GET NEXT STR NAME MOVEI P1,0 ;CAN'T DO MUCH... JUMPE P1,CPOPJ ;GO IF NO MORE SETZM DSKBUF+.DFGJN ;JOB 0 = SYSTEM SEARCH LIST MOVEM P1,DSKBUF+.DFGNM ;STORE STR NAME MOVE T1,[.DFGST+1,,DSKBUF] ;SETUP ARG POINTER GOBSTR T1, ;IS THIS STR IN SYSTEM SEARCH LIST? CAIA ;NO POPJ P, ;YES, RETURN IT MOVEM P1,DSKBUF+.DCNAM ;SETUP ARG FOR DSKCHR SETOM DSKBUF+.DCPSD ;DEFAULT POSITION IN SDL FOR OLD MONITORS MOVE T1,[.DCPSD+1,,DSKBUF] ;SETUP ARG DSKCHR T1, ;GET POSITION IN SDL JRST NXTSTR ;SHOULDN'T HAPPEN BUT... SKIPGE DSKBUF+.DCPSD ;IS THIS STR IN THE SDL? JRST NXTSTR ;NO POPJ P, ;YES ;ROUTINE TO OPEN THE CRASH FILE ON A SPECIFIED STRUCTURE. ;CALL: PUSHJ P,GETFIL ; ERROR RETURN ; ALL OK GETFIL: MOVSI T1,DSKX+<(FO.PRV)> ;CHANNEL IS DSKX PLUS PRIVS HRRI T1,.FORED ;FUNCTION IS READ MOVEM T1,D.FLOP+.FOFNC MOVEI T1,.IODMP ;SET I/O MODE MOVEM T1,D.FLOP+.FOIOS ; . . MOVE T1,D.DEV ;GET DEVICE MOVEM T1,D.FLOP+.FODEV ;AND STORE IT SETZM D.FLOP+.FOBRH ;NO BUFFERS SETZM D.FLOP+.FONBF ; . . MOVEI T1,D.LKB ;ADDR. OF LOOKUP BLOCK MOVEM T1,D.FLOP+.FOLEB ; . . MOVE T1,CRASH ;GET FILENAME MOVEM T1,D.LKB+.RBNAM ;STORE IT IN LOOKUP BLOCK MOVSI T1,'EXE' ;ASSUME EXE MOVEM T1,D.LKB+.RBEXT ;STORE IT MOVE T1,CRSPPN ;GET PPN MOVEM T1,D.LKB+.RBPPN ;STORE IT MOVEI T1,.RBSIZ ;GET EXTENDED LOOKUP BLOCK SIZE MOVEM T1,D.LKB+.RBCNT ;STORE IT IN LOOKUP BLOCK MOVE T1,[XWD .FOLEB+1,D.FLOP] ;POINT TO FILOP. BLOCK FILOP. T1, ;OPEN CRASH FILE POPJ P, ;CAN'T ACCESS FILE FILOPN: MOVE T1,D.LKB+.RBSIZ ;GET FILE SIZE MOVEM T1,DSKFLG ;AND SAVE IT AWAY FOR LATER JRST CPOPJ1 ;GIVE GOOD RETURN ;ROUTINE TO PERFORM GETTAB SIMULATION FROM AN EXE FILE ON DISK. ;DOES NOT HANDLE AN ITEM TYPE OF -2 FOR JOB ENTRIES. ;CALL: MOVE T1,GETTAB ITEM ; PUSHJ P,GTBDSK ; ERROR RETURN ; NORMAL RETURN WITH VALUE IN T1 GTBDSK: HRRZ BP,T1 ;GET TABLE NUMBER HLRES T1 ;KEEP JUST ITEM NUMBER IN T1 SKIPL MAXGTB ;DO WE HAVE ANY GETTAB POINTERS? CAMLE BP,MAXGTB ;AND DO WE HAVE THIS MANY? POPJ P, ;NO, RETURN ERROR PUSHJ P,SAVE2 ;SAVE P1-P2 ADD BP,GTBST ;COMPUTE ADDRESS OF THIS NUMTAB ENTRY MOVE BP,(BP) ;GET THE ENTRY LDB P2,[POINT 3,BP,11] ;GET TYPE OF GETTAB CAIE P2,.SLIXI ;RANDOM TABLE? CAIN P2,.SLIXR ; OR RANGED GETTAB? JRST GTBDS1 ;YES, DO NOT MAKE -1 MY JOB JUMPGE T1,GTBDS1 ;IF ITEM IS -1 FOR JOB INDEXED ENTRY, MOVEI T1,(J) ; USE USER'S JOB NUMBER GTBDS1: CAIN P2,.SLIXP ;DATUM IN THE PDB? JRST GTBDS3 ;YES, GO GET IT CAIN P2,.SLIXS ;TABLE INDEXED BY JOB OR SEGMENT NUMBER? SKIPA P1,JBTMXL ;YES, GET MAXIMUM LDB P1,[POINT 9,BP,8] ;GET MAX ITEM IN THIS TABLE CAIE P2,.SLIXR ;THIS A RANGE TABLE? JRST GTBDS2 ;NO, HAVE 0,,MAX IN P1 SKIPN P2,RNGTAB ;HAVE THE POINTER TO RNGTAB? POPJ P, ;NO, GIVE ERROR RETURN ADDI P1,(P2) ;ADD OFFSET INTO RNGTAB EXCH T1,P1 ;SAVE T1, PUT ADDRESS INTO T1 PUSHJ P,PEKDSK ;GET THE RNGTAB ENTRY EXCH T1,P1 ;PUT VALUE INTO P1, RESTORE T1 GTBDS2: HRRE P2,P1 ;GET MAXIMUM VALUE OF TABLE CAMLE T1,P2 ;.LE. MAX? POPJ P, ;NO, GIVE ERROR HLRE P2,P1 ;PUT MIN IN RH CAMGE T1,P2 ;.GE. MIN? POPJ P, ;NO, GIVE ERROR ADDI T1,(BP) ;GET ADDRESS OF WORD WE WANT PUSHJ P,PEKDSK ;GET VALUE JRST CPOPJ1 ;GIVE GOOD RETURN GTBDS3: SKIPN PDBPTR ;DO WE HAVE THE JBTPDB ADDRESS? POPJ P, ;NO, RETURN ADD T1,PDBPTR ;OFFSET TO THIS JOBS PDB POINTER PUSHJ P,PEKDSK ;READ THE ADDRESS OF THE PDB JUMPE T1,CPOPJ1 ;IF NO PDB, RETURN ZERO ADDI T1,(BP) ;OFFSET INTO THE PDB PUSHJ P,PEKDSK ;GET THE WORD JRST CPOPJ1 ;GIVE GOOD RETURN ;ROUTINE TO READ A WORD FROM AN EXE FILE ON DISK. ;CALL: MOVEI T1,CORE ADDRESS (WILL HANDLE PER-PROCESS ADDR AND MONITOR ; HIGH SEG) ; PUSHJ P,PEKDSK ; RETURN WITH T1=VALUE OR 0 IF ERROR PEKDSK: TRNE F,R.DINI ;WANT TO FORCE UNMAPPED REFERENCE? PJRST REDDSK ;YES, READ PHYSICAL MEMORY PUSHJ P,SAVE4 ;YES, NEED SOME SCRATCH ACS MOVE P1,T1 ;COPY ADDRESS TO P1 SKIPN FTKLP ;IS THIS A KL-PAGING MONITOR? JRST PEDKI0 ;NOPE JRST PEDKL0 ;YUP PEKDER: SETZ T1, ;RETURN 0 AS ERROR INDICATOR POPJ P, ;AND RETURN ;HERE FOR A KI-PAGING MONITOR PEDKI0: ANDI P1,-1 ;KI-PAGING ONLY SUPPORTS ONE SECTION LSHC P1,- ;CONVERT TO MAP OFFSET; HALF WORD FLAG ; IS 1B0 IN P2 CAIL P1,340000_-^D10 ;IN PER PROCESS AREA CAIL P1,400000_-^D10 ; FOR THIS JOB? SKIPA T1,EPT ;NO, GET EPT ADDRESS JRST PEDKI5 ;YES, GO GET UPT ADDRESS TRNN P1,400000_-^D10 ;ADDRESS IN MONITOR HIGH SEG? ADDI T1,600 ;NO, LOW SEG IS MAPPED STARTING AT 600 ADDI T1,(P1) ;ADD IN OFFSET FROM ABOVE MOVE T1,(T1) ;GET THE MAP WORD FROM CORE JRST PEDKI6 ;SKIP UPT STUFF PEDKI5: MOVSI T1,(J) ;JOB NUMBER TO LH HRRI T1,.GTUPM ;POINT TO JBTUPM FOR THIS JOB PUSHJ P,GTBSPY ;GET IT JRST PEKDER ;CAN'T? HRRZS T1 ;KEEP JUST PAGE NUMBER JUMPE T1,CPOPJ ;ERROR EXIT IF INACCESSIBLE LSH T1,P2WLSH ;CONVERT TO ADDRESS ADDI T1,220(P1) ;ADD ADDRESS OF THE UPT TO THE SHIFTED ; ADDRESS FROM ABOVE. THEN ADD THE BASE ; IN THE PAGE FOR THIS ADDRESS RANGE TO ; GET THE ADDRESS OF THE WORD CONTAINING ; THE MAPPING FOR THIS PAGE PUSHJ P,REDDSK ;GET THE MAP WORD FROM THE UPT PEDKI6: SKIPL P2 ;SKIP IF MAPPING THROUGH RH MOVSS T1 ;EVEN PAGES MAP THROUGH LH TRNN T1,PM.ACC ;ACCESS ALLOWED FOR THIS PAGE? JRST PEKDER ;NO, RETURN ZERO ANDI T1,17777 ;KEEP JUST 13 BIT PAGE NUMBER LSH T1,P2WLSH ;CONVERT TO ADDRESS LSHC P1,P2WLSH+1 ;UNDO LSHC FROM ABOVE [774] ANDI P1,PG.BDY ;ISOLATE OFFSET IN PAGE ADDI T1,(P1) ;ADD IN OFFSET PJRST REDDSK ;FALL INTO REDDSK ;HERE FOR A KL-PAGING MONITOR PEDKL0: TLNN P1,777776 ;SECTION 0/1? ANDI P1,-1 ;YES, TREAT AS SECTION 0 HLRZ T1,P1 ;GET EXEC SECTION NUMBER ADD T1,ESECTB ;COMPUTE CORE ADDRESS OF SECTION TABLE MOVE T1,(T1) ;GET THE WORD FROM CORE LDB P2,[POINT 3,T1,2] ;GET SECTION POINTER TYPE CAIE P2,1 ;MUST BE IMMEDIATE JRST PEKDER ;ERROR (SHARED/INDIRECT/ETC) ANDI T1,-1 ;PAGE NUMBER OF SECTION PAGE MAP CAME T1,EMAPAG ;DO WE HAVE THAT ONE IN CORE? JRST PEDKL1 ;NO, HAVE TO DO IT THE HARD WAY ;HERE IF THE ADDRESS MAPS THRU THE EXEC SECTION 0 OR 1 MAP WHICH ;WE READ IN EARLIER. WE EXTRACT THE SECTION OFFSET FROM P1 AND ;FETCH THE MAP WORD FROM OUR COPY OF THE MAP LDB P2,[POINT 9,P1,26] ;GET PAGE WITHIN SECTION ADD P2,EMAP ;ADD IN CORE ADDRESS OF OUR COPY MOVE T1,(P2) ;GET IT FROM OUR COPY JRST PEDKL2 ;JUMP AROUND THE REST ;HERE IF THE ADDRESS DIDN'T MAP THRU THE EXEC SECTION 0 OR 1 MAP. ;WE HAVE TO DO IT THE HARD WAY BY READING THE MAP WORD FROM THE DISK. PEDKL1: LSH T1,P2WLSH ;CONVERT TO WORD ADDRESS LDB P2,[POINT 9,P1,26] ;PAGE WITHIN SECTION ADDI T1,(P2) ;COMPUTE PHYS ADDRESS OF MAP POINTER PUSHJ P,REDDSK ;READ PAGE POINTER PEDKL2: LDB P2,[POINT 3,T1,2] ;POINTER TYPE CAML P1,EVAPPB ;IN FUNNY SPACE FOR CAML P1,EVAPPE ; THIS JOB? JRST PEDKL5 ;NO, CONTINUE ON ;HERE IF THE ADDRESS IS IN THE PER-PROCESS RANGE. THE MONITOR USES ;INDIRECT POINTERS TO MAP THE PER-PROCESS PAGES THRU THE UPT WHOSE ;PAGE NUMBER IS IN JBTUPM. CAIE P2,3 ;MAKE SURE IT'S AN INDIRECT POINTER JRST PEDKL5 ;NO, CONTINUE AS IF NOT PER-PROCESS LDB P2,[POINT 9,T1,17] ;GET PAGE OFFSET FROM INDIRECT PTR MOVSI T1,(J) ;PUT JOB NUMBER IN LH HRRI T1,.GTUPM ;GETTAB TO RETURN JBTUPM PUSHJ P,GTBSPY ;GET THE UPT PAGE NUMBER JRST PEKDER ;MUST HAVE IT ANDI T1,-1 ;KEEP JUST THE PAGE NUMBER JUMPE T1,CPOPJ ;CAN'T BE ZERO LSH T1,P2WLSH ;CONVERT TO AN ADDRESS ADDI T1,(P2) ;ADD IN THE OFFSET FROM THE INDIRECT PTR PUSHJ P,REDDSK ;READ THE PER-PROCESS MAP POINTER LDB P2,[POINT 3,T1,2] ;GET THE POINTER TYPE ;HERE TO COMPUTE THE PHYSICAL ADDRESS CORRESPONDING TO THE VIRTUAL ;ADDRESS IN P1. T1 CONTAINS THE PAGE POINTER; P2 CONTAINS THE POINTER ;TYPE. PEDKL5: CAIE P2,1 ;OK IF IMMEDIATE JRST PEKDER ;ERROR (SHARED/INDIRECT/ETC) ANDI T1,-1 ;REDUCE TO PHYSICAL PAGE NUMBER LSH T1,P2WLSH ;CONVERT TO AN ADDRESS ANDI P1,PG.BDY ;WORD WITHIN PAGE ADDI T1,(P1) ;T1:=PHYSICAL ADDRESS OF EXEC VIRTUAL WORD ;; PJRST REDDSK ;GO READ PHYSICAL WORD ;HERE TO ACTUALLY READ THE DISK FOR A PHYSICAL ADDRESS. FOLLOWS ;THE .EXE DIRECTORY TO FIND THE CORRECT BLOCK. ;CALL WITH T1=PHYSICAL ADDRESS ;RETURNS WITH T1=VALUE OR 0 IF ERROR REDDSK: PUSHJ P,SAVE4 ;SAVE P1-P4 PUSH P,T2 ;SAVE T2 IDIVI T1,PG.SIZ ;T1:=PAGE NUMBER, T2:=OFFSET IN PAGE EXCH T2,0(P) ;RESTORE T2, SAVE OFFSET ON STACK PUSHJ P,FNDPAG ;FIND THE PAGE IN THE EXE DIRECTORY JRST REDDS2 ;NOT THERE OR ERROR JUMPE P2,REDDS2 ;RETURN ZERO IF ALLOCATED BUT ZERO PAGE LSH P2,P2WLSH ;CONVERT TO ADDRESS ADD P2,0(P) ;INCLUDE PAGE OFFSET CAML P2,DSKFLG ;FILE THAT BIG? JRST REDDS2 ;NO, RETURN 0 IDIVI P2,LN.BUF ;P2:=BLOCK NUMBER, P3:=OFFSET IN BLOCK CAMN P2,DSKBLF ;SEE IF BLOCK ALREADY IN CORE JRST REDDS3 ;YES, JUST GET FROM CORE MOVEM P2,DSKBLF ;AND REMEMBER FOR NEXT TIME IFN LN.BUF-200,< IMULI P2,LN.BUF/BLKSIZ > IFN LN.BUF-*200, USETI DSKX,1(P2) ;NO--POSITION FILE IN DSKX,DSKIOW JRST REDDS3 ;READ OK REDDS2: TDZA T1,T1 ;READ FAILED, RETURN 0 REDDS3: MOVE T1,DSKBUF(P3) ;GET WORD FROM BLOCK IN CORE POP P,0(P) ;PRUNE STACK POPJ P, ;RETURN ;ROUTINE TO READ A PROCESS PAGE FROM THE CRASH FILE. FOLLOWS THE ;.EXE DIRECTORY TO FIND THE CORRECT PAGE. ;CALL WITH T1=PROCESS PAGE NUMBER ; T2=ADDRESS OF WHERE TO READ THE DATA ;RETURNS CPOPJ IF ERROR ; CPOPJ1 WITH DATA TRANSFERRED CORRECTLY REDPAG: PUSHJ P,SAVE4 ;SAVE P1-P4 PUSHJ P,FNDPAG ;FIND THE PAGE IN THE EXE DIRECTORY POPJ P, ;NOT THERE JUMPE P2,CPOPJ1 ;RETURN SUCCESS IF ALLOCATED BUT ZERO LSH P2,BLKSPP ;CONVERT TO BLOCK NUMBER USETI DSKX,1(P2) ;SET TO READ THAT BLOCK SOS T1,T2 ;DECREMENT ADDRESS AND COPY TO T1 HRLI T1,-PG.SIZ ;BUILD IOWD TO BUFFER MOVEI T2,0 ;TERMINATE THE IOWD IN DSKX,T1 ;READ THE PAGE JRST CPOPJ1 ;GIVE SUCCESS RETURN POPJ P, ;FAILED ;ROUTINE TO FIND A PAGE IN THE EXE DIRECTORY FOR THE FILE. THE ;EXE DIRECTORY STARTS AT C(EXEADR). ;CALL WITH T1=PROCESS PAGE NUMBER TO FIND ;RETURNS CPOPJ IF PAGE NOT FOUND IN THE DIRECTORY, ; CPOPJ1 WITH P2=FILE PAGE NUMBER (=0 IF ALLOCATED BUT ZERO) ;DESTROYS P1-P4 AND T1 ;PRESERVES T2 FNDPAG: MOVE P2,EXEADR ;GET ADDRESS OF .EXE DIRECTORY HRRZ P1,0(P2) ;GET LENGTH OF DIRECTORY MOVNI P1,-1(P1) ;GET -VE LENGTH FOR AOBJN POINTER HRLI P1,1(P2) ;PUT ADDRESS+1 IF LH MOVSS P1 ;MAKE IT RIGHT FNDPA1: HRRZ P2,0(P1) ;GET FILE PAGE NUMBER OF DESCRIPTOR HRRZ P3,1(P1) ;GET CORE PAGE NUMBER LDB P4,[POINT 9,1(P1),8] ;PLUS REPEAT COUNT ADD P4,P3 ;P3:=LOWER BOUND, P4:=UPPER BOUND CAML T1,P3 ;THIS PAGE NUMBER IN RANGE OF CAMLE T1,P4 ; THIS DESCRIPTOR? JRST FNDPA2 ;NO, TRY NEXT JUMPE P2,CPOPJ1 ;RETURN CPOPJ1 IF ALLOCATED BUT ZERO PAGE SUB T1,P3 ;COMPUTE OFFSET IN THIS DESCRIPTOR ADD P2,T1 ;COMPUTE FILE PAGE NUMBER JRST CPOPJ1 ;GIVE SKIP RETURN FNDPA2: AOBJN P1,.+1 ;INCREMENT EXE DIRECTORY AOBJN P1,FNDPA1 ; POINTER AND LOOP IF MORE POPJ P, ;NOT IN CORE, GIVE NON-SKIP RETURN KLEFLG: 0 ;1 BIT FOR EACH CPU SAYING THAT WE HAVE ; BEEN HERE ON THIS CPU BEFORE DSKBLF: 0 CRASH: SIXBIT /CRASH/ CRSPPN: XWD 1,4 CRSCHP: BLOCK 1 ;SAVED P AFTER CRSCHK DOES PUSHES DSKFLG: BLOCK 1 ;FLAG (AND MAX SIZE) OF DSK INPUT FILE EXEADR: BLOCK 1 ;ADDRESS OF THE .EXE DIRECTORY FOR THIS CRASH EPKIDX: Z ;AOBJN POINTER TO NEXT RELATIVE ENTRY IN ;ERPTBK TABLE IN CRASHED MONITOR ERPTMX: Z ;LENGTH OF TABLE ESVIDX: Z ;PHYSICAL ADDR OF ERROR TABLE ERPTSZ: BLOCK 1 ;SIZE OF EACH ERPTBK ENTRY EPT: BLOCK 1 ;CORE ADDRESS OF OUR COPY OF THE EPT EMAP: BLOCK 1 ;CORE ADDRESS OF OUR COPY OF THE EXEC ;SECTION 0/1 MAP (KL PAGING ONLY) EMAPAG: BLOCK 1 ;CORE PAGE NUMBER FROM WHICH WE READ THE ;EXEC SECTION 0/1 MAP (KL PAGING ONLY) ESECTB: BLOCK 1 ;CORE ADDRESS OF THE START OF THE SECTION ;TABLE IN THE EPT (I.E., C(EPT)+540) ;(KL PAGING ONLY) CRSHAC: BLOCK 20 ;SAVE AC'S HERE ON REENTER (FOR DEBUGING) CRSHPC: BLOCK 1 ;SAVE PC (.JBOPC) HERE ON REENTER SUBTTL DATA AND STORAGE, BUFFERS, ETC. ILIST: XWD -200,0 ;DUMP MODE INPUT COMMAND LIST 0 OLIST: XWD -P2,0 ;DUMP MODE OUTPUT COMMAND LIST (WORD COUNT WILL 0 ; BE FILLED IN.) IFN FTUNSUPPORTED,< DLIST: BPSTRT: IOWD 200,DAEBUF 0 > DSKIOW: UPDLST: IOWD 200,SECBUF 0 PDL: IOWD PDLEN,PDLIST PATTERN:XWD 252525,252525 HEADR0: INSVL.(EL.FVR,EH.FFM)!INSVL.(EL.HVR,EH.HFM)!INSVL.(EL.HED,EH.HLN) ERRSEQ: EXP 0 ;SEQUENCE NUMBER IFN FTUNSUPPORTED,< JBYSUN: POINT 3,SEGSWP,4 ;SWAP UNIT POINTER JBYLKN: POINT 13,SEGSWP,17 ;SWAP BLOCK POINTER > QUECOD: POINT 5,T1,14 SELPTR: XWD .IPCPL,.GTSID ;[602]GETTAB ARG FOR SEL PID ACTPTR: XWD .IPCPA,.GTSID ;GETTAB ARG FOR [SYSTEM]ACCOUNTING PID IFN FTUNSUPPORTED,< COMLST: SIXBIT .DCORE. SIXBIT .DUMP. SIXBIT .SAVE. SIXBIT .SSAVE. SIXBIT .E. SIXBIT .D. SIXBIT .VERSIO. SIXBIT .OSAVE. SIXBIT .OSSAVE. COMLEN==.-COMLST COMDSP: DCORE DUMP SAVE SAVE ECOM DCOM VERCOM SAVE SAVE > ;END IFN FTUNSUPPORTED JBTCLK: Z 0(J) IFN FTUNSUPPORTED,< QIKNAM: ASCIZ \@SYS:QUIKDM.CCL\ > ;[62]THIS CODE MUST GO HERE TO AVOID BLT OF ZEROES. IOERR: BLOCK 1 ;[62]FLAG TO STOP IO TO ERROR FILE IERCNT: EXP ^D10 ;[62]COUNTER FOR TIMED RETRIES NEWEXT: EXP ^D10 ;[62]COUNT TO PREVENT TOO MANY NEW EXTS. IN ROW CERDEV: ERRDEV ;DEVICE FOR ERROR FILE ERREXT: 'SYS' ;[62]ERROR FILE EXTENSION ERRDTM: BLOCK 1 ;OLDEST (FIRST) ENTRY DATE/TIME CERPPN: ERRPPN ;PPN FOR ERROR FILE RELINS: RELEAS 0, ;[535] CHANNEL # INSERTED BEFORE XCT XLIST ;LITERALS UNDER XLIST LIT LIST ZER:! CTYLIN: BLOCK 1 ;LINE NUMBER FOR CTY IFN FTUNSUPPORTED,< CCLFIL: BLOCK 1 ;SIXBIT JOB NUMBER IN LH FOR CCL FILES CURBLK: BLOCK 1 CURWRD: BLOCK 1 C.BH: BLOCK 3 > DAQNAM: BLOCK 1 D.FLOP: BLOCK .FOPPN+1 ;BLOCK FOR FILOP. FUNCTIONS D.DEV: BLOCK 1 D.NAM: BLOCK 1 BLOCK 1 D.EXT: BLOCK 1 D.DIR: BLOCK 1 BLOCK 1 D.PROT: BLOCK 1 D.DPTH: BLOCK .PTMAX ;LAST WORD SURE TO BE ZERO D.LKB: BLOCK .RBSTS+1 ;EXTENDED LOOKUP BLOCK EBLOCK: ;BLOCK FOR EXTENDED LOOKUPS AND ENTERS RBCNTE: BLOCK 1 RBPPNE: BLOCK 1 RBNAME: BLOCK 1 RBEXTE: BLOCK 1 RBPRVE: BLOCK 1 RBSIZE: BLOCK 1 LSTSTP: BLOCK 1 ;LAST SUBTABLE POINTER USED IN GSUBTB LSTSTV: BLOCK 1 ;LAST BALUE OF SUBTABLE POINTER GTBST: BLOCK 1 ;BEGINNING OF TABLE OF GETTAB PTRS IFN FTUNSUPPORTED,< HGHOFF: BLOCK 1 ;BEGINNING OF HIGH SEGMENT HGHREL: BLOCK 1 ;LENGTH OF HIGH SEGMENT JOBJLT: BLOCK 1 ;LOGIN TIME OF JOB REQUESTING SERVICE > HJOB: BLOCK 1 ;HIGHEST JOB NO IN RH LINE==HJOB ;LH LINE NO OF DUMP/DCORE COMMAND INTADR: BLOCK 1 ;ADDR TO RESTART FOR ERROR INTERCEPT INTBLK: BLOCK 4 ;ERROR INTERCEPT BLOCK MAXGTB: BLOCK 1 ;HIGHEST LEGAL GETTAB TABLE RNGTAB: BLOCK 1 ;ADDRESS OF RNGTAB JBTMXL: BLOCK 1 ;JOBN+SEGN-1. THIS IS THE MAXIMUM INDEX FOR ;GETTAB TABLES INDEXED BY JOB OR SEGMENT NUMBER. ;THE NUMTAB ENTRY IS NOT USED FOR THESE TABLES ;BECAUSE THE 9 BIT FIELD OVERFLOWS ON SYSTEMS ;WITH JOBN+SEGN-1 .GT. 511. EVAADR: BLOCK 1 ;ADDRESS OF 1ST WORD IN EVABUF EVABUF: BLOCK EVASIZ ;BUFFER FOR FUNNY SPACE DATA FROM PEKUSR PDLIST: BLOCK PDLEN IFN FTUNSUPPORTED,< PTRADR: BLOCK 1 REMBLK: BLOCK 1 REMWRD: BLOCK 1 STRADR: BLOCK 1 ;SAVE .JBSA HERE DURING SAVE > DSKBUF: SECBUF: BLOCK 200 IFN FTUNSUPPORTED,< SEGREL: BLOCK 1 SWPADR: BLOCK 1 > SEGSWP: BLOCK 1 EXECT1: BLOCK 1 ;WORD FOR ADDRESS OF EXEC AC T1 IN USER'S JOBDAT ERPTBK: BLOCK 4 ;4 WORD BLOCK FOR ERRPT. UUO .UPJOB: BLOCK 1 ;OFFSET OF JOB NUMBER IN UPMP IFN FTUNSUPPORTED,< .UPLST: BLOCK 1 ;OFFSET OF POINTER TO SWAPPABLE DDBS IN UPMP > FTKLP: BLOCK 1 ;NON-ZERO IF THIS MONITOR USES KL PAGING EVAPPB: BLOCK 1 ;START OF "PER PROCESS" ADDRESS SPACE EVAPPE: BLOCK 1 ;END (+1) OF "PER PROCESS" ADDRESS SPACE LDDBSH: BLOCK 1 ;LENGTH OF SHORT DDB IFN FTUNSUPPORTED,< LDDBLN: BLOCK 1 ;LENGTH OF LONG DDB LDDBDS: BLOCK 1 ;LENGTH OF DISK DDB > KONREG: BLOCK 1 ;OFFSET OF # OF DRIVE REGS IN KDB UNISCR: BLOCK 1 ;OFFSET OF DRIVE REGISTERS IN UNIT DATA BLOCK UNICCT: BLOCK 1 ;OFFSET TO # BAT SLOTS LEFT IN UDB [463] DEFINE X (ARG), CHNDAT:!DEFCHN ;CHANNEL DATA BLOCK OFFSETS MONVER: BLOCK 1 ;[545] MONITOR VERSION IFN FTSVSL,< PSRCH: BLOCK 1 ;LEN,,ADDR OF OUR SEARCH LIST SRCLST: BLOCK 3*^D9+4 ;SPACE FOR OUR SEARCH LIST > ;END IFN FTSVSL IFN FTSVSL!FTUNSUPPORTED,< USRLST: BLOCK 3*^D9+4 ;SPACE FOR USER SEARCH LIST > THSJOB: BLOCK 1 ;OUR JOB NUMBER THSLIN: BLOCK 1 ;OUR LINE NUMBER USRCOR: BLOCK MAXUCR+BLKSIZ USRUPM: BLOCK MAXUPM IFN FTUNSUPPORTED,< THSOFF: BLOCK 1 THSSEG: BLOCK 1 UPDFLG: BLOCK 1 ;-1 IF MUST DO USETO FOR NORMAL WRITE, 0 IF NOT USRADR: BLOCK 1 USRPPN: BLOCK 1 WRDCNT: BLOCK 1 ;WORDS FROM LAST PATTERN SWPUNI: BLOCK 1 ;NAME OF SWAP UNIT BEING ACCESSED SWPSLB: BLOCK 1 ;C(UNISLB) FOR UNIT BEING ACCESSED SWPTAB: BLOCK 1 ;ADDRESS OF SWPTAB SWPMAX: BLOCK 1 ;LENGTH OF SWPTAB UNISLB: BLOCK 1 ;OFFSET OF UNISLB IN UDB > ;END IFN FTUNSUPPORTED PDBPTR: BLOCK 1 ;ADDRESS OF JBTPDB IN MONITOR FOR SPY NEXTUP: BLOCK 1 ;NEXT TIME TO CAUSE A WAKE NEXTJB: BLOCK 1 ;JOB TO WAKE QPNTR: BLOCK 1 ;POINTER TO QUEUE OPRPPN: BLOCK 1 ;PPN OF THE OPERATOR JIFSEC: BLOCK 1 ;JIFFIES PER SECOND JIFDAY: BLOCK 1 ;JIFFIES PER DAY MILJIF: BLOCK 1 ;MILLISECONDS PER JIFFY JDPCNT: BLOCK 1 ;NUMBER OF JOBS SEEN STOPPED FOR HDW ERRORS UUOJOB: BLOCK 1 ;JOB NUMBER OF JOB DOING LAST DAEMON UUO UUOFNC: BLOCK 1 ;FUNCTION CODE FROM LAST DAEMON UUO SAVXWD: BLOCK 1 ;SAVE UUO XWD (FROM EXEC AC T2) IFN FTUNSUPPORTED,< CMDJOB: BLOCK 1 ;JOB NUMBER OF JOB DOING LAST COMMAND CMDCMD: BLOCK 1 ;COMMAND INDEX OF LAST COMMAND > DFNJOB: BLOCK 1 ;JOB NUMBER OF LAST JOB DAEFIN'ED UUXCOD: BLOCK 1 ;ERROR CODE RETURNED TO JOB IN UUXJOB UUXJOB: BLOCK 1 ;JOB WHICH LAST CAME THROUGH UUEXIT DPMJOB: BLOCK 1 ;JOB NUMBER OF LAST JOB RELEASED BECAUSE ;JS.DPM WAS ON DPMCNT: BLOCK 1 ;COUNT OF JOBS RELEASED DUE TO ABOVE ZZZDTM: BLOCK 1 ;UNIVERSAL DATE/TIME OF LAST WAKE AT ZZZ DLKDTM: BLOCK 1 ;UNIVERSAL DATE/TIME LAST TIME THRU DALOOK DLJDTM: BLOCK 1 ;UNIVERSAL DATE/TIME LAST TIME THRU DALOKJ IFN FTUNSUPPORTED,< FNCJBS: BLOCK 1 ;DEBUG - LAST JBTSTS READ IN FINCHK FNCJBA: BLOCK 1 ;DEBUG - LAST JBTADR READ IN FINCHK FNCJBJ: BLOCK 1 ;DEBUG - LAST JOB OR SEG NUMBER USED IN FINCHK FRCGUF: BLOCK 1 ;DEBUG - COUNTS FRCUUO FAILURES > PDLGUF: BLOCK 1 ;DEBUG - CONTAINS ERRONEOUS P CONTENTS GTBGUF: BLOCK 1 ;DEBUG - COUNTS MISTAKES IN GTBSPY ATTGUF: BLOCK 1 ;DEBUG - COUNTS ATTACH FAILURES FINGUF: BLOCK 1 ;DEBUG - COUNTS DAEFIN ERROR RETURNS IFN FTSVSL,< STRGUF: BLOCK 1 ;DEBUG - COUNTS STRUUO ERROR RETURNS > WAKGUF: BLOCK 1 ;DEBUG - COUNTS ERROR RETURNS FROM WAKE UUO CLKGUF: BLOCK 1 ;DEBUG - COUNTS CLOCK REQUESTS ON UNASSIGNED CHANNELS INTGUF: BLOCK 1 ;DEBUG - COUNTS INTERCEPTS OUTGUF: BLOCK 1 ;COUNTS TIMES WE WANTED TO OUTSTR BUT WERE DETACHED IFN FTUNSUPPORTED,< SWRGUF: BLOCK 1 ;COUNTS SWAP READ ERRORS SWWGUF: BLOCK 1 ;COUNTS SWAP WRITE ERORS WRTGUF: BLOCK 1 ;COUNTS FAILURES IN MARKSPT > IFG FTFACT,< FCTGUF: BLOCK 1 ;COUNTS FACT FILE ERRORS BSYFCT: BLOCK 1 ;COUNTS TIMES FACT FILE BEING MODIFIED TOO LONG > SPTGUF: BLOCK 1 ;DEBUG - COUNTS SWAPPING POINTER FAILURES HSSGUF: BLOCK 1 ;DEBUG - COUNTS HIGH SEG STATUS FAILURES UPMGUF: BLOCK 1 ;DEBUG - COUNTS UPMP FAILURES SUOGUF: BLOCK 1 ;DEBUG - COUNTS SWAP UNIT OPEN FAILURES SWPGUF: BLOCK 1 ;DEBUG - COUNTS SWAP POINTER INCONSISTENCIES CURJOB: BLOCK 1 ;DEBUG - LAST JOB SERVICED INTFLG: BLOCK 1 ;DEBUG - REASONS FOR LAST JOBINT INTPC: BLOCK 1 ;DEBUG - PC OF LAST JOBINT WTUERR: BLOCK 1 ;FLAG TO PREVENT RECURSIVE CALLS OF WTUCOR WHEN ;IT GETS IO ERRORS ON THE SWAPPING DEVICE WHILE ;ATTEMPTING TO WRITE THE EXIT VALUES FOR A UUO. IPCPDB: BLOCK 6 ;[602]IPCF PACKET DESCRIPTOR BLK \*** KEEP SSELBK: BLOCK 10 ;[602]IPCF MSG AREA /*** TOGETHER IFN FTDEBG,< ;DON'T WASTE SPACE PATT: BLOCK 100 ;SPACE FOR PATCHES > SAVEP4: BLOCK 1 ;SAVE P4 HERE IN ERRFIN IFG FTFACT,< FACTSZ: BLOCK 1 ;NUMBER OF WORDS IN FACT BUFFER > NXMLEN: BLOCK 1 ;LENGTH OF NXMTAB NXMTAB: BLOCK 1 ;POINTER TO FIRST COPY OF NXMTAB ; SUPPORT IN THIS MONITOR NSYN==/BLKSIZ ;MAX NUMBER OF RESYNC POINTERS ERRBUF: BLOCK <!177>+1 ;LAST BLOCK OF ERROR.SYS ERRBFE=.-1 ;END OF THE BUFFER MRVBLK: BLOCK ERRSIZ+AWELEN+2 ;AVAIL.SYS WORKING ENTRY MRVEND==.-1 MRVBDY==MRVBLK+AWELEN IFN FTUNSUPPORTED!FTSVSL,< GOBBUF: DAEBUF: BLOCK BLKSIZ ;BUFFER FOR DUMP IO > IFG FTFACT,< FACTBF: BLOCK MAXFCT+TRNSIZ+1 ;FACT FILE BUFFER >;END COND ON FTFACT EZER==.-1 ;ROUTINE TO READ THE OLD VERSION OF DAEMON INTO HIGH CORE, BLT IT ;DOWN TO WHERE IT BELONGS, AND START IT WHERE .JBSA INDICATES. ;CALL WITH RH(P1)=SIXBIT MONITOR NUMBER OF PREVIOUS VERSION OF DAEMON. ;TO SAVE SPACE, THIS ROUTINE IS OVERLAYED WITH ERABUF. XLIST ;MAKE SURE ALL LITERALS ARE DUMPED LIT LIST PRVDAE: WARN ,OPR WARN ,NOCRLF MOVSI T2,'DAE' ;GET LH OF NEW NAME HRR T2,P1 ;PLUS REST OF NAME PUSHJ P,TSIX ;TYPE THE NAME TELL <.EXE as system DAEMON>,OPR MOVX T1,UU.PHS!.IODMP ;MODE IS DUMP, PHYSICAL ONLY MOVSI T2,'SYS' ;DEVICE IS SYS MOVEI T3,0 ;NO BUFFERS OPEN DSK,T1 ;OPEN THE CHANNEL JRST PRVDE1 ;GO IF ERROR MOVSI T1,'DAE' ;LEFT HALF OF DAEMON NAME HRR T1,P1 ;GET THE RIGHT HALF MOVSI T2,'EXE' ;EXTENSION IS .EXE SETZB T3,T4 ;ZERO REST OF BLOCK LOOKUP DSK,T1 ;LOOKUP THE FILE PRVDE1: ERROR ,STOP MOVE T1,[-BLKSIZ,,DSKBUF-1] ;IOWD TO EXE DIRECTORY MOVEI T2,0 ;END THE IOWD IN DSK,T1 ;READ IN THE EXE DIRECTORY CAIA ;READ SUCCEEDED PRVDE2: ERROR ,STOP HLRZ T1,DSKBUF ;GET LEFT HALF OF FIRST WORD HRRZ P1,DSKBUF ;AND RIGHT HALF CAIN T1,.SVDIR ;THIS AN EXE DIRECTORY? CAILE P1,BLKSIZ-1 ; AND LESS THAN A BLOCK LONG? PRVDE3: ERROR ,STOP MOVE T1,DSKBUF(P1) ;GET LAST WORD CAME T1,[.SVEND,,1] ;CORRECT END? JRST PRVDE3 ;NO, GIVE MESSAGE MOVNI P1,-1(P1) ;COMPUTE -VE LENGTH OF PAIRS HRLI P1,DSKBUF+1 ;STARTING AT DSKBUF+1 MOVSS P1 ;MAKE IT AN AOBJN POINTER MOVE P4,.JBREL ;GET LAST WORD IN CORE ADDI P4,1 ;MAKE IT BASE OF NEW DAEMON ;HERE FOR EVERY PAIR OF WORDS IN THE DIRECTORY. PRVDA1: SKIPGE P2,.SVFPF(P1) ;GET FIRST WORD; INSURE NOT HI SEG JRST PRVDE3 ;BAD .EXE FORMAT ANDX P2,SV%FPN ;KEEP JUST FILE PAGE NUMBER LDB T1,[POINTR .SVPPC(P1),SV%PPN] ;GET PROCESS PAGE NUMBER LDB T2,[POINTR .SVPPC(P1),SV%REP] ; AND REPEAT COUNT MOVEI T3,1(T2) ;COMPUTE NUMBER OF PAGES IN DESCRIPTOR LSH T3,P2WLSH ;MAKE IT THE NUMBER OF WORDS MOVE T4,T3 ;COPY ARGUMENT TO T4 ADD T4,.JBREL ;ADD TO WHAT WE HAVE NOW CORE T4, ;ASK FOR THE NECESSARY CORE ERROR ,STOP ADD T2,T1 ;T2:=HIGHEST PAGE IN DESCRIPTOR LSHC T1,P2WLSH ;CONVERT BOTH TO ADDRESSES ADD T1,P4 ;T1:=FIRST ADDRESS OF OUR COPY ADDI T2,PG.SIZ-1(P4) ;T2:=LAST ADDRESS OF OUR COPY JUMPE P2,PRVDA2 ;GO IF ALLOCATED BUT ZERO PAGE ;HERE IF WE HAVE TO READ THE FILE TO GET THE PAGES. T1 CONTAINS ;THE ADDRESS OF WHERE TO PUT IT. T3 CONTAINS THE NUMBER OF WORDS. ;P2 CONTAINS THE FILE PAGE NUMBER OF THE PAGES TO TRANSFER. SUBI T1,1 ;BACK UP THE FIRST ADDRESS BY 1 MOVNS T3 ;NEGATE THE WORD COUNT HRL T1,T3 ;MAKE AN IOWD FOR THE TRANSFER MOVEI T2,0 ;TERMINATE IT LSH P2,BLKSPP ;CONVERT FILE PAGE TO FILE BLOCK USETI DSK,1(P2) ;SET TO READ THAT BLOCK IN DSK,T1 ;READ THE DATA FROM THE FILE JRST PRVDA3 ;JOIN COMMON END CODE JRST PRVDE2 ;I/O ERROR ;HERE IF THE PAGES WERE ALLOCATED BUT ZERO TO SIMPLY BLT THEM ALL TO ;ZERO. T1 CONTAINS THE BASE ADDRESS. T2 CONTAINS THE HIGHEST ADDRESS. PRVDA2: SETZM (T1) ;ZERO THE FIRST WORD OF THE PAGE HRLI T1,1(T1) ;BUILD SWAPPED BLT POINTER MOVSS T1 ;SWAP THE HALVES BLT T1,(T2) ;ZERO ALL THE PAGES ;HERE WHEN THE CURRENT DESCRIPTOR HAS BEEN PROCESSED. CHECK FOR ;MORE AND LOOP BACK TO THE TOP IF THERE ARE. PRVDA3: AOBJP P1,.+2 ;BUMP THE DESCRIPTOR POINTER ONCE AOBJN P1,PRVDA1 ; AND AGAIN AND LOOP IF MORE ;ALL OF THE NEW DAEMON IS NOW IN CORE STARTING AT THE ADDRESS IN ;P4 AND GOING THRU THE ADDRESS IN .JBREL. ALL WE HAVE TO DO IS ;BLT THE CODE DOWN TO WHERE IT BELONGS AND THEN JUMP TO IT. MOVSI 1,20(P4) ;GET SOURCE OF BLT POINTER HRRI 1,20 ;AND DESTINATION MOVE 2,.JBREL ;GET HIGHEST ADDRESS WE HAVE SUB 2,P4 ;COMPUTE HIGHEST RELATIVE ADDRESS MOVE 3,.JBREL(P4) ;GET .JBREL OF NEW DAEMON HRRZ 4,.JBSA(P4) ;AND START ADDRESS MOVSI 5,(BLT 1,(2)) ;START SETTING UP INSTRUCTIONS IN THE SKIPA 6,.+1 ; AC'S TO BLT THE CODE DOWN, GIVE UP CORE 3, MOVSI 7,(JFCL) ; THE UNNEEDED CORE, AND START THE MOVSI 10,(JRST (4)) ; NEW DAEMON MOVEI 11,0 ;SETUP TO CLEAR .JBDDT SO THAT WE SETDDT 11, ; DON'T CONFUSE THE NEW DAEMON JRST 5 ;START IT GOING XLIST ;PRVDAE LITERALS UNDER XLIST LIT LIST ;THIS BUFFER OVERLAYS THE PRVDAE ROUTINE ABOVE SINCE IT ISN'T USED ;ONCE DAEMON STARTS UP. IT MUST NOT BE WITHIN THE SCOPE OF THE ;ZER,,EZER BLT SO THAT PRVDAE DOESN'T GET CLEARED AT STARTUP. ERABUF==PRVDAE ;NEW ERROR ENTRIES BUILT HERE ERABFL==-<.-ERABUF> ;COMPUTE SIZE OF REST OF BLOCK BLOCK ERABFL ;FILL TO END OF BLOCK ERAEND==.-1 ;***************************************************************** ;SUB-BLOCK POINTERS USED IN THE ERROR ENTRIES ARE NOT CONSISTENT. ;SOMETIMES THE POINTER IS +LEN,,OFFSET WHILE OTHER TIMES IT IS ;-LEN,,OFFSET. TO MAKE MATTERS WORSE, "OFFSET" IS SOMETIMES THE ;OFFSET FROM THE FIRST WORD OF THE HEADER AND SOMETIMES THE OFFSET ;FROM THE FIRST WORD OF THE ENTRY AFTER THE HEADER. HOPEFULLY SOMEBODY ;WILL MAKE THEM ALL -LEN,,OFFSET FROM FIRST DATA WORD SOMEDAY. IN ;ORDER TO MAKE THIS A LITTLE EASIER, THE FOLLOWING TWO SYMBOLS ARE ;DEFINED AND USED: ; ERABFH - USED TO INDICATE THAT THE OFFSET IS FROM THE ; START OF THE HEADER. ; ERABFS - USED TO INDICATE THAT THE OFFSET IS FROM THE ; FIRST WORD OF DATA AFTER THE HEADER. ERABFH==ERABUF ;START OF THE HEADER ERABFS==ERABUF+EL.HED ;FIRST WORD OF DATA AFTER THE HEADER ;***************************************************************** IFN FTUNSUPPORTED,< SUBTTL SCANER COMMAND SCANNER FOR DEMON IFNDEF .FXLNF,<.FXLNF==6> ;MAX DIRECTORY NESTING ;FLAGS IN SF F%BRK==1B0 ;SIGN BIT -- ON IF BREAK SEEN F%SOM==1B1 ;ON IF SOME INPUT SEEN IN FILE SPEC COLLECTOR F%EXT==1B2 ;EXTENSION SPECIFIED F%OCT==1B3 ;VALID INPUT FROM OCTIN SUBTTL INITIALIZE COMMAND SCANNER ;STILL IFN FTUNSUPPORTED ;ISCAN - INITIALIZE, RESCAN, AND INPUT MONITOR COMMAND ;TSCAN - CALLED AFTER ISCAN TO INPUT A COMMAND OR KEYWORD ;CALL WITH C(T1)=IOWD TO LIST OF MONITOR COMMANDS ;RETURNS WITH C(T1)=INDEX INTO MONITOR COMMAND LIST OR -1 .ISCAN: TLO SF,(F%BRK) ;MARK END OF LINE SO NEW COMMAND ; WILL BE SCANNED RESCAN 1 ;COMMAND? SKPINL ;? JRST RETNEG ;NO COMMAND, RETURN -1 .TSCAN: PUSH P,T1 ;SAVE IOWD PUSHJ P,SIXIN ;READ SIXBIT COMMAND POP P,T4 ;RESTORE PTR TO COMMAND TABLE PUSHJ P,NAME ;FIND NAME IN TABLE RETNEG: SKIPA T1,[EXP -1] ;RETURN -1 FOR NOT FOUND HRRZ T1,T2 ;INDEX INTO T1 POPJ P, ;AND RETURN SUBTTL SUBROUTINES ;STILL IFN FTUNSUPPORTED ;MAKPJN SUBROUTINE TO MAKE CCL JOB NUMBER ;ARGS T2=JOB NUMBER ;VALUES T4=CCL JOB NUMBER MAKPJN: PUSH P,P1 ;SAVE P1 MOVEI P1,3 ;3 DIGITS MAKPJ1: IDIVI T2,^D10 ;DIVIDE BY DECIMAL 10 ADDI T3,'0' ;MAKE SIXBIT REMAINDER LSHC T3,-6 ;SHIFT INTO T4 SOJG P1,MAKPJ1 ;LOOP POP P,P1 ;RESTORE P1 POPJ P, ;RETURN SUBTTL GATHER FILE SPECIFICATION ;STILL IFN FTUNSUPPORTED ;FILSPC - INPUT A FILE SPECIFICATION OF THE FORM ;DEV:FILE.EXT[P,PN,SFD1,SFD2,...] FILIN: SETZM F.ZER ;GET SET MOVE T1,[F.ZER,,F.ZER+1] ;TO CLEAR DATA BLT T1,F.EZER ;BLITTTTT! TLZA SF,(F%SOM!F%EXT);NOTHING YET FILSP0: JUMPL SF,CPOPJ1 ;RETURN AT END OF LINE PUSHJ P,SIXINX ;READ A SIXBIT WORD JUMPN T1,FILSP5 ;IF NON-NULL WORD SEEN, GO PROCESS IT JUMPL SF,CPOPJ1 ;RETURN IF AT END OF LINE FILSP5: TLO SF,(F%SOM) ;SOME INPUT HAS BEEN SEEN CAIE SC,":" ;COLON? JRST FILSP1 ;NO SKIPE F.DEV ;YES, DEVICE ALREADY SEEN? PJRST MULDEV ;YES, ERROR JUMPE T1,NULDEV ;NULL DEVICE ILLEGAL MOVEM T1,F.DEV ;STORE DEVICE NAME JRST FILSP0 ;GO BACK FOR MORE INPUT FILSP1: JUMPE T1,FILSP2 ;GO IF NO FILE NAME SEEN SKIPE F.NAM ;ALREADY SEEN A FILE NAME? PJRST MULNAM ;YES, ERROR MOVEM T1,F.NAM ;STORE NAME FILSP2: JUMPL SF,CPOPJ1 ;RETURN IF EOL CAIE SC,"[" ;LEFT SQUARE BRACKET? JRST FILSP3 ;NO SKIPE F.DIR ;DIRECTORY ALREADY SEEN? PJRST MULDIR ;YES, ERROR PUSHJ P,FDIRIN ;READ A DIRECTORY SPECIFICATION POPJ P, ;ILLEGAL DIRECTORY JRST FILSP0 ;GOT IT. GO BACK FOR MORE FILSP3: CAIE SC,"." ;WAS TERMINATOR A PERIOD? JRST SYNERR ;NO TLOE SF,(F%EXT) ;YES, EXTENSION ALREADY SEEN? PJRST MULEXT ;YES, MULTIPLE EXTENSION ILLEGAL PUSHJ P,SIXINX ;READ EXTENSION HLLZM T1,F.EXT ;STORE EXTENSION SETZ T1, ;CLEAR NAME JRST FILSP5 ;AND LOOP ;STILL IFN FTUNSUPPORTED ;FDIRIN - RETURN C(F.DIR)=DIRECTORY ;INCLUDING SFD'S (UP TO .FXLNF ALTOGETHER) ;NON-SKIP RETURN IF ERROR FDIRIN: MOVEI T1,F.DIRP ;GET POINTER TO PATH BLOCK MOVEM T1,F.DIR ;SAVE IN DIRECTORY POINTER PUSHJ P,OCTIN ;GET PROJECT NUMBER CAIE SC,"," ;TERMINATED BY COMMA? PJRST ILLDIR ;NO, ERROR TLNN SF,(F%OCT) ;ANYTHING? HLRZ T2,USRPPN ;NO, GRAB DEFAULT TLNN T2,-1 ;[605] OVERFLOW TO LH? TRNE T2,400000 ;[605] SIGN BIT SET? SKIPA ;[605] TRNN T2,-1 ;[605] PROJECT 0? PJRST ILLDIR ;YES, BOUNCE THIS JERK! HRLM T2,F.PTH ;SAVE VALUE PUSHJ P,OCTIN ;GET PROGRAMMER TLNN SF,(F%OCT) ;IF NOTHING HRRZ T2,USRPPN ;GRAB DEFAULT TLNN T2,-1 ;CHECK AGAIN TRNN T2,-1 ; .. PJRST ILLDIR ;SOME PEOPLE NEVER GIVE UP HRRM T2,F.PTH ;SAVE CAIE SC,"," ;SFD'S COMING? JRST FDIRI0 ;NO, NO SFD'S PUSHJ P,SAVE1 ;SAVE AN AC MOVSI P1,-<.FXLNF-1> ;MAX NUMBER OF SFD'S FDIRI1: PUSHJ P,SIXINX ;GET SFD NAME MOVEM T1,F.PTH+1(P1) ;STORE SFD NAME CAIE SC,"," ;MORE COMING? JRST FDIRI0 ;NO, WE ARE DONE AOBJN P1,FDIRI1 ;GO GET NEXT ERROR POPJ P, ;THAT'S TELLING HIM FDIRI0: CAIN SC,"]" ;TERMINATED BY BRACKET? JRST CPOPJ1 ;YES, RETURN NOW JUMPL SF,CPOPJ1 ;ALSO RETURN IF EOL ILLDIR: ERROR POPJ P, ;RETURN ;STILL IFN FTUNSUPPORTED ;SUB TO GET NEXT CHAR FROM TTY INPUT BUFFER ;LOADS SC, USES NO AC'S ;IF BREAK, F%BRK (SIGN BIT) OF SF IS SET AND SC IS SET TO -1 TYIA: JUMPGE SF,GETB3 ;JUMP IF MORE CHAR'S LEFT PUSHJ P,SAVE2 ;NO -- READ IN LINE TLZ SF,(F%BRK) ;NO BREAK YET MOVE P2,TTIBP ;LOAD PTR TO BEG OF BUF MOVEM P2,TTIPTR ;STORE FOR LATER USE MOVEI P1,LINSIZ ;LOAD SIZE IN BYTES FILL1: INCHSL SC ;OK, GET NEXT CHAR MOVEI SC,.CHLFD ;NONE, RETURN LINE FEED PUSHJ P,ISBRK ;PLACE IN BUFFER, SEE IF BREAK JRST GETB3 ;WELL, THAT'S A BREAK SOJG P1,FILL1 ;LOOP CLRBFI ;LINE TOO LONG -- BUFFER FULL ERROR MOVEI SC,.CHNUL ;SET UP NULL BYTE DPB SC,P2 ;AND CONCLUDE WITH EOL ; JRST GETB3 ;PROCEED GETB3: ILDB SC,TTIPTR ;GET FROM BUFFER JUMPN SC,CPOPJ ;IF NOT NULL, GOOD CHAR TLO SF,(F%BRK) ;ELSE FLAG BREAK SOJA SC,CPOPJ ;SET ALL BITS OF SC AND RETURN ;STILL IFN FTUNSUPPORTED BRKTAB: EXP .CHBEL,.CHLFD,.CHVTB,.CHFFD,.CHCNR,.CHCNU EXP .CHCNZ,.CHESC,.CHDEL BRKLEN==.-BRKTAB ;ISBRK - SKIP RETURN IF NOT A BREAK CHARACTER ISBRK: CAIN SC,.CHCRT ;IGNORE CARRIAGE RETURN AOJA P1,CPOPJ1 ;INCREMENT CHAR COUNT FOR IGNORE PUSHJ P,SAVE1 ;SAVE AN AC MOVSI P1,-BRKLEN ;GET LENGTH OF TABLE CAMN SC,BRKTAB(P1) ;MATCH? TDZA SC,SC ;YES, REPLACE WITH NULL AOBJN P1,.-2 ;NO, TRY NEXT CAIN SC,.CHTAB ;CONVERT TABS MOVEI SC," " ;TO SPACES CAIG SC,"Z"+40 ;CONVERT LC CAIGE SC,"A"+40 ; .. JRST .+2 MOVEI SC,-40(SC) ;TO UC IDPB SC,P2 ;SAVE CHAR AWAY CAIE SC,";" ;CHECK FOR COMMENT COMING JUMPN SC,CPOPJ1 ;ELSE RETURN IF NOT BREAK JUMPE SC,CPOPJ ;NON-SKIP IF BREAK MOVEI SC,.CHNUL ;COMMENT -- INSERT TERMINATOR DPB SC,P2 ;INSERT JRST CPOPJ1 ;AND SKIP RETURN ;ROUTINE TO IGNORE SPACES AND SCAN FOR GOOD CHAR STYIA: PUSHJ P,TYIA ;GET CHAR CAIN SC," " ;IGNORE SPACES JRST STYIA ;LOOP POPJ P, ;GOOD CHAR, RETURN ;STILL IFN FTUNSUPPORTED ;NAME - SCAN TABLE FOR COMMAND OR UNIQUE ABBREVIATION ;CALL WITH C(1)=SIXBIT COMMAND, C(T4)=IOWD TABLE LENGTH,TABLE ADR ;RETURNS C(T2)=INDEX INTO TABLE, ALWAYS PRESERVES T1 ;CPOPJ1 IF MATCH FOUND, USES T2-T4 NAME: PUSHJ P,SAVE2 ;SAVE P1 AND P2 SETZB P1,T3 ;CLEAR SKIPN T2,T1 ;COPY COMMAND INTO T2 SOJA T3,NAME2 ;SET UP MASK, GO IF NULL COMMAND SOJA T3,NAME1 ;SET UP INITIAL MASK (-1) AND GO NAME0: LSH T2,-6 ;SHIFT 1 CHAR TO THE RIGHT LSH T3,6 ;AND ONE TO THE LEFT NAME1: TRNN T2,77 ;A CHAR IN RIGHTMOST POSITION? JRST NAME0 ;NO, TRY SOME MORE NAME2: HRLI P2,1(T4) ;REMEMBER START OF COMMAND TABLE NAMELP: CAMN T1,1(T4) ;EXACT MATCH? JRST NAMEFN ;YES MOVE T2,1(T4) ;CANDIDATE INTO T2 AND T2,T3 ;MASKED TO CORRECT # OF CHARACTERS CAME T1,T2 ;GOT A MATCH? AOBJN T4,NAMELP ;NO, TRY NEXT ONE JUMPGE T4,NAMTST ;YES, YOUR FACE AND ... TROE P1,1 ;MARK THAT ONE WAS FOUND TRO P1,2 ;TWO WERE FOUND HRRI P2,1(T4) ;REMEMBER WHERE AOBJN T4,NAMELP ;LOOK FOR MORE MATCHES NAMTST: CAIE P1,1 ;ONE MATCH FOUND? POPJ P, ;NO, COMMAND UNKNOWN OR NOT UNIQUE JRST NAMDSP ;GOOD RESULT NAMEFN: HRRI P2,1(T4) ;EXACT MATCH, RH(P2)=INDEX OF COMMAND NAMDSP: HLRZ T4,P2 ;BASE OF TABLE SUBI P2,(T4) ;OFFSET INTO TABLE HRRZ T2,P2 ;RETURN RESULT IN T2 JRST CPOPJ1 ;SKIP RETURN ;STILL IFN FTUNSUPPORTED ;SIXINX - LIKE SIXIN, EXCEPT ADVANCES TTY INPUT SO NEXT CHARACTER ;WILL BE RELEVANT SIXINX: PUSHJ P,SIXIN ;READ CAIN SC," " ;SPACE? PJRST STYIA ;YES, READ NULLS POPJ P, ;NO, RETURN ;SIXIN - RETURNS C(T1)=UP TO SIX CHARACTERS OF SIXBIT ;USES T2,SC SIXIN: PUSHJ P,STYIA ;GET A CHAR SETZ T1, ;CLEAR COLLECTOR MOVE T2,[POINT 6,T1] ;SET UP BYTE POINTER SIXIN1: CAIL SC,"0" ;SEE IF ALPHANUMERIC CAILE SC,"Z" ; .. POPJ P, ;NO CAIGE SC,"A" ; .. CAIG SC,"9" ; .. JRST .+2 ;OK POPJ P, ;BAD SUBI SC,40 ;MAKE SIXBIT TLNE T2,770000 ;SIX CHARACTERS YET? IDPB SC,T2 ;NO, LOAD IT IN PUSHJ P,TYIA ;GET NEXT JRST SIXIN1 ;LOOP SUBTTL NUMERIC INPUT ;STILL IFN FTUNSUPPORTED ;OCTINW - READ OCTAL NUMBER FROM COMAND STREAM INTO SN OCTINW: PUSHJ P,OCTIN ;GET OCTAL NUMBER IN T2 MOVE SN,T2 ;MOVE POPJ P, ;RETURN ;OCTIN - READ OCTAL NUMBER INTO T2 OCTIN: PUSHJ P,STYIA ;SKIP SPACES SETZB T2,T3 ;CLEAR COUNT TLZ SF,(F%OCT) ;NOTHING IN YET CAIN SC,"#" ;FORCING OCTAL (WHICH IS DEFAULT)? PUSHJ P,TYIA ;YES, IGNORE AND GET NEXT CHAR OCTIN0: CAIG SC,"9" ;RANGE CHECK CAIGE SC,"0" ; .. JRST OCTIN1 ;NO, EXIT LOOP TLO SF,(F%OCT) ;FLAG SOMETHING IN LSH T2,3 ;SHIFT OVER RESULT ADDI T2,-"0"(SC) ;AND ADD OCTAL IMULI T3,^D10 ;AND KEEP UP DECIMAL COUNT ALSO ADDI T3,-"0"(SC) ; .. PUSHJ P,TYIA ;NEXT JRST OCTIN0 ;LOOP OCTIN1: CAIE SC,"." ;FORCING DECIMAL? POPJ P, ;NO, RETURN NOW MOVE T2,T3 ;YES, USE DECIMAL COUNT PJRST TYIA ;GET NEXT CHAR AND RETURN SUBTTL ERROR MESSAGES ;STILL IFN FTUNSUPPORTED MULDEV: ERROR POPJ P, MULDIR: ERROR POPJ P, MULEXT: ERROR POPJ P, MULNAM: ERROR POPJ P, NULDEV: ERROR POPJ P, SYNERR: ERROR POPJ P, > ;END IFN FTUNSUPPORTED SUBTTL ACCUMULATOR SAVERS ;ROUTINES TO SAVE P1-PX. ALL ARE CALLED WITH PUSHJ P,SAVEX SAVE1: EXCH P1,(P) ;COMMENTS SAME MOVEM P1,1(P) MOVE P1,(P) PUSHJ P,@1(P) JRST RET1 AOS -1(P) JRST RET1 ;RESTORE P1 AND RETURN SAVE2: EXCH P1,(P) ;GET RETURN, SAVE P1 PUSH P,P2 ;SAVE P2 MOVEM P1,1(P) ;SAVE RETURN MOVE P1,-1(P) ;RESTORE P1 PUSHJ P,@1(P) ;CALL CALLER JRST RET2 AOS -2(P) ;SKIP RET JRST RET2 ;RESTORE P1,P2 AND RETURN SAVE3: EXCH P1,(P) ;GET RETURN, SAVE P1 PUSH P,P2 ;SAVE P2 PUSH P,P3 ;SAVE P3 MOVEM P1,1(P) ;SAVE RETURN MOVE P1,-2(P) ;RESTORE P1 PUSHJ P,@1(P) ;CALL CALLER JRST RET3 AOS -3(P) ;SKIP RET JRST RET3 ;RESTORE P1-P3 AND RETURN SAVE4: EXCH P1,(P) ;GET RETURN, SAVE P1 PUSH P,P2 ;SAVE P2 PUSH P,P3 ;SAVE P3 PUSH P,P4 ;SAVE P4 MOVEM P1,1(P) ;SAVE RETURN MOVE P1,-3(P) ;RESTORE P1 PUSHJ P,@1(P) ;CALL CALLER JRST RET4 AOS -4(P) ;SKIP RET RET4: POP P,P4 ;RESTORE P4 RET3: POP P,P3 ;RESTORE P3 RET2: POP P,P2 ;RESTORE P2 RET1: POP P,P1 ;RESTORE P1 POPJ P, ;RETURN ;THALF - SUBROUTINE TO TYPE A NUMBER AS HALFWORD OCTAL ;CALL MOVE T1,NUMBER ; PUSHJ P,THALF ;USES T1,T2,T3,SC THALF: HRLM T1,(P) ;KEEP RH FOR LATER HLRZS T1 ;KEEP JUST LEFT HALF PUSHJ P,TOCT ;TYPE IT MOVEI SC,"," ;COMMA PUSHJ P,TYPCHR HLRZ T1,(P) ;RESTORE RH FROM STACK ;; PJRST TOCT ;FALL INTO TOCT TO TYPE AND RETURN ;TOCT - TYPE OCTAL VALUE GIVEN IN T1 TOCT: IDIVI T1,^D8 ;DIVIDE OUT JUMPE T1,TOCT1 ;EXIT IF NO MORE HRLM T2,(P) ;SAVE REMAINDER PUSHJ P,TOCT ;LOOP HLRZ T2,(P) ;RESTORE DIGIT TOCT1: MOVEI SC,"0"(T2) ;MAKE ASCII PUSHJ P,TYPCHR ;TYPE POPJ P, ;RETURN ;TDEC - TYPE DECIMAL VALUE GIVEN IN T1 TDEC02: MOVEI SC,"0" ;GET A ZERO CAIG T1,^D9 ;IF GT 10 PUSHJ P,TYPCHR ;FILL TDEC: IDIVI T1,^D10 ;DIVIDE OUT JUMPE T1,TDEC1 ;EXIT IF NO MORE HRLM T2,(P) ;SAVE REMAINDER PUSHJ P,TDEC ;LOOP HLRZ T2,(P) ;RESTORE DIGIT TDEC1: MOVEI SC,"0"(T2) ;MAKE ASCII PUSHJ P,TYPCHR ;TYPE POPJ P, ;RETURN ;TSIXN - TYPE C(T2) AS SIXBIT, NO TRAILING BLANKS TSIX: SETZ T1, ;MAKE ROOM LSHC T1,6 ;GET CHAR IN T1 MOVEI SC,40(T1) ;MAKE ASCII IN SC PUSHJ P,TYPCHR ;TYPE IT TSIXN: JUMPN T2,TSIX ;LOOP IF MORE POPJ P, ;DONE ;ROUTINE TO STORE A STRING IN THE MESSAGE BUFFER. ;CALL MOVEI T1,ADDRESS OF STRING ; PUSHJ P,TYPSTR ; ALWAYS RETURN HERE TYPSTR: PUSH P,SC ;SAVE SC HRLI T1,(POINT 7,0) ;MAKE IT AN ASCII BYTE POINTER TYPST1: ILDB SC,T1 ;GET NEXT CHARACTER OF STRING JUMPE SC,TYPST2 ;DONE ON ZERO BYTE PUSHJ P,TYPCHR ;STORE THE CHARACTER JRST TYPST1 ;LOOP FOR NEXT TYPST2: POP P,SC ;RESTORE SC POPJ P, ; AND RETURN ;ROUTINE TO STORE ONE CHARACTER IN THE MESSAGE BUFFER AND FLUSH ;THE BUFFER WHEN A LINE FEED IS SEEN. ;CALL MOVEI SC,CHARACTER ; PUSHJ P,TYPCHR ; ALWAYS RETURN HERE TYPCHR: CAIE SC,.CHCRT ;END OF THE LINE? JRST TYPCH1 ;NO, CONTINUE EXCH SC,MSGPTR ;SAVE CHARACTER, GET MSGPTR MOVEM SC,EOLPTR ;SAVE AS END-OF-LINE POINTER EXCH SC,MSGPTR ;RESTORE MSGPTR, SC TYPCH1: SOSL MSGCNT ;ROOM IN THE BUFFER? IDPB SC,MSGPTR ;YES, STORE THE CHARACTER TLNN F,L.QUE ;IF QUEUE. ONLY, MAY BE MULTIPLE LINES CAIE SC,.CHLFD ;LINE FEED? POPJ P, ;NO, RETURN NOW DMPBUF: PUSHJ P,SAVE1 ;SAVE P1 MOVEI P1,0 ;STORE A ZERO BYTE AT IDPB P1,MSGPTR ; THE END OF THE STRING IFN FTUNSUPPORTED,< MOVE P1,[3,,MSGARG] ;GET ARG FOR TRMOP. TRMOP. P1, ;TYPE THE STRING ON THE USER'S TERMINAL CAIA ;FAILED, HAVE TO USE OUTSTR JRST TYPCH2 ;GO RESET THE POINTERS PUSHJ P,ATTCHK ;ATTACHED TO A TERMINAL? JRST TYPCH2 ;NO, FORGET IT > IFE FTUNSUPPORTED,< TLNN F,L.INI ;IN INITIALIZATION? SKIPE .JBDDT ;OR DDT LOADED? > CAIA ;WANT TO DO OUTSTR JRST TYPCH2 ;DON'T TLNN F,L.QUE ;DON'T EVER IN QUEUE. MODE OUTSTR MSGBUF ;TYPE THE STRING WITH OUTSTR TYPCH2: TLNE F,L.QUE ;QUEUE. ONLY? JRST TYPCHQ ;YES, DON'T CHANGE FORMAT TLNN F,L.OPR ;TELL OPERATOR ALSO? JRST TYPCH3 ;NO MOVEI P1,"]" ;GET INFORMATIVE MSG END CHARACTER IDPB P1,EOLPTR ;OVERWRITE THE LINE TERMINATOR MOVEI P1,.CHCRT ;NOW PUT THE NEW LINE TERMINATOR IDPB P1,EOLPTR ; IN PLACE AND TERMINATE THE LINE MOVEI P1,.CHLFD ; WITH THE APPROPRIATE TERMINATOR IDPB P1,EOLPTR ;... MOVEI P1,0 ;... IDPB P1,EOLPTR ;... PUSH P,T1 ;SAVE T1 PUSHJ P,FNDOPR ;FIND OPR TTY JFCL ;??? USE LAST VALUE WE FOUND POP P,T1 ;RESTORE T1 MOVE P1,[3,,OPRARG] ;GET ARG FOR TRMOP. SKIPN .JBDDT ;DON'T TELL OPERATOR IF DEBUGGING TRMOP. P1, ;TELL THE OPERATOR JFCL ;WE TRIED HRRZ P1,EOLPTR ;GET THE BYTE POINTER TO LAST BYTE SUBI P1,MSGERR-1 ;COMPUTE LENGTH (IN WORDS) OF STRING HRLM P1,QUELEN ;STORE AS WTO LENGTH JRST TYPCQ1 ;ONWARDS TYPCHQ: HRRZ P1,MSGPTR ;COUNT FROM END OF TEXT SUBI P1,MSGBUF-1 ;LENGTH TO END (SKIPPING SILLY ^G[DAEMON: ) HRLM P1,KLQTXT ;DIFFERENT BLOCK FOR KLINIK SKIPA P1,[7,,KLKQUE] ;YES, NEED TO INCLUDE HEADER ARG TYPCQ1: MOVE P1,[7,,QUEARG] ;SETUP FOR QUEUE. SKIPN .JBDDT ;DON'T DO WTO IF DEBUGGING QUEUE. P1, ;TELL THE OPERATOR ALSO JFCL ;WE TRIED TYPCH3: MOVE P1,MSGPT1 ;GET VIRGIN BYTE POINTER MOVEM P1,MSGPTR ;AND STORE IT IN WORKING POINTER MOVEI P1,LINSIZ ;GET MAX CHARS IN STRING MOVEM P1,MSGCNT ;AND SAVE NEW COUNT POPJ P, ;RETURN ;ROUTINE TO FIND THE TTY TO WHICH WE ARE TO WRITE OUR MESSAGES. ;THIS TTY IS, IN ORDER: OPR0, CTY, OPR. ;CALL PUSHJ P,FNDOPR ; RETURN HERE IF COULDN'T FIND ONE ; RETURN HERE IF FOUND ONE WITH TTY UDX IN OPRLIN FNDOPR: MOVE T1,[SIXBIT/OPR0/] ;FIRST TRY WITH OPR0 IONDX. T1, ;GET IT CAIA ;FAILED JRST FNDOP1 ;RETURN MOVSI T1,'CTY' ;SECOND TRY IS CTY IONDX. T1, ;GET IT CAIA ;FAILED JRST FNDOP1 ;RETURN MOVSI T1,'OPR' ;THIRD TRY IS OPR IONDX. T1, ;GET IT POPJ P, ;FAILED, RETURN FNDOP1: MOVEM T1,OPRLIN ;STORE VALUE IN OPRLIN JRST CPOPJ1 ;GIVE SKIP RETURN SUBTTL STORAGE ; LOCATIONS FOR OUTPUT ROUTINES EOLPTR: BLOCK 1 ;POINTER TO CR IN LAST MESSAGE MSGPT1: POINT 7,MSGBUF ;INITIAL POINTER FOR MESSAGE BUFFER ;***DMOVED MSGPTR: POINT 7,MSGBUF ;WORKING POINTER FOR MESSAGE BUFFER MSGCNT: EXP LINSIZ ;COUNTER FOR MESSAGE BUFFER ;***END DMOVED IFN FTUNSUPPORTED,< MSGARG: EXP .TODSP ;TRMOP. ARG BLOCK TO TYPE MESSAGE MSGLIN: BLOCK 1 ; ON USER'S TERMINAL EXP MSGBUF > QUEARG: EXP QF.PIP!QF.NBR!.QUWTO ;FUNCTION FOR NON-BLOCKING WTO EXP -1 ;-1=NODE NUMBER FOR CENTRAL SITE EXP 0 ;NO RESPONSE WANTED XWD MSGHDL,.QBTYP ;LEN,,FUNCTION EXP MSGHDR ;ADDRESS OF STRING QUELEN: XWD 0,.QBMSG ;LEN,,FUNCTION (LEN FILLED IN LATER) EXP MSGBUF ;ADDRESS OF STRING KLKQUE: EXP QF.PIP!QF.NBR!.QUWTO ;FUNCTION FOR NON-BLOCKING WTO EXP -1 ;-1=NODE NUMBER FOR CENTRAL SITE EXP 0 ;NO RESPONSE WANTED KLQLEN: XWD 0,.QBTYP ;LEN,,FUNCTION (LEN FILLED IN LATER) EXP KLQHDR ;ADDRESS OF STRING KLQTXT: XWD 0,.QBMSG ;JUST TEXT EXP MSGBUF ;TEXT KLQHDR: BLOCK <<^D80+3+4>/5>+1 OPRARG: EXP .TODSP ;TRMOP. ARG BLOCK TO TYPE MESSAGE OPRLIN: BLOCK 1 ; ON DEVICE OPR EXP MSGERR MSGHDR: ASCIZ /Message from DAEMON/ MSGHDL==.-MSGHDR ;***** KEEP THE FOLLOWING TOGETHER MSGERR: ASCII/[DAEMON: / ;MUST BE EXACT MULTIPLE OF 5 CHARS MSGBUF: BLOCK </5>+1 ;***** END OF KEEP TOGETHER IFN FTUNSUPPORTED,< ; LOCATIONS FOR THE TTY INPUT SCANNER TTIBP: POINT 7,TTIBUF TTIPTR: BLOCK 1 TTIBUF: BLOCK /5 ;FILE SPECIFICATION AREA F.ZER:! F.DEV: BLOCK 1 F.NAM: BLOCK 1 F.EXT: BLOCK 1 F.DIR: BLOCK 1 ;PTR TO DIRECTORY F.DIRP: BLOCK 2 F.PTH: BLOCK .FXLNF ;ROOM FOR DIRECTORY F.EZER==.-1 > ;END IFN FTUNSUPPORTED END DAEMON