Trailing-Edge
-
PDP-10 Archives
-
BB-F493Z-DD_1986
-
10,7/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 V22(1012) - 31-DEC-85
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==22
VMINOR==0 ;MINOR VERSION NUMBER
VEDIT==1012
;********************************************************************
;* 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==703 ;7.03 MONITOR
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1971,1978,1979,1980,1981,1982,1985,1986.
;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.
;
; 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 <ERRDEV-'DSK '>,<
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,<FTCHKPNT==0> ;RE-DEFAULT CHKPNT IF FACT TURNED OFF
ND FTCHKPNT,1 ;0 TO SUPPRESS CHKPNT FCN
ND FCTDEV,SIXBIT/SYS/ ;SYS IS UNAMBIGUOUS
IFE <FCTDEV-'DSK '>,<
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 (<?>,<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
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
.CHSYS==1 ;LH - POINTER TO NEXT CHAN DATA BLOCK
.CHLUE==1 ;RH - POINTER TO UDB WITH MOST RECENT ERROR
.CHICW==2 ;INITIAL CONTROL WORD FROM LAST ERROR
.CHDW0==11 ;DATA WORD POINTED TO BY .CHFCW
.CHMPE==12 ;COUNT OF MEM PAR ERRS ON THIS CHANNEL
.CHDPE==13 ;COUNT OF DEVICE PARITY ERRORS ON THIS CHANNEL
.CHNXM==14 ;COUNT OF NON-EX MEMS ON THIS CHANNEL
.CHTCW==16 ;EXPECTED CHANNEL TERMINATION WORD OF LAST ERROR
; THIS VALUE IS GETTABED, BUT DEFINED FOR GETTAB FAILURE
;UNIT DATA BLOCK ITEMS
UNINAM==0 ;UNIT NAME
UNILOG==1 ;LOGICAL UNIT WITHIN STR
UNIHID==2 ;SIXBIT HOME-BLOCK ID NAME (PACK ID)
UNISYS==3 ;LH - ADDR OF NEXT UNIT DATA BLOCK IN SYSTEM
;0 = NO MORE
;RH - UP POINTER TO STR DATA BLOCK
UNICHN==5 ;LH - ADDR OF NEXT UDB ON SAME CHANNEL (RING)
;RH - UP POINTER TO CHAN DATA BLOCK
UNIKON==6 ;POINTER TO CONTROLLER DATA BLOCK FOR THIS UNIT
UNIHCT==10 ;HARD (UNRECOVERABLE) ERRORS ON THIS UNIT
;LH - DEVICE & SEARCH ERRORS
;RH - DATA ERRORS
UNISCT==11 ;SOFT (RECOVERABLE) ERRORS - INCREMENTED WHEN
;RECOVERY SUCCEEDS. HALVES SAME AS UNIHCT.
UNIMCT==12 ;SOFTWARE-DETECTED ERRORS (3 FIELDS OF 12 BITS)
;SAT FAILURES, RIB REDUNDANCY ERRORS, FOLDED CHKSUM
UNIERR==13 ;LAST ERROR STATUS ON DEVICE AFTER FIRST RECOVERY ATTEMPT
UNISOF==14 ;ERROR STATUS BEFORE RECOVERY ATTEMPT
UNIHBN==15 ;LOGICAL BLOCK NO OF LAST HARD ERROR
UNIBRC==16 ;BLOCKS READ IN BUFFERED MODE
UNIBWC==17 ;BLOCKS WRITTEN IN BUFFERED MODE
UNIDRC==20 ;BLOCKS READ IN DUMP MODE (INCLUDING GET'S)
UNIDWC==21 ;BLOCKS WRITTEN IN DUMP MODE (INCLUDING SAVE'S)
UNIMRC==22 ;BLOCKS READ FOR MONITOR (SAT,UFD,MFC,BAT,SWAP)
UNIMWC==23 ;BLOCKS WRITTEN FOR MONITOR
UNIICT==24 ;SWAP READS (ALSO COUNTED IN UNIMWC)
UNIOCT==25 ;SWAP WRITES (ALSO IN UNIMWC)
UNIMSC==26 ;NO OF MONITOR & SWAPPING SEEKS
UNIUSC==27 ;NO OF USER (INCLUDING GET & SAVE) SEEKS
UNIPCT==30 ;SEEK INCOMPLETE ERRORS
UNISDI==32 ;DATAI WORD ON LAST ERROR BEFORE RECOVERY ATTEMPT
UNIHDI==33 ;DATAI WORD AFTER FAILURE OF FIRST RECOVERY ATTEMPT
UNIECT==34 ;NO OF RETRIES+INITIAL ATTEMPT WHICH FAILED
;BIT 0 SET IF SUCCESSFUL OPERATIONS SINCE ERROR
UNIHNG==35 ;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 OR TRANSFER WAIT
UNICDA==40 ;RH - ADDR OF DDB FOR CURRENT FILE
UNIDES==55 ;[551] UNIT DESCRIPTION(FOR DSKCHR)
;[551] BOTH UNICDA AND UNIDES ARE GETTABED, BUT ARE DEFINED
;HERE IN CASE OF GETTAB FAILURE
;TAPSER UNIT DATA BLOCK ITEMS (TUB)
;ALL ARE RELATIVE TO OFFSET OF TUBRID IN TUB, SINCE GETTAB RETURNS
;OFFSET OF TUBRID IN TUB
;AREA FROM TUBRID TO TUBDDA IS STATIC IN MONITOR, I.E. NO NEW WORDS
;WIIL BE ADDED. ALL WORDS ARE DEFINED HERE, EVEN IF NOT USED
;***************THESE TWO ITEMS ARE NOT RELATIVE TO TUBRID BUT SHOULD
;***************REMAIN STATIC. IF THEY CHANGE, A GETTAB SHOULD BE ADDED
;***************TO THE MONITOR TO RETURN THEM
TUBKDB==1 ;OFFSET OF UPWARD POINTER TO CONTROLLER DATA BLOCK IN TUB
TKBCDB==11 ;OFFSET OF UPWARD POINTER TO CHANNEL DATA BLOCK IN KDB
;**********************************
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
;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
.ESCIE==74 ;CI DISK ERROR CODE (TEMPORARY UNTIL IN UUOSYM)
;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==<<ERRSIZ+AWELEN+BLKSIZ-1>_-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,<MAXUCR==1000> ;IMPOSE JOBPEK LIMIT
IFL MAXUCR-BLKSIZ,<MAXUCR==BLKSIZ> ;AT LEAST ONE BLOCK
MAXUCR==MAXUCR&<-1_B2WLSH> ;FORCE BLOCK BOUNDARY
;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 <Can't find OPR terminal>,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 <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
JUMPL T1,PRVDAE ;GO BLT IN PREVIOUS VERSION OF DAEMON
ERROR <Old version of DAEMON run with new monitor>,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
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
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,<F%KLP&777777> ;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 <Can't get pointer to SWPTAB>,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 <Can't get offset of UNISLB>,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 <MAXUCR parameter doesn't match %CNJPK>,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 <SETUUO to set DSKFUL ERROR failed>,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,<MOVEI T1,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 <Search list definition failed>
> ;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 <JOBPEK UUO failed>,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 <DAEMON already running
?Please kill one of us>,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 <Can't get core for clock table>,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 <Can't get core for NXMTAB>,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 <File SYS:MAXCNF.SYS does not exist>,,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
MOVE T1,[%LDEXP]
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,CHNTCW ;[545] OFFSET TO EXP TERM WD IN CDB
;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 <Detaching>
ATTACH T1, ;DETACH OUR TTY
ERROR <DETACH failed>,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 <CRSCHK returned with L.DSK set>,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,<L.UUO+L.UPMP+L.SAVE+L.DUMP> ;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 DALOKJ ;NO MORE, GO LOOK AT JOBS
PUSHJ P,DSPERR ;DISPATCH TO CORRECT ROUTINE OFF CODE IN T1
JRST NEWLOK ;AND LOOP BACK FOR MORE
;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)
RPTERR ;53-NOT IMPLEMENTED
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
RPTERR ;75-NOT IMPLEMENTED
RPTERR ;76-NOT IMPLEMENTED
RPTERR ;77-NOT IMPLEMENTED
DSPMAX=.-DSPTAB
IFE FTUNSUPPORTED,<
SNXMER:
SCPERR:
SKLTRP:
>
RPTERR: WARN <Unimplemented error code >,NOCRLF
MOVE T1,T2 ;GET THE CODE
PUSHJ P,TOCT ;TELL OF THE ERROR
TELL < returned by ERRPT. UUO>,OPR
WARN <Error entry ignored>,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,<HRRI T1,.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,<L.NHRL+L.SAVE+L.DUMP> ;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 <Failed to get JBTSTS in DALOKJ loop>,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 <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
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,<L.UUO> ;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,<DMPUUO:>
IFL FTFACT,<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
IFE FTFACT,<FCTUUO: >
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 <DAEMON invoked to process a command, Job=>,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 <Can't set to user search list>
;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 <Unknown DAEMON command>
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 <E command no longer supported>,,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 <D command no longer supported>,,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 <VERSION command no longer supported>
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 <DUMP command doesn't work with KL-paging systems>,,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 <CR>
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 <SAVE and SSAVE commands no longer supported>,,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 <Neither SAVE nor DUMP/DCORE in DAEOPN>,,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 <CR><LF>. 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 <Can't reattach TTY to user job>,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 <Necessary GETTAB failed>,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 <Can't get swapping pointer for job>,OPR
PJRST SNH
E.HSTS: AOS HSSGUF
ERROR <Can't get high segment status for job>,OPR
PJRST SNH
E.UPMP: AOS UPMGUF
ERROR <Can't get UPMP for job>,OPR
PJRST SNH
E.SOPN: AOS SUOGUF
ERROR <Can't OPEN swap unit >,NOCRLF
MOVE T2,T3 ;GET SWAP UNIT NAME
PUSHJ P,TSIXN
JRST E.SWP1 ;JOIN COMMON CODE
E.SWPE: AOS SWPGUF ;COUNT ERROR
ERROR <Swap pointer inconsistency >,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 <File must be written on disk>
JRST E.DCOR
E.CCLE: PUSHJ P,CWF ;CHECK FOR UUO
ERROR <Error writing CCL file, code = >,NOCRLF
JRST E.DAE1
; STILL IFN FTUNSUPPORTED
E.DAEF: PUSHJ P,CWF ;CHECK FOR UUO AND ATTACH
ERROR <Error writing file, code = >,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+<<CHR>_.SHFT>
.SHFT==.SHFT-7
IFL .SHFT,<EXP .STRG
.STRG==0
.SHFT==^D29 >>
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 <Y> <B>,<..Z==0>
IFIDN <Y> <J>,<..Z==1>
IFIDN <Y> <S>,<..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 <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
>
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 <Swap write error unit >,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 <Error reading arguments for DAEMON UUO>,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,<HRRI T1,.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,<HRRI T1,.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 <Swap read error unit >,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 UNINAM
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 <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,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 <JOBPEK failed with unexpected error code >,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 <Error intercept count exceeded>,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 <Error intercept @PC >,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 <Output>,NOCRLF
JRST E.WRD1
E.WRD: ERROR <Input>,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 <Tried to overwrite data word>,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,<LBL: ..IFFT==1>>
..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,<BUFAGE==CPOPJ>
>;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==<ERRSIZ-DSC1ST>/<ZUSCL-XUSCL+1> ;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 UNINAM(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 UNINAM(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 UNINAM(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
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 UNINAM(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,UNIKON(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
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,UNIKON(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
JRST CPOPJ ;OOPS
HLRZ P2,T1 ;GET OFFSET OFTUBRID 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 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 <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
;HERE TO PROCESS SYSTEM ERROR BLOCKS FROM A CRASH FILE.
;NOTE WE DO THESE ALL IN ONE SHOT AND IGNORE ANY OTHER
;CODE 13 ENTRIES FROM THIS CRASH FILE.
RSEBL2: AOSE RSEFLG ;FIRST TIME FOR THIS CRASH FILE?
POPJ P, ;NO, WE'VE ALREADY DONE EVERYTHING WE NEED TO
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 <System error block length inconsistent from crash file>,OPR,CPOPJ
ANDI T1,777 ;KEEP JUST THE BODY LENGTH FIELD
ADD T1,T2 ;INCLUDE IN HEADER LENGTH
CAILE T1,<ERAEND-ERABUF> ;WILL WE TRUNCATE THIS ONE?
WARN <System error block truncated from crash file>,OPR
CAILE T1,<ERAEND-ERABUF> ;DON'T COPY MORE THAN WE CAN STORE INTERNALLY
MOVEI T1,<ERAEND-ERABUF> ;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 RSEBL2 ;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,UNINAM(P1) ;GET UDB ADDR INTO T1
PUSHJ P,PEKSPY ;AND GET FIRST WORD (UNINAM)
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,UNINAM(P1) ;ADDR OF FIRST UDB
PUSHJ P,PEKSPY ;PICK UP UNIT NAME
PUSH P4,T1 ;(R0) AND PUT IT INTO ERROR BUFFER
MOVEI T1,UNINAM(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
MOVEI T1,.CHLUE(P2) ;GET POINTER TO LAST UNIT WITH ERROR
PUSHJ P,PEKSPY
ANDI T1,-1 ;RH ONLY
JUMPE T1,CHNER1 ;STORE 0 IF DEVICE UNKNOWN
IFN UNINAM,<ADDI T1,UNINAM> ;ADDR OF NAME OF ERROR UNIT
PUSHJ P,PEKSPY ;PICK UP UNIT NAME
CHNER1: PUSH P4,T1 ;(R0) UNIT NAME
MOVEI T1,.CHNXM(P2)
PUSHJ P,PEKSPY ;GET NXM COUNT FOR THIS CHANNEL
PUSH P4,T1 ;(R1) NON-EX MEM COUNT
MOVEI T1,.CHMPE(P2)
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R2) MEM PAR ERR COUNT THIS CHANNEL
; MOVEI T1,.CHDPE(P2)
; PUSHJ P,PEKSPY
; PUSH P4,T1 ;(R3) DEVICE PARITY ERRORS
AOBJN P4,.+1 ;(R3) OBSOLETE
MOVSI T2,<.CHICW-.CHDW0-1> ;SETUP AOBJN WORD
HRRI T2,.CHICW(P2) ;WITH POINTER TO CHAN DATA BLOCK
CHNER2: MOVEI T1,(T2) ;GET ADDR TO EXAMINE
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R4-R13) CONTROL AND DATA WORDS
AOBJN T2,CHNER2
SKIPN T1,CHNTCW ;[545] GET OFFSET IF ANY
JRST CHNER3 ;[545] NONE, STORE ZERO
ADDI T1,0(P2) ;ADD OFFSET
PUSHJ P,PEKSPY
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,,MT0DDB
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,TUBKDB(P3) ;OFFSET TO KDB POINTER
PUSHJ P,PEKSPY ;READ KDB ADDRESS
MOVEI T1,TKBCDB(T1) ;OFFSET TO CDB POINTER
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,-<RNXNXM-RNXCS0+1> ;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,UNIKON(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,UNINAM(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
MOVNI T3,MAXREG ;GET TOTAL NUMBER OF REGS TO WRITE
POP P,T2 ;AND NUMBER SAVED BY MONITOR
ADD T3,T2 ;T3=-NUMBER LEFT OVER
SKIPL T3 ;IF T3 NOT LT 0,
SETZ T3, ;DEVICE MUS BE NEW-JUST SAVE MAXREG REGISTERS
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,-<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
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 <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: 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: 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
ENAMLP: 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 [HRRZ T2,RBEXTE ;GET ERROR CODE
CAIE T2,ERFNF% ;FILE NOT FOUND?
JRST .+1 ;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
HRRZM T1,ERREXT ;SAVE EXTENSTION
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
CAILE T1,'X77' ;HAS THE EXTENSION OVERFLOWED?
ERROR <Too many error files found>,OPR,E.IEF
JRST ENAMLP ;NO, LOOK UP THIS ONE
;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 <AVAIL.A77 already used, can't rename AVAIL.SYS>,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,-<ERRSIZ+AWELEN> ;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 <RBSIZE-RBCNTE> ;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
SETOM RSEFLG ;PRESET SYSTEM ERROR BLOCK 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,(<DSKX>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+<DSKX>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?
PJRST CRSINF ;YES, ALL DONE
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
;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,<F%KLP&777777> ;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 <Old monitor version detected while processing crash file on >,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 <Crash analysis aborted for this file>,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,-<P2WLSH+1> ;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-<LN.BUF/200>*200,<PRINTX LN.BUF MUST BE MULT OF 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
RSEFLG: 0 ;FLAG SET TO -1 INDICATING HAVEN'T PROCESSED
; ANY ENTRIES FROM SYSTEM ERROR BLOCK QUEUE
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
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]
CHNTCW: BLOCK 1 ;OFFSET TO EXP. TERM WD IN CDB [463]
; (I.E. THE VALUE OF .CHTCW)
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==<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
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 <DAEMON started on old monitor version>,OPR
WARN <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>,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 <Old DAEMON file not found>,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 <I/O error reading old DAEMON file>,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 <Inconsistent .EXE file format for old DAEMON file>,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 <Unable to allocate core for old DAEMON file>,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==<ERRSIZ+EL.HED+2>-<.-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 <Too many SFD's in file spec>
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 <Illegal directory spec>
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 <Input line too long>
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 <Multiple device specs illegal>
POPJ P,
MULDIR: ERROR <Multiple directory specs illegal>
POPJ P,
MULEXT: ERROR <Multiple file extension illegal>
POPJ P,
MULNAM: ERROR <Multiple file name illegal>
POPJ P,
NULDEV: ERROR <Null device illegal>
POPJ P,
SYNERR: ERROR <Syntax 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 <<LINSIZ+4>/5>+1
;***** END OF KEEP TOGETHER
IFN FTUNSUPPORTED,<
; LOCATIONS FOR THE TTY INPUT SCANNER
TTIBP: POINT 7,TTIBUF
TTIPTR: BLOCK 1
TTIBUF: BLOCK <LINSIZ+4>/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