Trailing-Edge
-
PDP-10 Archives
-
BB-BT99V-BB_1990
-
10,7/daemon/daemon.mac
There are 17 other files named daemon.mac in the archive. Click here to see a list.
TITLE DAEMON - PROGRAM TO SERVICE USER REQUESTS V24(1032) - 23-JAN-90
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
VWHO==0 ;WHO LAST UPDATED THIS CUSP
VDAEMON==24
VMINOR==0 ;MINOR VERSION NUMBER
VEDIT==1032
;********************************************************************
;* 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==705 ;MONITOR
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
; 1971,1978,1979,1980,1981,1982,1985,1986,1987,1988,1989,1990.
; 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,1990.
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:.
;
;1026 RCB 05-Apr-89
; Add EH.AVL to the flags defined in our ERROR.SYS entry header
; so that we can write system error blocks to AVAIL.SYS.
; This will be used as we covert the monitor from using old
; ERRPT.-style blocks to SE blocks for error reporting.
;
;1027 DPM 05-Sep-89
; Add EH.NER to the flags defined in our ERROR.SYS entry header
; which signifies that the record is NOT destined for ERROR.SYS.
; Presumably, the monitor will lite EH.AVL, causing the record
; to be written elsewhere.
;
;1030 DPM 14-Nov-89
; Strip out old error logging stuff and code to read crash files.
; The monitor now prepares fully formatted system error blocks
; and reads crash files on startup.
;
;1031 DPM 5-Dec-89
; Require %CNDAE to return 705. If not, run another DAEMON.
;
;1032 DPM 23-Jan-90
; Remove AVAIL.SYS code. SPEAR %2(1152) will extract the necessary
; data from ERROR.SYS. Also remove code which incorrectly rolled the
; file over every 7 days. SPEAR knows how to do this correctly.
;
; 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 LINSIZ,^D200 ;MAX CHARACTERS/LINE
ND ERRDEV,SIXBIT/SYS/ ;SYS IS THE RIGHT PLACE
ND ERRPPN,<0> ;UFD (DEFAULT SYS:) FOR HARDWARE ERROR LOG FILE
ND ERRSIZ,777 ;LARGEST ERROR-FILE TRANSACTION
ND MAXINT,^D100000 ;NUMBER OF ERROR INTERCEPTS BEFORE STOPING
;AUTOMATICALLY
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 IOERQ,-2 ;TIMER TO RETRY ERRORS ON ERROR.SYS
;AC'S
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
F=13 ;FLAGS
SC=16 ;16 USED AS CHAR AC IN COMMAND SCANNER
P=17 ;PUSH DOWN LIST PTR
;I/O CHANNELS
FCT==10
;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 (<?>,<MSG>,FLG,LBL)
>
DEFINE WARN (MSG,FLG,LBL),<
ERRWRN (<%>,<MSG>,FLG,LBL)
>
DEFINE TELL (MSG,FLG,LBL),<
ERRWRN (< >,<MSG>,FLG,LBL)
>
DEFINE ERRWRN (PFX,MSG,FLG,LBL),<
PUSHJ P,ERRMSG
XLIST
..XX==0
..YY==0
IRP FLG,<
IFIDN <FLG>,<STOP>,<..XX==..XX!<ER.STP_-^D23>>
IFIDN <FLG>,<NOCRLF>,<..XX==..XX!<ER.NCR_-^D23>>
IFIDN <FLG>,<OPR>,<..XX=..XX!<ER.OPR_-^D23>>
>
IFNB <PFX>,<..YY=="'PFX'">
IFB <LBL>,<CAI ..XX,[XWD ..YY,[ASCIZ\MSG\]]>
IFNB <LBL>,<CAIA ..XX,[XWD ..YY,[ASCIZ\MSG\]]
JRST LBL>
LIST
>
;FLAGS IN F
L.ANY==(1B8) ;SET IF ANY JOBS REQUIRING DAEMON SERVICE FOUND DURING SCAN
L.OPR==(1B9) ;SET IF MESSAGE SHOULD GO TO OPR
L.INI==(1B11) ;SET DURING INITIALIZATION TO INHIBIT TYPING
;ERROR MESSAGES ON OPR
L.QUE==(1B12) ;OPR GOES ONLY TO ORION VIA QUEUE.
R.NEB==1B21 ;NO ERROR BLOCK FOR THIS CALL TO ERRINI, USE
;BOOT CPU SERIAL NUMBER
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
JACCT==1 ;THE GODLY BIT
;BITS IN JBTSTS WORD - RH
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.
;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
;MISCELLANEOUS
B2WLSH==7 ;BITS TO SHIFT TO CONVERT BLOCKS TO WORDS
BLKSIZ==200 ;NUMBER OF WORDS PER BLOCK
PAGSIZ==1000 ;SIZE OF PAGE IN WORDS
MAXUCR==1000 ;MAXIMUM BLOCK TO READ FROM USER CORE
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,DAEREN ;REENTER FOR 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
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 <Unprivileged job >,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
WARN <Wrong version of DAEMON run; Invoking SYS:>,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>
MOVEI T1,RUNBLK ;POINT TO RUN UUO BLOCK
MOVSI T2,'SYS' ;DEVICE
MOVEM T2,.RNDEV(T1)
MOVSI T2,'DAE' ;LH OF OUR NAME
HRR T2,P1 ;AND RH VERSION
MOVEM T2,.RNNAM(T1)
SETZM .RNEXT(T1) ;DEFAULT TO .EXE
SETZM .RNPPN(T1) ;SYS IMPLIES A PPN
SETZM .RNMEM(T1) ;NO CORE ARGUMENTS
RUN T1,UU.PHY ;RUN THE NEW DAEMON
HALT . ;NEVER RETURN
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 SPYING
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 ;MORE THAN 128K?
MOVEI T1,377777 ;YES, REDUCE TO THE MAXIMUM
SPY T1, ;SET SPY
ERROR <Can't SPY on the monitor>,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 <Can't get core for NUMTAB>,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 <Can't get CTY line number>,STOP
;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE
;GET, SAVE ORIGINAL FILE STRUCTURE SEARCH LIST FOR THIS JOB
MOVE T1,[3,,[.PTFSL ;DEFINE ADDITIONAL PATH TO BE SEARCHED
0 ;NO LIB, NO SYS, NO NEW, NO PROBLEMS
0]] ;DON'T WASTE A PPB
PATH. T1, ;SET UP
JFCL ;WHAT ISN'T IMPLEMENTED CAN'T HURT US
MOVE T1,[.STDFL,,.DFERR] ;ARG TO SET DSKFUL ERROR
SETUUO T1, ;DO IT
WARN <SETUUO to set DSKFUL ERROR failed>,OPR
;HERE TO CHECK FOR OTHER DAEMON'S RUNNING AROUND
MOVE T1,[.STDAE,,1] ;FUNCTION,,SET
SETUUO T1, ;MAKE US THE SYSTEM DAEMON
ERROR <Cannot become system DAEMON>,STOP
JRST GETJIF ;PRESS ON
ERROR <DAEMON already running in job >,NOCRLF
MOVE T1,[%CNDJN] ;SET UP GETTAB
PUSHJ P,GTBSPY ;GET REAL DAEMON'S JOB NUMBER
SETZ T1, ;???
PUSHJ P,TDEC ;PRINT IT
TELL <; cannot become system DAEMON>,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 ;GET NUMBER OF QUEUES LESS THAN 0
MOVNM T2,QPNTR ;SAVE IN QPNTR AS MOST NEG. QUEUE NO
ADD T2,.JBFF ;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 <Can't get core for clock table>,STOP
;HERE TO GET ADDRESS OF EXECT1 IN JOB DATA AREA
MOVE T1,[%CNET1] ;GETTAB THE ADDRESS OF EXEC T1
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,EXECT1 ;AND SAVE FOR LATER
;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 <Detaching>
ATTACH T1, ;DETACH OUR TTY
ERROR <DETACH failed>,STOP
NODET: TLZ F,L.INI ;NO LONGER IN INITIALIZATION
MOVEI T1,DALOOK ;
MOVEM T1,INTADR ;
SETOM WTUERR ;INIT FLAG TO CATCH RECURSIVE EXIT ATTEMPTS
SUBTTL CHECK FOR MONITOR-INITIATED DAEMON REQUEST
;HERE WHEN DAEMON AWAKENED
DALOOK: CAME P,PDL ;VERIFY STACK CORRECTNESS
MOVEM P,PDLGUF ;OR SAVE THE BAD GUY
MOVE P,PDL ;RESTORE GOODNESS
PUSHJ P,NBSDAT ;GET DATE/TIME
TLZ F,L.OPR+L.QUE ;CLEAR ASSORTED BITS
PUSHJ P,RSEBLK ;PROCESS ANY SYSTEM ERROR BLOCKS
JRST DALOKJ ;DONE, GO LOOK AT JOBS
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 ;CLEAR DUMP FLAG AND SAVE FLAG
MOVEM J,CURJOB ;SAVE LAST JOB EXAMINED FOR DEBUG
PUSHJ P,NBSDAT ;GET DATE/TIME
HRROI T1,.GTSTS
PUSHJ P,GTBSPY ;GET JBTSTS WORD FOR JOB
WARN <Failed to get JBTSTS in DALOKJ loop>,OPR,DALOO2
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,
JRST DETUSR ;RELEASE IT
DALOO2: CAME J,CURJOB ;MAKE DEFENSIVE CHECK
WARN <J/COMJOB mismatch in DALOKJ loop>,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
;HERE TO CHECK FOR EXPIRED CLOCK REQUESTS
SKIPN T2,NEXTUP ;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
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
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: MOVEM J,UUOJOB ;SAVE JOB NUMBER FOR DEBUGGING
TLO F,L.ANY ;SOMETHING HAPPENED, A UUO
MOVEI T1,DETUSR ;NEW RESTART ADDRESS
MOVEM T1,INTADR
MOVSI T1,.JBDA ;GET JOB DATA AREA
PUSHJ P,GTUCOR ;GET JOB'S JOB DATA AREA
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
;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
PUSHJ P,GTUCOR ;READ HIS CORE IMAGE
JRST UUERR2 ;ADDRESS CHECK
MOVE T1,USRCOR+1 ;GET THE TIME
PUSHJ P,CLKREQ ;PUT IN QUEUE
JRST UUOKX ;EXIT
;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
HRROI T1,.GTPPN ;SETUP JBTPPN INDEX
PUSHJ P,GTBSPY ;READ JOB'S PPN
SETZ T1, ;CAN'T
CAME T1,OPRPPN ;ARE YOU A GOOD GUY?
JRST UUERR6 ;NO--GET LOST
EAPUU1: MOVE T1,P2 ;GET XWD INTO T1
HLRE T2,T1 ;GET LENGTH INTO T2
JUMPLE T2,UUERR3 ;WRONG NUMBER OF ARGS
CAIN T2,1 ;ONLY 1 ARG (NULL ENTRY)?
JRST UUOKX ;YES, GOOD RETURN BUT DO NOTHING
CAILE T2,MAXUCR ;ARG BIGGER THAN OUR BUFFER?
JRST UUERR3 ;YES, WRONG NUMBER OF ARGS
PUSHJ P,GTUCOR ;GO READ HIS CORE
JRST UUERR2 ;ADDRESS CHECK
MOVE T1,USRCOR+1 ;GET CODE FOR ERROR FILE INTO T1
LSH T1,^D27 ;AND SHIFT IT TO GOOD PLACE
PUSHJ P,ERRINB ;GO PUT HEADER IN BUFFER
HLRZ T2,P2 ;RESTORE LENGTH OF ARG BLOCK
SUBI T2,2 ;MAKE T2 NUMBER OF DATA WORDS OF ENTRY
JUMPE T2,EAPUU2 ;SKIP ON IF NO DATA
HRLS T2 ;PUT IT INTO BOTH HALVES
HRRZI T1,1(P4) ;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 ;CHECK FOR OVERFLOW OF IOWD
BLT T1,(P4) ;AND BLT STUFF TO BUFFER
EAPUU2: PUSHJ P,ERRFIN ;WRITE ENTRY AND CLOSE FILE
JRST UUOKX ;GIVE GOOD RETURN
UUERR6: MOVEI T1,DMNPV% ;NO PRIVS TO DO THAT UUO
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
DMPUUO:!
FCTUUO:!
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
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
MOVSI T1,2 ;WRITE 2 WORDS
HRR T1,EXECT1 ;AT EXEC T1 IN USER'S JOBDAT
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
;HERE TO UUO USER OUT OF DAEMON REQUEST
DETUSR: MOVEI T1,DALOOK ;NEW RESTART ADDR
MOVEM T1,INTADR
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 DALOO2 ;FINISH UP
SUBTTL ERRORS
E.GTBF: ERROR <Necessary GETTAB failed>,STOP
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
SUBTTL SUBROUTINES TO WRITE USER CORE
;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 <Error returning values from DAEMON UUO>,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 <UUOFNC=>,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
SUBTTL SUBROUTINES TO READ USER CORE
;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 <Error reading arguments for DAEMON UUO>,OPR,JPKUER
;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,PAGSIZ-1 ;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 <JOBPEK failed with unexpected error code>,OPR
TELL <Code=>,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 <Job=>,NOCRLF
MOVE T1,J ;JOB NUMBER
PUSHJ P,TDEC ;...
TELL <, JBTSTS=>,NOCRLF
HRROI T1,.GTSTS ;GETTAB FOR JBTSTS
PUSHJ P,GTBSPY ;GET THE VALUE
SETZ T1,
PUSHJ P,THALF ;TYPE IT
TELL <, JBTADR=>,NOCRLF
HRROI T1,.GTADR ;GETTAB FOR JBTADR
PUSHJ P,GTBSPY ;GET THE VALUE
SETZ T1,
PUSHJ P,THALF ;TYPE IT
PUSHJ P,OCRLF ;END THE LINE
JRST CPOPJ1
;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 ;SAVE INT PC
PUSH P,T1 ;SAVE AC FOR INT ROUTINE
SETZB T1,INTBLK+2 ;AND ENABLE INTERRUPTS AGAIN
EXCH T1,INTBLK+3 ;GRAB & CLEAR REASONS
MOVEM T1,INTFLG ;SAVE FOR DEBUG
MOVE T1,-1(P) ;GET PC
TLZ F,L.OPR!L.QUE ;MAKE SURE OPR MESSAGE BIT IS CLEAR
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
JFCL ;WE TRIED
REGO:
REGO1: AOS T1,INTGUF ;COUNT THE INTERCEPTS
CAIL T1,MAXINT ;TOO MANY?
ERROR <Error intercept count exceeded>,STOP
HRRZ T1,-1(P) ;RETURN WITH PC IN T1
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
;HERE TO TYPE MESSAGE AND PC FOR ERROR DURING STARTUP
TYPIPC: ERROR <Error intercept @PC >,NOCRLF
PJRST TOCT ;PRINT IN OCTAL
;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: 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
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 IOECLR ;(-2) CLEAR I/O ERROR ON ERROR.SYS
EXP CPOPJ ;(-1) FORCE OUT THE FACT BUFFER
CLKDSP: EXP CPOPJ ;(0) CHECKPOINT JOBS
;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,
IOECLR: SETZM IOERR ;CLEAR FLAG SO ERRFIN RETRIES NOW
POPJ P, ;RETURN
;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:
RSEBL1: MOVE T1,[XWD <ERAEND-ERABUF>,ERABUF] ;POINT AT BUFFER AREA
SEBLK. T1, ;ASK MONITOR FOR NEXT SYSTEM ERROR BLOCK
POPJ P, ;NO MORE ERROR BLOCKS
CAILE T1,<ERAEND-ERABUF> ;DID THIS ONE GET TRUNCATED?
WARN <System error block was truncated>,OPR
LDB T1,[POINTR ERABUF+.EHTYP,EH.HLN] ;GET PURPORTED HEADER LENGTH
CAXE T1,EL.HED ;DOES MONITOR'S IDEA AND OURS AGREE?
ERROR <System error block length inconsistent>,OPR,RSEBL1
PUSHJ P,SEBLOG ;LOG THE SYSTEM ERROR BLOCK
JRST RSEBL1 ;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
IOR T1,ERABUF+.EHTYP ;MAKE THIS LOOK LIKE A GOOD ERROR ENTRY
MOVEM T1,ERABUF+.EHTYP ;SET FINAL TYPE WORD
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,ERABUF+EL.HED-1 ;ACCOUNT FOR SUBTRACT AT ERFILL
PJRST ERRFIN ;STUFF THIS ENTRY IN ERROR.SYS AND RETURN
;SUBROUTINE TO APPEND TO ERROR.SYS
;ARGS P4=LAST ADDR STORED IN ERRBUF
;BLOWS T1-3
;ALWAYS RETURNS CPOPJ
ERRFIN: SKIPE IOERR ;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
TRZ F,R.INF ;MAKE SURE THIS BIT IS OFF
INIFIN: MOVX T1,UU.PHS!.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 ;GET DEVICE WHERE ERROR.SYS LIVES
MOVEM T1,SSELBK+4 ;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 ;IN IPCF MSG TOO
MOVE T1,[SIXBIT/ERROR/]
MOVEM T1,RBNAME ;STORE FILNAM
MOVEM T1,SSELBK+5 ;IN IPCF PACKET TOO
HRLZ T1,ERREXT ;GET CURRENT ERROR EXTENSION
MOVEM T1,RBEXTE ;STORE EXT
MOVEM T1,SSELBK+6 ;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
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 ;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 ;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 ;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
RELFCT: RELEAS FCT, ;RELEASE THE CHANNEL
POPJ P, ;RETURN
ERFIL0: TRNE F,R.INF ;DOING SEQUENCE # INITIALIZATION?
JRST ERRFIX ;SO GIVE UP NOW
MOVEI T2,1 ;SO USETO WILL WRITE FIRST BLOCK
ERFIL3: SETZM ERRBUF ;CLEAR FIRST WORD
MOVE T1,[ERRBUF,,ERRBUF+1] ;[534] SET UP TO CLEAR ANY JUNK
BLT T1,ERRBFE ;BLITTTT!
MOVE T1,[.ESOFF_9,,1];PUT POINTER TO FIRST ENTRY IN BLOCK
MOVEM T1,ERRBUF ;INTO FIRST WORD OF BLOCK
; 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,ERABUF+EL.HED-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,-<ERRBUF-1>(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
MOVE T1,ERABUF ;GET HEADER WD 0
MOVEM T1,SSELBK+2 ;INTO THE IPCF PACKET
MOVE T1,ERABUF+1 ;GET HEADER WD 1
MOVEM T1,SSELBK+3 ;INTO IPCF PACKET
PUSHJ P,SNDSEL ;SEND PACKET TO SYSTEM ERROR LOGGER
MOVEI T1,^D10 ;REINITIALIZE NUMBER
MOVEM T1,IERCNT ;OF ERROR RETRIES
MOVEM T1,NEWEXT ;AND COUNT ON NEW EXTENSIONS IN ROW
ERFIL4: RELEAS FCT, ;RELEASE THE CHANNEL
JRST ERRFIX ;NO, EXIT CLEARING ALL FLAGS
;+[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
;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
HRR T1,HEADR0 ;FORMAT VERS & HEADER LEN
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
SETZ T2,
ASHC T1,-^D17 ;JIFFIES*2**18 IN T2[7(55)]
DIV T1,JIFDAY ;DAYS IN LH, FRACTION IN RH
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: SKIPA T1,[%CNDTM] ;GETTAB ARG FOR UDT
;ROUTINE TO RETURN THE UPTIME IN TICKS IN T1.
GETUPT: MOVE T1,[%CNSUP] ;GETTAB ARG FOR SYSTEM UPTIME
PUSHJ P,GTBSPY ;GET IT
SETZ T1, ;SHOULDN'T FAIL
POPJ P, ;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
SKIPN ERPTBK+2 ;IS THIS AN OLD MONITOR?
BOOTCP: MOVE T1,[%CNSER] ;USE BOOT CPU SERIAL NUMBER
PUSHJ P,GTBSPY ;NO, GET IT
SETZ T1, ;SHOULDN'T FAIL
POPJ P, ;RETURN WITH NUMBER IN T1
;NEW ROUTINES TO PROCESS I/O ERRORS ON ERROR.SYS
;HERE IF INIT FAILS
E.IEF: TRNN F,R.INF ;DOING SEQUENCE # INITIALIZATION
SETOM IOERR ;SET FLAG SO WE STOP TRYING
RELEAS FCT, ;RELEASE THE CHANNEL
ERRFIX: TXNE F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION
JRST E.INF1 ;YES, GIVE UP
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: 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
RELEAS FCT, ;RELEASE THE 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 <Unable to resync sequence number from error file>,OPR
WARN <Computed initial value-1 is >,NOCRLF
PUSHJ P,TDEC ;TYPE THE NUMBER
PUSHJ P,OCRLF ;END MESSAGE AND RETURN
JRST RELFCT ;RELEASE CHANNEL
E.INF1: WARN <Unable to initialize error file sequence number>,OPR
WARN <Resyncing sequence number to 1>,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: 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
RELEAS FCT, ;RELEASE THE 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,UU.PHS!.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 <Too many error files found>,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
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
;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
;CALL: PUSHJ P,FNDXXX
; NOT THERE
; RETURN WITH T1=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
;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
MOVX T1,UU.PHS!.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
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.)
PDL: IOWD PDLEN,PDLIST
HEADR0: INSVL.(EL.FVR,EH.FFM)!INSVL.(EL.HVR,EH.HFM)!INSVL.(EL.HED,EH.HLN)
ERRSEQ: EXP 0 ;SEQUENCE NUMBER
QUECOD: POINT 5,T1,14
SELPTR: XWD .IPCPL,.GTSID ;GETTAB ARG FOR SEL PID
JBTCLK: Z 0(J)
IOERR: BLOCK 1 ;FLAG TO STOP IO TO ERROR FILE
IERCNT: EXP ^D10 ;COUNTER FOR TIMED RETRIES
NEWEXT: EXP ^D10 ;COUNT TO PREVENT TOO MANY NEW EXTS. IN ROW
CERDEV: ERRDEV ;DEVICE FOR ERROR FILE
ERREXT: 'SYS' ;ERROR FILE EXTENSION
ERRDTM: BLOCK 1 ;OLDEST (FIRST) ENTRY DATE/TIME
CERPPN: ERRPPN ;PPN FOR ERROR FILE
XLIST ;LITERALS UNDER XLIST
LIT
LIST
ZER:!
CTYLIN: BLOCK 1 ;LINE NUMBER FOR CTY
RUNBLK: BLOCK 6 ;RUN UUO BLOCK
DAQNAM: BLOCK 1
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
GTBST: BLOCK 1 ;BEGINNING OF TABLE OF GETTAB PTRS
HJOB: BLOCK 1 ;HIGHEST JOB NO IN RH
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.
PDLIST: BLOCK PDLEN
EXECT1: BLOCK 1 ;WORD FOR ADDRESS OF EXEC AC T1 IN USER'S JOBDAT
ERPTBK: BLOCK 4 ;4 WORD BLOCK FOR ERRPT. UUO
THSJOB: BLOCK 1 ;OUR JOB NUMBER
THSLIN: BLOCK 1 ;OUR LINE NUMBER
USRCOR: BLOCK MAXUCR+BLKSIZ
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
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)
ZZZDTM: BLOCK 1 ;UNIVERSAL DATE/TIME OF LAST WAKE AT ZZZ
PDLGUF: BLOCK 1 ;DEBUG - CONTAINS ERRONEOUS P CONTENTS
GTBGUF: BLOCK 1 ;DEBUG - COUNTS MISTAKES IN GTBSPY
FINGUF: BLOCK 1 ;DEBUG - COUNTS DAEFIN ERROR RETURNS
WAKGUF: BLOCK 1 ;DEBUG - COUNTS ERROR RETURNS FROM WAKE UUO
INTGUF: BLOCK 1 ;DEBUG - COUNTS INTERCEPTS
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 ;IPCF PACKET DESCRIPTOR BLK \*** KEEP
SSELBK: BLOCK 10 ;IPCF MSG AREA /*** TOGETHER
IFN FTDEBG,< ;DON'T WASTE SPACE
PATT: BLOCK 100 ;SPACE FOR PATCHES
>
SAVEP4: BLOCK 1 ;SAVE P4 HERE IN ERRFIN
NSYN==<ERRSIZ+EL.HED+BLKSIZ-1>/BLKSIZ ;MAX NUMBER OF RESYNC POINTERS
ERRBUF: BLOCK <<BLKSIZ+ERRSIZ+EL.HED+NSYN>!177>+1 ;LAST BLOCK OF ERROR.SYS
ERRBFE=.-1 ;END OF THE BUFFER
EZER==.-1
ERABUF: BLOCK ERRSIZ+EL.HED+2 ;FILL TO END OF BLOCK
ERAEND==.-1
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
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
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.
;CALL PUSHJ P,FNDOPR
; RETURN HERE IF FOUND ONE WITH TTY UDX IN OPRLIN
FNDOPR: MOVE T1,[%CNOPR] ;TRY FOR DEVOPR
PUSHJ P,GTBSPY ;ASK MONITOR
CAIA ;???
IONDX. T1,UU.PHY ;TRANSLATE TO AN I/O INDEX
SKIPA T1,CTYLIN ;FAILED--USE CTY LINE NUMBER
CAIA ;GO STORE
TLO T1,.UXTRM ;MAKE IT A UDX
MOVEM T1,OPRLIN ;STORE VALUE IN OPRLIN
POPJ P, ;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
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 <<LINSIZ+4>/5>+1
;***** END OF KEEP TOGETHER
END DAEMON