1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-01-31 05:42:03 +00:00
Files
PDP-10.stacken/files/stacken-tape-backup/dskb:10_7/daemon/daemon.mac
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

9735 lines
339 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
TITLE DAEMON - PROGRAM TO SERVICE USER REQUESTS V23(1025) - 31-MAY-88
SUBTTL D BLACK/DAL/RCC/JSL/CER/RLD/SMM/BAH/PMW/WRS/KPY/TJW/ISM/DBD/JLG/GMU/RKB
SEARCH JOBDAT,MACTEN,UUOSYM
SALL ;PRETTY LISTINGS
.DIRECT FLBLST ;PRETTIER LISTINGS
.DIRECT SFCOND ;THIS DIRECTIVE SUPPRESSES ALL FAILING CONDITIONALS
;IN THE LISTING AND MAKES IT MORE READABLE. THEREFORE,
;THE CODE UNDER FTUNSUPPORTED NEVER APPEARS IN THE
;LISTING. COMMENT THIS DIRECTIVE OUT TO CAUSE
;THE FAILING CONDITIONALS TO APPEAR IN THE LISTING
VWHO==0 ;WHO LAST UPDATED THIS CUSP
VDAEMON==23
VMINOR==0 ;MINOR VERSION NUMBER
VEDIT==1025
;********************************************************************
;* The following symbol gives the version of the monitor that this *
;* version of DAEMON is built for. It must be changed for each new *
;* version of the monitor *
;********************************************************************
VMON==704 ;7.04 MONITOR
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1971,1978,1979,1980,1981,1982,1985,1986,1987.
;ALL RIGHTS RESERVED.
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
;TRANSFERRED.
;
;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
;CORPORATION.
;
;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1971,1978,1979,1980,1981,1982,1986.
ALL RIGHTS RESERVED.
\; \ ENDS COPYRIGHT-IN-EXE MACRO
; UPDATE SUMMARY AS OF VERSION 7(52)
;053 PARAMETER NOT SET UP CORRECTLY FOR GETLCH UUO IN ERROR
; INTERCEPTING ROUTINE AT INTRES+5 (SPR 10-11,097).
;054 NEW ROUTINES INTRODUCED TO PROVIDE ERROR REPORTING FOR
; MAGTAPES AS PART OF THE 507/601 RELEASE. NEW ROUTINES ARE
; COMPLETELY BACKWARD COMPATIBLE AND WILL NOT BE EXERSIZED FOR
; MONITORS PRIOR TO 50622.
;055 ERROR.SYS UPTIME INCORRECT BY FACTOR OF 4. ERRINI+14,
; MAKE ASHC OPERAND DECIMAL 17 RATHER THAN OCTAL.
;056 RANDOM PROTECTION OF FACT FILES. APPNDF+4, STORE AC A,
; RATHER THAN 0.
;057 FT1975, SUPPORT FOR NEW FORMAT FACT FILE ENTRIES, IN WHICH
; THE DATE LASTS PAST 1975.
;060 FIXES TO MAKE EDIT 54 WORK.
;061 FIX TO TAKE CARE OF AOBJN DIFFERENCE FROM KA TO KI. CLOCK
; REQUEST FOR HIGHEST JOB NUMBER WAS NOT GETTING SERVICED ON KA.
;062 ADD DEFENSIVE CODE TO HANDLE ERRORS ON ERROR.SYS. DAEMON WILL
; NOW WRITE ERROR.X01 TO ERROR.X77 IF NECESSARY.
;063 GENERATE CORRECT FORMAT DATE/TIME WORD IN FACT ENTRIES
;064 FIX FOR UNDEFINED SYMBOL NXTWAK IF USING CERTAIN NONSTANDARD
; FEATURE TEST SETTINGS
;065 CLEAR .JBINT ON EXIT
;066 INSURE THAT DUMP DOESN'T GET DONE IF AN ERROR THAT WILL PREVENT
; IT FROM WORKING IS DETECTED
;067 QPNTR IS STILL SET UP WRONG (ON KA AND KI).RH NEEDS TO BE
; -(# OF INTERNAL CLOCK REQUESTS -1). (SINCE 0 REPRESENTS
; A QUEUE IN JBTCLK.
;070 IMPLEMENTS 6.01 SUPPORT
;071 COMPLETES IMPLEMENTATION OF 6.01 SUPPORT AND INCLUDES THE
; SOURCE FOR SCANER AS PART OF DAEMON.MAC.
;072 MINOR EDIT TO CLEAN UP SOME SMALL DEFICIENCIES LEFT OVER FROM
; EDIT 71 AND TO PROVIDE A COMMON FATHER FOR SOUPS OF FUTURE
; DEVELOPMENT AND INTEGRATION OF IPCF STUFF
;073 EDITS PREPARING THE INTEGRATION OF [SYSTEM] INFO
; ALL [SYSTEM]INFO DEPENDENCIES ARE DETERMINED BY THE
; FEATURE SWITCH FTIPCF.THIS SWITCH IS DEFINED AS OFF
; FOR STANDARD RELEASES AND SHOULD NOT BE TURNED ON
; NOTE: THAT TURNING ON FTIPCF IMPLIES AN IMPURE VERSION.
; IT MIGHT BE REMARKED THAT A PURE DAEMON IS A RATHER
; IMPURE IDEA
;074 ADD THE CAPABILITY TO DAEMON TO RESTART ON ILLEGAL UUO'S
; ILL. MEM.REF ADDRESS CHECK EXTERNAL JOB ERROR,NXM ,PDL
; OVERFLOW
;075 FIX SOME BUGS AND CHANGE THE FORMAT OF A SAVE FILE SO THAT
; NON-CONTIGUOUS LOW SEGMENTS CAN BE 'GOTTEN' INTO A CORE IMAGE
; THAT RESEMBLES THE ORIGINAL. THIS IS DONE BY OUTPUTTING A NULL
; IOWD FOR EACH EXISTANT BUT ZERO PAGE.
;076 INSERT A NEW SUBROUTINE 'SCNBRK' TO FORCE TTY SCANNING
; TO GO TO END OF LINE FOR EACH DAEMON COMMAND.
;077 FIX A BUG INVOLVING USING THE WRONG HALF OF 'SEGSWP' TO STORE
; A SWAPPING POINTER BEFORE CALL TO REDPEC
;100 A BLIND ATTEMPT TO FIX WHAT MIGHT BE A PROBLEM GETTING UPMP'S
; OFF THE SWAPPING SPACE.
;101 START DAEMON AT DAEMON +2 WHEN RESTARTING IT,THIS WILL IDENTIFY
; THAT IT HAS TO DETACH FROM THE CURRENT TERMINAL AND SUPPRESS OTHER OUTPUT
; NOTE THAT RESTART ALWAYS DEFINED AND ALWAYS IS ZERO WHEN
; NO IPCF OR RESTART FUNCTIONS ARE WISHED
;102 FIX A SECURITY LEAK IN THE DCORE COMMAND
;103 CHANGE NAME TO DAE AND NO TO DUMMY
;104 INIT DSK:[1,4] INSTEAD OF SYS:[1,4] FOR FACT.SYS UPDATES
; AS ELSEWISE THE ENABLING OF NEW E.G. WILL LET
; THE UPDATE MODE ACCESS FAIL
;105 IF ANOTHER DAEMON IS RUNNING THEN JUST EXIT
; AND LET OPERATOR DECIDE WHAT TO DO
;106 AS 104 ERROR.SYS CANNOT BE UPDATED WITH AMBIGUOUS SYS
;107 A REENTER OF DAEMON FAILED TO EXIT WITH THE TERMINAL ATTACHED
; THIS WAS DUE TO THE OMISSION OF A JFCL AFTER THE ZAPRUN CALL
;110 EDIT ERROR IN EDIT 102 IN DAEOPN CODE
;110(A) WHEN A SECOND DAEMON IS RUNNING DAEMON SHOULD CALL
; DAEREN TO EXIT
;110(B) GIVE MORE INFORMATION THEN COULD NOT GET AT SWAP POINTER
;EDITS 111-210 RESERVED FOR SPECIAL RELEASES
;VERSION 10(110) RELEASED WITH ALL ABOVE EDITS
;ALL LATER EDITS IN VERSION 11
;211 FIX CODE TO HANDLE NEW SWAPPING POINTERS FOR
; 6.01 CORRECTLY
;212 REMOVE CRLF FROM JOB SAVED MESSAGE TO LOOK LIKE MONITOR
;213 FIX EXAMINE AND DEPOSIT COMMANDS FOR HIGH SEGMENTS
;214 CHECK FOR OUTPUT DEVICE OF NUL AND FINISH WITH NO IO IF TRUE
;215 FIX HIGH SEGMENT SAVE TO ONLY WRITE EXACT
; NUMBER OF WORD IN LAST BLOCK OF HGH OR SHR FILE
;216 FIX TO EDIT 62 TO MAKE DAEMON WRITE IN LAST ERROR.X?? FILE
; WHICH EXISTS ON ERRDEV
;217 FIX UNDEFINED GLOBALS ILIST AND OLIST IF FTFACT!FTCHKPNT=0
;220 FIX TO MAKE DAEMON SAVE DO SAME AS MONITOR DEPENDENT ON CONTENTS
; OF .JBCOR AND .JBHRL.
;221 FIX TO NOT ERROR INTERCEPT ON ALL IO.BKT ERRORS SO WE CAN
; REPORT THEM ON COMMANDS
;222 FIX 220 AND 215 TO DO THE RIGHT THING TOGETHER
;223 ADD EXTERNAL SYMBOLS SO SYSINF KNOWS START AND END OF DAEMON
;224 FIX TO 220/222 TO NOT SAVE .LOW IF .JBCOR .LT. 140
;EDITS 225-324 RESERVED FOR SPECIAL RELEASES.
;VERSION 11(224) RELEASED WITH ALL ABOVE EDITS. ALL LATER EDITS IN
;VERSION 12.
;325 ADD A FEATURE TEST TO CREATE THE ABILITY TO ASSEMBLE AS TWO
; SEPARATE PROGRAMS, ONE TO DO ALL COMMANDS AND THE DCORE FUNCTION
; OF THE UUO, AND ONE TO DO ERROR REPORTING, CHECKPOINTING,
; ACCOUNTING, OTHER UUO FUNCTIONS, AND SYSTEM INFO. THE FEATURE
; TEST IS FTSAVE, EQUAL -1 FOR SAVE ONLY, 0 FOR BOTH, AND +1
; FOR DAEMON ONLY. NOTE THAT FTIPCF=-1 OR FTRSTR=-1 WILL NOT
; WORK WITH FTSAVE=-1.
;326 ADD SUPPORT FOR RH10 DEVICES. THIS IMPLEMENTS THE SPECIAL DRIVE
; REGISTERS ON MASSBUS DEVICES. THIS EDIT IS ONLY INTENDED FOR
; RP04'SAND RS04'S ON SYSTEMS WITH THE RP04 LIR. IT WILL HAVE NO
; EFFECT ON SYSTEMS WITHOUT THE RP04 LIR.
;327 FIX SOME INCONSISTENCIES IN BEHAVIOR ON SAVE
;330 SAVE ADDRESS OF DDB ALONG WITH LENGTH SO USER CAN ASSOCIATE
; DDB'S WITH CHANNELS (SPR 14451)
;331 FINISH EDIT 325 -- MAKE TYPEOUT SAY THE RIGHT THINGS
;332 FIX BUG IN FINCHK WHICH CAUSED JOB 8 (AC J =8 ) TO BE CHECKED
; RATHER THAN THE JOB WE WERE INTERESTED IN. THIS BUG CAUSED
; RANDOM ERROR CODE 3 TO DAEMON UUO'S AND ALSO WRITING IN RANDOM
; PAGES.
;333 FIX DAEMON TO TAKE ADVANTAGE OF THE GETTABS ADDED IN 507/601
; FOR ITS BENEFIT.
;334 ADD CODE TO DUMP UNILOG AS LAST ITEM IN CODE 10 ENTRY IN
; ERROR FILE
;335 MAKE UNKNOWN COMMANDS GIVE ERROR MESSAGE, INSTEAD OF DOING
; DCORE AS IN PREVIOUS VERSIONS
;336 FIX SWAPPING POINTERS FOR 507. THEY ARE THE SAME ON
; BOTH 507 AND 601, NOT DIFFERENT AS PREVIOUSLY CODED
; SEE EDIT 211 FOR SIMILAR CHANGE FOR 601.
;337 FIX BUGS ADDED BY CHANGE TO DAEMON/SAVER(EDIT 325), AND
; IN USING NEW GETTABS(EDIT 333)
;340 FIX RACE ADDED BY EDIT 325
;341 SPEED UP COMPRS (IGNORE NONEXISTENT PAGES, DON'T LOOK AT EVERY
; WORD ON THEM)
;EDITS 342-441 RESERVED FOR SPECIAL EDITS
;342 ADD SUPPORT FOR TAPSER MAGTAPE ERROR REPORTING.
;VERSION 12A(342)RELEASED WITH TAPSER LIR.
;VERSION 12(341) RELEASED WITH ALL ABOVE EDITS
;ALL LATER EDITS IN VERSION 13
;442 ADD CODE TO USE ERRPT. UUO INSTEAD OF SCANNING FOR ERRORS
;443 FIX HSVADR TO NOT NEED UPMP IN CORE. ALSO FIX CALLS TO NOT READ
; UPMP IF NOT NECESSARY FOR OTHER REASONS.
;444 FIX DCORE TO DO CORRECT THING WITH FIRST PAGE OF HIGH SEG
;445 CHANGE ALL SUPER I/O TO USE SUSET.
;446 CHANGE REFERENCES TO SYMBOLS IN UPMP TO USE GETTABS, NOT DEFINED
; SYMBOLS
;447 FIX SETUP OF PARAMETERS FOR SWAPPING TO USE GETTABS
; AND WIN WITH UNITS MISSING
;450 FIX CODE FOR HANDLING ERROR FILE TO ADD WORD AT START
; OF EACH BLOCK POINTING AT FIRST COMPLETE ENTRY
; IN BLOCK. ALSO, PAD LAST BLOCK WITH ZEROS.
;451 ADD SUPPORT FOR CODE 50 IN ERROR.SYS, DL10 ERRORS
; 602 AND LATER MONITORS ONLY.
;452 ADD FUNCTION 5 TO DAEMON UUO, APPEND TO ERROR.SYS
;453 ADD SUPPORT FOR OSAVE AND OSSAVE COMMANDS FOR 6.02
;454 ADD CODE TO GET JOB # FROM DDB ON BOTH 602 AND EARLIER MONITORS
; JOB # WAS MOVED TO NEW WORD IN 602
;455 ADD CODE TO SYNCHRONIZE ERROR REPORTING WITH STOPPED JOBS. NO
; JOBS WILL NOW BE STARTED AT THE JOB LOOP -- ALL WILL NOW BE
; STARTED AFTER THE ERROR THAT STOPPED THEM IS REPORTED
;456 ADD CODE TO SUPPORT SOME NEW ERRORS REPORTED IN 6.02
; NEW ERRORS ARE: .ESCSC (CONFIGURATION STATUS CHANGE) = 15
; ER.MSE (MONITOR SOFTWARE ERROR) = 2
; .ESNXM (NON-EX-MEM, NEVER BEFORE SUPPORTED) = 4
;457 CORRECT IMPLEMENTATION OF ER.MSE
;460 FIX BUG IN IMPLEMENTATION OF DL10 (ER.DLE) ERRORS
;461 FIX TAPSER ERROR REPORTING TO USE TAPOP'S TO GET THE POINTERS
; TO THE INITIAL AND FINAL ERROR STATUS AREAS, RATHER THAN
; ABSOLUTE OFFSETS RELATIVE TO TUBRID
;462 FIX UP MASSBUSS ERRORS TO REPORT USER'S PPN AND FILENAME CORRECTLY
;463 ADD USERS ID ETC TO CODE 3 & 10,ADD BAD BLOCKS SLOTS
; TO CODE 10 & 11, ADD EXPECTED TERM. WD TO CODE 6 (RLD)
;464 CHANGE ERROR FILE HEADER LENGTH TO 4 AND INCLUDE SYS SER. # AND
; CHAGE HEADER VERSION TO 1, INCREASE MAX ENTRY SIZE TO 777 VICE
; 77 BY MOVING HEADER LENGTH LEFT 3 PLACES (RLD)
;465 ANSWER TO SPR#15908
;466 MODIFICATIONS TO CORRECT FOR VERSION 1 HEADERS IN ERROR FILE
;467 ADD CODE TO REPORT NXM AND SET MEMORY OFFLINE TYPE ERRORS.
; THIS ALSO CHANGES THE WHY RELOAD ERROR ENTRY SINCE IT
; KEEPS A COPY OF THE ORIGINAL NXM TABLE IN OUR CORE.
;470 FIX CODE TO USE SUPER USETI./O IF SUSET. FAILS.
;471 (16349)MAKE DCORE, DUMP, AND SAVE ABORT ON DSK ERRORS
;472 FIX BUGS IN CODE 4(NXM), CODE 15(MEMORY ON/OFF LINE), AND IN
; EDIT 466.
;473 FIX SOME USES OF MONITOR VERSION NUMBER TO BE USES OF "VMMON"
; INSTEAD
;474 FIX BYTE POINTER TO STORE ENTRY LENGTH IN ERROR FILE HEADER
; TO STORE 9 BITS, NOT 6. PART OF EDIT 466
;EDITS 475-507 RESERVED FOR SPECIAL RELEASES
;VERSION 13(474) RELEASED WITH ALL ABOVE EDITS
;ALL LATER EDITS IN VERSION 14
;510 FIX BUG IN COMPUTING POINTER TO PARITY SUBTABLE IN CODE 3
; ERROR FILE ENTRY
;511 DON'T REPORT MEMORY ON-LINE AT RELOAD ON 507/601 AND EARLIER
; MONITORS
;512 ALLOW ERROR FILE ENTRIES TO SPAN MORE THAN ONE BLOCK, I.E.
; DO THE RIGHT THING IF AN ENTRY HAS TWO BLOCK BOUNDARIES
; IN IT
;513 ADD SUPPORT FOR KL10 PROCESSOR ERRORS, CODE 60-AR/ARX PARITY
; TRAP, CODE 61- PARITY INTERRUPT, CODE 67-ADDRESSING FAILURE
;VERSION 14(513) RELEASED WITH ALL ABOVE EDITS
;ALL LATER EDITS IN VERSION 15
;EDITS 514-517 RESERVED FOR SPECIAL RELEASES
;520 PERFORM PROPER ADDRESS CHECKING FOR ALLOCATED BUT ZERO PAGE
;521 CORRECT ADDRESS CHECK CODE TO PREVENT POSSIBLE
; OVERWRITING OF JOB DATA AREA
;522 SET UP JBINT TO PREVENT HANG IN TO STATE ON OPR
; ACTION REQUESTED CONDITIONS
;523 UUOSYMIZE DAEMON
;524 IN CASE OF STRUUO FAILURE WHEN RESETTING DAEMON SEARCH LIST,
; PURGE INVALID STRUCTURES AND RETRY STRUUO.
;525 FIX ERRORS IN WRTSWP (ROUTINE TO WRITE SWAPPING SPACE)
;526 FIX IMPROPER ADDI AT UADOLD-2 (FROM EDIT 521)
;527 ELLIMINATE MILLIONS OF HRRI T1,.GTSTS 'S
;530 USE XOR IN PLACE OF ANDCA TO SEE IF A BLOCK CROSSES PAGE BOUNDARIES
;531 FIX POTENTIAL LOOP IN FINCHK BY CHECKING FOR PROPER SEGMENTS
;532 GET RID OF UNNEEDED MOVSI T1,(J) 'S
;533 MAKE DAEMON FUNCTION TO APPEND TO ERROR.SYS WORK
;534 ZERO TRAILING SPACE ON ERROR.SYS ON OUTPUT
;535 REASSIGN CHANNELS TO OUR JOB ON RELEASE OF CHANNEL. THUS IF
; WE ARE ASKED TO LOG AN ERROR FOR THAT FILE, THE DDB WILL STILL
; EXIST.
;536 RIP OUT SCANER AND REPLACE WITH REASONABLE COMMAND SCANNER.
; MAKE MINOR NECESSARY CHANGES TO THE DEVIL HIMSELF, INCLUDING
; REMOVAL OF EDIT 76
;537 FIX UP INTERRUPT ROUTINE SO IT WON'T DESTROY T1 OR SELF-DESTRUCT
;540 WRITE DAEMON FILES ON SYS ONCE AGAIN. DISENABLE NEW TO AVOID
; ANY PROBLEMS. HACK OUT CODE WHICH RESETS DAEMON SEARCH LIST,
; SINCE THIS ISN'T NECESSARY WHEN WRITING ON ERSATZ DEVICES
;541 FIX IMPROPER INDEX AC TO PREVENT PROBLEMS WHEN READING ARG
; BLOCK FROM USER WHICH IS SPLIT ACROSS PAGES.
;542 MAKE SURE USER HAS RENAME PRIV'S WHEN DELETING .SAV, .HGH, ETC.
; ALSO FIX CHCACC FUNCTION IN ACCCHK TO CHECK WRITE PRIV'S INSTEAD
; OF RENAME PRIV'S WHEN TRYING TO WRITE
;543 PUT PATCHING SPACE AND JUNK UNDER FTDEBG
;544 SET UP INTADR SO WE CAN'T LEAVE USER IN DAEMON ERROR PAUSE
; IF WE BLOW UP WHILE RECORDING ERROR
;545 ON DISK ERROR, DON'T GIVE EXPECTED CHANNEL TERMINATION WORD
; UNLESS HAVE A 601 OR GREATER MONITOR, SINCE THIS VALUE IS NOT
; STORED FOR THE LAST ERROR ON PREVIOUS MONITORS, AND THE BEST
; WE CAN DO IS PICK UP THE LAST EXPECTED CHANNEL TERMINATION WORD,
; WHICH MAY BE FOR A MORE RECENT TRANSFER THAN THE LAST ERROR.
;546 ADD SUPPORT FOR KL10 CPU ERROR INFORMATION OBTAINED FROM
; RSX20 FRONT END -11
;547 CHANGE FORMAT OF KL ERROR ENTRY IN ERROR.SYS TO INCLUDE
; COUNT OF 8 BIT DATA BYTES
;550 ADD DEFINITION OF %CVPTR&.ESDRE UNTIL UUOSYM GETS
; UPDATED. ALSO ADD SUPPORT FOR LP100-CODE 71
;551 ADD FUNCTION TO SUPPORT READING PENDING ENTRIES AND OTER INFO
; FROM CRASH.EXE FILES.
;552 FIXES TO CORRECTLY RECORD OVER 200 WORD ERROR FILE ENTRIES
;553 FIX PREV.CHANGES & MAKE UNUSED AND ILLEGAL ERROR CODES
; GO TO JOBFIN VOCE CPOPJ
;554 FIX EDIT 545 SO THAT MONVER GETS SET UP CORRECTLY
;555 MAKE WORK CORRECTLY FOR RPO6'S
;556 FIX KLERR STUFF
;557 PUT CRASH STUFF IN FTSAVE CONDITIONALS
;560 FIX EDIT 557
;561 SAVE PDBPTR AROUND CRASH CHECK STUFF AND FIX TYPO'S
;562 GET UDT FROM %CNDTM NOT %CNDAT
;563 FIX GTUPMP CODE
;564 DON'T SMASH TWO PACK STRUCTURES WITH CRASH STUFF
;565 FIX EDIT 544
;566 FIX MAGTAPE ERROR REPORTING
;567 FIX REDSWP ON VM
;570 MAKE DAEMON EXIT GRACEFULLY ON RE-ENTER
;571 DCORE SPOOLED DDB'S CORRECTLY.
;572 HANDLE AN ARGUMENT BLOCK SPLIT ACROSS FRAGMENTED PAGES
; ON THE SWAPPING SPACE CORRECTLY ON A VM SYSTEM.
;573 FIX MAGTAPE STATISTICS REPORTING. THE UNIT NAME WAS BEING
; OUTPUT AS GARBAGE.
;574 FIX MAGTAPE STATISTICS SO THAT THERE IS SOME USEFUL INFORMATION
; IN THE ERROR.SYS FILE.
;575 FIX PATH. UUO SO WE DON'T WASTE A PPB
;576 FIX CALL TO GETZ AT CRSIN3+5
;577 HISTORICALLY THE MAXIMUM FACT FILE SIZE WAS 2048 BLOCKS
; WITH SAID MAXIMUM ACHIEVED WHEN P2 EXCEED 777577 AND
; RESULTING ARITHMETIC ERRONEOUSLY POINTED TO THE WRONG BLOCK.
; RECODE TO TEST FOR THIS CONDITION AND EXIT ACCORDINGLY.
;600 FIX BUG WHERE DATA FROM TAPE UNLOAD IS NOT SAVED.
; CURE: AT GTPST1+1 ADJUST T1 NOT P1
;601 ADD USER'S P,PN AND PROGRAM NAME TO MAGTAPE ERROR REPORTING
;602 ADD IPCF SUPPORT FOR SYSERR
;603 5-10-78 ISM CHECK FOR 0 LENGTH DAEMON QUEUE TABLE IN
; CRASH.EXE FILE. THIS FIXES A PROBLEM WITH DAEMON LOOPING
; WHILE READING CERTAIN CRASH.EXE FILES DURING STARTUP.
;604 5-15-78 ISM FIX EDIT 544. INTADR IMPROPERLY SET UP
; SO THAT DAEMON MAY GO INTO TO STATE WHILE DETACHED.
;605 5-19-78 ISM DCORE FILES GET WRITTEN INTO [1,2] IF SIGN
; BIT IS SET IN THE PPN. CHECK FOR SIGN BIT ON AND BOMB THE USER.
;606 6-5-78 ISM DAEMON DOES NOT HANDLE DUMP COMMAND FOLLOWED BY
; SPACES PROPERLY. THROW AWAY THE SPACES.
;607 RELEASE DISK CHANNEL UPON EXITING CRSCHK SINCE WE ARE DONE WITH IT
;610 AFTER DOING A DCORE, CHECK IF USER JOB IS DETACHED. IF NOT
; DO NOT REATTACH JOB.
;611 8-22-78 ISM FILES WITH PROTECTION GREATER THAN <400>
; (FILE DAEMON CALLABLE) CAN GET WIPED OUT BY DCORE FUNCTION. USE
; "IN YOUR BEHALF" FILOP. TO CHECK PROTECTION PROPERLY.
;612 18-SEP-78/BAH DAEMON SENDS A PACKET WITH AN INCORRECT INDEX INTO
; ERROR.SYS WHEN USING THE /NOW SWITCH IN SYSERR. ALSO SYSERR ALWAYS
; REPORTS 0 FOR CHAR/H/S FOR READ/WRITE ERRORS IN MAGTAPE STATS
; BECAUSE DAEMON USES WRONG OFFSET TO GET THE DATA.
;VERSION 17
;700 ADD SUPPORT FOR KS10 SYSTEM ERROR ENTRIES
;701 CHANGE THE REFERENCES TO WORD 36 TO .JBSYM (WORD 116). (USED
; AS THE FLAG WORD FOR DETERMINING IF A CRASH FILE HAS BEEN PROCESSED
; BY DAEMON OR NOT)
;702 FIX MAGTAPE STATS ENTRY ROUTINE
;703 (SPR 10-26436) ALLOW CONTROLLER NUMBER TO BE REPORTED TO
; SYSERR. AREA AFFECTED: MBDVDN
;704 ADD CODE TO LOG DX20 DEVICE ERRORS. AT PRESENT THIS MEANS
; TU7X TAPE ERRORS REPORTED BY TAPSER.
;705 REMOVE ALL CODE SPECIFIC TO PRE-603 MONITORS. THIS IS THE FIRST
; STEP IN UPDATING DAEMON FOR 701.
;706 ADD CODE TO DUMP THE CPU STATUS BLOCK VIA ERROR CODE 63 (.ESCSB)
;707 ADD CODE TO DUMP THE DEVICE STATUS BLOCK VIA ERROR CODE 64
; (.ESDSB)
;710 ADD CODE TO SEND THE DATE/TIME INCREMENTAL CHANGE TO %SIACT
; IF THE SYSTEM DATE/TIME CHANGES. INVOKED BY SUBFUNCTION 3
; OF ERROR CODE 15.
;711 BRING ALL THE CODE UP TO 7.01 LEVEL. ALSO FIX A LARGE NUMBER
; OF BUGS IN THE ERROR REPORTING CODE.
;712 ADD CODE TO LOG SOFTWARE EVENTS OF INTEREST VIA CODE 14.
;713 REWRITE MISCELANEOUS PARTS OF THE CODE TO CLEAN IT UP
; AND FIX A LOT OF BUGS.
;714 TO BE ABLE TO MEASURE SOME SORT OF GENERIC "AVAILABILITY"
; FOR A SYSTEM, MAKE DAEMON WAKE UP EVERY 6 MINUTES AND
; LOOK AROUND TO SEE WHAT THE SYSTEM STATE IS. LOG THIS
; INFORMATION TO A NEW FILE, SYS:AVAIL.SYS.
;715 FOR SYSTEMS WITH JOBN+SEGN-1 .GT. 511 (7.01 REMEMBER),
; THE GETTAB SIMULATION FAILS FOR TABLES INDEXED BY JOB
; OR SEGMENT NUMBER IF THE INDEX IS LARGER THAN 511.
; NUMTAB ONLY HAS 9 BITS FOR THE MAXIMUM TABLES SIZE. THE
; MONITOR USES JBTMXL EXPLICITLY FOR SUCH TABLES.
;716 FOR SYSTEMS WITH A LARGE NUMBER OF (POSSIBLY DUAL PORTED)
; DISKS, ERROR CODE 5, INFORMATION EXTRACTED FROM A CRASH
; MAY OVERFLOW WHILE WRITING THE ENTRIES FOR EACH DISK.
; REMOVE THE DISK STUFF FROM ERROR CODE 5 AND WRITE A
; NEW ENTRY (45) WHICH CONTAINS THE INFORMATION.
;717 LOG NODE OFF AND ON-LINE VIA SUB-CODES 6 AND 7 OF THE
; CONFIGURATION STATUS CHANGE ENTRY.
;720 IF THE ERPTBK TABLE IN A CRASHED MONITOR IS FULL AND EPKIDX
; IS 0, DAEMON WILL LOOP PROCESSING THE ENTRIES. REDO THE CODE
; AT READCR TO AVOID THIS PROBLEM.
;721 DAEMON MAY REATTACH THE WRONG JOB TO A TERMINAL AFTER PROCESSING
; A REQUEST IF THE USER ATTACHES AND LOGS OUT THE JOB DOING THE
; REQUEST AND ANOTHER USER LOGS IN AND DETACHES BEFORE THE REQUEST
; IS COMPLETED. DON'T REATTACH A JOB TO A TERMINAL IF THE JOB'S
; LOGIN TIME DOESN'T MATCH THAT SAVED AT THE START OF THE REQUEST
;722 FIX PROBLEM WHERE DAEMON WAS RETURNING A UUO ERROR CODE WHILE
; PROCESSING HARDWARE ERRORS.
;723 IF AN ERROR OCCURS WHEN DAEMON IS DETACHED, THE ERROR MESSAGE,
; IF ANY, IS THROWN ON THE FLOOR. USE TRMOP. FUNCTION .TODSP
; TO PRINT THE ERROR MESSAGE ON DEVICE OPR.
;724 AVOID PROBLEMS WITH USERS GETTING A [1,2] JOB BY ALWAYS
; SETTING DSKFUL ERROR WHEN DAEMON STARTS UP.
;725 SINCE THE 700 MONITOR IS CAPABLE OF CHANGING THE ACTIVE
; SWAPPING LIST ON THE FLY, WE CAN NO LONGER READ SWPTAB
; WHEN DAEMON STARTS UP. READ THE INFORMATION FROM SWPTAB
; ON EACH REQUEST TO READ/WRITE THE SWAPPING SPACE.
;726 TC10C TAPE ERRORS ARE REPORTED BY SYSERR AS DX10 ERRORS.
; THE DEVICE CODE FOR TC10C'S IS 724 AND THE CODE ASSUMED
; THAT ANY DEVICE CODE LARGER THAT 540 WAS AN RH20. A COMPLEMENTING
; BUG IN SYSERR THEN TURNED THAT INTO A DX10 ERROR REPORT.
;727 FIX BUG IN PEKUSR THAT CAUSED SWAP POINTER INCONSISTENCIES
; WHILE READING FUNNY SPACE ADDRESSES.
;730 FIX RANDOM ERROR CODE 3 FAILURES IN DAEMON UUO FACT FUNCTION
; CAUSED BY RELEASING THE JOB WITHOUT PROCESSING IT
; IF JS.DPM WAS SET.
;731 YET ANOTHER SECURITY FIX TO PREVENT A USER GETTING A [1,2]
; JOB.
;732 FIX ROUTINE TO DUMP KS10 HALT STATUS BLOCK
;START VERSION 20 HERE WITH 7.01 FIELD TEST
;
;733 FIX KLERR ROUTINE TO CORRECTLY PROCESS ENTRIES ON CPUS OTHER
; THAN THE BOOT CPU
;734 CHANGE THE FORMAT OF THE ERPTBK TABLE TO USE 4 WORD ENTRIES SO
; THAT THE CPU NUMBER CAN BE INCLUDED IN THE ERROR DATA RETURNED
; BY THE MONITOR.
;735 ADD SUPPORT FOR NEW SYSERR ENTRIES FOR 7.01 MONITOR. THESE ARE
; ERROR TYPES 6,51,52,54,55,56 AND 57.
;736 FIX DATA GATHERING PROBLEM IN ENTRY TYPE 56.
;737 FIX SBDIAG POINTER IN ENTRY TYPE 52
;740 MAKE ANOTHER ATTEMPT AT FIXING THE KLERR REPORT.
;741 FIX ILL MEM REF IN MASSBUS ERROR ROUTINE.
;742 MONBTS NOW WRITES DUMPS THAT ARE NOT A CONTIGUOUS PHYSICAL
; CORE IMAGE. CHANGE PEKSPY TO READ AND FOLLOW THE .EXE
; DIRECTORY WHEN READING WORDS FROM THE DISK.
;743 IF A USER ^C'S DAEMON WHILE IT IS WRITING A DUMP/DCORE/SAVE
; FILE, DAEMON DOESN'T RELEASE THE CHANNEL WHICH CAUSES THE
; USER TO GET AN FBM ERROR WHEN HE TRYS TO DELETE THE TMP FILE.
;744 DEVICE OPR0 DOESN'T EXIST IF FTNET IS TURNED OFF OR IF A SITE
; HACKS THEIR MONITOR. MAKE DAEMON TRY HARDER TO FIND A TTY TO
; TRMOP. TO.
;745 AVAIL HAS TROUBLE FIGURING OUT WHEN AVAIL.SYS STARTED AND WHEN
; IT ENDED. DEFINE 2 NEW ENTRIES, 46 AND 47 WHICH ARE THE FIRST
; AND LAST ENTRIES IN AVAIL.SYS. THESE ENTRIES PROVIDE TIMESTAMPS
; FOR AVAIL.
;746 MAKE PROCESSING OF ERRORS DURRING INITIALIZATION CLEANER
;747 LIMIT THE NUMBER OF ENTRIES MADE IN THE DISK STATISTICS
; ENTRY TO AVOID INFINITE ERROR FILES IF THE UDB CHAINS GET
; SCREWED UP.
;750 CHANGE DAEMON TO USE %CNSUP AS THE UPTIME INSTEAD OF %NSUPT
; SO THAT IT GETS CLOCK REQUESTS RIGHT IF CPU0 ISN'T RUNNING.
;751 FIX BUG THAT CAUSED ERROR CODE 2 FROM JOBPEK WHEN READING
; FRAGMENTED CORE.
;752 ADD CODE TO LOG RP20 DISK DEVICE ERRORS
;753 SPR #10-29485 RKB 2-JUN-80
; FIX ROUTINE "CHECK" TO FORCE A FACT.SYS UPDATE AT EACH CHECK-
; POINT. THIS HELPS PRESERVE MORE ACCOUNTING DATA.
;754 AVAIL.SYS UPDATE ROUTINES DON'T USE ERRDEV AND ERRPPN TO
; DO THEIR UPDATES.
;755 SPR #10-29218 RKB 11-JUN-80
; FIX ROUTINE "COMPRS" TO AVOID CREATING IOWDS OVER 128K.
;756 ALLOW A USER HAVING POKE PRIVILEGES TO DO THE APPEND TO
; ERROR.SYS DAEMON UUO FUNCTION.
;757 LOOK FOR CRASH FILES TO PROCESS ON THE UNION OF THE
; SYSTEM SEARCH LIST AND THE SYSTEM DUMP LIST.
;760 CLEAN UP THE RP20 ERROR REPORTING LOGIC TO MAKE IT LESS DEPENDENT
; ON ASSEMBLED-IN PARAMETERS.
;START VERSION 21 HERE WITH 7.02
;
;761 UPDATE EDIT NUMBER FOR 7.02, REMOVE THE FT603 CONDITIONAL AND
; MAKE SOME COSMETIC CHANGES.
;762 UNCONDITIONALLY LINK THE STATE OF FTCHKPNT TO THAT OF FTFACT.
; YOU CAN NO LONGER ASSEMBLE DAEMON WITH FTFACT OFF AND FTCHKPNT
; ON. THIS WILL ALLOW US TO TURN OFF THE FTFACT FEATURE TEST
; SWITCH IN PREPARATION FOR THE MOVE TO USAGE ACCOUNTING.
;763 ADD THE FTI701 FEATURE TEST SWITCH THAT WILL SURROUND CODE
; THAT MUST EXIST FOR PRE-702 MONITORS. THE DEFAULT VALUE
; WILL BE ON. THE FEATURE TEST SWITCH AND THE CODE THAT
; IT SURROUNDS WILL BE REMOVED ON 703 SHIP.
;764 DO SOME MORE GENERAL CODE CLEANUP.
;765 REMOVE SUPPORT FOR THE SAVE AND SSAVE COMMANDS. THESE COMMANDS
; WERE ONLY INVOKED BY .SAV FILE WRITES FOR VIRTUAL PROGRAMS.
;766 SUPPORT KL-PAGING MONITORS; DESUPPORT E, D, VERSION, DCORE, AND DUMP
; COMMANDS FOR 7.02 MONITORS.
;767 SPR #32036 BCM 26-MAR-82
; INCREASE THE MAXIMUM NUMBER OF CPUS WE CAN REPORT TO THE
; CURRENT SUPPORTED OPERATING SYSTEM MAXIMUM.
;770 IT HAS BECOME NEARLY IMPOSSIBLE TO CONTINUE SUPPORTING BOTH
; THE CURRENT AND PREVIOUS VERSIONS OF THE MONITOR WITH DAEMON.
; FIX DAEMON TO DETERMINE IF IT IS RUNNING WITH A PREVIOUS
; VERSION OF THE MONITOR AND RUN THE OLD VERSION OF DAEMON IF
; IT IS. THE PREVIOUS VERSION IS ASSUMED TO HAVE A NAME OF
; THE FORM DAEXXX.EXE, WHERE XXX IS THE MONITOR VERSION, E.G.,
; DAE701 FOR THE 701 MONITOR. WE CAN ALSO REMOVE A GREAT
; DEAL OF CODE THAT WAS NECESSARY TO SUPPORT PRE-702 MONITORS
; AS A RESULT. INSTEAD OF REMOVING THIS CODE COMPLETELY FROM
; THE SOURCE, IT HAS BEEN PLACED UNDER THE FTUNSUPPORTED FEATURE
; TEST SWITCH. THIS VERSION OF DAEMON HAS ONLY BEEN TESTED WITH
; THAT SWITCH TURNED OFF AND WE EXPRESSLY DO NOT SUPPORT DAEMON
; WITH THE SWITCH TURNED ON. THE SWITCH IS THERE STRICTLY FOR
; REFERENCE PURPOSES AND ALL CODE CONTAINED WITHIN THE SCOPE
; OF THE FEATURE TEST SWITCH WILL BE REMOVED FOR THE NEXT RELEASE
; OF THE MONITOR.
;771 INCREASE THE SIZE OF THE ERROR.SYS HEADER TO 5 WORDS AND ADD
; A MONOTONICALLY INCREASING SEQUENCE NUMBER IN THE NEW WORD.
; DAEMON ALSO WRITES THE SEQUENCE NUMBER INTO THE EOF WORD AT
; THE END OF THE FILE WHEN IT WRITES AN ENTRY. EVERYTIME IT
; STARTS UP, DAEMON FINDS THE EOF WORD IN THE FILE AND USES
; THAT NUMBER AS THE START FOR THE NEW RUN. IF IT CAN'T FIND
; THE EOF MARK IN THE FILE FOR SOME REASON, DAEMON WILL TRY
; TO FIND THE FIRST SEQUENCE NUMBER IN THE FILE. IT THEN ADDS
; THE SIZE OF THE FILE DIVIDED BY THE SIZE OF THE SMALLEST
; ERROR ENTRY TO THAT NUMBER AND USES THAT AS THE SEQUENCE
; NUMBER. AS PART OF THIS CHANGE, DAEMON WILL CONTINUE TO
; USE ERROR.XNN INSTEAD OF ERROR.SYS IF IT FINDS AN .XNN
; FILE. THIS MEANS THAT THE SEQUENCE NUMBERS IN THE FILES
; SHOULD START IN ERROR.SYS AND INCREASE THRU ERROR.XNN.
; NOTE THAT THIS MEANS THAT ALL ERROR.* FILES MUST BE
; PROCESSED AS A UNIT. SEE THE 7.02 BEWARE FILE FOR
; MORE INFORMATION.
;772 STU GROSSMAN 13-JAN-83
; SYMPTOM: THE FIRST ENTRY IN ERROR.XNN IS WRONG SIZE, AND MAY CONTAIN
; PIECES OF DAEMON CODE. ALSO, MANY RE-SYNC POINTERS GENERATED.
; IF YOU GET AN I/O ERROR IN ERRFIN WHILE WRITING AN ENTRY INTO
; THE FILE, WE CREATE AN ERROR.XNN+1 FILE, AND THEN RESTART ERRFIN.
; UNFORTUNATELY P4 (WHICH SHOULD POINT TO THE LAST WORD WRITTEN INTO
; ERABUF), MAY HAVE BEEN CHANGED INTO A WORD COUNT BY ERFILL. WHEN
; WE GET TO ERFILL AGAIN, IT TRIES TO CONVERT P4 INTO A WORD COUNT
; (AGAIN!). THINGS GO DOWN HILL FROM THERE.
; FIX: RESTORE OLD VALUE OF P4 BEFORE RESTARTING ERRFIN.
;773 GMU/KBY 7-OCT-83
; AVAIL.SYS GETS BAD ENTRIES IN IT SWITCHING FROM 7.01(A) TO 7.02.
; THIS IS BECAUSE WE THINK THE HEADER FOR THE AVAIL.SYS WORKING
; ENTRY IS THE SAME LENGTH AS THE HEADER FOR THE ERROR.SYS/AVAIL.SYS
; DATA ENTRIES. THIS CHANGED WITH 7.02. USE NEW SYMBOL AWELEN WHERE
; APPROPRIATE FOR DEALING WITH THE AWE. ALSO, DON'T STORE EL.HED IN
; WORKING ENTRY HEADER.
;774 TARL 17-OCT-83
; FIX PEKDI6, WHERE READING A KI PAGING CRASH WOULD RETRIEVE BAD
; ADDRESSES FROM CRASH FILE THROUGH PEKDSK.
;775 TARL 17-OCT-83
; MOVE CLRBFI FROM INITIALIZATION CODE TO RIGHT BEFORE THE HIBER.
; HELPS AVOID LOOPS WHILE DEBUGGING DAEMON ON A TERMINAL.
;776 TARL 17-OCT-83
; WHILE WE'RE IN THE CODE, COMBINE THE BINARY AND SOURCE COPYRIGHT
; STATEMENTS. HAVE THEM BE ON THE FIRST PAGE.
;
;777 DZIEDZIC 2-FEB-84
; ADD SYSTEM ERROR BLOCK SUPPORT AS PART OF CI DISK PROJECT.
;START VERSION 22 HERE.
;
;1000 TARL 22-NOV-83
; UP THE MONITOR VERSION TO 703
;
;1001 TARL 15-MAY-84
; MCO 11194, SIX CHARACTER STOPCODE NAMES. STOPCODE NAME IS NOW IN
; %SYSCD INSTEAD OF %SYSPC.
;
;1002 TARL 22-MAY-84, SPR 34163
; BAD RANGE CHECK AT DSPERR, FIXED.
;
;1003 TL 28-Nov-84
; Do ORION messages when KLINIK events are logged
;
;1004 CJA 1985-03-22 09:25:45
; In routine ERRFIN
; make DAEMON do multi-block output to ERROR/AVAIL file
; so we don't write a partial entry if the system crashes.
;
;1005 CJA 17-APR-85
; In routine AVLAGE, rename LAST-WEEK's AVAIL file to .Ann
; and rename AVAIL.SYS to AVAIL.LWK (to make it the new
; LAST-WEEK file). Complain if we already used AVAIL.A77.
;
;1006 CJA 24-APR-85
; Since edit 1004, we get some entries in ERROR.SYS which
; are not reflected in RIBSIZE. Perhaps the data was written
; but the system crashed before the RIB was updated. Try
; to preserve these entries when looking for EOF.
;
;1007 JAD 2-MAY-85
; Fix QUEUE. UUO argument block so WTO's aren't so messy.
;
;1010 LEO 9-AUG-85
; DO COPYRIGHTS.
;
;1011 CJA 30-APR-85
; First attempt to flag software-detected disk errors positively.
; Left half of 4 word ERRPT. block will contain a code to indicate
; which of the several software-detected errors occur. These include
; SAT errors, RIB errors, Recovered Transfer hung, etc. All of
; these errors are detected in FILIO. This enlarges the massbus-disk
; entry (11) by one word.
;
;1012 CJA 30-APR-85
; Create new entry (code 74) for FILIO-detected CI disk error.
; Similar to massbuss disk (code 11) entry, but without a lot
; of useless information about controller status.
;
;1013 DPM #33947 29-Apr-86
; Range check the number of kontroller registers. Don't allow
; more than MAXREG.
;
;1014 JAD 20-May-86
; Don't attempt to SPY on more than 128K.
;Start version 23 for use with 7.04 monitor
;
;1015 DPM 6-Jan-87
; Use new GETTAB table .GTCHN to fetch channel data block offsets
; instead of hardwiring needed values.
;
;1016 JAD 1-Apr-87
; Ignore code 53 error entries (KS memory errors) for the moment.
;
;1017 DPM 5-May-87
; If the oldest (first) entry in the error file is older than
; 7 days, create a new file.
;
;1020 JAD 27-Jul-87
; Always do an SEBLK. UUO after the ERRPT. UUO to ensure any system
; error blocks are copied to the error file in a timely fashion.
;
;1021 DPM 13-Aug-87
; Update FILSER and TAPSER KDB/UDB offsets to agree with the new
; values defined in DEVPRM.
;
;1022 DPM 3-Nov-87
; Fix up references where UNIKON was used to find the KDB. UDBKDB
; now points to the KDB. Delete definition of UNIKON since it is
; no longer used.
;
;1023 DPM 12-May-88
; Edit 1022 revisited. UDB offsets changed again.
;
;1024 ?
;
;1025 JAD 31-May-88
; Handle IPA20 DRAM dump record in ERROR.SYS and write a dump
; file containing the DRAM data on XPN:.
;
; END OF EDIT HISTORY
SUBTTL SYMBOL DEFINITIONS
;DEBUGGING NOTE:
;IF DAEMON IS LOOPING AND YOU WANT TO STOP IT AND SAVE THE CORE
;IMAGE FOR LATER ANALYSIS, DO THE FOLLOWING:
; .ATTACH 5[1,2] ;ATTACH TO IT FROM A [1,2] JOB
; .HALT ;STOP IT
; .REENTER ;STOP IT GRACEFULLY
; .SAVE BADDAE ;SAVE FOR LATER
;THIS PROCEDURE WILL CAUSE DAEMON TO SAVE ITS AC'S SO THAT YOU GET
;A DUMP WITH SOME USEFUL INFORMATION.
LOC .JBVER
BYTE (3)VWHO(9)VDAEMON(6)VMINOR(18)VEDIT
RELOC
ND FTDEBG,0 ;NON-ZERO FOR DEBUGGING FEATURES
ND PDLEN,50 ;LENGTH OF PUSH DOWN LIST
ND FTMCNF,0 ;NON-ZERO TO INCLUDE MAXCNF.SYS STUFF
;THIS SWITCH SHOULD REMAIN ZERO UNTIL
;WE DECIDE WHAT TO PUT IN MAXCNF
ND MAXUCR,1000 ;MAXIMUM BLOCK TO READ FROM USER CORE
ND MAXUPM,^D512 ;SIZE OF BLOCK TO USE AS UPMP BUFFER
ND EVASIZ,^D128 ;NUMBER OF WORDS TO READ FROM FUNNY SPACE IN PEKUSR
;THIS **MUST** BE ONE OF 128, 256, OR 512. ANY
;OTHER VALUE WILL CAUSE PEKUSR TO RETURN WRONG
;VALUES
ND EVDPPB,340000 ;BEGINNING OF "PER PROCESS" ADDRESS SPACE
ND EVDPPE,400000 ;END (+1) OF "PER PROCESS" ADDRESS SPACE
ND LINSIZ,^D200 ;MAX CHARACTERS/LINE
ND CPUN,4 ;MAX NO OF CPU'S TO LOG ERRORS ON
ND ERRDEV,SIXBIT/SYS/ ;SYS IS THE RIGHT PLACE
IFE <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
DEFINE DEFCHN,<
X SYS ;LINK TO NEXT CHANNEL DATA BLOCK IN SYSTEM
X LUE ;LAST UDB WITH SOFT OR HARD ERROR
X ICW ;INITIAL CONTROL WORD ON LAST ERROR
X ICL ;NUMBER OF WORDS POINTED TO BY CHNICW
X MPE ;NUMBER OF MEMORY PARITY ERRORS
X DPE ;NUMBER OF DATA PARITY ERRORS (FROM DEVICE)
X NXM ;NUMBER OF NXMS OR DATA LATES (OVER RUN)
X TCW ;EXPECTED TERMINATION CONTROL WORD
> ;END DEFINE DEFCHN
;COMMON KDB OFFSETS
KDBNAM==0 ;SIXBIT NAME OF CHANNEL
KDBCHN==3 ;ADDRESS OF CHANNEL DATA BLOCK
;COMMON UDB OFFSETS
UDBNAM==0 ;UNIT NAME
UDBKDB==4 ;START OF KDB TABLE IN UDB
;FILSER UNIT DATA BLOCK ITEMS (UNI)
UNILOG==13 ;LOGICAL UNIT WITHIN STR
UNIHID==14 ;SIXBIT HOME-BLOCK ID NAME (PACK ID)
UNISYS==15 ;LH - ADDR OF NEXT UNIT DATA BLOCK IN SYSTEM
;0 = NO MORE
;RH - UP POINTER TO STR DATA BLOCK
UNICHN==17 ;LH - ADDR OF NEXT UDB ON SAME CHANNEL (RING)
;RH - UP POINTER TO CHAN DATA BLOCK
UNIHCT==22 ;HARD (UNRECOVERABLE) ERRORS ON THIS UNIT
;LH - DEVICE & SEARCH ERRORS
;RH - DATA ERRORS
UNISCT==23 ;SOFT (RECOVERABLE) ERRORS - INCREMENTED WHEN
;RECOVERY SUCCEEDS. HALVES SAME AS UNIHCT.
UNIMCT==24 ;SOFTWARE-DETECTED ERRORS (3 FIELDS OF 12 BITS)
;SAT FAILURES, RIB REDUNDANCY ERRORS, FOLDED CHKSUM
UNIERR==25 ;LAST ERROR STATUS ON DEVICE AFTER FIRST RECOVERY ATTEMPT
UNISOF==26 ;ERROR STATUS BEFORE RECOVERY ATTEMPT
UNIHBN==27 ;LOGICAL BLOCK NO OF LAST HARD ERROR
UNIBRC==30 ;BLOCKS READ IN BUFFERED MODE
UNIBWC==31 ;BLOCKS WRITTEN IN BUFFERED MODE
UNIDRC==32 ;BLOCKS READ IN DUMP MODE (INCLUDING GET'S)
UNIDWC==33 ;BLOCKS WRITTEN IN DUMP MODE (INCLUDING SAVE'S)
UNIMRC==24 ;BLOCKS READ FOR MONITOR (SAT,UFD,MFC,BAT,SWAP)
UNIMWC==35 ;BLOCKS WRITTEN FOR MONITOR
UNIICT==36 ;SWAP READS (ALSO COUNTED IN UNIMWC)
UNIOCT==37 ;SWAP WRITES (ALSO IN UNIMWC)
UNIMSC==40 ;NO OF MONITOR & SWAPPING SEEKS
UNIUSC==41 ;NO OF USER (INCLUDING GET & SAVE) SEEKS
UNIPCT==42 ;SEEK INCOMPLETE ERRORS
UNISDI==44 ;DATAI WORD ON LAST ERROR BEFORE RECOVERY ATTEMPT
UNIHDI==45 ;DATAI WORD AFTER FAILURE OF FIRST RECOVERY ATTEMPT
UNIECT==46 ;NO OF RETRIES+INITIAL ATTEMPT WHICH FAILED
;BIT 0 SET IF SUCCESSFUL OPERATIONS SINCE ERROR
UNIHNG==47 ;HUNG RECOVERYS (4 FIELDS OF 9 BITS)
;# NOT RECOVERED BY STOPPING UNIT IN TRANSFER STATE
;# RECOVERED BY STOPPING UNIT IN TRANSFER STATE
;# CAUSED BY UNIT IN POSITION STATE AND RECOVERED AUTOMATICALLY
;# RECOVERED BY RESTARTING UNIT, WHICH WAS IDLE/TRANSFER WAIT
UNIDES==67 ;[551] UNIT DESCRIPTION(FOR DSKCHR)
;[551] BOTH UNICDA AND UNIDES ARE GETTABED, BUT ARE DEFINED
;HERE IN CASE OF GETTAB FAILURE
UNICDA==73 ;RH - ADDR OF DDB FOR CURRENT FILE
;TAPSER UNIT DATA BLOCK ITEMS (TUB)
;ALL ARE RELATIVE TO OFFSET OF TUBRID IN TUB, SINCE GETTAB RETURNS
;OFFSET OF TUBRID IN TUB. THE AREA FROM TUBRID TO TUBDDA IS STATIC
;IN MONITOR, I.E. NO NEW WORDS WILL BE ADDED. ALL WORDS ARE DEFINED
;HERE, EVEN IF NOT USED.
TUBRID==0 ;REELID OF CURRENT TAPE
TUBFIL==1 ;# OF FILES FROM BOT
TUBREC==2 ;# OF RECORDS FROM EOF
TUBCRD==3 ;# OF CHARACTERS READ SINCE LAST UNLOAD
TUBCWR==4 ;# OF CHARACTERS WRITTEN SINCE LAST UNLOAD
TUBSRE==5 ;# OF SOFT READ ERRORS SINCE LAST UNLOAD
TUBHRE==6 ;# OF HARD READ ERRORS SINCE LAST UNLOAD
TUBSWE==7 ;# OF SOFT WRITE ERRORS SINCE LAST UNLOAD
TUBHWE==10 ;# OF HARD WRITE ERRORS SINCE LAST UNLOAD
TUBTRY==14 ;# OF RETRIES TO RESOLVE ERROR
TUBCCR==15 ;CHARACTER COUNT ON LAST RECORD
TUBPBE==16 ;POSITION BEFORE ERROR (FILE,,RECORD)
TUBFES==17 ;FINAL ERROR STATE
TUBDDA==21 ;BEGINNING OF SHADOW BLOCK FOR STATISTICS ON UNLOAD
TUBPGM==33 ;[601] USER'S PROGRAM IN SIXBIT
TUBUID==34 ;[601] USERS PPN
TUBDVC==35 ;DEVICE CODE/UNIBUS ADDRESS
TUBKTY==36 ;KONTROLLER TYPE
;TAPSER TUBFEP ENTRIES FOR DX20 DEVICE ERRORS. THESE ENTRIES ARE
;RELATIVE TO THE START OF THE TUBFEP BLOCK.
TD2ZRO==0 ;ZERO WORD; ALL UNDEFINED ENTRIES MAP TO HERE
TD2CNI==1 ;CONI INITIAL
TD2CIF==2 ;CONI FINAL
TD2RED==3 ;NUMBER OF FRAMES READ
TD2WRT==4 ;NUMBER OF FRAMES WRITTEN
TD2D1I==5 ;DATAI PTCR INITIAL
TD2D1F==6 ;DATAI PTCR FINAL
TD2D2I==7 ;DATAI PBAR INITIAL
TD2D2F==10 ;DATAI PBAR FINAL
TD2CS0==11 ;CHANNEL LOGOUT 0
TD2CS1==12 ;CHANNEL LOGOUT 1
TD2CS2==13 ;CHANNEL LOGOUT 2
TD2CC1==14 ;FIRST CCW
TD2CC2==15 ;SECOND CCW
TD2MPE==16 ;COUNT OF MPE
TD2NXM==17 ;COUNT OF NXM
TD2OVR==20 ;NUMBER OF OVERRUNS
TD2ICR==21 ;CONTENTS OF INITIAL CONTROL REG
TD2VER==22 ;BYTE (9)DX20 ADDRESS(9)0(18)MICROCODE VERSION NUMBER
TD2MBR==23 ;# OF MASSBUS REGS,,OFFSET TO FIRST
TD2DVL==24 ;# OF DEVICE REFS,,OFFSET TO FIRST
;THE FOLLOWING VALUES AND OFFSETS INTO THE UNIEBK BLOCK FOR THE
;RP20 DISK MUST AGREE WITH THOSE DEFINED IN RNXKON. IF RNXKON CHANGES
;YOU MUST CHANGE THE FOLLOWING DEFINITIONS ALSO.
RNXCS0==1 ;OFFSET TO THE WORD CONTAINING CHANNEL LOGOUT 0
RNXNXM==7 ;OFFSET TO THE WORD CONTAINING COUNT OF NXM'S
;OFFSETS IN THE HEADER FOR ERROR.SYS
.EHTYP==0 ;TYPE, VERSIONS, LENGTHS
EH.TYP==777B8 ;MASK FOR TYPE FIELD
EH.CRS==1B16 ;ENTRY EXTRACTED FROM CRASH.EXE
EH.FFM==7B20 ;MASK FOR FORMAT VERSION FIELD
EL.FVR==0 ;FORMAT VERSION OF ERROR.SYS
EH.HFM==7B23 ;MASK FOR HEADER VERSION FIELD
EL.HVR==2 ;HEADER VERSION OF ERROR.SYS
EH.HLN==7B26 ;MASK FOR HEADER LENGTH FIELD
EL.HED==5 ;LENGTH OF STANDARD HEADER
.EHDTM==1 ;UNIVERSAL DATE/TIME OF ENTRY
.EHUPT==2 ;UPTIME OF SYSTEM WHEN ENTRY CREATED
.EHASN==3 ;CPU SERIAL NUMBER OF CPU ON WHICH ERROR WAS DETECTED
.EHSEQ==4 ;SEQUENCE NUMBER OF ENTRY
;OFFSETS IN HEADER FOR AVAIL.SYS WORKING ENTRY
AWEHDR==0 ;BYTE(9).ESMRV(9)0(6)EL.HVR(3)EL.HED(9)BODY LENGTH
AWEDAT==1 ;UNIVERSAL DATE/TIME OF ENTRY
AWECDA==2 ;UNIVERSAL DATE/TIME OF FILE CREATION
AWECDM==3 ;15 BIT DATE,,TIME OF MAXCNF.SYS CREATION
AWELEN==4 ;LENGTH OF AVAIL.SYS WORKING ENTRY HEADER
;OFFSETS IN AVAIL.SYS MONITOR RUN VALUES (.ESMRV) BODY
MRVPSN==0 ;-LEN,,OFFSET FROM MRVPSN TO ASCIZ SYSTEM NAME
MRVVER==1 ;MONITOR VERSION NUMBER
MRVUPT==2 ;UPTIME IN UNIVERSAL DATE/TIME FORMAT
MRVCTM==3 ;MONITOR CRASH TIME (+/- 6 MIN) IN UNIVERSAL DATE/TIME FMT
MRVRTM==4 ;MONITOR RELOAD TIME IN UNIVERSAL DATE/TIME FORMAT
MRVWHY==5 ;WHY RELOAD CODE IN SIXBIT
MRVIDT==6 ;SUM OF ALL INCREMENTAL DATE/TIME CHANGES SINCE RELOAD
MRVSNM==7 ;FIRST OF 5 WORDS OF ASCIZ SYSTEM NAME
;DEFINITIONS IN KL ERROR BLOCK
.KEDEV==0 ;DEVICE, LINE
.KECNT==0 ;COUNT
.KECPU==1 ;CPU
.KEDTE==1 ;DTE NUMBER
.KELNK==1 ;LINK
.KEDAT==2 ;FIRST DATA WORD
;SPECIAL DEFINITIONS FOR MASSBUS ERROR PROCESSING
RH10CD==1
RH20CD==2
RH11CD==3
MAXREG==20 ;MAXIMUM NUMBER OF DRIVE REGISTERS ON A MASSBUS DEVICE
;MISC
CRSBLK==5 ;BLOCK # WHICH CONTAINS 1ST 200 WDS OF CORE IMAGE
BLKSPP==2 ;BITS TO SHIFT TO CONVERT PAGES TO BLOCKS
B2WLSH==7 ;BITS TO SHIFT TO CONVERT BLOCKS TO WORDS
BLKSIZ==^D128 ;NUMBER OF WORDS PER BLOCK
AVLWRK==<<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
DRMSIZ==2000 ;SIZE OF IPA20 DRAM STORE
;LOCATIONS SET UP BY SAVGET CODE IN COMCON
IFN FTUNSUPPORTED,<
SGAEXT==1
SGAHGH==16
>
SUBTTL INITIALIZE
DAEMON: JFCL ;IN CASE OF CCL ENTRY
RESET ;GET ALL RESET
MOVE P,PDL ;GET A STACK POINTER(IS A RUN UUO ACCU!!)
MOVEI T1,DAEREE ;REENTER FOR [SYSTEM]INFO SHUT DOWN
MOVEM T1,.JBREN ;STORE IN REENTER ADDRESS
SETZB J,ZER ;J=VALUE OF QUEUE CODE FOR DAEMON QUEUE
MOVE T1,[ZER,,ZER+1]
BLT T1,EZER ;CLEAR STORAGE LOCATIONS
MOVSI F,L.INI ;CLEAR FLAGS, NOTE INITIALIZATION
MOVEI T1,E.EINT ;REENTER ADDRESS TO START WITH
MOVEM T1,INTADR
MOVE T1,[XWD 4,INTRES] ;ROUTINE TO RESTART AFTER ERROR INTERCEPTS
MOVEM T1,INTBLK ;STORE IN INTERCEPT BLOCK
MOVEI T1,777747 ;ENABLE FOR ALL ERRORS
TLO T1,400000 ;SUPRESS ERROR TYPEOUTS
SKIPE .JBDDT ;ARE WE DEBUGGING?
TXZ T1,ER.ICC ;YES, PREVENT INSANE PROGRAMMERS
MOVEM T1,INTBLK+1 ;STORE CONDITIONS IN INTERCEPT BLOCK
MOVEI T1,INTBLK
MOVEM T1,.JBINT ;SET UP JOB INTERCEPT BLOCK
PUSHJ P,FNDOPR ;FIND OPR TTY
ERROR <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
CAILE T1,377777 ;[1014] MORE THAN 128K?
MOVEI T1,377777 ;[1014] YES, REDUCE TO THE MAXIMUM
SPY T1, ;SET SPY
ERROR <Can't SPY on the monitor>,STOP
MOVEI T1,.GTSLF ;GET TABLE NUMBER FOR NUMTAB
HRLI T1,(T1) ;WANT THE NUMTAB ENTRY FOR .GTSLF
GETTAB T1, ;GET IT
JRST E.GTBF ;FAILED
LSH T1,-^D27 ;KEEP JUST MAX ENTRY IN NUMTAB
MOVEI T2,1(T1) ;PLUS ONE FOR LENGTH OF NUMTAB
PUSHJ P,GETCOR ;GET THAT MUCH CORE
ERROR <Can't get core for NUMTAB>,STOP
MOVEM T2,GTBST ;SAVE ADDRESS OF START OF TABLE
NXTGTB: HRLZ T1,T3 ;NEXT TABLE PTR
HRRI T1,.GTSLF
GETTAB T1, ;GET NEXT TABLE PTR
JRST ENDGTB ;THAT'S ALL
TLZE T1,37 ;CLEAR MONITOR XR AND INDIRECT
TLO T1,P3 ;SET OUR AC IF TABLE EXISTS
; (IE, IF POINTER WAS INDEXED)
TRO T1,400000 ;SET SPY BIT
MOVEM T1,(T2) ;STORE IN TABLE OF TABLE PTRS
ADDI T2,1 ;BUMP TABLE POINTER
AOJA T3,NXTGTB ;LOOP FOR ALL POSSIBLE GETTABS
ENDGTB: SUBI T3,1 ;COMPUTE MAX NUMBER OF GETTABS
MOVEM T3,MAXGTB ;SAVE MAX GETTAB NUMBER
MOVE T2,GTBST ;GET ADDRESS OF START OF POINTERS
CAIGE T3,.GTIDX ;DO WE HAVE A RANGE TABLE?
TDZA T3,T3 ;NO, MAKE IT ZERO
HRRZ T3,.GTIDX(T2) ;GET SPYSEG ADDRESS OF RANGE TABLE
TRZ T3,400000 ;TURN OFF SPYSEG BIT
MOVEM T3,RNGTAB ;SAVE FOR GETTAB SIMULATION
;HERE TO FIND QUEUE # FOR DAEMON WAIT
SETZ T2,
FNDDAQ: HRLZ T1,T2 ;LH T1=NEXT WORD IN TABLE
HRRI T1,.GTWSN ;RH=QUEUE CODES TABLE
PUSHJ P,GTBSPY ;GET NEXT WORD IN QUEUE CODES TABLE
JRST E.GTBF ;MUST FIND IT
MOVE T3,[POINT 12,T1]
FNDDA1: TLNN T3,770000 ;SKIP IF MORE CODES IN THIS WORD
AOJA T2,FNDDAQ ;NO MORE, TRY NEXT WORD
ILDB T4,T3 ;T4=NEXT CODE IN SIXBIT
CAIE T4,DACODE ;SKIP IF FOUND DAEMON QUEUE CODE
AOJA J,FNDDA1 ;NO, TRY NEXT, COUNT CODES SKIPPED
;HERE WHEN FOUND DAEMON QUEUE CODE, NOW FIND CTY LINE NUMBER
MOVEM J,DAQNAM ;SAVE DAEMON QUEUE CODE
MOVE T1,[%CNPTY]
PUSHJ P,GTBSPY ;GET OFFSET FOR PTY'S
JRST E.GTBF ;CAN'T GET IT
HLRES T1 ;T1=OFFSET FOR PTY=LINE NUM OF CTY+1
SUBI T1,1 ;LINE NUMBER OF CTY
MOVEM T1,CTYLIN ;STORE LINE NUMBER OF CTY
SKIPGE T1 ;GET SWAPPING PARAMETERS IF OK
ERROR <Can't get CTY line number>,STOP
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
;HERE TO GET CHANNEL DATA BLOCK OFFSETS
GETCHN: PUSH P,P1 ;SAVE P1
MOVSI P1,-CHNLEN ;AOBJN POINTER
GETCH1: MOVE T1,CHNARG(P1) ;ARGUMENT
PUSHJ P,GTBSPY ;GETTAB
JRST E.GTBF ;FAILED
MOVEM T1,@CHNARG+1(P1) ;STORE RESULTS
AOBJN P1,.+1 ;ACCOUNT FOR TWO WORD ENTRIES
AOBJN P1,GETCH1 ;LOOP THROUGH TABLE
POP P,P1 ;PHASE STACK
JRST GETET1 ;ONWARD
DEFINE X (ARG),<EXP <%CH'ARG>,<CHN'ARG>>
CHNARG: DEFCHN
CHNLEN==.-CHNARG
;HERE TO GET ADDRESS OF EXECT1 IN JOB DATA AREA
GETET1: MOVE T1,[%CNET1] ;GETTAB THE ADDRESS OF EXEC T1
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,EXECT1 ;AND SAVE FOR LATER
;HERE TO GET DDB LENGTHS
MOVE T1,[%CNLSD] ;GETTAB SHORT DDB LENGTH
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,LDDBSH ;AND SAVE AS LENGTH OF SHORT DDB
IFN FTUNSUPPORTED,<
MOVE T1,[%CNLLD] ;NOW GET LONG LENGTH
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,LDDBLN ;AND SAVE FOR UUO'S, ETC.
MOVE T1,[%CNLDD] ;AND LAST, GET DISK DDB LENGTH
PUSHJ P,GTBSPY
JRST E.GTBF
MOVEM T1,LDDBDS ;AND SAVE FOR DCORE OF DDB'S
>
;HERE TO DETACH TTY
HRLZ T1,THSLIN ;LH IS NOW LINE NUMBER, RH=0 TO DETACH
HRRZ T2,.JBDDT ;GET ADDR OF DDT IF ANY
JUMPN T2,NODET ;DONT DETACH IF DDT
TELL <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 SEBLOK ;NO MORE, LOOK AT SYSTEM ERROR BLOCKS
PUSHJ P,DSPERR ;DISPATCH TO CORRECT ROUTINE OFF CODE IN T1
JRST NEWLOK ;AND LOOP BACK FOR MORE
SEBLOK: PUSHJ P,RSEBLK ;PROCESS ANY SYSTEM ERROR BLOCKS
JRST DALOKJ ;DONE, GO LOOK AT JOBS
;ROUTINE TO SET UP AND DISPATCH TO APPROPRIATE REPORTING
;ROUTINE FROM CODE RETURNED IN T1 BY
;ERRPT. UUO.
DSPERR: LDB T2,[POINT 9,(T1),35] ;GET CODE INTO T2
LDB J,[POINT 9,(T1),26] ;GET JOB NUMBER, IF ANY
CAIL T2,DSPMAX ;IGNORE IF OUT OF RANGE
JRST RPTERR ; RANGE
JRST @DSPTAB(T2) ;DISPATCH ON CODE
DSPTAB: RPTERR ;0-ILLEGAL CODE
SRLERR ;1-SYSTEM RELOAD
SCNSTD ;2-CONTINUABLE MONITOR ERROR
SCPERR ;3-NOT IMPLEMENTED
SNXMER ;4-NOT IMPLEMENTED
RPTERR ;5-EXTRACTED CRASH INFO, NOT REPORTED THIS WAY
CHNERR ;6-CHANNEL ERROR
RPTERR ;7-DAEMON STARTED, NOT REPORTED THIS WAY
SDVERR ;10-RP10,RC10 DISK ERROR
SMDVER ;11-MASS BUS DEVICE ERROR
DX2ERR ;12-DX20 DEVICE ERROR
RSEBLK ;13-SYSTEM ERROR BLOCK(S) AVAILABLE
SWEERR ;14-SOFTWARE EVENT OF INTEREST (POKE, SNOOP., ETC)
SCSCER ;15-CONFIGUATION STATUS CHANGE
RPTERR ;16-SYSTEM ERROR LOG, NOT REPORTED THIS WAY
SDIERR ;17-SOFTWARE REQUEST
RPTERR ;20-NOT IMPLEMENTED
STPERR ;21-TAPSER MAGTAPE ERROR
RPTERR ;22-NOT IMPLEMENTED
RPTERR ;23-NOT IMPLEMENTED
RPTERR ;24-NOT IMPLEMENTED
RPTERR ;25-NOT IMPLEMENTED
RPTERR ;26-NOT IMPLEMENTED
RPTERR ;27-NOT IMPLEMENTED
KLEERR ;30-KL10 FRONT END ERROR DATA
RPTERR ;31-FRONT-END RELOAD, NOT REPORTED THIS WAY
RPTERR ;32-NOT IMPLEMENTED
RPTERR ;33-KS10 HALT STATUS BLOCK, NOT REPORTED THIS WAY
RPTERR ;34-NOT IMPLEMENTED
RPTERR ;35-NOT IMPLEMENTED
RPTERR ;36-NOT IMPLEMENTED
RPTERR ;37-NOT IMPLEMENTED
RPTERR ;40-DISK STATISTICS, NOT REPORTED THIS WAY
RPTERR ;41-NOT IMPLEMENTED
STPERR ;42-TAPE STATISTICS FOR TAPSER
RPTERR ;43-MAX CONFIGURATION IN AVAIL.SYS, NOT REPORTED THIS WAY
RPTERR ;44-MONITOR RUN VALUES IN AVAIL.SYS, NOT REPORTED THIS WAY
RPTERR ;45-DISK STATISTICS (USUALLY FROM A CRASH)
RPTERR ;46-BEGINNING OF AVAIL.SYS TIMESTAMP
RPTERR ;47-END OF AVAIL.SYS TIMESTAMP
SDIERR ;50-DL10 ERROR
KPARNX ;51-KI PARITY/NXM INTERRUPT (7.01)
KPARNX ;52-KL PARITY/NXM INTERRUPT (7.01)
JOBFIN ;53-KS MEMORY ERROR (IGNORED FOR NOW)
KLSTRP ;54-KS NXM TRAP (7.01)
KLSTRP ;55-KL/KS PARITY TRAP (7.01)
NXMSWP ;56-NXM SWEEP (7.01)
PARSWP ;57-PARITY SWEEP (7.01)
RPTERR ;60-NOT IMPLEMENTED
SKLTRP ;61-NOT IMPLEMENTED
SCPERR ;62-NOT IMPLEMENTED
CSBERR ;63-CPU STATUS BLOCK
DSBERR ;64-DEVICE STATUS BLOCK
RPTERR ;65-NOT IMPLEMENTED
RPTERR ;66-NOT IMPLEMENTED
SNXMER ;67-NOT IMPLEMENTED
RPTERR ;70-NOT IMPLEMENTED
SDIERR ;71-LP100 REPORT [550]
SDIERR ;72-UNIT RECORD DEVICE ERROR
RPTERR ;73-NOT IMPLEMENTED
RPTERR ;74-NOT IMPLEMENTED
ICDERR ;75-IPA20 DRAM DUMP
RPTERR ;76-NOT IMPLEMENTED
RPTERR ;77-NOT IMPLEMENTED
DSPMAX=.-DSPTAB
IFE FTUNSUPPORTED,<
SNXMER:
SCPERR:
SKLTRP:
>
RPTERR: WARN <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 UDBNAM
JUMPE T1,[POP P,(P) ;CLEAN UP STACK
JRST TPOPJ] ;GIVE NON-SKIP RETURN
MOVEM T1,SWPUNI ;SAVE FOR CALLER
POP P,T1 ;GET UDB ADDRESS BACK
ADD T1,UNISLB ;PLUS OFFSET TO UNISLB
PUSHJ P,PEKSPY ;READ FIRST BLOCK FOR SWAPPING
JUMPLE T1,TPOPJ ;MUST BE POSITIVE
MOVEM T1,SWPSLB ;SAVE FOR CALLER
JRST TPOPJ1 ;GIVE SUCCESS RETURN
SUBTTL SUBROUTINES
;STILL IFN FTUNSUPPORTED
;SUBROUTINE TO OUTPUT A CARRIAGE RETURN LINE FEED FOR DUMP CCL FILE
CCCRLF: MOVEI SC,.CHCRT ;CARRIAGE RETURN
PUSHJ P,CCOUT ;OUTPUT CHAR TO CCL FILE
MOVEI SC,.CHLFD ;LINE FEED - FALL INTO CCOUT
;SUBROUTINE TO OUTPUT A CHARACTER ON DUMP CCL FILE
;ARGS SC(=16)=CHAR
CCOUT: SOSG C.BH+2
OUTPUT DSK,
IDPB SC,C.BH+1
POPJ P,
> ;END IFN FTUNSUPPORTED
IFN FTSVSL!FTUNSUPPORTED,<
;SUBROUTINE TO COPY USER'S SEARCH LIST
;ARGS T1=JOB NUMBER
; T2=PPN
; T3=ADDRESS-1 OF BLOCK TO STORE SEARCH LIST
GETSRC: MOVEM T1,GOBBUF+.DFGJN ;USER'S JOB NUMBER
MOVEM T2,GOBBUF+.DFGPP
SETOM GOBBUF+.DFGNM ;START AT BEGINNING OF JOB'S SEARCH LIST
GETSR1: MOVE T1,[.DFGST+1,,GOBBUF]
GOBSTR T1, ;GET NEXT STR IN JOB'S SEARCH LIST
POPJ P, ;ALL DONE
MOVE T1,GOBBUF+.DFGNM ;NEXT STR
JUMPE T1,CPOPJ ;EXIT IF FENCE OR
AOJE T1,CPOPJ ; IF END OF LIST
PUSH T3,GOBBUF+.DFGNM ;STORE NAME
PUSH T3,GOBBUF+.DFGNM+1 ;AND UNUSED WORD
PUSH T3,GOBBUF+.DFGST ;AND STATUS WORD
JRST GETSR1 ;LOOP TILL END OF LIST
> ;END IFN FTSVSL!FTUNSUPPORTED
IFN FTUNSUPPORTED,<
;SUBROUTINE TO GET JOB'S DEFAULT PATH
;ARGS J=JOB NUMBER WHOSE PATH TO READ
;VALUE T1=POINTER TO PATH SPEC, OR PPN IF SFD'S NOT IMPLEMENTED
GETPTH: HRLOI T1,(J) ;READ JOB'S PATH FUNCTION
MOVEM T1,D.DPTH ;AT TOP OF PATH BLOCK
MOVE T1,[XWD .PTMAX,D.DPTH]
PATH. T1,
PJRST GETPPN ;NO SFD'S-RETURN PPN
MOVEI T1,D.DPTH ;POINT TO PATH LIST
POPJ P,
> ;END FTUNSUPPORTED
;SUBROUTINE TO GET JOB'S PPN
;ARGS J=JOB NUMBER
;VALUE T1=PPN
GETPPN: HRROI T1,.GTPPN ;SETUP JBTPPN INDEX
GTBDFL: PUSHJ P,GTBSPY
SETZ T1,
POPJ P,
;SUBROUTINE TO GET JOB # FROM DDB
;ARGS T1=ADDRESS OF DDB
;VALUES T1=JOB #
DDBJOB: ADD T1,LDDBSH ;ADD IN LENGTH OF SHORT DDB
SUBI T1,1 ;DEVJOB IS LAST WORD IN SHORT DDB
PUSHJ P,PEKSPY ;GO PICK IT UP
ANDI T1,777 ;ONLY RIGHT 9 BITS ARE JOB NUMBER
POPJ P, ;RETURN
;HERE TO RELEASE A CHANNEL
;ARG=CHANNEL # IN T1 T1,T2,T3 DESTROYED
;THIS ROUTINE KEEPS CHANNEL DDB AROUND IN CASE OF A SOFT ERROR
; ON OURSELF THAT WE MAY SHORTLY BE ASKED TO RECORD
RELFCT: MOVEI T1,FCT ;ENTER HERE TO GIVE UP FCT CHANNEL
RELDSK: DPB T1,[POINT 4,RELINS,12] ;[535] PUT CHANNEL IN RELEASE INSTR.
SETZ T2, ;[535] GIVE TO JOB 0 (DEASSIGN)
MOVSI T3,'KLG' ;[535] LOGICAL NAME WE WANT
REASSI T2, ;[535] GIVE AWAY IF ALREADY EXISTS
MOVSI T2,'KLG' ;[535] SET UP KLUDGE AGAIN
DEVLNM T1, ;[535] GIVE OUR CHANNEL THAT LOGICAL NAME
JRST RELDS1 ;[535] SNH
SETO T1, ;[535] REASSIGN TO OUR JOB
LDB T2,[POINT 4,RELINS,12] ;[535] CHANNEL NO. TO ASSIGN
REASSI T1, ;[535] GET IT
RELDS1: XCT RELINS ;[535] NOW RELEASE FOR REAL
POPJ P, ;[535] DONE
IFE FTUNSUPPORTED,<
;SUBROUTINE TO PERFORM A JOBPEK UUO AND CHECK THE ERROR CODE IF
;THE UUO TAKES THE ERROR RETURN. FOR READS, THE CALLER MUST HAVE
;ZEROED THE BUFFER BEFORE THE CALL SINCE THIS ROUTINE GIVES A
;SUCCESSFUL RETURN ON JKABZ% (ALLOCATED BUT ZERO) ERRORS.
;CALL: MOVE T2,JOBPEK ARG
; PUSHJ P,DOJBPK
;RETURNS CPOPJ IF THE JOBPEK SUCCEEDED WITH THE DATA TRANSFERRED
; CPOPJ1 IF THE JOBPEK CAUSED AN ILLEGAL ADDRESS ERROR
; (JKIAD%)
; CPOPJ2 IF THE JOBPEK CAUSED ANY OTHER ERROR WITH AN APPROPRIATE
; ERROR MESSAGE ISSUED
;RESPECTS T1
DOJBPK: PUSHJ P,SAVE4 ;GET SOME AC'S TO USE
PUSH P,0(T2) ;HAVE TO MOVE THE ARGS TO P1 AND P2 VIA
PUSH P,1(T2) ; THE STACK SINCE WE DON'T KNOW WHERE
POP P,P2 ; THE ARGS ARE (THEY MAY BE P1 AND
POP P,P1 ; P2
MOVEI P3,(P1) ;SET P3:=WORDS LEFT TO DO
DOJBP1: HRRZ T2,P2 ;ASSUME WRITING, GET WRITE ADDRESS
TXNN P1,JK.WRT ;ARE WE WRITING USER CORE?
HLRZ T2,P2 ;NO, GET READ ADDRESS
MOVEI P4,(T2) ;COPY THE USER ADDRESS TO P4
TRO P4,PG.BDY ;INCREASE TO LAST WORD IN PAGE
SUBI P4,-1(T2) ;COMPUTE NUMBER OF WORDS LEFT IN PAGE
CAIGE P4,(P3) ;DO WE HAVE MORE THAN WE NEED?
HRRM P4,P1 ;NO, USE WHAT WE HAVE
SUBI P3,(P1) ;ACCOUNT FOR THOSE THAT WE CAN DO
MOVEI T2,P1 ;GET ADDRESS OF OUR JOBPEK BLOCK
JOBPEK T2, ;TRANSFER THE DATA
JRST DOJBP3 ;FAILED, ANALYZE THE ERROR
DOJBP2: JUMPLE P3,CPOPJ ;RETURN IF ALL WORDS ARE DONE
MOVEI P4,(P1) ;GET THE NUMBER OF WORDS WE DID
HRLS P4 ;DUPLICATE IN BOTH HALVES
ADD P2,P4 ;STEP THE ADDRESSES FOR THOSE THAT WE DID
HRRM P3,P1 ;TRY FOR THE REST THIS TIME
JRST DOJBP1 ;TRY FOR MORE
DOJBP3: CAIN T2,JKABZ% ;WAS THE PAGE ALLOCATED BUT ZERO?
JRST DOJBP2 ;YES, THAT'S OK.
CAIN T2,JKIAD% ;ILLEGAL ADDRESS?
JRST CPOPJ1 ;YES, WE EXPECT THAT ONE
AOS 0(P) ;SETUP FOR CPOPJ2 RETURN
;CONTINUED ON THE NEXT PAGE
;CONTINUED FROM THE PREVIOUS PAGE
;HERE IF THE JOBPEK FAILED WITH A CODE THAT WE DON'T EXPECT. PRINT
;EVERYTHING WE KNOW ABOUT THE FAILURE IN THE HOPE THAT SOMEBODY CAN
;DEBUG IT.
WARN <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 UDBNAM(P3) ;(R0) PHYSICAL UNIT NAME
Z UNIHID(P3) ;(R1) PACK (HOME BLOCK) ID
Z UNIHCT(P3) ;(R2) HARD ERROR COUNT
Z UNISCT(P3) ;(R3) SOFT ERROR COUNT
Z UNIECT(P3) ;(R4) RETRY COUNT
Z UNISOF(P3) ;(R5) 1CONI - ERROR CONI AFTER INITIAL ATTEMPT
Z UNIERR(P3) ;(R6) 2CONI - ERROR CONI AFTER 1ST RECALIBRATE
Z UNISDI(P3) ;(R7) 1DATAI - AFTER INITIAL ATTEMPT
Z UNIHDI(P3) ;(R10) 2DATAI - AFTER 1ST RECALIBRATE
Z UNIHBN(P3) ;(R11) BLOCK NO OF LAST HARD ERROR
Z UNIMCT(P3) ;(R12) SOFTWARE-DETECTED ERROR COUNTS
Z UNIPCT(P3) ;(R13) SEEK INCOMPLETE ERRORS
Z UNIHNG(P3) ;(R14) HUNG COUNTS
ZDVEL==.-1
XUSCL: XWD .-ZUSCL,.+1 ;AOBJN WORD FOR TABLE OUTPUT BY DMPDSK
Z UDBNAM(P2) ;(R1) DEV NAM
Z UNIHID(P2) ;(R2) PACK ID
Z UNIHCT(P2) ;(R3) HARD ERROR COUNT
Z UNISCT(P2) ;(R4) SOFT ERROR COUNT
Z UNIPCT(P2) ;(R5) SEEK ERROR COUNT
Z UNIHNG(P2) ;(R6) HUNG COUNTS
Z UNIMCT(P2) ;(R7) SOFTWARE-DETECTED ERRORS
Z UNIBRC(P2) ;(R10) BUFFERED READS
Z UNIBWC(P2) ;(R11) BUFFERED WRITES
Z UNIDRC(P2) ;(R12) DUMP READS
Z UNIDWC(P2) ;(R13) DUMP WRITES
Z UNIMRC(P2) ;(R14) MONITOR READS
Z UNIMWC(P2) ;(R15) MONITOR WRITES
Z UNIICT(P2) ;(R16) SWAP READS
Z UNIOCT(P2) ;(R17) SWAP WRITES
Z UNIMSC(P2) ;(R20) MONITOR SEEKS
Z UNIUSC(P2) ;(R21) USER SEEKS
ZUSCL==.-1
XMDVEL: XWD .-ZMDVEL,.+1
Z UDBNAM(P3) ;(R0)PHYSICAL UNIT NAME
Z UNIHID(P3) ;(R1)PACK ID (HOME BLOCK ID)
Z UNILOG(P3) ;(R2)LOGICAL NAME OF UNIT (STR NAME)
Z UNIHBN(P3) ;(R3)BLOCK OF LAST HARD ERROR
Z UNIECT(P3) ;(R4)RETRY COUNT
Z UNISOF(P3) ;(R5)1CONI - ERROR CONI AFTER INITIAL ATTEMPT
Z UNIERR(P3) ;(R6)2CONI - ERROR CONI AFTER 1ST RECALIBRATE
Z UNIMCT(P3) ;(R7)SOFTWARE DETECTED ERROR COUNTS
Z UNIPCT(P3) ;(R10)SEEK INCOMPLETE ERRORS
Z UNIHNG(P3) ;(R11)HUNG COUNTS
ZMDVEL==.-1
XTPEL: XWD .-ZTPEL,.+1
Z TUBRID(P1) ;(R1)REELID
Z TUBFIL(P1) ;(R2)FILES FROM BOT
Z TUBREC(P1) ;(R3)RECORDS FROM LAST EOF
Z TUBTRY(P1) ;(R4)RETRY COUNT + HARD ERROR BIT
Z TUBCCR(P1) ;(R5)CHARACTERS INTO CURRENT RECORD
Z TUBPBE(P1) ;(R6)POSITION BEFORE ERROR
Z TUBFES(P1) ;(R7)FINAL ERROR STATE
ZTPEL==.-1
XTPUL: XWD .-ZTPUL,.+1
Z DEVNAM(P3) ;(R0)DEVICE NAME
Z TUBRID(P1) ;(R1)REELID
Z TUBCRD(P1) ;(R2)CHARACTERS READ
Z TUBCWR(P1) ;(R3)CHARACTERS WRITTEN
Z TUBSRE(P1) ;(R4)SOFT READ ERRORS
Z TUBHRE(P1) ;(R5)HARD READ ERRORS
Z TUBSWE(P1) ;(R6)SOFT WRITE ERRORS
Z TUBHWE(P1) ;(R7)HARD WRITE ERRORS
ZTPUL==.-1
XTPEL1: XWD .-ZTPEL1,.+1 ;
Z TUBUID(P1) ;(R12)P,PN OF USER
Z TUBPGM(P1) ;(R13) SIXBIT PROGRAM NAME
Z TUBDVC(P1) ;(R14) DEVICE CODE/UNIBUS ADDRESS
Z TUBKTY(P1) ;(R15) KONTROLLER TYPE
ZTPEL1==.-1 ;
XD2EL: XWD .-ZD2EL,.+1
Z TUBPBE(P3) ;(R3) POSITION BEFORE ERROR
Z TUBFES(P3) ;(R4) FINAL ERROR STATE
Z TD2CNI(P1) ;(R5) CONI INITIAL
Z TD2CIF(P1) ;(R6) CONI FINAL
Z TD2ZRO(P1) ;(R7) NUMBER OF SEEKS (0 FOR MAGTAP)
Z TD2RED(P1) ;(R10) NUMBER OF FRAMES READ
Z TD2WRT(P1) ;(R11) NUMBER OF FRAMES WRITTEN
Z TD2ZRO(P1) ;(R12) SIXBIT FILENAME
Z TUBUID(P3) ;(R13) [P,PN] OF USER MAKING REQUEST
Z TUBPGM(P3) ;(R14) SIXBIT NAME OF PROGRAM RUNNING
Z TD2D1I(P1) ;(R15) DATAI PTCR INITIAL
Z TD2D1F(P1) ;(R16) DATAI PTCR FINAL
Z TD2D2I(P1) ;(R17) DATAI PBAR INITIAL
Z TD2D2F(P1) ;(R20) DATAI PBAR FINAL
Z TUBSRE(P3) ;(R21) SOFT READ ERRORS
Z TUBSWE(P3) ;(R22) SOFT WRITE ERRORS
Z TUBHRE(P3) ;(R23) HARD READ ERRORS
Z TUBHWE(P3) ;(R24) HARD WRITE ERRORS
Z TUBFIL(P3) ;(R25) FILE POSITION
Z TUBREC(P3) ;(R26) RECORD POSITION
Z TD2CS0(P1) ;(R27) CHANNEL LOGOUT 0
Z TD2CS1(P1) ;(R30) CHANNEL LOGOUT 1
Z TD2CS2(P1) ;(R31) CHANNEL LOGOUT 2
Z TD2CC1(P1) ;(R32) FIRST CCW
Z TD2CC2(P1) ;(R33) SECOND CONTROL WORD
Z TD2MPE(P1) ;(R34) COUNT OF MPE
Z TD2NXM(P1) ;(R35) COUNT OF NXM
Z TD2ZRO(P1) ;(R36) SOFT POSITIONING ERRORS
Z TD2ZRO(P1) ;(R37) HARD POSITIONING ERRORS
Z TD2OVR(P1) ;(R40) NUMBER OF OVERRUNS
Z TD2ICR(P1) ;(R41) CONTENTS OF INITIAL CONTROL REG
Z TD2VER(P1) ;(R42) DX20 MICRO-CODE VERSION #
ZD2EL==.-1
XR2EL1: XWD .-ZR2EL1,.+1
Z UDBNAM(P3) ;(R0) SIXBIT DEVICE NAME
Z UNILOG(P3) ;(R1) VOLUME ID
ZR2EL1==.-1
XR2EL2: XWD .-ZR2EL2,.+1
Z UNIHBN(P3) ;(R3) LOC OF ERROR
Z UNIECT(P3) ;(R4) FINAL ERROR STATE
Z UNISOF(P3) ;(R5) CONI INITIAL
Z UNIERR(P3) ;(R6) CONI FINAL
ZR2EL2==.-1
XR2EL3: XWD .-ZR2EL3,.+1
Z 0(P1) ;(R15) DATAI PTCR INITIAL (UNISCR)
Z 1(P1) ;(R16) DATAI PTCR FINAL (UNIHCR)
Z 2(P1) ;(R17) DATAI PBAR INITIAL (UNISDR)
Z 3(P1) ;(R20) DATAI PBAR FINAL (UNIHDR)
Z UNIHCT(P3) ;(R21) HARD ERROR STATISTICS
Z UNISCT(P3) ;(R22) SOFT ERROR STATISTICS
Z UNIMCT(P3) ;(R23) SOFTWARE ERROR STATISTICS
Z UNIHNG(P3) ;(R24) HUNG COUNTS
ZR2EL3==.-1
;ROUTINES TO SET UP FOR CALL TO ROUTINE TO PUT ACTUAL ENTRY INTO ERROR
; FILE
;ALL HAVE SAME CALLING SEQUENCE
;ARGS: T2 -- CODE FOR ERROR SYS ENTRY
; T1 -- ADDRESS OF BLOCK RETURNED BY ERRPT. UUO
;RETURNS CPOPJ, NO AC'S PRESERVED
;ROUTINE TO REPORT SYSTEM RELOAD (CODE 1)
SRLERR: MOVSI T1,.ESWHY_9 ;CODE FOR WHY RELOAD
PUSHJ P,ERRINI ;STORE HEADER, SETUP P4 AND CLEAR BUFFER
MOVE T2,[%CNFG0] ;5 WORDS OF SYSTEM NAME, 2 DATE
SUB T2,[%CNDT1+<1,,0>]
HLR T2,[%CNFG0]
CNFLUP: MOVEI T1,.GTCNF ;FROM CNFTBL
HRLI T1,(T2)
PUSHJ P,GTBVAR ;(R0-R6) SAVE NEXT WORD OF SYSTEM NAME/DATE
AOBJN T2,CNFLUP ;GET IT ALL
MOVE T1,[%CNSTS]
PUSHJ P,GTBVAR ;(R7) SAVE STATES WORD
PUSH P4,MONVER ;(R10) MONITOR VERSION
MOVE T1,[%CNSER]
PUSHJ P,GTBVAR ;(R11) SAVE CPU0 SERIAL NUMBER
MOVE T1,[%CNWHY]
PUSHJ P,GTBVAR ;(R12) SAVE WHY RELOAD CODE IN SIXBIT
PUSH P,T1 ;SAVE FOR AVAIL BELOW
EW%COM==13 ;RELATIVE LOC'N OF POINTER WORD
AOBJN P4,.+1 ;(R13) LEAVE SPACE FOR POINTER WORD
MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE
HRLI T1,707070 ;ADD A STRANGE CODE FOR SYSERR TO RECOGNIZE THIS WORD
PUSH P4,T1 ;(R14) AND SAVE IN ERROR BUFFER
EW%NPT==15 ;OFFSET FOR POINTER TO NXMTAB IN ENTRY
AOBJN P4,.+1 ;(R15) LEAVE ROOM FOR POINTER
PUSH P,P4 ;SAVE CURRENT BUFFER LOC
MOVEI T2,0 ;START AT FIRST WORD OF OPR COMMENTS
WHYLUP: MOVEI T1,.GTWHY ;GETTAB FOR WHY-RELOAD COMMENTS IN ASCIZ
HRLI T1,(T2) ;DESIRED WORD THEREOF
PUSHJ P,GTBSPY ;GET IT
JRST WHYCLS ;MUST NOT BE ONE
JUMPE T1,WHYCLS ;STOP AT END OF STRING
PUSH P4,T1 ;(R16-) SAVE 5 CHARACTERS
AOJA T2,WHYLUP ;GO FOR NEXT WORD
WHYCLS: POP P,T1 ;GET BACK START LOC OF COMMENTS
MOVNI T2,(T2) ;GET -VE LENGTH OF COMMENTS
JUMPE T2,WHYOUT ;LEAVE POINTER ZERO IF NONE
HRLI T2,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO COMMENTS
MOVSM T2,ERABFS+EW%COM ;SAVE AOBJN POINTER TO COMMENTS
WHYOUT: MOVN T2,NXMLEN ;GET -VE LENGTH OF NXMTAB
JUMPGE T2,SRLERX ;IF NONE, QUIT NOW
HRLZS T2 ;MOVE TO LH
HRRI T2,1-ERABFH(P4) ;OFFSET TO FIRST TO RH
MOVEM T2,ERABFS+EW%NPT ;SAVE AS POINTER TO NXMTAB
HRR T2,NXMTAB ;GET CORE POINTER TO NXMTAB
PUSH P4,(T2) ;SAVE NEXT WORD IN BUFFER
AOBJN T2,.-1 ;LOOP FOR ALL WORDS
SRLERX: PUSHJ P,ERRFIN ;CLOSE FILE
IFN FTMCNF,<
PUSHJ P,APPCNF ;APPEND MAXCNF ENTRY AS NECESSARY
>
MOVSI T1,.ESMRV_9 ;GET ENTRY CODE FOR MONITOR RUN VALUES
PUSHJ P,ERRINI ;SETUP THE BUFFER
MOVE T1,[MRVBDY,,ERABFS] ;MAKE BLT POINTER
BLT T1,ERAEND ;MOVE TO BUFFER
POP P,ERABFS+MRVWHY ;SAVE RELOAD CODE IN BUFFER
PUSHJ P,NBSDAT ;GET CURRENT DATE/TIME
MOVE T3,T1 ;SAVE
PUSHJ P,UPTIME ;GET UPTIME
SUB T3,T1 ;COMPUTE TIME OF RELOAD
MOVEM T3,ERABFS+MRVRTM ;SAVE IN BUFFER
PUSHJ P,SYSNAM ;UPDATE MRV BLOCK TO REFLECT NEW
MOVE T1,MONVER ; MONITOR NAME AND VERSION
MOVEM T1,MRVBDY+MRVVER ; FOR NEXT RELOAD
SETZM MRVBDY+MRVIDT ;START WITH NO DATE/TIME CHANGES
LDB P4,[POINT 9,MRVBLK,35] ;GET LENGTH OF BODY
ADDI P4,ERABFS-1 ;ADJUST FOR CALCULATION AT ERFILL
PUSHJ P,AVLFIN ;APPEND THE ENTRY TO AVAIL
PJRST UPDAVL ; AND DO AN IMMEDIATE UPDATE
IFN FTUNSUPPORTED,<
;ROUTINE TO REPORT DISK AND MASSBUS ERRORS, CODES 10 AND 11
SDVERR: TDZA P1,P1 ;SET FLAG FOR DISPATCH LATER
SMDVER: MOVEI P1,1 ;DITTO FOR MASSBUS DEVICE ERROR
PUSHJ P,PROTJB ;INSURE THAT JOB WILL BE FREED
HRRZ P3,1(T1) ;GET UDB ADDR INTO P3 FOR GIVE ROUTINE
HLRZ P2,1(T1) ;ADDR OF DDB INTO P2
JUMPE P2,CPOPJ ;IF NO DDB, EXIT
JUMPE P3,CPOPJ ;LIKEWISE IF NO UDB
MOVEI T1,UDBKDB(P3) ;ADDRESS OF KONTROLLER DATA BLOCK
PUSHJ P,PEKSPY
HRRZS T1 ;KEEP JUST ADDRESS
ADD T1,KONREG ;NUMBER OF DRIVE REGS ON THIS CONTROLLER
PUSHJ P,PEKSPY
MOVEI T3,(T1) ;PUT NUMBER OF REGS INTO T3
SKIPN P1 ;IF THIS IS A MASSBUS ERROR
SKIPN T3 ;OR NOT A DISK ERROR WITH REGISTERS
JRST SDVER1 ;THEN ALL IS OK
ADDI T2,.ESMDE-.ESHDE ;MUST BE PRE-701, MAKE IT MASSBUS ERROR
;IF A DISK ERROR WITH REGISTERS
MOVEI P1,1 ;AND SET FLAG FOR MASSBUS ERROR DISPATCH
SDVER1: MOVEI T1,UNIDES(P3) ;GET ADDRESS OF UNIDES OF UDB
PUSHJ P,PEKSPY ;GET UNIDES
LDB T1,[POINTR T1,DC.CNT] ;GET CONTROLLER TYPE
CAIE T1,.DCCRN ;RP20?
JRST SDVER2 ;NO
MOVEI P1,2 ;SETUP DISPATCH OFFSET
MOVEI T2,.ESDXE ;MAKE IT A DX20 DEVICE ERROR
SDVER2: MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;STORE CODE IN T1 FOR ERRINI
PJRST @[EXP GDVERR,GMDVER,D2DSER](P1) ;DISPATCH TO CORRECT ROUTINE
> ;END IFN FTUNSUPPORTED
IFE FTUNSUPPORTED,<
;ROUTINE TO REPORT DISK AND MASSBUS ERRORS, CODES 10 AND 11
SDVERR:
SMDVER: PUSHJ P,PROTJB ;INSURE THAT JOB WILL BE FREED
HRRZ P3,1(T1) ;GET UDB ADDR INTO P3 FOR GIVE ROUTINE
HLRZ P2,1(T1) ;ADDR OF DDB INTO P2
JUMPE P2,CPOPJ ;IF NO DDB, EXIT
JUMPE P3,CPOPJ ;LIKEWISE IF NO UDB
MOVEI T1,UDBKDB(P3) ;ADDRESS OF KONTROLLER DATA BLOCK
PUSHJ P,PEKSPY
HRRZS T1 ;KEEP JUST ADDRESS
ADD T1,KONREG ;NUMBER OF DRIVE REGS ON THIS CONTROLLER
PUSHJ P,PEKSPY
MOVE T3,T1 ;PUT NUMBER OF REGS INTO T3
MOVEI T2,.ESMDE ;ASSUME A MASSBUS DISK ENTRY
MOVEI T1,UNIDES(P3) ;GET ADDRESS OF UNIDES OF UDB
PUSHJ P,PEKSPY ;GET UNIDES
LDB T1,[POINTR T1,DC.CNT] ;GET CONTROLLER TYPE
CAIN T1,.DCCRN ;RP20?
MOVEI T2,.ESDXE ;YES, IT'S REALLY A DX20 ERROR
CAIN T1,.DCCRA ;CI DISK?
MOVEI T2,.ESCIE ;YES, DIFFERENT CODE
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;STORE CODE IN T1 FOR ERRINI
CAIN T2,.ESCIE ;CI DISK ERROR?
JRST GCIFER ;YES, PROCESS CI DISK ERROR
CAIE T2,.ESDXE ;DX20 ERROR?
JRST GMDVER ;NO, PROCESS MASSBUS ENTRY
JRST D2DSER ;YES, PROCESS DX20 DISK ENTRY
> ;END IFE FTUNSUPPORTED
;ROUTINE TO REPORT TAPE ERRORS, CODE 21 AND TAPE STATS, CODE 41
STPERR: PUSHJ P,PROTJB ;ASSURE JOB WILL BE FREED FROM ^D
HLRZ P3,1(T1) ;GET DDB ADDR IN P3
HRRZ P4,1(T1) ;MAKE P4 A POINTER TO THE TUB
MOVE T1,[%CNMER] ;GETTAB FOR MAGTAPE INFO
PUSHJ P,GTBSPY
POPJ P, ;OOPS
HLRZ P2,T1 ;GET OFFSET OF TUBRID IN RH OF P2
ADDI P4,(P2) ;AND MAKE P4 POINTER TO CURR. TUBRID
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE IN T1
CAIN T2,.ESTPS ;IS THIS MAG TAPE STATS?
PJRST GTPSTU ;YES, RECORD THEM
PJRST GTPERR ;GO REPORT TAPE ERROR
;ROUTINE TO REPORT DX20 DEVICE ERRORS, CODE 12.
DX2ERR: PUSHJ P,PROTJB ;INSURE JOB WILL BE FREED FROM ^D
HLRZ P2,1(T1) ;GET DDB ADDRESS IN P2
HRRZ P3,1(T1) ;GET UBD ADDRESS IN P3
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE IN T1
PJRST D2TPER ;PROCESS TU7X TAPE ERROR
;ROUTINE TO REPORT SOFTWARE ERROR (CODE 17), DL10 ERROR (CODE 50),
;LP100 ERROR (CODE 71), OR HARD COPY CONTROLLER ERROR (CODE 72)
SDIERR: PUSHJ P,PROTJB ;[544] [550] MAKE SURE JOB WILL BE FREED
HLRZ T1,(T1) ;GET POINTER TO AOBJN WORD INTO RH OF T1
PUSHJ P,PEKSPY ;GET AOBJN WORD
MOVE P1,T1 ;PUT IT INTO P1
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT CODE INTO T1
PUSHJ P,ERRINI ;INITIALIZE ERROR ENTRY
DLELP: HRRZ T1,P1 ;GET POINTER PART INTO T1
PUSHJ P,PEKSPY ;GET NEXT WORD
PUSH P4,T1 ;AND SAVE IT IN BUFFER
AOBJN P1,DLELP ;STEP POINTER
PJRST ERRFIN ;[544] [550] ALL DONE, WRITE ENTRY AND CLOSE FILE
;ROUTINE TO PROCESS ERROR CODE 75 (IPA20 DRAM DUMP)
ICDERR: HLRZ P3,(T1) ;GET POINTER TO KONTROLLER DATA BLOCK
MOVE T1,[%CNIDB] ;GET OFFSET TO DRAM DUMP BUFFER IN KDB
PUSHJ P,GTBSPY ;ASK
POPJ P, ;SORRY
ADD T1,P3 ;ADD IN OFFSET TO DUMP BUFFER
PUSHJ P,PEKSPY ;GET ADDRESS OF DUMP BUFFER
SKIPN P2,T1 ;COPY BUFFER ADDRESS TO P2
POPJ P, ;NOTHING THERE? STRANGE!
MOVSI T1,DSK+<(FO.PRV)> ;CHANNEL IS DSK PLUS PRIVS
HRRI T1,.FOWRT ;FUNCTION IS WRITE
MOVEM T1,D.FLOP+.FOFNC
MOVEI T1,.IODMP ;SET I/O MODE
MOVEM T1,D.FLOP+.FOIOS ; . .
MOVSI T1,'XPN' ;GET DEVICE
MOVEM T1,D.DEV ;SET UP FOR ERROR ROUTINES
MOVEM T1,D.FLOP+.FODEV ;AND STORE IT
SETZM D.FLOP+.FOBRH ;NO BUFFERS
SETZM D.FLOP+.FONBF ; . .
MOVEI T1,D.LKB ;ADDR. OF LOOKUP BLOCK
MOVEM T1,D.FLOP+.FOLEB ; . .
MOVEI T1,KDBNAM(P3) ;GET ADDRESS OF KDB NAME WORD
PUSHJ P,PEKSPY ;GET SIXBIT KDB NAME
MOVEM T1,D.LKB+.RBNAM ;STORE IT IN LOOKUP BLOCK
MOVSI T1,'D00' ;ASSUME FIRST DUMP FILE
MOVEM T1,D.LKB+.RBEXT ;STORE IT
ICDER1: SETZM D.LKB+.RBPPN ;ZAP PPN
MOVEI T1,.RBSIZ!RB.NSE ;GET EXTENDED LOOKUP BLOCK SIZE
MOVEM T1,D.LKB+.RBCNT ;STORE IT IN LOOKUP BLOCK
MOVE T1,[XWD .FOLEB+1,D.FLOP] ;POINT TO FILOP. BLOCK
FILOP. T1, ;ENTER DUMP FILE
SKIPA ;ERROR
JRST ICDER2 ;SUCCESS, CONTINUE
HRRZ T1,D.LKB+.RBEXT ;GET ENTER ERROR CODE
CAIE T1,ERAEF% ;ALREADY EXISTING FILE?
WARN <Can't create IPA channel dump file>,OPR
HLRZ T1,D.LKB+.RBEXT ;GET EXTENSION OF DUMP FILE
CAIN T1,'D99' ;TRIED ALL OF THEM?
WARN <Can't create IPA channel dump file>,OPR
ADDI T1,1 ;BUMP THE EXTENSION
TRC T1,12 ;SEE IF OVERFLOW INTO TENS DIGIT
TRCN T1,12 ;...
ADDI T1,100-'9'+'0'-1 ;YES, RESET UNITS TO ZERO AND BUMP TENS
HRLZM T1,D.LKB+.RBEXT ;SAVE NEW EXTENSION
JRST ICDER1 ;TRY AGAIN
ICDER2: MOVSI P4,-DRMSIZ/BLKSIZ ;SET UP AOBJN WORD FOR DUMPING DRAM
ICDER3: MOVSI P3,-BLKSIZ ;SET UP TO WRITE ONE DISK BLOCK'S WORTH OF DATA
ICDER4: MOVE T1,P2 ;GET AN ADDRESS
PUSHJ P,PEKSPY ;SNIFF IT OUT
MOVEM T1,DSKBUF(P3) ;STORE IT AWAY
ADDI P2,1 ;BUMP POINTER TO DRAM DATA
AOBJN P3,ICDER4 ;LOOP FOR ALL REMAINDER OF THIS BLOCK
OUTPUT DSK,[IOWD BLKSIZ, DSKBUF
0] ;WRITE OUT THE BLOCK
AOBJN P4,ICDER3 ;LOOP FOR REMAINING BLOCKS
CLOSE DSK, ;CLOSE DOWN THE CHANNEL
RELEAS DSK, ;...
POPJ P, ;AND ALL DONE
;ROUTINE TO PROCESS SYSTEM ERROR BLOCKS
;NOTE THAT THE MONITOR ATTEMPTS TO BUILD A "STANDARD" FORMAT
;ERROR.SYS HEADER. IF THE LENGTH THE MONITOR SUPPLIES DIFFERS
;FROM DAEMON'S IDEA A WARNING MESSAGE IS PRINTED ON THE CTY.
RSEBLK: TLNE F,L.DSK ;READING FROM DISK?
JRST RSEBL2 ;YES, THAT'S A LITTLE HARDER
RSEBL1: MOVE T1,[XWD <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.
RSEBL2: MOVX T1,%LDSEB ;POINTER TO TOP OF SYSTEM ERROR BLOCK QUEUE
PUSHJ P,GTBDSK ;RUMMAGE AROUND THE CRASH FILE
POPJ P, ;OLD CRASH FILE?
PUSHJ P,PEKDSK ;GET THE ADDRESS OF THE FIRST ENTRY
RSEBL3: MOVE P1,T1 ;COPY POINTER TO NEXT BLOCK TO P1
JUMPE P1,CPOPJ ;RETURN IF NO MORE ERROR BLOCKS
MOVEI T1,1+.EHTYP(P1) ;POINT AT TYPE WORD (SKIP LINK WORD)
PUSHJ P,PEKDSK ;INSERT OUR NOSES INTO THE CRASH FILE
LDB T2,[POINTR T1,EH.HLN] ;GET THE HEADER LENGTH
CAXE T2,EL.HED ;MAKE A QUICK SANITY CHECK
ERROR <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 RSEBL3 ;LOOP FOR ANY OTHER BLOCKS
;MINOR SUBROUTINE TO INSERT THE SYSTEM ERROR BLOCK IN ERABUF
;INTO THE ERROR.SYS FILE.
SEBLOG: TLO F,L.ANY ;NOTE WE GOT SOMETHING
MOVE T1,HEADR0 ;GET THE STANDARD FIELD DEFINITIONS
TLNE F,L.DSK ;READING FROM DISK?
TXO T1,EH.CRS ;YES, SET THE FLAG
IORM T1,ERABUF+.EHTYP ;MAKE THIS LOOK LIKE A GOOD ERROR ENTRY
AOS T1,ERRSEQ ;INCREMENT SEQUENCE NUMBER
MOVEM T1,ERABUF+.EHSEQ ;(4) SEQUENCE NUMBER
LDB P4,[POINT 9,ERABUF+.EHTYP,35] ;GET MONITOR-SUPPLIED LENGTH
ADDI P4,ERABFS-1 ;ACCOUNT FOR SUBTRACT AT ERFILL
PJRST ERRFIN ;STUFF THIS ENTRY IN ERROR.SYS AND RETURN
;ROUTINE TO REPORT SOFTWARE EVENT OF INTEREST, CODE 14.
SWEERR: HLRZ P1,(T1) ;GET EVENT TYPE
MOVE P2,1(T1) ;GET FUNCTION SPECIFIC DATA
PUSHJ P,PROTJB ;INSURE THE JOB IS RELEASED
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;STORE ERROR CODE
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
PUSH P4,P1 ;(R0) SAVE EVENT CODE
PUSH P4,J ;(R1) SAVE JOB NUMBER
HRROI T1,.GTPPN ;NEED USER'S PPN
PUSHJ P,GTBVAR ;(R2) SAVE IT
HRROI T1,.GTPRG ;NEED USER'S PROGRAM NAME
PUSHJ P,GTBVAR ;(R3) SAVE IT ALSO
MOVEI P1,0 ;START OUT WITH NO TTY NUMBER
PUSHJ P,GETTTY ;GET NUMBER OF CONTROLLING TTY
JRST SWEER1 ;CAN'T, SKIP THE REST
SKIPGE T1 ;IF THIS IS THE CTY
MOVE T1,CTYLIN ;GET THE CTY
DPB T1,[POINT 12,P1,35] ;SAVE IN P1
TRO T1,.UXTRM ;MAKE IT A UDX FOR GTNTN.
TLNN F,L.DSK ;FORGET REST IF READING FROM DISK
GTNTN. T1, ;GET NODE,,LINE ON NODE
JRST SWEER1 ;CAN'T, USE ZERO
DPB T1,[POINT 12,P1,23] ;SAVE LINE ON NODE IN P1
HLRZS T1 ;MOVE NODE TO RH
DPB T1,[POINT 12,P1,11] ;SAVE IN P1
SWEER1: PUSH P4,P1 ;(R4) BYTE (12) NODE,LINE ON NODE,TTY
PUSH P4,[-1,,SWEDTA] ;(R5) POINTER TO FUNCTION SPECIFIC DATA
SWEDTA==6 ;OFFSET TO FIRST WORD OF FUNCTION DATA
PUSH P4,P2 ;(R6-) FUNCTION SPECIFIC DATA
PJRST ERRFIN ;CLOSE FILE AND RETURN
;HERE TO REPORT CONFIGURATION STATUS CHANGE, CODE = 15
SCSCER: LDB T3,[POINT 6,(T1),17] ;GET BYTE WHICH TELLS US WHAT CHANGE
CAILE T3,CSCTBL ;GREATER THAN WE KNOW ABOUT?
POPJ P, ;YES, GIVE UP
PJRST @CSCTAB(T3) ;NO, DISPATCH
;DISPATCH TABLE INDEXED BY CHANGE CODE
CSCTAB: EXP ATTUNI ;(0) ATTACH
EXP ATTUNI ;(1) DETATCH
EXP XCHNGE ;(2) EXCHANGE
EXP DATCHG ;(3) DATE/TIME CHANGE
EXP CPOPJ ;(4) UNDEFINED
EXP CPOPJ ;(5) UNDEFINED
EXP NODONL ;(6) NODE OFF-LINE
EXP NODONL ;(7) NODE ON-LINE
EXP MEMOFL ;(10) MEMORY ONLINE
EXP MEMOFL ;(11) MEMORY OFFLINE
EXP MEMOFL ;(12) MONITOR SET MEMORY OFFLINE
CSCTBL==.-CSCTAB-1
ATTUNI: HRRZ P1,1(T1) ;ATT OR DET- GET UDB ADDR
HLLZ P2,(T1) ;AND GET COMMENT+COD INTO P2
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8];PUT ERROR CODE INTO T1
PUSHJ P,ERRINI ;AND CALL ERROR INITIALIZER
MOVEI T1,UDBNAM(P1) ;GET UDB ADDR INTO T1
PUSHJ P,PEKSPY ;AND GET FIRST WORD (UDBNAM)
PUSH P4,T1 ;(R0) STORE IT AWAY FOR ERROR FILE
PUSH P4,[0] ;(R1) STORE SECOND NAME OF ZERO
PUSH P4,P2 ;(R2) AND STORE COMMENTS+CODE
PJRST SCSEND ;CLOSE ERROR FILE AND RETURN
XCHNGE: HLRZ P1,1(T1) ;GET FIRST UDB ADDR INTO P1
HRRZ P2,1(T1) ;AND SECOND UDB ADDR INTO P2
HLLZ P3,(T1) ;GET COMMENTS+CODE INTO P3
SETZ T1, ;NOW CLEAR T1
DPB T2,[POINT 9,T1,8];AND PUT .ESCSC INTO T1
PUSHJ P,ERRINI ;INITIALIZE FOR ERROR
MOVEI T1,UDBNAM(P1) ;ADDR OF FIRST UDB
PUSHJ P,PEKSPY ;PICK UP UNIT NAME
PUSH P4,T1 ;(R0) AND PUT IT INTO ERROR BUFFER
MOVEI T1,UDBNAM(P2) ;NOW SAME FOR SECOND UNIT
PUSHJ P,PEKSPY ;...
PUSH P4,T1 ;(R1) ...
PUSH P4,P3 ;(R2) AND NOW COMMENTS+CODE
PJRST SCSEND ;CLOSE FILE AND RETURN
MEMOFL: HLLZ P3,(T1) ;COMMENTS+CODE INTO P3
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8];AND PUT .ESCSC INTO T1
PUSHJ P,ERRINI ;INITIALIZE FOR ERROR
MOVN T1,NXMLEN ;GET NEGATIVE LENGTH OF NXMTAB
HRLZS T1 ;AND PUT IN LH FOR POINTER
CSCNAM==0 ;OFFSET OF POINTER TO FIRST TABLE
PUSH P4,T1 ;(R0) SAVE -LEN,,0 FOR POINTER
CSCNM2==1 ;OFFSET OF POINTER TO SECOND TABLE
PUSH P4,T1 ;(R1) SAVE -LEN,,0 FOR THIS ONE ALSO
HRRI P3,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE
PUSH P4,P3 ;(R2) COMMENTS+CODE
MOVEI T2,1-ERABFH(P4) ;GET OFFSET OF START OF FIRST NXM TABLE
HRRM T2,ERABFS+CSCNAM ;SAVE IN RH OF POINTER
HRR T1,NXMTAB ;MAKE AOBJN POINTER TO NXMTAB
PUSH P4,(T1) ;PUSH A WORD ONTO THE BUFFER
AOBJN T1,.-1 ;AND STEP TO NEXT WORD
MOVEI T2,1-ERABFH(P4) ;GET OFFSET OF START OF SECOND NXM TABLE
HRRM T2,ERABFS+CSCNM2 ;SAVE IN RH OF POINTER
MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB
PUSHJ P,GTBDFL
MOVE T3,T1 ;USE T3 AS AOBJN POINTER
MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE
MOFLOP: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1
PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR
MOVEM T1,(T2) ;STASH IT AWAY
PUSH P4,(T2) ;PUT IT INTO ERROR BUFFER ALSO
AOS T2 ;INCREMENT T2
AOBJN T3,MOFLOP ;INCREMENT T3 AND LOOP
JRST SCSEND ;JOIN COMMON CODE
DATCHG: PUSHJ P,PROTJB ;INSURE THAT JOB IS RELEASED FROM ^D
MOVE P1,1(T1) ;GET DATE/TIME INCREMENT
ADDM P1,MRVBDY+MRVIDT ;SUM DATE/TIME INCREMENTS
HLLZ P2,(T1) ;GET CODE
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;STORE ENTRY CODE IN T1 FOR ERRINI
PUSHJ P,ERRINI ;SETUP BUFFER
PUSH P4,P1 ;(R0) INCREMENTAL DATE/TIME CHANGE
PUSHJ P,FLSPAK ;FLUSH INPUT QUEUE AND CLEAR BLOCK
MOVEI T1,.USSDT ;GET CODE FOR DATE CHANGE FOR %SIACT
MOVEM T1,SSELBK ;STORE IN BLOCK
MOVEM P1,SSELBK+1 ;SAVE INCREMENT IN MESSAGE BLOCK
PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME
MOVEM T1,SSELBK+2 ;SAVE IN BLOCK
PUSH P4,T1 ;(R1) CURRENT DATE/TIME
PUSH P4,P2 ;(R2) REASON CODE (I.E., DATE/TIME)
MOVE T1,[SIXBIT/DAEMON/] ;GET OUR NAME
MOVEM T1,SSELBK+3 ;SAVE IN BLOCK
MOVE T1,.JBVER ;GET OUR VERSION NUMBER
MOVEM T1,SSELBK+4 ;SAVE IN BLOCK
PUSHJ P,FNDACT ;FIND PID OF [SYSTEM]ACCOUNTING
JRST SCSEND ;NOT THERE, JUST WRITE FILE
PUSHJ P,SNDPAK ;SEND MESSAGE TO %SIACT
JRST SCSEND ;JOIN COMMON CODE
NODONL: HLLZ P1,0(T1) ;GET SUB-CODE IN P1
HRRZ P2,1(T1) ;GET NODE NUMBER IN P2
HLRZ P3,1(T1) ;GET ADDITIONAL INFORMATION IN P3
MOVEI T1,0 ;SETUP FOR ERRINI
DPB T2,[POINT 9,T1,8] ;STORE CODE
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
PUSH P4,P2 ;(R0) NODE NUMBER
PUSH P4,P3 ;(R1) ADDITIONAL INFO
PUSH P4,P1 ;(R2) CODE FOR NODE ON/OFF LINE
;; JRST SCSEND ;JOIN COMMON CODE
SCSEND: TRO F,R.AVL ;APPEND THIS ENTRY TO AVAIL.SYS ALSO
PJRST ERRFIN ;CLOSE FILE AND RETURN
IFN FTUNSUPPORTED,<
;HERE TO REPORT NXM ERROR - CODE 4 OR 67
SNXMER: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;GET CPU NUMBER
LSH P2,1 ;DOUBLE IT
PUSHJ P,ISKL10 ;IS THIS A KL10?
SKIPA ;NO
MOVEI T2,.ESKAE ;FUDGE CODE FOR KL10 NXM
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSHJ P,ERRINI ;INITIALIZE THE ERROR BUFFER
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVTNE] ;COUNT OF ERROR ON SWEEP OF CORE
PUSHJ P,GCPVAR ;(R1)STASH IT
MOVE T1,[%CVSNE] ;NOT REPRODUCIBLE ERROR COUNT
PUSHJ P,GCPVAR ;(R2)
MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR
PUSHJ P,GCPVAR ;(R3)
MOVE T1,[%CVNJA] ;NUMBER OF JOBS AFFECTED BY THIS NXM
PUSHJ P,GCPVAR ;(R4)
MOVE T1,[%CVMNA] ;FIRST BAD ADDR FROM SWEEP
PUSHJ P,GCPVAR ;(R5)
MOVE T3,[%CCNXT] ;GET POINTER TO NXM SUBTABLE
ADD T3,P2 ;POINTER IS IN CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN VARIABLES TABLE
NXMSLP: PUSHJ P,GSUBTB ;GET AN ITEM FROM THE SUBTABLE
JRST ENXSTB ;END OF THE SUBTABLE
PUSH P4,T1 ;(R6-R15)STICK IT IN THE BUFFER
AOJA T2,NXMSLP ;LOOP OVER ENTIRE SUBTABLE
ENXSTB: MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE
HRLI T1,707070 ;FLAG FOR SYSERR
PUSH P4,T1 ;(R16)SAVE IT
MOVN T2,NXMLEN ;GET NEGTIVE LENGTH OF NXMTAB
HRLZS T2 ;PUT IT IN LH OF T2 FOR POINTER
EN%BEF==17 ;OFFSET OF FIRST POINTER TO NXMTAB
PUSH P4,T2 ;(R17)SAVE AS POINTER TO FIRST COPY OF NXMTAB
PUSH P4,T2 ;(R20)SAVE AS POINTER TO SECOND COPY OF NXMTAB
EN%BAT==21 ;OFFSET FOR POINTER TO BAD ADDR SUBTABLE
AOBJN P4,.+1 ;(R21)SPACE FOR BAD ADDRESS SUBTABLE
MOVE T1,[%SYSPP] ;GETTAB FOR PPN OF USER CRASHED BY NXM
PUSHJ P,GTBVAR ;(R22) SAVE PPN
MOVE T1,[%SYSPN] ;PROGRAM NAME ON NXM
PUSHJ P,GTBVAR ;(R23) SAVE PROGRAM NAME
PUSHJ P,KLCPU ;(R24-R26 ON KL)REPORT CONI APR, AND RDERA IF KL10
MOVEI T1,1-ERABFH(P4) ;GET RELATIVE POSITION TO NXM TABLE
HRRM T1,ERABFS+EN%BEF ;SAVE AS RIGHT HALF OF POINTER
HLLZ T2,ERABFS+EN%BEF ;GET BACK NEG LENGTH
HRR T2,NXMTAB ;AND GET POINTER TO TABLE
PUSH P4,(T2) ;PUSH WORD OF NXMTAB INTO BUFFER
AOBJN T2,.-1 ;STEP TO NEXT WORD
MOVEI T1,1-ERABFH(P4) ;GET RELATIVE OFFSET TO 2ND TABLE
HRRM T1,ERABFS+EN%BEF+1 ;SAVE IT AS RIGHT HALF OF POINTER
MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB
PUSHJ P,GTBDFL
MOVE T3,T1 ;USE T3 AS AOBJN POINTER
MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE
NXELOP: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1
PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR
MOVEM T1,(T2) ;STASH IT AWAY
PUSH P4,T1 ;PUT IT INTO ERROR BUFFER ALSO
AOS T2 ;INCREMENT T2
AOBJN T3,NXELOP ;INCREMENT T3 AND LOOP
PUSH P,P4 ;SAVE CURRENT LOC IN BUFFER
MOVE T3,[%CCNXT] ;SUBTABLE POINTER FOR NXM
ADD T3,P2 ;IN THE CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;THE SUBTABLE IS IN VARIABLES TABLE
HRRI T2,%CVNTS ;ITEM FOR # OF NXM'S FOUND ON SWEEP
PUSHJ P,GSUBTB ;GO GET IT
JRST CKLSBD ;NONE IF NO POINTER
JUMPE T1,CKLSBD ;OR IF POINTER IS ZERO
MOVE T4,T1 ;GET COUNT INTO T4
HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW
HLLZS T2 ;AND START AT ITEM 0
NBTSLP: PUSHJ P,GSUBTB ;GET A WORD
JRST ENBTTB ;ALL DONE
PUSH P4,T1 ;SAVE IT IN BUFFER
AOJ T2, ;STEP TO NEXT ENTRY
SOJG T4,NBTSLP ;LOOP BACK FOR NUMBER OF ENTRIES
ENBTTB: POP P,T1 ;GET BACK START LOC OF TABLE
MOVNI T2,(T2) ;GET NEGATIVE NUMBER OF ITEMS STORED
JUMPE T2,KLSBDG ;IF NONE, JUST FINISH
HRLI T2,1-ERABFH(T1) ;COMPUTE RELATIVE OFFSET OF TABLE
MOVSM T2,ERABFS+EN%BAT ;SAVE POINTER IN BUFFER
PJRST KLSBDG ;WRITE SBDIAG SUBTABLE IF KL10, THEN CLOSE ERROR FILE
;STILL IFN FTUNSUPPORTED
;HERE TO REPORT CPU PARITY ERROR - CODE 3 OR 62
SCPERR: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;COPY CPU #
LSH P2,1 ;DOUBLE IT
PUSHJ P,ISKL10 ;IS THIS A KL10?
SKIPA ;NO
MOVEI T2,.ESMOT ;YES, FUDGE CODE FOR KL10 PARITY INTERRUPT
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PJRST GCPERR ;LOG THE ERROR
;HERE TO REPORT KL10 DATA PARITY TRAP -- CODE 60
SKLTRP: PUSHJ P,PROTJB ;[544] MAKE SURE JOB IS FREED
HLRZ P3,(T1) ;GET CPU DATA BLOCK ADDR INTO P3
PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;COPY CPU NUMBER
LSH P2,1 ;AND DOUBLE IT FOR GETTABS
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1
PUSHJ P,ERRINI ;WRITE ENTRY HEADER
MOVE T1,[%CVPFW] ;PAGE FAIL WORD
PUSHJ P,GCPVAR ;(R0)
MOVE T1,[%CVTBD] ;BAD DATA
PUSHJ P,GCPVAR ;(R1)
MOVE T1,[%CVTGD] ;GOOD DATA
PUSHJ P,GCPVAR ;(R2)
MOVE T1,[%CVBPA] ;BAD PHYSICAL ADDR
PUSHJ P,GCPVAR ;(R3)
MOVE T1,[%CVPTR] ;RETRY WORD
PUSHJ P,GCPVAR ;(R4)
MOVE T1,[%CVSPT] ;NUMBER OF SOFT TRAPS
PUSHJ P,GCPVAR ;(R5)
MOVE T1,[%CVHPT] ;NUMBER OF HARD TRAPS
PUSHJ P,GCPVAR ;(R6)
MOVE T1,[%CVPPC] ;PC AT TIME OF TRAP
PUSHJ P,GCPVAR ;(R7)
PJRST ERRFIN ;CLOSE FILE AND RETURN
> ;END IFN FTUNSUPPORTED
;HERE TO REPORT CONTINUABLE STOPCD - CODE =2
SCNSTD: MOVSI P1,-21 ;NUMBER OF CRASH AC'S + CRASH PI
HLR P1,(T1) ;LOCATION SAVED AT IN MONITOR
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1
PUSHJ P,ERRINI ;AND INITIALIZE ERROR
MOVE T2,[%CNFG0] ;5 WORDS OF SYSTEM NAME, 2 DATE
SUB T2,[%CNDT1+<1,,0>]
HLR T2,[%CNFG0]
MONLUP: MOVEI T1,.GTCNF ;FROM CNFTBL
HRLI T1,(T2)
PUSHJ P,GTBVAR ;(R0-R6) SAVE A WORD OF SYSTEM NAME/DATE
AOBJN T2,MONLUP ;GO GET NEXT WORD
MOVE T1,[%CNSER] ;GET CPU0 SERIAL NUMBER
PUSHJ P,GTBVAR ;(R7) SAVE CPU0 SERIAL NUMBER
PUSH P4,MONVER ;(R10) SAVE MONITOR VERSION
MOVE T1,[%SYSCD] ;GET NAME OF LAST STOPCD
PUSHJ P,GTBVAR ;(R11) SAVE NAME OF LAST STOPCODE
MOVE T1,[%SYSJN] ;JOB # ON LAST STOPCD
PUSHJ P,GTBVAR ;(R12) SAVE JOB NUMBER ON LAST STOPCODE
MOVE T1,[%SYSTN] ;TTY NAME ON LAST STOPCD
PUSHJ P,GTBVAR ;(R13) SAVE TTY ON LAST STOPCODE
MOVE T1,[%SYSPN] ;PROG NAME ON LAST STOPCD
PUSHJ P,GTBVAR ;(R14) SAVE PROGRAM NAME ON LAST STOPCODE
MOVE T1,[%SYSPP] ;PPN OF USER, LAST STOPCD
PUSHJ P,GTBVAR ;(R15) SAVE PPN
MOVE T1,[%SYNJS] ;NUMBER OF JOB STOPCDS
PUSHJ P,GTBVAR ;(R16) SAVE NUMBER
MOVE T1,[%SYNDS] ;NUMBER OF DEBUG STOPCD
PUSHJ P,GTBVAR ;(R17) SAVE NUMBER
CACLUP: MOVEI T1,(P1) ;ADDRESS OF NEXT CRASH AC (OR PI STATUS)
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R20-R40)
AOBJN P1,CACLUP ;NOW GO TO NEXT ONE
TRO F,R.AVL ;APPEND THIS ENTRY TO AVAIL.SYS ALSO
PJRST ERRFIN ;ALL DONE, CLOSE FILE AND RETURN
;HERE TO REPORT FRONT END SUPPLIED KL CPU ERROR INFORMATION
KLEERR: LDB P1,[POINT 3,2(T1),17] ;GET CPU NUMBER FROM ERROR BLOCK
PUSH P,P1 ;SAVE ON STACK FOR LATER
TLNN F,L.DSK ;READING FROM DISK?
JRST KLEER1 ;NO
MOVEI P2,1 ;GET A BIT TO SHIFT
LSH P2,(P1) ;POSITION FOR THIS CPU
TDNE P2,KLEFLG ;ALREADY BEEN HERE FOR THIS CPU?
JRST TPOPJ ;YES, DONE THEM ALL ALREADY
IORM P2,KLEFLG ;SET FLAG FOR NEXT TIME
KLEER1: HLRZ P1,(T1) ;GET ADDRESS OF FIRST ERROR BLOCK IN MONITOR
PUSH P,T2 ;SAVE CODE ON STACK
KLEER2: JUMPE P1,KLEER6 ;DONE IF ZERO
TLNE F,L.DSK ;READING FROM DISK?
JRST KLEER3 ;YES, IT'S NOT GOING TO GO AWAY
MOVE T1,[.DTERT,,T3]
HRLZ T3,-1(P) ;GET CPU,,0 FROM STACK
DTE. T1, ;RESET THE TIMER SO THE KL ERROR DATA DOESN'T GO AWAY
JRST KLEER6 ;SORRY, IT'S ALREADY GONE.
KLEER3: MOVE T2,0(P) ;GET CODE OFF STACK
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT CODE IN T1
PUSHJ P,ERRINI ;SETUP P4 (0-2)
PUSH P4,[-1] ;(R0)JOB NUMBER
PUSH P4,[0] ;(R1)DIRECTORY
PUSH P4,[0] ;(R2)FRONT END SOFTWARE VERSION
PUSH P4,[0] ;(R3)SIXBIT NAME OF PROGRAM (NONE)
MOVEI T1,.KEDEV(P1) ;GET ADDRESS IN BLOCK WHERE PROTOCOL DEVICE IS
PUSHJ P,PEKSPY ;GET THE DATA
LDB T2,KLEDEV ;GET PROTOCOL DEVICE CODE
LDB T3,KLEUNI ;AND UNIT NUMBER
HRL T2,T3 ;UNIT#,,PROTOCOL DEVICE CODE
PUSH P4,T2 ;(R4)PROTOCOL DEVICE CODE
LDB T1,KLECNT ;GET SIZE OF ERROR DATA IN 8 BIT BYTES
PUSH P,T1 ;SAVE FOR LATER
ADDI T1,^D36/^D8-1 ;ROUND UP TO NEAREST 36 BIT WORD
ASH T1,-2 ;CONVERT TO 36 BIT WORD COUNT
MOVNS T1 ;GET MINUS COUNT
HRLZS T1 ;-COUNT,,0
FE%OFF==5 ;OFFSET OF SUB-BLOCK POINTER
PUSH P4,T1 ;(R5)-LENGTH,,0
HLLZ P3,T1 ;GET -COUNT,,0 IN P3 FOR AOBJN LATER
MOVEI T1,.KECPU(P1) ;WORD WITH CPU, DTE, LINK
PUSHJ P,PEKSPY ;GET NEXT WORD IN T1
LDB T2,KLEDTN ;GET DTE NUMBER
LDB T3,KLECPN ;AND CPU NUMBER
HRL T2,T3 ;CPU#,,DTE#
PUSH P4,T2 ;(R6)CPU#,,DTE#
POP P,T2 ;GET SAVED COUNT OF 8 BIT DATA BYTES
PUSH P4,T2 ;(R7)COUNT OF 8 BIT DATA BYTES
LDB P2,KLELNK ;GET LINK ADDRESS
JUMPE P3,KLEER5 ;GO IF NO DATA TO STORE
HRRI P3,.KEDAT(P1) ;GET ADDRESS OF DATA
MOVEI T1,1-ERABFS(P4) ;GET RELATIVE OFFSET OF START OF TABLE
HRRM T1,ERABFS+FE%OFF ;SAVE IN POINTER
KLEER4: HRRZ T1,P3 ;GET ADDRESS IN MONITOR IN T1
PUSHJ P,PEKSPY ;GET THE DATA
PUSH P4,T1 ;(R10-)SAVE THE DATA
AOBJN P3,KLEER4 ;LOOP FOR ALL WORDS
KLEER5: HRRZ T1,ERABFS+FE%OFF-1 ;UNIT,,DEVICE CODE
CAIN T1,210 ;KLINIK DEVICE?
TLNE F,L.DSK ;FROM MONITOR?
JRST KLER5A ;NO, NO NEED TO QUEUE.
HRRZI T4,ERABFS+FE%OFF+3 ;POINT TO FIRST DATA WORD
HRLI T4,(POINT 16,,) ;THUS
ILDB T1,T4 ;GET STATUS WORD
JUMPE T1,KLER5A ;IF NO BITS ON, XFER DIDN'T
HLRZ T1,F ;SAVE A COPY OF THE FLAGS
TRZ T1,^-L.QUE ;ONLY THE ONES WE MESS WITH
PUSH P,T1 ;FOR WHEN WE'RE DONE
TLO F,L.QUE ;TELL TYPCHR WHAT WE WANT
PUSH P,MSGPTR ;SAVE POINTER
PUSH P,MSGCNT ;AND COUNTER
DMOVE T1,[POINT 7,KLQHDR
EXP ^D80] ;BUFFER LENGTH
DMOVEM T1,MSGPTR ;STORE A NEW ONE
MOVEI T1,[ASCIZ .CPU.]
PUSHJ P,TYPSTR ;TYPE
HLRZ T1,ERABFS+FE%OFF+1 ;CPU,,DTE WORD
PUSHJ P,TDEC
MOVEI T1,[ASCIZ . KLINIK Status Change.];END
PUSHJ P,TYPSTR
HRRZ T1,MSGPTR ;GET POINTER
SUBI T1,KLQHDR-1 ;GET NUMBER OF WORDS IN HEADER
HRLM T1,KLQLEN ;STORE FOR QUEUE.
POP P,MSGCNT ;RESTORE COUNTER
POP P,MSGPTR ;AND POINTER
ILDB T1,T4 ;NEXT, GET EVENT CODE WORD
MOVE T3,T1 ;COPY CODE,,TYPE
LSH T3,-8 ;CODE
ANDI T1,377 ;TYPE
CAIN T1,377 ;CLEAR?
JRST KLEKWC ;(377) WINDOW CLOSED
CAILE T1,0 ;IF LE ZERO
CAILE T1,7 ;OR GT MAX
JRST KLER5B ;INVALID FORMAT, FORGET IT
JRST @.(T1) ;DISPATCH
Z KLEKOW ;(1) OPEN WINDOW
Z KLEKLR ;(2) LINE RANG
Z KLEKLD ;(3) LINE DISCONNECT
Z KLEKLC ;(4) LINE CONNECT
Z KLEKBP ;(5) BAD PASSWORD
Z KLEKLF ;(6) LOGIN FAILED
Z KLEKAR ;(7) ACTIVE ON REBOOT
KLEKWC: MOVEI T1,[ASCIZ .Access window closed.]
JRST KLEKST ;OUTPUT STRING
KLEKOW: MOVEI T1,[ASCIZ .Access window opened
Window opened on .]
PUSHJ P,TYPSTR ;TYPE IT
PUSHJ P,KLEKDT ;TYPE DATE
MOVEI T1,[ASCIZ .
Window closes on .]
PUSHJ P,TYPSTR ;DELIMIT
PUSHJ P,KLEKDT ;TYPE DATE
MOVEI T1,[ASCIZ .
KLINIK mode: .]
PUSHJ P,TYPSTR ;TYPE
ILDB T1,T4 ;FETCH CSL,,KLINIK
MOVE T3,T1 ;SAVE CSL
ANDI T1,377 ;GET KLINIK
CAIN T1,377 ;USER MODE?
JRST [MOVEI T1,[ASCIZ .USER.]
JRST KLEKST] ;YES, DONE
MOVEI T1,[ASCIZ .REMOTE Console mode: .]
PUSHJ P,TYPSTR
MOVE T1,T3 ;GET CSL MODE
LSH T1,-8 ; ;ONLY CSL MODE
IDIVI T1,3 ;XLATE (1,3,7) TO (0,1,2)
AOJ T1, ;MAKE (1,2,3)
KLEKLM: MOVE T1,[[ASCIZ .OPERATOR.]
[ASCIZ .PROGRAMMER.]
[ASCIZ .MAINTENANCE.]]-1(T1)
JRST KLEKST ;TYPE AND SEND MESSAGE
KLEKLR: MOVEI T1,[ASCIZ .Dataset rang - .]
PUSHJ P,TYPSTR
MOVEI T1,[ASCIZ .???.]
CAIN T3,1 ;ACCEPTED?
MOVEI T1,[ASCIZ .Accepted.]
CAIN T3,377 ;REJECTED
MOVEI T1,[ASCIZ .Window closed.]
JRST KLEKST ;TYPE AND SEND MESSAGE
KLEKLD: MOVEI T1,[ASCIZ .Dataset disconnected .]
PUSHJ P,TYPSTR ;SAY SO
MOVEI T1,[ASCIZ .???.]
CAIN T3,1 ;INTENTIONAL?
MOVEI T1,[ASCIZ .from CTY or Timeout.]
CAIN T3,377 ;LINE DROP?
MOVEI T1,[ASCIZ .due to carrier loss.]
JRST KLEKST ;TYPE AND SEND
KLEKLC: MOVEI T1,[ASCIZ .Remote user connected in .]
PUSHJ P,TYPSTR ;WHAT HAPPENED
KLEKC0: MOVE T1,T3 ;GET EVENT CODE
CAIN T1,377 ;IS IT USER?
JRST [MOVEI T1,[ASCIZ .USER.]
JRST KLEKC1] ;YES
CAIL T1,1 ;RANGE CHECK
CAILE T1,3 ;OP, PRG, MNT
SKIPA T1,[[ASCIZ .???.]] ;FAILS
XCT KLEKLM ;GET ADDRESS OF MODE
PUSH P,T1 ;SAVE
MOVEI T1,[ASCIZ .REMOTE .]
PUSHJ P,TYPSTR ;SAY
POP P,T1 ;RESTORE ADDRESS OF MODE STRING
KLEKC1: PUSHJ P,TYPSTR ;TYPE IT
MOVEI T1,[ASCIZ . mode.]
JRST KLEKST ;TYPE AND SEND
KLEKBP: MOVEI T1,[ASCIZ .Bad password #.]
PUSHJ P,TYPSTR ;LABEL
MOVE T1,T3 ;GET NUMBER
PUSHJ P,TDEC ;TYPE
MOVEI T1,[ASCIZ . entered.]
JRST KLEKST ;DON'T TYPE WHAT WAS TRIED
KLEKLF: MOVEI T1,[ASCIZ .Remote access failed - .]
PUSHJ P,TYPSTR
MOVE T1,T3 ;HOW MANY PASSWORDS
PUSHJ P,TDEC ;SAY
MOVEI T1,[ASCIZ . passwords attempted.]
JRST KLEKST ;TYPE AND SEND
KLEKAR: MOVEI T1,[ASCIZ .Active during reload in .]
PUSHJ P,TYPSTR
JRST KLEKC0 ;TYPE CODE
KLEKDT: ILDB T1,T4 ;FETCH THE TIME(SEC/2)
PUSH P,T1 ;SAVE TIME
ILDB T1,T4 ;GET MON,,YR
PUSH P,T1 ;SAVE
ILDB T1,T4 ;GET 0,,DAY
ANDI T1,377 ;BETTER BE DAY
PUSHJ P,TDEC ;TYPE DAY
MOVE T1,(P) ;MONTH,,YR
LSH T1,-8 ;MONTH
CAILE T1,^D12 ;BETTER BE LEGAL
SETZ T1, ;GLAD WE CHECKED
MOVEI T1,[0
ASCIZ /-Jan/
ASCIZ /-Feb/
ASCIZ /-Mar/
ASCIZ /-Apr/
ASCIZ /-May/
ASCIZ /-Jun/
ASCIZ /-Jul/
ASCIZ /-Aug/
ASCIZ /-Sep/
ASCIZ /-Oct/
ASCIZ /-Nov/
ASCIZ /-Dec/](T1)
PUSHJ P,TYPSTR ;TYPE THIS
MOVEI SC,"-" ;NEXT
PUSHJ P,TYPCHR ;TYPE IT
POP P,T1 ;GET YEAR
ANDI T1,377 ;THUS
PUSHJ P,TDEC02 ;DONE WITH DATE
MOVEI T1,[ASCIZ . at .]
PUSHJ P,TYPSTR ;SIGH
POP P,T1 ;RESTORE TIME
LSH T1,1 ;MAKE SECONDS
IDIVI T1,^D60 ;MIN:SEC
PUSH P,T2 ;SEC
IDIVI T1,^D60 ;HR:MIN
PUSH P,T2 ;MIN
PUSHJ P,TDEC02 ;PRINT 2 DIGITS
MOVEI SC,":" ;
PUSHJ P,TYPCHR ;TYPE COLON
POP P,T1 ;MIN
PUSHJ P,TDEC02 ;MIN
MOVEI SC,":"
PUSHJ P,TYPCHR ;COLON
POP P,T1 ;SEC
PJRST TDEC02 ;TYPE AND RETURN
KLEKST: PUSHJ P,TYPSTR ;TYPE STRING
KLEKSM: PUSHJ P,PCRLF ;DO A CRLF
PUSHJ P,DMPBUF ;DUMP THE BUFFER
KLER5B: TLZ F,L.QUE ;CLEAR L.QUE
POP P,T1 ;GET OLD VALUE
TLO F,(T1) ;RESTORE IT
KLER5A: PUSHJ P,ERRFIN ;OK, CLOSE OFF ENTRY
MOVE P1,P2 ;GET NEW NEXT BLOCK
JRST KLEER2 ;GO SEE IF THERE IS MORE
KLEER6: POP P,(P) ;FLUSH CODE FROM STACK
MOVE T1,[.DTERC,,T3] ;RELEASE THE ERROR CORE NOW
POP P,T3 ;GET CPU NUMBER
HRLZS T3 ;MAKE IT CPU,,0
TLNN F,L.DSK ;DON'T TOUCH RUNNING MONITOR IF FROM DISK
DTE. T1, ;DO IT
JFCL ;GIVES NO ERROR RETURN
POPJ P, ;RETURN
KLEDEV: POINT 9,T1,8 ;PROTOCOL DEVICE CODE
KLEUNI: POINT 9,T1,17 ;UNIT NUMBER
KLECNT: POINT 18,T1,35 ;COUNT OF 8 BIT BYTES
KLECPN: POINT 9,T1,8 ;CPU NUMBER
KLEDTN: POINT 9,T1,17 ;DTE NUMBER
KLELNK: POINT 18,T1,35 ;LINK TO NEXT BLOCK IF ANY
;HERE TO DUMP CPU STATUS BLOCK - CODE 63
CSBERR: HLRZ P3,(T1) ;GET CDB ADDRESS
PUSHJ P,FNDCPU ;FIND CPU NUMBER THAT WANTS TO DUMP BLOCK
POPJ P, ;NONE, GIVE UP
LSH P1,1 ;DOUBLE IT
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
MOVE T3,[%CCCSB] ;SUBTABLE POINTER TO CPU STATUS BLOCK
ADDI T3,(P1) ; FROM THIS CPU CONSTANT TABLE
MOVSI T2,.GTC0V(P1) ;SUBTABLE IS IN CPU VARIABLE TABLE
CSBER1: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE
PJRST CSBER2 ;END OF TABLE, CLEAN UP
PUSH P4,T1 ;PLACE IN BUFFER
AOJA T2,CSBER1 ;LOOP FOR ENTIRE TABLE
CSBER2: MOVEI T1,1(P4) ;GET CURRENT BUFFER ADDRESS
CSBSBD==142 ;OFFSET IN BLOCK OF SBDIAG POINTER
CAILE T1,ERABFS+CSBSBD ;DID WE DO THAT MANY ENTRIES?
SKIPL ERABFS+CSBSBD ;AND SBDIAG POINTER LOOK OK?
PJRST ERRFIN ;NO TO ONE, DON'T TOUCH POINTER
MOVEI T3,CSBSBD ;GET OFFSET OF SBDIAG POINTER
ADDM T3,ERABFS+CSBSBD ;MAKE IT OFFSET FROM START OF BLOCK
PJRST ERRFIN ;CLOSE ERROR FILE AND RETURN
;HERE TO DUMP DEVICE STATUS BLOCK - CODE 64
DSBERR: HLRZ P3,(T1) ;GET CDB ADDRESS
PUSHJ P,FNDCPU ;FIND CPU THAT WANTS TO DUMP BLOCK
POPJ P, ;NONE, GIVE UP
LSH P1,1 ;DOUBLE IT
MOVEI T1,0 ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;STORE ERROR CODE IN T1
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
DSBIOI==0 ;OFFSET OF POINTER TO I/O INSTRUCTIONS
AOBJN P4,.+1 ;(R0) LEAVE ROOM FOR POINTER
DSBRSV==1 ;OFFSET OF POINTER TO RESULTANT VALUES
AOBJN P4,.+1 ;(R1) LEAVE ROOM FOR POINTER
PUSH P,P4 ;SAVE INITIAL VALUE OF BUFFER POINTER
MOVEI T2,0 ;INITIALIZE COUNT
DSBER1: HRLI T1,(T2) ;ITEM NUMBER TO LH
HRRI T1,.GTDCD ;TABLE NUMBER TO RH
PUSHJ P,GTBSPY ;GET NEXT I/O INSTRUCTION FROM DVCSTS
JRST DSBER2 ;END OF TABLE
PUSH P4,T1 ;SAVE IN BUFFER
AOJA T2,DSBER1 ;BUMP ITEM NUMBER AND LOOP
DSBER2: MOVNI T2,(T2) ;GET NEGATIVE LOOP COUNT
POP P,T1 ;RESTORE POINTER TO INITIAL LOC
JUMPE T2,DSBER3 ;IF NONE, LEAVE POINTER ZERO
HRLI T2,1-ERABFS(T1) ;MAKE SWAPPED AOBJN POINTER TO I/O INSTNS
MOVSM T2,ERABFS+DSBIOI ;SAVE POINTER IN BUFFER
DSBER3: PUSH P,P4 ;SAVE CURRENT BUFFER LOC FOR NEXT POINTER
MOVE T3,[%CCDSB] ;SUBTABLE POINTER TO DEVICE STATUS BLOCK
ADDI T3,(P1) ; FROM THIS CPU CONSTANT TABLE
MOVSI T2,.GTC0V(P1) ;SUBTABLE IS IN CPU VARIABLE TABLE
DSBER4: PUSHJ P,GSUBTB ;GET VALUE FROM SUBTABLE
JRST DSBER5 ;END OF TABLE
PUSH P4,T1 ;SAVE VALUE IN BUFFER
AOJA T2,DSBER4 ;BUMP INDEX AND LOOP
DSBER5: MOVNI T2,(T2) ;GET NEGATIVE COUNT
POP P,T1 ;GET BACK START LOC OF TABLE
PJUMPE T2,ERRFIN ;IF NONE, CLOSE ERROR FILE
HRLI T2,1-ERABFS(T1) ;MAKE SWAPPED AOBJN POINTER TO TABLE
MOVSM T2,ERABFS+DSBRSV ;SAVE IN BUFFER
PJRST ERRFIN ;CLOSE FILE AND RETURN
;SUBROUTINE TO RECORD A CPU-DETECTED ERROR
;ARGS T1=ERROR.SYS CODE IN BITS 0-8
; P1=CPU #
; P2=CPU # TIMES 2 (FOR GETTAB CPU TABLES)
;RETURNS CPOPJ, P1 AND P2 INTACT, P4, T1-4 BLOWN
GCPERR: PUSHJ P,ERRINI ;SETUP BUFFER AND P4
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVTPE]
PUSHJ P,GCPVAR ;(R1)TOTAL ERRORS WHICH RECURRED ON SWEEP OF CORE
MOVE T1,[%CVSPE]
PUSHJ P,GCPVAR ;(R2) TOTAL NOT REPRODUCABLE
MOVE T1,[%CVMPC] ;MEM PAR CONTINUES
PUSHJ P,GCPVAR ;(R3)
MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR
PUSHJ P,GCPVAR ;(R4) PC (EXEC OR USER)
MOVE T1,[%CVMPW] ;1ST WORD FOUND IN ERROR
PUSHJ P,GCPVAR ;(R5)
MOVE T1,[%CVMPA] ;FIRST BAD ADDRESS
PUSHJ P,GCPVAR ;(R6)
EC%PAR==7 ;PARITY DATA SUBTABLE POINTER
AOBJN P4,.+1 ;(R7) SAVE SPACE FOR IT
EC%BAT==10 ;BAD ADDRESS SUBTABLE POINTER
AOBJN P4,.+1 ;(R10) SAVE SPACE FOR IT
MOVE T1,[%SYSPP] ;[463]PPN OF USER, LAST STOPCD
PUSHJ P,GTBVAR ;(R11) SAVE PPN
MOVE T1,[%SYSPN] ;PROG NAME ON LAST STOPCD
PUSHJ P,GTBVAR ;(R12) SAVE PROGRAM NAME
PUSHJ P,KLCPU ;(R13-R15 ON KL)REPORT KL10 CONI AND RDERA
;KLCPU SET UP P3 WITH LOCATION OF POINTER TO SBDIAG SUBTABLE FOR
;CALL TO KLSBDG
PUSH P,P4 ;SAVE START ADDRESS OF SUBTABLE
MOVE T3,[%CCPAR] ;SUB-TABLE POINTER FOR OTHER PAR STUFF
ADD T3,P2 ;FROM THIS CPU CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN CPU VAR TABLE
PARSLP: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE
JRST EPARTB ;END OF PARITY SUBTABLE
PUSH P4,T1 ;GIVE
AOJA T2,PARSLP ;GET WHOLE SUBTABLE
EPARTB: POP P,T1 ;GET BACK START LOC OF SUBTABLE
MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT
JUMPE T4,KLSBDG ;IF NONE, THEN NO BAD ADDR'S EITHER
HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE
MOVSM T4,ERABFS+EC%PAR ;SAVE AS POINTER TO SUBTABLE
PUSH P,P4 ;SAVE START LOC OF BAD ADDR SUBTABLE
;HERE TO RECORD BAD ADDRESSES
HRRI T2,%CVPTS ;OTHER POINTERS ARE ALREADY SET
PUSHJ P,GSUBTB ;NO OF BAD ADDRESSES SAVED
JRST CKLSBD ;NONE IF NO TABLE FOR THEM
MOVEI T4,(T1) ;KEEP THE COUNT
JUMPE T4,CKLSBD ;QUIT IF NONE
HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW
HLLZS T2 ;START AT BEGINNING OF TABLE
BATSLP: PUSHJ P,GSUBTB ;GET NEXT BAD ADDRESS
JRST EBATTB ;END OF SUB-TABLE
MOVEM T1,1(P4) ;SAVE THE BAD ADDR
AOBJP P4,EBATTB ;CHECK FOR BUFFER OVERFLOW
AOJ T2, ;READY FOR NEXT ENTRY
SOJG T4,BATSLP ;GET IT IF ONE WAS STORED
EBATTB: POP P,T1 ;GET BACK START LOC OF TABLE
MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT
JUMPE T4,KLSBDG ;GO IF NONE
HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE
MOVSM T4,ERABFS+EC%BAT ;STORE AS POINTER TO SUBTABLE
PJRST KLSBDG ;GET SBDIAGS IF ON A KL
GCPVAR: ADD T1,P2 ;CUT DOWN THE TYPING BY PUTTING THIS
GTBVAR: PUSHJ P,GTBDFL ; ALL IN ONE PLACE
PUSH P4,T1 ;SAVE AN ITEM IN THE ERROR FILE
POPJ P,
;HERE TO FIND CPU NUMBER CORRESPONDING TO CDB ADDRESS
;CALLED WITH P3 CONTAINING CDB ADDR
;RETURNS WITH P1 CONTAINING CPU # IN RIGHT HALF
;NON SKIP RETURN MEANS NO CPU MATCHED
FNDCPU: MOVSI P1,-CPUN ;GET NUMBER OF CPUS WE KNOW ABOUT
FNDCP1: HRRZ T1,P1 ;GET CPU NUMBER INTO T1
LSH T1,1 ;DOUBLE IT FOR .GTC0C, ETC.
HRLI T1,.GTC0C(T1) ;GET .GTCNC FOR THIS CPU
HRRI T1,.GTSLF ;SET UP TO GETTAB START OF .GTCNC
PUSHJ P,GTBDFL
CAIN P3,(T1) ;IS THIS THE CPU
JRST CPOPJ1 ;YES, GIVE SKIP RETURN
AOBJN P1,FNDCP1 ;NO, TRY NEXT
POPJ P, ;NONE MATCH, GIVE ERROR RETURN
;HERE TO DETERMINE IS THIS IS A KL10 PROCESSOR
;ALL REGS PRESERVED
;SKIPS IF CPU IS A KL10
ISKL10: PUSH P,T1 ;SAVE T1
MOVEI T1,0 ;CLEAR AN AC
BLT T1,0 ;AND DO A ZERO LENGTH BLT
SKIPE T1 ;IF NON-ZERO, NO KL10
AOS -1(P) ;IF KL, SKIP
POP P,T1 ;GET OLD T1 BACK
POPJ P, ;AND RETURN
;HERE TO PUT SPECIAL STUFF INTO ERROR FILE ENTRY IF THIS IS A KL10
KLCPU: PUSHJ P,ISKL10 ;IS THIS A KL10?
POPJ P, ;NO, EXIT
MOVE T1,[%CVPCN] ;RESULTS OF CONI APR,
PUSHJ P,GCPVAR
MOVE T1,[%CVAER] ;RESULTS OF RDERA
PUSHJ P,GCPVAR
AOBJN P4,.+1 ;RESERVE THE SPACE ALSO
HRRZ P3,P4 ;SAVE CURRENT ERROR FILE LOC FOR LATER
POPJ P, ;AND RETURN
;HERE TO WRITE SBDIAG SUBTABLE IF PROCESSOR IS A KL10
;ARGS P2=CPU NUMBER TIMES 2
; P3=ADDRESS IN BUFFER OF POINTER
CKLSBD: POP P,(P) ;BRING STACK INTO PHASE AND
;FALL INTO KLSBDG
KLSBDG: PUSHJ P,ISKL10 ;IS THIS A KL10?
PJRST ERRFIN ;NO, EXIT CLOSING FILE
MOVE T3,[%CCSDP] ;GET POINTER TO SBDIAG SUBTABLE
ADDI T3,(P2) ;IN THIS CPU'S CONSTANT TABLE
MOVSI T2,.GTC0V(P2) ;TABLE IS IN CDB VARIABLE TABLE
PUSHJ P,GSUBTB ;GET FIRST WORD (-# BLKS,,OFFSET TO 1ST)
PJRST ERRFIN ;NOT DEFINED, FORGET IT
JUMPGE T1,ERRFIN ;IF NO BLOCKS, GIVE UP
ADDI T2,(T1) ;BUMP ITEM NUMBER BY OFFSET OF FIRST
HRRI T1,1-ERABFH(P4) ;MAKE IT OFFSET TO START OF BLOCK
MOVEM T1,(P3) ;SAVE IN POINTER WORD IN BUFFER
KLSBD1: PUSHJ P,GSUBTB ;GET NEXT ITEM IN TABLE
PJRST ERRFIN ;DONE, CLOSE FILE
PUSH P4,T1 ;SAVE ITEM IN BUFFER
AOJA T2,KLSBD1 ;BUMP ITEM NUMBER AND LOOP
;SUBROUTINE TO RECORD A CHANNEL-DETECTED PARITY ERROR OR NON-EX MEM
CHNERR: HLRZ P2,(T1) ;GET CDB ADDRESS
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSHJ P,ERRINI ;HEADER, SET UP P4, CLEAR BUFFER
ADD P2,CHNLUE ;GET POINTER TO LAST UNIT WITH ERROR
PUSHJ P,PEKSPY
ANDI T1,-1 ;RH ONLY
JUMPE T1,CHNER1 ;STORE 0 IF DEVICE UNKNOWN
IFN UDBNAM,<ADDI T1,UDBNAM> ;ADDR OF NAME OF ERROR UNIT
PUSHJ P,PEKSPY ;PICK UP UNIT NAME
CHNER1: PUSH P4,T1 ;(R0) UNIT NAME
ADD P2,CHNNXM ;INDEX INTO CHANNEL DATA BLOCK
PUSHJ P,PEKSPY ;GET NXM COUNT FOR THIS CHANNEL
PUSH P4,T1 ;(R1) NON-EX MEM COUNT
ADD P2,CHNMPE ;INDEX INTO CHANNEL DATA BLOCK
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R2) MEM PAR ERR COUNT THIS CHANNEL
; ADD P2,CHNDPE ;INDEX INTO CHANNEL DATA BLOCK
; PUSHJ P,PEKSPY
; PUSH P4,T1 ;(R3) DEVICE PARITY ERRORS
AOBJN P4,.+1 ;(R3) OBSOLETE
MOVN T1,CHNICL ;-WORDS POINTED TO BY CHNICW
MOVE T2,P2 ;CHANNEL DATA BLOCK ADDRESS
ADD T2,CHNICW ;OFFSET TO INITIAL CONTROL WORD
HRL T2,T1 ;MAKE AN AOBJN POINTER
CHNER2: MOVEI T1,(T2) ;GET ADDR TO EXAMINE
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R4-R13) CONTROL AND DATA WORDS
AOBJN T2,CHNER2
ADD P2,CHNTCW ;INDEX INTO CHANNEL DATA BLOCK
PUSHJ P,PEKSPY ;READ CHANNEL TERMINATION WORD
CHNER3: PUSH P4,T1 ;(R14)EXPECTED TERM WD[463]
PJRST ERRFIN ;WRITE THE STUFF AND RETURN
;SUBROUTINE TO RECORD MAGTAPE STATISTICS ON UNLOAD (TAPSER)
;ARGS P2=OFFSET OF TUBRID IN TUB
; P3=DDB ADDRESS
; P4=POINTER TO TUBRID IN CURRENT TUB
;RETURN CPOPJ,P1-P4 INTACT,T1-T4 BLOWN
GTPSTU: PUSH P,P1 ;PRESERVE P1
PUSH P,P4 ;PRESERVE P4
PUSH P,P3 ;PRESERVE P3
MOVEI P1,TUBDDA-TUBRID(P4) ;GET ADDRESS OF SHADOW AREA FOR CURRENT
; TUB INTO P1
PUSHJ P,ERRINI ;HEADER, SETUP P4 AND BUFFER
MOVE T1,[%CNTDB] ;FIND TUBDDB
PUSHJ P,GTBSPY
JRST GTPST1 ;NOT THERE, USE OLD STYLE
ADDI T1,(P1) ;COMPUTE TUBDDB
SUBI T1,TUBDDA-TUBRID(P2)
PUSHJ P,PEKSPY
MOVEI P3,(T1) ;USE DDB ADDRESS FROM TUB
GTPST1: MOVE T2,XTPUL ;LIST OF ITEMS TO DUMP
PUSHJ P,UNIDMP ;(R0-R7)DUMP THEM
POP P,P3 ;RESTORE P3
MOVEI T1,(P3) ;DDB ADDR TO T1
PUSHJ P,DDBJOB ;GET OWNER'S JOB NUMBER
MOVEI J,(T1) ;AND PUT IT INTO J
PUSHJ P,GETPPN ;GET PPN
PUSH P4,T1 ;(R10)SAVE IT IN BUFFER
PUSHJ P,ERRFIN ;CLOSE ERROR FILE
POP P,P4 ;RESTORE ADDR OF TUB+TUBRID
POP P,P1 ;RESTORE AOBJN WORD FOR ALL UNITS
POPJ P, ;RETURN
;SUBROUTINE TO RECORD A MAGTAPE ERROR (TAPSER)
;ARGS AS IN GTPSTU ON LAST PAGE
GTPERR: PUSH P,P1 ;PRESERVE POINTER TO BLOCK FOR TAPES
PUSH P,P3 ;SAVE DDB ADDRESS
PUSH P,P4 ;SAVE POINTER TO TUBRID
MOVEI P1,0(P4) ;GET OFFSET TO TUBRID IN TUB INTO P1
PUSHJ P,ERRINI ;SET UP P4, PRODUCE HEADER
MOVE T1,[%CNTDB] ;FIND TUBDDB
PUSHJ P,GTBSPY
JRST GTPER1 ;NOT THERE, USE OLD STYLE
ADDI T1,(P1) ;COMPUTE TUBDDB
SUBI T1,(P2)
PUSHJ P,PEKSPY
MOVEI P3,(T1) ;SAVE DDB ADDRESS FROM TUB TO P3
GTPER1: MOVEI T1,DEVNAM(P3)
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R0)PUT IT INTO BUFFER
MOVEM T1,ERPTBK+1 ;REMEMBER DEVICE NAME IN ERPTBK TO USE FOR TAPOP
MOVE T2,XTPEL ;SET UP LIST OF ITEMS TO DUMP
PUSHJ P,UNIDMP ;(R1-R7)DUMP THEM
MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP. CALL
MOVEI T2,.TFKTP ;FUNCTION FOR TAPOP.
MOVEM T2,ERPTBK ;SAVE IT IN BLOCK FOR UUO
TAPOP. T1, ;WHAT KIND OF DEVICE?
SETZ T1, ;OOPS
TAPTRY==4 ;WORD CONTAINING CONTROLLER TYPE
DPB T1,[POINT 3,ERABFS+TAPTRY,14] ;SAVE IN BUFFER
MOVE T1,[2,,T2] ;SET UP FOR DIAG.
MOVEI T2,7 ;GET CONTROLLER NUMBER
MOVE T3,ERPTBK+1 ;UNIT NAME
DIAG. T1, ;WHAT CONTROLLER?
SETZ T1, ;BEFORE 603, ASSUME RH10
HLRZS T1 ;MOVE DEVICE CODE TO RH, CLEAR LH
CAIL T1,540 ;IS IT IN THE RANGE OF
CAILE T1,574 ;LEGAL RH20 DEVICE CODES?
TDZA T2,T2 ;NO
MOVSI T2,(1B11) ;YES--1B11 FOR RH20
MOVE T1,[%FTERR] ;GET OPTIONS
PUSHJ P,GTBDFL
TRNE T1,F%KS10&777777;ARE WE REPORTING FOR A KS10 SYSTEM?
MOVSI T2,(1B10) ;YES--ONLY RH11 CONTROLLERS
IORM T2,ERABFS+TAPTRY ;SET CHANNEL TYPE IN RETRY WORD
MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP.
MOVEI T2,.TFIEP ;AND GET ARG FOR POINTER TO INITIAL
MOVEM T2,ERPTBK ; ERROR AREA INTO BLOCK FOR TAPOP.
TAPOP. T1, ;GO GET IT
SETZ T1, ;OOPS
MOVE T4,T1 ;SAVE UNRELOCATED POINTER IN T4
TAPIEP==10 ;OFFSET OF POINTER TO INITIAL BLOCK
PUSH P4,T1 ;(R10)PUT IT IN BUFFER
MOVEI T1,.TFFEP ;FUNCTION FOR TAPOP. TO GET POINTER
MOVEM T1,ERPTBK ; TO FINAL ERROR STATUS AREA
MOVE T1,[2,,ERPTBK] ;SETUP FOR TAPOP.
TAPOP. T1, ;GO GET FINAL ERROR POINTER
SETZ T1, ;OOPS
MOVE T3,T1 ;SAVE UNRELOCATED POINTER IN T3
TAPFEP==11 ;OFFSET OF POINTER TO FINAL BLOCK
PUSH P4,T1 ;(R11)PUT IN BUFFER
MOVE T2,XTPEL1 ;GET EXTRA ITEMS
PUSHJ P,UNIDMP ;(R12-R13)
MOVEI T1,1-ERABFH(P4) ;GET OFFSET OF IEP BLOCK
HRRM T1,ERABFS+TAPIEP ;COMPLETE POINTER
ADDI T4,(P1) ;RELOCATE INITIAL POINTER WITH
SUBI T4,(P2) ;START OF UDB
IERLUP: MOVEI T1,(T4) ;GET NEXT WORD TO RECORD
PUSHJ P,PEKSPY ;PICK IT UP
PUSH P4,T1 ;AND PUT IT IN THE BUFFER
AOBJN T4,IERLUP ;LOOP ON INITIAL ERROR AREA
MOVEI T1,1-ERABFH(P4) ;GET OFFSET OF FEP BLOCK
HRRM T1,ERABFS+TAPFEP ;COMPLETE POINTER
ADDI T3,(P1) ;ADD OFFSET OF TUBRID+START OF TUB
SUBI T3,(P2) ;SUBTRACT OFFSET OF TUBRID IN TUB
FERLUP: MOVEI T1,(T3) ;GET NEXT WORD TO RECORD
PUSHJ P,PEKSPY ;PICK IT UP
PUSH P4,T1 ;AND PUT IT IN THE BUFFER
AOBJN T3,FERLUP ;LOOP ON FINAL ERROR AREA
PUSHJ P,ERRFIN ;CLOSE ERROR FILE
POP P,P4 ;RESTORE P4
POP P,P3 ;RESTORE P3
POP P,P1 ;RESTORE POINTER TO MAGTAPE ERROR AREA
POPJ P,
;SUBROUTINE TO RECORD DX20 DEVICE ERRORS FROM TAPSER
;ARGS T1=WORD 0 OF HEADER BLOCK FOR ERRINI
; P2=DDB ADDRESS
; P3=UDB ADDRESS
;RETURN CPOPJ, P1-P3 INTACT; P4, T1-T4 DESTROYED
D2TPER: PUSH P,P1 ;SAVE P1-P3
PUSH P,P2 ;...
PUSH P,P3 ;...
PUSHJ P,ERRINI ;SETUP P4, PRODUCE HEADER
MOVE T1,[%CNTDB] ;GETTAB TO RETURN VALUE OF TUBDDB
PUSHJ P,GTBSPY ;GET IT
JRST D2TPE1 ;USE WHAT TAPSER GAVE US
ADDI T1,(P3) ;ADD IN BASE OF TUB
PUSHJ P,PEKSPY ;GO GET DDB ADDRESS
MOVEI P2,(T1) ;MOVE TO P2
D2TPE1: MOVEI T1,DEVNAM(P2) ;POINT TO DEVICE NAME
PUSHJ P,PEKSPY ;GET IT
MOVEM T1,ERPTBK+1 ;SAVE FOR TAPOP'S/DIAG'S
PUSH P4,T1 ;(R0) SAVE IN BUFFER
MOVEI P1,.TFFEP ;TAPOP. FUNCTION TO RETURN TUBFEP
MOVEM P1,ERPTBK ;BUILD UUO BLOCK
MOVE P1,[2,,ERPTBK] ;POINT TO IT
TAPOP. P1, ;GET TUBFEP FOR THIS UDB
MOVEI P1,0 ;CAN'T DO MUCH
ADDI P1,(P3) ;OFFSET TO FIRST WORD OF TUBFEP ENTRIES
MOVE T1,[%CNMER] ;GETTAB TO RETURN TUBRID,,??????
PUSHJ P,GTBSPY ;GET VALUE
MOVSI T1,11 ;TAKE A GUESS
HLRZS T1 ;REALLY ONLY NEED TUBRID
ADDI P3,(T1) ;COMPUTE UDB+TUBRID
MOVEI T1,TUBRID(P3) ;POINT AT REELID IN TUB
PUSHJ P,PEKSPY ;GET IT
PUSH P4,T1 ;(R1) SAVE IN BUFFER
MOVE T1,[2,,T2] ;LEN,,ADR FOR DIAG.
MOVEI T2,7 ;FUNCTION=READ KON NUMBER
MOVE T3,ERPTBK+1 ;GET DEVICE NAME BACK
DIAG. T1, ;READ RH20 DEVICE CODE
MOVEI T1,0 ;FAILED, USE 0
MOVE T2,T1 ;SAVE IN T2
MOVEI T1,TD2VER(P1) ;GET POINTER TO DX20 ADDRESS
PUSHJ P,PEKSPY ;READ IT
IOR T2,T1 ;OR TOGETHER
HRRI T2,001001 ;CODES FOR RH20/MAGTAP
PUSH P4,T2 ;(R2) SAVE IN BUFFER
MOVE T2,XD2EL ;GET AOBJN POINT TO INFO TO DUMP
PUSHJ P,UNIDMP ;(R3-R42) DUMP REST
MOVEI T1,TD2MBR(P1) ;POINTER TO MASSBUS REGISTER POINTER
PUSHJ P,PEKSPY ;READ IT
DXEMBR==43 ;OFFSET IN DX20 ERROR ENTRY OF MBR SUB-BLOCK POINTER
SKIPE T2,T1 ;SKIP IF ZERO, SAVE IN T2
ADDI T1,DXEMBR ;OFFSET FROM START OF ERROR BLOCK
PUSH P4,T1 ;(R43) SAVE IN BUFFER
MOVEI T1,TD2DVL(P1) ;POINTER TO DEVICE SUB-BLOCK POINTER
PUSHJ P,PEKSPY ;READ IT
PUSH P,T1 ;SAVE FOR LATER
DXEDVL==44 ;OFFSET IN DX20 ERROR ENTRY OF DX20 REG SUB-BLOCK POINTER
SKIPE T1 ;SKIP IF NO REGISTERS
ADDI T1,DXEDVL ;OFFSET FROM START OF ERROR BLOCK
PUSH P4,T1 ;(R44) SAVE IN BUFFER
JUMPE T2,D2TPE5 ;SKIP LOOP IF NO MASSBUS REGISTERS
ADDI T2,TD2MBR(P1) ;OFFSET TO START OF BLOCK
HLRZ T1,T2 ;GET +NUMBER OF REGS TO READ
MOVNS T1 ;MAKE IT NEGATIVE
HRL T2,T1 ;MAKE AN AOBJN POINTER
D2TPE4: MOVEI T1,(T2) ;GET ADDRESS OF NEXT WORD OF BLOCK
PUSHJ P,PEKSPY ;READ IT
PUSH P4,T1 ;SAVE IN BUFFER
AOBJN T2,D2TPE4 ;LOOP FOR ALL ENTRIES
D2TPE5: POP P,T2 ;GET BACK DEVICE BLOCK POINTER
JUMPE T2,D2TPE7 ;SKIP IF NONE
ADDI T2,TD2DVL(P1) ;OFFSET TO START OF BLOCK
HLRZ T1,T2 ;GET +NUMBER OF REGS TO READ
MOVNS T1 ;MAKE IT NEGATIVE
HRL T2,T1 ;MAKE AN AOBJN POINTER
D2TPE6: MOVEI T1,(T2) ;GET ADDRESS OF NEXT WORD OF BLOCK
PUSHJ P,PEKSPY ;READ IT
PUSH P4,T1 ;SAVE IN BUFFER
AOBJN T2,D2TPE6 ;LOOP FOR ALL ENTRIES
D2TPE7: PUSHJ P,ERRFIN ;CLOSE ERROR FILE
POP P,P3 ;RESTORE UDB ADDRESS
MOVEI T1,UDBKDB(P3) ;OFFSET TO KDB POINTER
PUSHJ P,PEKSPY ;READ KDB ADDRESS
MOVEI T1,KDBCHN(T1) ;OFFSET TO CHANNEL DATA BLOCK
PUSHJ P,PEKSPY ;READ CDB ADDRESS
POP P,P2 ;RESTORE DDB ADDRESS
POP P,P1 ;AND P1
POPJ P, ;RETURN
;SUBROUTINE TO RECORD DX20 DEVICES ERRORS FROM FILIO (RP20)
;ARGS T1=WORD 0 OF HEADER BLOCK FOR ERRINI
; P2=DDB ADDRESS
; P3=UDB ADDRESS
;RETURN CPOPJ
D2DSER: PUSHJ P,ERRINI ;SETUP BUFFER, P4
MOVE T2,XR2EL1 ;GET ARG FOR UNIDMP
PUSHJ P,UNIDMP ;(R0-R1) STORE VALUES IN BUFFER
DXENAM==0 ;OFFSET OF UNIT NAME IN ENTRY
PUSH P4,[001002] ;(R2) CODE FOR RH20/DISK
DXETYP==2 ;OFFSET IN ENTRY OF DX20/CONTROLLER ADDRESS
MOVE T2,XR2EL2 ;GET ARG FOR UNIDMP
PUSHJ P,UNIDMP ;(R3-R6) STORE VALUES IN BUFFER
MOVEI T1,UNIMSC(P3) ;POINT TO COUNT OF MONITOR SEEKS
PUSHJ P,PEKSPY ;GET IT
MOVE P1,T1 ;SAVE IN P1
MOVEI T1,UNIUSC(P3) ;POINT TO COUNT OF USER SEEKS
PUSHJ P,PEKSPY ;GET IT
ADD T1,P1 ;ADD TOGETHER
PUSH P4,T1 ;(R7) NUMBER OF SEEKS
MOVEI T1,UNIBRC(P3) ;POINT TO BUFFERED READ COUNT
PUSHJ P,PEKSPY ;GET IT
MOVE P1,T1 ;SAVE IN P1
MOVEI T1,UNIDRC(P3) ;POINT TO DUMP READ COUNT
PUSHJ P,PEKSPY ;GET IT
ADD P1,T1 ;ACCUMULATE TOTAL
MOVEI T1,UNIMRC(P3) ;POINT TO MONITOR READ COUNT
PUSHJ P,PEKSPY ;GET IT
ADD P1,T1 ;ACCUMULATE TOTAL
PUSH P4,P1 ;(R10) NUMBER OF BLOCKS READ
MOVEI T1,UNIBWC(P3) ;POINT AT BUFFERED WRITE COUNT
PUSHJ P,PEKSPY ;GET IT
MOVE P1,T1 ;SAVE IN P1
MOVEI T1,UNIDWC(P3) ;POINT AT DUMP WRITE COUNT
PUSHJ P,PEKSPY ;GET IT
ADD P1,T1 ;ACCUMULATE TOTAL
MOVEI T1,UNIMWC(P3) ;POINT AT MONITOR WRITE COUNT
PUSHJ P,PEKSPY ;GET IT
ADD P1,T1 ;ACCUMULATE TOTAL
PUSH P4,P1 ;(R11) NUMBER OF BLOCK WRITTEN
MOVE T1,LDDBSH ;DEVFIL=DEVJOB+1=LEN(SHORT DDB)
ADDI T1,(P2) ;MAKE IT AN ADDRESS
PUSHJ P,PEKSPY ;GET IT
PUSH P4,T1 ;(R12) STORE FILENAME
MOVEI T1,(P2) ;PUT DDB ADDRESS IN T1
PUSHJ P,DDBJOB ;GET JOB NUMBER FROM DDB
MOVSS P1,T1 ;PUT IN LH AND SAVE IN P1
HRRI T1,.GTPPN ;SETUP TO GET PPN OF USER
PUSHJ P,GTBVAR ;(R13) SAVE PPN IN BUFFER
MOVE T1,P1 ;GET JOB NUMBER BACK
HRRI T1,.GTPRG ;SETUP TO GET NAME OF PROGRAM RUNNING
PUSHJ P,GTBVAR ;(R14) SAVE PROGRAM NAME IN BUFFER
HRRZ P1,UNISCR ;GET OFFSET TO UNISCR
ADDI P1,(P3) ;MAKE IT AN ADDRESS
MOVE T2,XR2EL3 ;SETUP ARG FOR UNIDMP
PUSHJ P,UNIDMP ;(R15-R24) STORE VALUES IN BUFFER
PUSH P4,[0] ;(R25) UNUSED
PUSH P4,[0] ;(R26) UNUSED
MOVEI T1,.DIAKU ;FUNCTION CODE FOR DIAG.
MOVE T2,ERABFS+DXENAM ;GET UNIT NAME
MOVE T3,[2,,T1] ;POINT AT BLOCK
DIAG. T3, ;GET DEVICE CODE
MOVEI T3,0 ;FAILED?
HRRZ P1,UNISCR ;GET OFFSET OF UNISCR
ADDI P1,4(P3) ;UNIEBK=UNISCR+4
MOVEI T1,(P1) ;MOVE POINTER TO T1
PUSHJ P,PEKSPY ;GET DX20/CONT ADDR,,MICROCODE VER
PUSH P,T1 ;SAVE MICROCODE VERSION FOR LATER
IOR T1,T3 ;OR DX20 ADDRESS WITH RH20 DEVICE CODE
HLLM T1,ERABFS+DXETYP ;STORE ADDRESSES IN BLOCK
HRLI P1,-<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,UDBKDB(P3) ;GET KDB ADDRESS
PUSHJ P,PEKSPY ;READ IT
HRRZS T1 ;KEEP JUST ADDRESS
ADD T1,KONREG ;OFFSET TO NUMBER OF REGS TO SAVE
PUSHJ P,PEKSPY ;READ THAT
ADD T1,UNISCR ;SKIP PAST THE REGS TO GET THE INITIAL
ADDI T1,4(P3) ; CONTROL REGISTER (UNIEBK=UNISCR+4)
PUSHJ P,PEKSPY ;READ THE INITIAL CONTROL REGISTER
PUSH P4,T1 ;(R41) SAVE IN THE BUFFER
POP P,T1 ;GET MICROCODE VERSION BACK
TLZ T1,-1 ;CLEAR JUNK
PUSH P4,T1 ;(R42) SAVE IN BUFFER
AOS T1,P1 ;STEP TO POINTER TO MASSBUS REGISTERS
PUSHJ P,PEKSPY ;READ IT
SKIPE T2,T1 ;DON'T DO ADD IF ZERO, MOVE TO T2
ADDI T1,DXEMBR ;OFFSET FROM FIRST WORD IN ENTRY
PUSH P4,T1 ;(R43) SAVE IN BUFFER
AOS T1,P1 ;STEP TO POINTER TO DEVICE REGISTERS
PUSHJ P,PEKSPY ;READ IT
PUSH P,T1 ;SAVE FOR LATER
SKIPE T1 ;DON'T DO ADD IF ZERO
ADDI T1,DXEDVL ;OFFSET FROM FIRST WORD IN ENTRY
PUSH P4,T1 ;(R44) SAVE IN BUFFER
JUMPE T2,D2DSE3 ;GO IF NO MASSBUS REGISTERS TO READ
ADDI T2,-1(P1) ;COMPUTE FIRST MASSBUS REGISTER ADDR
HLRZ T1,T2 ;GET THE LENGTH OF THE BLOCK
MOVNS T1 ;MAKE IT NEGATIVE
HRL T2,T1 ;MAKE T2 AN AOBJN POINTER TO THE BLOCK
D2DSE2: MOVEI T1,(T2) ;GET NEXT ADDRESS
PUSHJ P,PEKSPY ;READ THE NEXT REGISTER
PUSH P4,T1 ;SAVE IN BUFFER
AOBJN T2,D2DSE2 ;LOOP FOR ALL MASSBUS REGISTERS
D2DSE3: POP P,T2 ;RESTORE DEVICE REGISTER POINTER
JUMPE T2,D2DSE5 ;GO IF NONE TO READ
ADDI T2,(P1) ;COMPUTE FIRST DEVICE REGISTER ADDR
HLRZ T1,T2 ;GET LENGTH OF BLOCK
MOVNS T1 ;MAKE IT NEGATIVE
HRL T2,T1 ;MAKE T2 AN AOBJN POINTER TO THE BLOCK
D2DSE4: MOVEI T1,(T2) ;GET NEXT ADDRESS
PUSHJ P,PEKSPY ;READ THE NEXT REGISTER
PUSH P4,T1 ;STORE IN BUFFER
AOBJN T2,D2DSE4 ;LOOP FOR ALL WORDS IN BLOCK
D2DSE5: HLRZ T1,ERPTBK ;[1010] GET SOFTWARE-DETECTED ERROR CODE
PUSH P4,T1 ;[1010] AND SAVE IT TOO
PJRST ERRFIN ;CLOSE FILE AND RETURN
IFN FTUNSUPPORTED,<
;SUBROUTINE TO RECORD A DISK ERROR
;ARGS P2=ADDR OF DDB WITH ERROR
; P3=ADDR OF UNIT DATA BLOCK IN ERROR
;RETURN CPOPJ, P1-P3 INTACT; P4,T1-4 BLOWN
GDVERR: PUSHJ P,ERRINI ;HEADER, SETUP P4, CLEAR BUFER
MOVE T2,XDVEL ;LIST OF ITEMS TO DUMP
PUSHJ P,UNIDMP ;(R0-R14) DUMP THEM
MOVEI T1,UNIBRC(P3) ;BUFFERED READ COUNT
PUSHJ P,PEKSPY
MOVE T2,T1
MOVEI T1,UNIDRC(P3) ;DUMP-MODE READ COUNT
PUSHJ P,PEKSPY
ADD T2,T1
MOVEI T1,UNIMRC(P3) ;MONITOR READ COUNT
PUSHJ P,PEKSPY
ADD T2,T1 ;GET THEM ALL TOGETHER
PUSH P4,T2 ;(R15) TOTAL READS ON THIS UNIT
MOVEI T1,UNIBWC(P3) ;BUFFERED WRITE COUNT
PUSHJ P,PEKSPY
MOVE T2,T1
MOVEI T1,UNIDWC(P3) ;DUMP MODE WRITES
PUSHJ P,PEKSPY
ADD T2,T1
MOVEI T1,UNIMWC(P3) ;MONITOR WRITES
PUSHJ P,PEKSPY
ADD T2,T1
PUSH P4,T2 ;(R16) TOTAL WRITES ON THIS UNIT
MOVEI T1,UNIMSC(P3) ;MONITOR SEEK COUNT
PUSHJ P,PEKSPY
MOVE T2,T1
MOVEI T1,UNIUSC(P3) ;USER SEEK COUNT
PUSHJ P,PEKSPY
ADD T2,T1
PUSH P4,T2 ;(R17) TOTAL SEEKS ON THIS UNIT
MOVEI T1,UDBNAM(P3)
PUSHJ P,PEKSPY ;RE-GET UNIT NAME
MOVEI T2,T1 ;SET POINTER TO IT
DSKCHR T2,
SETZ T2, ;LOSE
PUSH P4,T2 ;(R20) DSKCHR INFO FOR THIS UNIT
MOVEI T1,UNILOG(P3) ;LOGICAL NAME OF UNIT
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R21) SAVE UNILOG
MOVE T1,UNICCT
ADDI T1,0(P3) ;OFFSET
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R22) # BAT SLOTS LEFT
MOVEI T2,(P2) ;GET DDB ADDRESS IN T2
ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB
HRLI T2,-2 ;WANT 2 WORDS FROM THE DDB
GDVER1: MOVEI T1,(T2) ;GET ADDRESS FOR PEKSPY
PUSHJ P,PEKSPY ;READ THE WORD IN THE DDB
PUSH P4,T1 ;(R23-R24) SAVE IN BUFFER
AOBJN T2,GDVER1 ;LOOP FOR ALL
HLLZS 0(P4) ;SAVE ONLY LH OF EXTENSION WORD
MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1
PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB
MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB
MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN
HRRI T1,.GTPPN ; FOR THIS JOB
PUSHJ P,GTBVAR ;(R25) SAVE PPN
MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM
HRRI T1,.GTPRG ; NAME FOR THIS JOB
PUSHJ P,GTBVAR ;(R26) SAVE PROGRAM NAME
PJRST ERRFIN ;FALL INTO CLOSE AND RETURN
> ;END IFN FTUNSUPPORTED
;SUBROUTINE TO RECORD A MASSBUS DEVICE ERROR (CODE 11) IN ERROR.SYS
;ARGS T3=NUMBER OF DRIVE REGISTRS SAVED ON THIS UNIT
; P2=ADDR OF DDB WITH ERROR
; P3=ADDR OF UNIT DATA BLOCK IN ERROR
;RETURN CPOPJ, P1-P3 INTACT; T1-T4,P4 BLOWN
GMDVER: PUSH P,T3 ;SAVE T3 FOR LATER
PUSHJ P,ERRINI ;WRITE HEADER
MOVE T2,XMDVEL ;GET AOBJN WORD FOR TABLE
PUSHJ P,UNIDMP ;(R0-R11) AND DUMP THE TABLE'S ITEMS
MOVEI T2,(P2) ;GET DDB ADDRESS INTO T2
ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB
HRLI T2,-2 ;WANT FILENAME AND EXT FROM DDB
GMDVR1: MOVEI T1,(T2) ;GET ADDRESS OF WORD
PUSHJ P,PEKSPY ;GET THE WORD
PUSH P4,T1 ;(R12-R13) SAVE IN BUFFER
AOBJN T2,GMDVR1 ;LOOP FOR ALL
HLLZS 0(P4) ;SAVE ONLY LH OF EXTENSION WORD
MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1
PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB
MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB
MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN
HRRI T1,.GTPPN ; FOR THIS JOB
PUSHJ P,GTBVAR ;(R14) SAVE PPN
MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM
HRRI T1,.GTPRG ; NAME FOR THIS JOB
PUSHJ P,GTBVAR ;(R15) SAVE PROGRAM NAME
POP P,T2 ;GET NUMBER OF REGS MONITOR SAVED
CAILE T2,MAXREG ;MORE THAN ALLOWED MAXIMUM?
MOVEI T2,MAXREG ;YES, REDUCE TO ALLOWED MAXIMUM
HRREI T3,-MAXREG(T2) ;GET NUMBER OF FILLERS
MOVNI T2,4(T2) ;T2=-(NUMBER TO SAVE+4 DATAI'S)
HRLZS T2 ;T2=AOBJN WORD FOR REGS TO SAVE
HRR T2,UNISCR ;MUST POINT INTO UDB
ADDI T2,(P3) ;INTO THIS UDB
MBDRLP: MOVEI T1,(T2) ;GET POINTER TO NEXT REG
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R16-R41) SAVE THIS REGISTER
AOBJN T2,MBDRLP ;AND LOOP TO NEXT REGISTER
JUMPE T3,MBDVDN ;NO MORE REGS, MONITOR SAVED ALL?
SETZ T1, ;SAVE SOME ZEROES FOR
PUSH P4,T1 ; SYSERR
AOJL T3,.-1 ;T3 HAS NUMBER TO SAVE
MBDVDN: MOVE T1,UNISCR ;GET OFFSET OF UNISCR IN UDB
ADDI T1,-1(P3) ;UNILAS=UNISCR-1
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R42) PUT IT IN ERABUF
MOVE T1,UNICCT ;[463]
ADDI T1,0(P3) ;OFFSET
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R43) # OF BAT SLOTS
MOVEI T1,(P3) ;ADDRESS OF UDB
PUSHJ P,PEKSPY ;GET UNIT NAME
MOVE T3,T1 ;SAVE FOR DIAG.
MOVE T1,[2,,T2] ;SET UP CALL
MOVEI T2,7 ;GET CONTROLLER UNIT
DIAG. T1, ;DO IT
SETZ T1, ;BEFORE 603 ASSUME RH10
HLRZ T2,T1 ;[703]MOVE KONT ADDR TO T2
LSH T2,-2 ;[703]RIGHT JUSTIFY FOR BYTE
MDETYP==4 ;WORD CONTAINING DEVICE CODE AND TYPE
DPB T2,[POINT 7,ERABFS+MDETYP,11] ;[703] SAVE FOR SYSERR
CAMGE T1,[540,,0] ;RH10?
SKIPA T2,[RH10CD] ;YES
MOVEI T2,RH20CD ;NO
MOVE T1,[%FTERR] ;GET OPTIONS
PUSHJ P,GTBDFL
TRNE T1,F%KS10&777777;ARE WE REPORTING FOR A KS10 SYSTEM?
MOVEI T2,RH11CD ;YES, THEN ONLY RH11 CONTROLLERS
DPB T2,[POINT 3,ERABFS+MDETYP,14] ;SAVE CODE IN RETRIES WORD
HLRZ T1,ERPTBK ;[1010] GET POSSIBLE SOFT ERROR CODE
PUSH P4,T1 ;[1010] AND TACK IT ON END OF ENTRY
PJRST ERRFIN ;CLOSE FILE AND RETURN
;SUBROUTINE TO RECORD A FILIO-DETECTED CI DISK ERROR (CODE 74) IN ERROR.SYS
;ARGS P2=ADDR OF DDB WITH ERROR
; P3=ADDR OF UNIT DATA BLOCK IN ERROR
;RETURN CPOPJ, P1-P3 INTACT; T1-T4,P4 BLOWN
GCIFER: PUSHJ P,ERRINI ;WRITE HEADER
MOVE T2,XMDVEL ;GET AOBJN WORD FOR TABLE (SAME AS MASSBUSS)
PUSHJ P,UNIDMP ;(R0-R11) AND DUMP THE TABLE'S ITEMS
MOVEI T2,(P2) ;GET DDB ADDRESS INTO T2
ADD T2,LDDBSH ;LEN OF SHORT DDB=DEVFIL IN DSK DDB
MOVEI T1,(T2) ;GET ADDRESS OF WORD
PUSHJ P,PEKSPY ;GET THE FILE NAME
PUSH P4,T1 ;(R12) SAVE IN BUFFER
MOVEI T1,1(T2) ;GET ADDRESS OF WORD
PUSHJ P,PEKSPY ;GET THE EXTENSION
HLLZS T1 ;ISOLATE EXTENSION (IN LEFT HALF)
PUSH P4,T1 ;(R13) SAVE IN BUFFER
MOVEI T1,(P2) ;GET DDB ADDRESS INTO T1
PUSHJ P,DDBJOB ;GET JOB # OWNING THIS DDB
MOVE T2,T1 ;REMEMBER JOB NUMBER IN T2 FOR 2ND GETTAB
MOVSI T1,(T2) ;SET UP T1 TO GETTAB USERS PPN
HRRI T1,.GTPPN ; FOR THIS JOB
PUSHJ P,GTBVAR ;(R14) SAVE PPN
MOVSI T1,(T2) ;AND SET UP T1 TO GETTAB PROGRAM
HRRI T1,.GTPRG ; NAME FOR THIS JOB
PUSHJ P,GTBVAR ;(R15) SAVE PROGRAM NAME
MOVE T1,UNICCT ;[463]
ADDI T1,0(P3) ;OFFSET
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R16) # OF BAT SLOTS
HLRZ T1,ERPTBK ;[1010] GET POSSIBLE SOFT ERROR CODE
PUSH P4,T1 ;[1010] (R17) AND TACK IT ON END OF ENTRY
PJRST ERRFIN ;CLOSE FILE AND RETURN
;SUBROUTINE TO RECORD KI/KL PARITY/NXM INTERRUPTS
KPARNX: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;COPY CPU #
LSH P2,1 ;DOUBLE IT
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSH P,T2 ;SAVE IT FOR A WHILE
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVMPP] ;PC AT TIME OF ERROR
PUSHJ P,GCPVAR ;(R1) PC (EXEC OR USER)
MOVE T1,[%CVPCN] ;CONI APR, AT ERROR
PUSHJ P,GCPVAR ;(R2) CONI APR,
MOVE T1,[%CVPPI] ;CONI PI, AT ERROR
PUSHJ P,GCPVAR ;(R3) CONI PI,
POP P,T2 ;GET BACK ERROR CODE
CAIE T2,.ESKIP ;IS THIS A KI?
JRST KPARN1 ;NO--A KL
MOVE T1,[%CVEJN] ;PPN OF USER
PUSHJ P,GTBVAR ;(R4) SAVE PPN
MOVE T1,[%CVEPN] ;PROGRAM NAME
PUSHJ P,GTBVAR ;(R5) SAVE PROGRAM NAME
PJRST ERRFIN ;END OF KI ENTRY
KPARN1: MOVE T1,[%CVAER] ;RDERA
PUSHJ P,GCPVAR ;(R4) RDERA
AOBJN P4,.+1 ;(R5) SPACE FOR SBDIAG POINTER
HRRZ P3,P4 ;SAVE CURRENT LOCATION HERE
PJRST KLSBDG ;WRITE THE SBDIAG SUB-TABLE
;SUBROUTINE TO RECORD KS NXM TRAPS AND KL/KS PARITY TRAPS
KLSTRP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;COPY CPU #
LSH P2,1 ;DOUBLE IT
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVPPC] ;PC AT TIME OF TRAP
PUSHJ P,GCPVAR ;(R1) PC AT TIME OF TRAP
MOVE T1,[%CVPFW] ;PAGE FAIL WORD
PUSHJ P,GCPVAR ;(R2) PAGE FAIL WORD
MOVE T1,[%CVBPA] ;MAPPED PHYSICAL ADDRESS
PUSHJ P,GCPVAR ;(R3) MAPPED PHYSICAL ADDRESS
MOVE T1,[%CVTBD] ;INCORRECT DATA
PUSHJ P,GCPVAR ;(R4) INCORRECT DATA
MOVE T1,[%CVTPI] ;CONI PI, AT TRAP
PUSHJ P,GCPVAR ;(R5) CONI PI, AT TRAP
MOVE T1,[%CVEJN] ;JOB NUMBER
PUSHJ P,GCPVAR ;(R6) JOB NUMBER THAT TRAPPED
MOVE T1,[%CVEPN] ;JOB NAME
PUSHJ P,GCPVAR ;(R7) JOB NAME THAT TRAPPED
MOVE T1,[%CVTGD] ;CORRECT DATA
PUSHJ P,GCPVAR ;(R8) CORRECT DATA
MOVE T1,[%CVPTR] ;RETRY WORD
PUSHJ P,GCPVAR ;(R9) RETRY WORD
MOVE T1,[%CVSPT] ;NUMBER OF RECOVERABLE TRAPS
PUSHJ P,GCPVAR ;(R10) RECOVERABLE TRAP COUNT
MOVE T1,[%CVHPT] ;NUMBER OF NON-RECOVERABLE TRAPS
PUSHJ P,GCPVAR ;(R11) NON-RECOVERABLE TRAP COUNT
MOVE T1,[%CVTGD] ;CORRECT DATA
PJRST ERRFIN ;CLOSE OUT ENTRY
;HERE TO RECORD NXM SWEEPS - CODE 56
NXMSWP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;GOT FIND WHICH CPU ERROR WAS ON
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;GET CPU NUMBER
LSH P2,1 ;DOUBLE IT
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSHJ P,ERRINI ;INITIALIZE THE ERROR BUFFER
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVTNE] ;COUNT OF ERROR ON SWEEP OF CORE
PUSHJ P,GCPVAR ;(R1)STASH IT
MOVE T1,[%CVSNE] ;NOT REPRODUCIBLE ERROR COUNT
PUSHJ P,GCPVAR ;(R2)
MOVE T1,[%CVMNA] ;FIRST BAD ADDR FROM SWEEP
PUSHJ P,GCPVAR ;(R3)
MOVE T3,[%CCNXT] ;GET POINTER TO NXM SUBTABLE
ADD T3,P2 ;POINTER IS IN CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN VARIABLES TABLE
NXMSW1: PUSHJ P,GSUBTB ;GET AN ITEM FROM THE SUBTABLE
JRST NXMSW2 ;END OF THE SUBTABLE
PUSH P4,T1 ;(R4-R11)STICK IT IN THE BUFFER
AOJA T2,NXMSW1 ;LOOP OVER ENTIRE SUBTABLE
NXMSW2: MOVEI T1,1 ;FLAG WHICH SAYS 1 BIT=1 PAGE
HRLI T1,707070 ;FLAG FOR SYSERR
PUSH P4,T1 ;(R12)SAVE IT
MOVN T2,NXMLEN ;GET NEGTIVE LENGTH OF NXMTAB
HRLZS T2 ;PUT IT IN LH OF T2 FOR POINTER
EN%NX1==13 ;OFFSET OF FIRST POINTER TO NXMTAB
PUSH P4,T2 ;(R13)SAVE AS POINTER TO FIRST COPY OF NXMTAB
PUSH P4,T2 ;(R14)SAVE AS POINTER TO SECOND COPY OF NXMTAB
EN%BTB==15 ;OFFSET FOR POINTER TO BAD ADDR SUBTABLE
AOBJN P4,.+1 ;(R15)SPACE FOR BAD ADDRESS SUBTABLE
MOVEI T1,1-ERABFH(P4) ;GET RELATIVE POSITION TO NXM TABLE
HRRM T1,ERABFS+EN%NX1 ;SAVE AS RIGHT HALF OF POINTER
HLLZ T2,ERABFS+EN%NX1 ;GET BACK NEG LENGTH
HRR T2,NXMTAB ;AND GET POINTER TO TABLE
PUSH P4,(T2) ;PUSH WORD OF NXMTAB INTO BUFFER
AOBJN T2,.-1 ;STEP TO NEXT WORD
MOVEI T1,1-ERABFH(P4) ;GET RELATIVE OFFSET TO 2ND TABLE
HRRM T1,ERABFS+EN%NX1+1 ;SAVE IT AS RIGHT HALF OF POINTER
MOVE T1,[%CNNXM] ;GETTAB POINTER TO NXMTAB
PUSHJ P,GTBDFL
MOVE T3,T1 ;USE T3 AS AOBJN POINTER
MOVE T2,NXMTAB ;AND T2 AS WHERE TO STORE
NXMSW3: HRRZ T1,T3 ;GET CURRENT ADDR INTO T1
PUSHJ P,PEKSPY ;GO PICK IT UP FROM MONITOR
MOVEM T1,(T2) ;STASH IT AWAY
PUSH P4,T1 ;PUT IT INTO ERROR BUFFER ALSO
AOS T2 ;INCREMENT T2
AOBJN T3,NXMSW3 ;INCREMENT T3 AND LOOP
PUSH P,P4 ;SAVE CURRENT LOC IN BUFFER
MOVE T3,[%CCNXT] ;SUBTABLE POINTER FOR NXM
ADD T3,P2 ;IN THE CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;THE SUBTABLE IS IN VARIABLES TABLE
HRRI T2,%CVNTS ;ITEM FOR # OF NXM'S FOUND ON SWEEP
PUSHJ P,GSUBTB ;GO GET IT
JRST CRRFIN ;NONE IF NO POINTER
JUMPE T1,CRRFIN ;OR IF POINTER IS ZERO
MOVE T4,T1 ;GET COUNT INTO T4
HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW
HLLZS T2 ;AND START AT ITEM 0
NXMSW4: PUSHJ P,GSUBTB ;GET A WORD
JRST NXMSW5 ;ALL DONE
PUSH P4,T1 ;SAVE IT IN BUFFER
AOJ T2, ;STEP TO NEXT ENTRY
SOJG T4,NXMSW4 ;LOOP BACK FOR NUMBER OF ENTRIES
NXMSW5: POP P,T1 ;GET BACK START LOC OF TABLE
MOVNI T2,(T2) ;GET NEGATIVE NUMBER OF ITEMS STORED
JUMPE T2,ERRFIN ;IF NONE, JUST FINISH
HRLI T2,1-ERABFH(T1) ;COMPUTE RELATIVE OFFSET OF TABLE
MOVSM T2,ERABFS+EN%BTB ;SAVE POINTER IN BUFFER
PJRST ERRFIN ;CLOSE OUT ENTRY
;HERE TO RECORD PARITY SWEEPS - CODE 57
PARSWP: HLRZ P3,(T1) ;GET CDB ADDR FOR CDB WITH ERROR
PUSHJ P,FNDCPU ;FIND CPU WHICH HAD ERROR
POPJ P, ;NOT ANY CPU, GIVE IT UP
MOVEI P2,(P1) ;COPY CPU #
LSH P2,1 ;DOUBLE IT
SETZ T1, ;CLEAR T1
DPB T2,[POINT 9,T1,8] ;PUT ERROR CODE INTO T1 FOR ERRINI
PUSHJ P,ERRINI ;SETUP BUFFER AND P4
MOVE T1,[%CCPHY] ;PHYSICAL CPU NAME
PUSHJ P,GCPVAR ;(R0) PHYSICAL CPU NAME
MOVE T1,[%CVTPE]
PUSHJ P,GCPVAR ;(R1)TOTAL ERRORS WHICH RECURRED ON SWEEP OF CORE
MOVE T1,[%CVSPE]
PUSHJ P,GCPVAR ;(R2) TOTAL NOT REPRODUCABLE
MOVE T1,[%CVMPW] ;CONTENTS OF FIRST BAD WORD
PUSHJ P,GCPVAR ;(R3)
MOVE T1,[%CVMPA] ;FIRST BAD ADDRESS
PUSHJ P,GCPVAR ;(R4)
EC%PRT==5 ;PARITY DATA SUBTABLE POINTER
AOBJN P4,.+1 ;(R5) SAVE SPACE FOR IT
EC%BTA==6 ;BAD ADDRESS SUBTABLE POINTER
AOBJN P4,.+1 ;(R6) SAVE SPACE FOR IT
PUSH P,P4 ;SAVE START ADDRESS OF SUBTABLE
MOVE T3,[%CCPAR] ;SUB-TABLE POINTER FOR OTHER PAR STUFF
ADD T3,P2 ;FROM THIS CPU CONSTANTS TABLE
MOVSI T2,.GTC0V(P2) ;SUBTABLE IS IN CPU VAR TABLE
PARSW1: PUSHJ P,GSUBTB ;GET ENTRY FROM SUBTABLE
JRST PARSW2 ;END OF PARITY SUBTABLE
PUSH P4,T1 ;GIVE
AOJA T2,PARSW1 ;GET WHOLE SUBTABLE
PARSW2: POP P,T1 ;GET BACK START LOC OF SUBTABLE
MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT
JUMPE T4,ERRFIN ;IF NONE, THEN NO BAD ADDR'S EITHER
HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE
MOVSM T4,ERABFS+EC%PRT ;SAVE AS POINTER TO SUBTABLE
PUSH P,P4 ;SAVE START LOC OF BAD ADDR SUBTABLE
HRRI T2,%CVPTS ;OTHER POINTERS ARE ALREADY SET
PUSHJ P,GSUBTB ;NO OF BAD ADDRESSES SAVED
JRST CRRFIN ;NONE IF NO TABLE FOR THEM
MOVEI T4,(T1) ;KEEP THE COUNT
JUMPE T4,CRRFIN ;QUIT IF NONE
HLL T3,[%CCMPT] ;LOOK IN BAT SUBTABLE NOW
HLLZS T2 ;START AT BEGINNING OF TABLE
PARSW3: PUSHJ P,GSUBTB ;GET NEXT BAD ADDRESS
JRST PARSW4 ;END OF SUB-TABLE
MOVEM T1,1(P4) ;SAVE THE BAD ADDR
AOBJP P4,PARSW4 ;CHECK FOR BUFFER OVERFLOW
AOJ T2, ;READY FOR NEXT ENTRY
SOJG T4,PARSW3 ;GET IT IF ONE WAS STORED
PARSW4: POP P,T1 ;GET BACK START LOC OF TABLE
MOVNI T4,(T2) ;GET -LEN OF TABLE FROM LOOP COUNT
JUMPE T4,ERRFIN ;GO IF NONE
HRLI T4,1-ERABFH(T1) ;MAKE SWAPPED AOBJN POINTER TO SUBTABLE
MOVSM T4,ERABFS+EC%BTA ;STORE AS POINTER TO SUBTABLE
PJRST ERRFIN ;CLOSE OUT ENTRY
;SUBROUTINE TO APPEND TO ERROR.SYS
;ARGS P4=LAST ADDR STORED IN ERRBUF
;BLOWS T1-3
;ALWAYS RETURNS CPOPJ
CRRFIN: POP P,(P) ;PRUNE STACK
ERRFIN: SKIPE IOERR ;[62]CAN WE WRITE IN ERROR.SYS
JRST ERRFIX ;NO, CLEAR FLAGS AND RETURN
MOVEM P4,SAVEP4 ;SAVE P4
PUSHJ P,FLSPAK ;FLUSH INPUT QUEUE AND CLEAR BLOCK
TRZA F,R.PAE ;INSURE THAT R.PAE IS NOT SET
AVLFIN: TRO F,R.PAE ;SET PROCESSING AVAIL.SYS FLAG
TRZ F,R.INF ;MAKE SURE THIS BIT IS OFF
INIFIN: MOVX T1,.IODMP ;OPEN IN DUMP MODE
MOVE T2,CERDEV ;GET DEVICE
MOVEI T3,0 ;NO BUFFERS
OPEN FCT,T1 ;OPEN THE CHANNEL
JRST E.IEF ;CAN'T INIT ERROR FILE
MOVE T1,CERDEV ;[602] GET DEVICE WHERE ERROR.SYS LIVES
MOVEM T1,SSELBK+4 ;[602]INTO THE IPCF MSG
MOVEI T1,RBSIZE-RBCNTE ;LENGTH OF DESIRED EXTENDED LOOKUP
MOVEM T1,RBCNTE
MOVE T1,CERPPN ;GET PPN OF ERROR FILE
MOVEM T1,RBPPNE ;STORE DIRECTORY
MOVEM T1,SSELBK+7 ;[602] IN IPCF MSG TOO
MOVE T1,[SIXBIT/ERROR/]
TRNE F,R.PAE ;DOING AVAIL.SYS?
MOVE T1,[SIXBIT/AVAIL/] ;YES, CHANGE NAME
MOVEM T1,RBNAME ;STORE FILNAM
MOVEM T1,SSELBK+5 ;[602]IN IPCF PACKET TOO
HRLZ T1,ERREXT ;[62]GET CURRENT ERROR EXTENSION
TRNE F,R.PAE ;DOING AVAIL.SYS?
MOVSI T1,'SYS' ;YES, EXTENSION IS ALWAYS SYS
MOVEM T1,RBEXTE ;STORE EXT
MOVEM T1,SSELBK+6 ;[602]IN IPCF TOO
MOVSI T1,(155B8) ;IF NOT FOUND, MAKE IT READ-ONLY
MOVEM T1,RBPRVE
SETZM RBSIZE ;IF LOOKUP FAILS, LEN IS ZERO
MOVEI T1,ERRBUF-1 ;PREPARE IOWD
HRRM T1,ILIST ; FOR INPUT
HRRM T1,OLIST ; AND FOR OUTPUT
MOVEI T1,-200 ;PUT WORD COUNT INTO OUTPUT
HRLM T1,OLIST ; IOWD FOR FULL BLOCK
MOVEI T1,-1 ;MASK IN RIGHT HALF FOR ERROR CODE
TXNN F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION?
JRST INIFI1 ;YES, DO NORMAL STUFF
LOOKUP FCT,EBLOCK ;DO EXTENDED LOOKUP
JRST E.INF1 ;FAILED
JRST INIFI2 ;JUMP AROUND OTHER STUFF
INIFI1: LOOKUP FCT,EBLOCK ;DO EXTENDED LOOKUP
TDZN T1,RBEXTE ;IF FILE NOT FOUND, MAKE ONE, ELSE BOMB
ENTER FCT,EBLOCK ;DO UPDATE
JRST E.EEF ;WHAT?
INIFI2: MOVE T1,RBSIZE ;GET SIZE IN WORDS
TRNE F,R.PAE ;IF WE ARE DOING AVAIL.SYS AND
CAIE T1,BLKSIZ*AVLWRK ;THE SIZE IS THE LENGTH OF THE
SKIPA ;WORKING ENTRY, JUST APPEND
JRST ERFIL5 ;TO THE FILE
SOJL T1,ERFIL0 ;DECR FOR LAST WORD
ROT T1,-B2WLSH ;COMPUTE LAST BLOCK
MOVEI T2,1(T1) ;START AT BLOCK 1
MOVEM T2,SSELBK+1 ;[602]PUT LAST BLOCK NUMBER IN IPCF PACKET
USETI FCT,(T2) ;READ LAST BLOCK
ROT T1,B2WLSH ;RESTORE WORD COUNT
ANDI T1,BLKSIZ-1 ;RELATIVE LAST WORD IN BLOCK
INPUT FCT,ILIST ;READ THE LAST BLOCK
STATZ FCT,IO.ERR ;OK?
JRST [TXNN F,R.INF ;DOING SEQ NUMBER INITIALIZATION?
JRST E.INEF ;OOPS
JRST E.INF] ;YES
;HERE TO CHECK FOR MESS-UPS IN ERROR.SYS
SKIPN T3,ERRBUF(T1) ;PICK UP LAST WORD
JRST ERBAK ;IF 0, BACK UP TO FIND GOOD ENTRY
LSH T3,-^D27 ;KEEP JUST TYPE CODE
CAIN T3,.ESEOF ;EOF MARKER?
JRST ERFEOF ;YES, INSERT NEW ENTRY OVER IT
;HERE, WE FOUND SOMETHING THAT WAS NOT AN EOF MARKER AT THE END
;OF THE FILE. IT MIGHT BE A LEGITIMATE ENTRY HEADER IF WE
;CRASHED AFTER WRITING A NEW ENTRY, BUT BEFORE RECORDING NEW SIZE IN
;THE RIB. IF IT "LOOKS LIKE" AN ENTRY HEADER, THEN CALCULATE WHERE
;THE END OF THE ENTRY SHOULD BE. LOOK THERE FOR AN EOF. IF THERE IS
;AN EOF MARK THERE, USE IT AS THE PROPER END OF FILE.
;
CAIN T3,.ESHIA ;IS IT AN OLD HIATUS MARK?
JRST ERPHIA ;YES, OVERWRITE IT WITH NEW ONE
PUSH P,T2 ;SAVE BLOCK NUMBER
PUSH P,T4 ;SUPERSTITION
MOVE T2,ERRBUF(T1) ;GET POSSIBLE ENTRY HEADER WORD
LDB T3,[POINTR T2,EH.HFM] ;GET HDR FMT
LDB T4,[POINTR T2,EH.HLN] ; AND HDR LEN
CAIL T3,EL.HVR ;HEADER VERSION OK?
CAIGE T4,EL.HED ;LENGTH OK?
JRST ERPHI0 ;NO, WRITE A HIATUS MARK
;
;IT LOOKS LIKE WE ARE ABOUT TO STEP ON A REAL ENTRY HEADER
;
ANDI T2,777 ;KEEP BODY LENGTH
ADD T2,T4 ;ADD HEADER LENGTH
ADDI T2,(T1) ;AND POINT TO WHERE NEXT ENTRY SHOULD START
CAILE T2,BLKSIZ-1 ;IF IT'S NOT IN THE BLOCK WE READ
JRST ERPHI0 ;THEN FORGET IT
LDB T3,[POINTR ERRBUF(T2),EH.TYP] ;GET ENTRY TYPE
CAIE T3,.ESEOF ;IF IT'S NOT AN EOF MARK
JRST ERPHI0 ;THEN WE WERE WRONG, GO WRITE NORMAL HIATUS
HRR T1,T2 ;WE WERE GOING TO WIPE A REAL ENTRY, SO
POP P,T4 ;JUST POINT TO NEWLY FOUND EOF
POP P,T2
JRST ERFEOF ;AND PRETEND NOTHING HAPPENED
ERPHI0: POP P,T4
POP P,T2 ;RESTORE BLOCK NUMBER
ERPHIA: TXNE F,R.INF ;DOING SEQUENCE NUBMER INITIALIZATION?
JRST E.INF ;YES, ERROR
MOVSI T3,.ESHIA_9 ;MARK HIATUS
MOVEM T3,ERRBUF(T1) ;IN THE BUFFER
USETO FCT,(T2) ;WHEN WE MARK HAITUS,
OUTPUT FCT,OLIST ;WE USE NEW BLOCK
STATZ FCT,IO.ERR ;OK
JRST E.OUEF ;NOPE!
AOJA T2,ERFIL3 ;[534] AND GO PUT THIS ENTRY INTO NEXT BLOCK
ERBAK: JUMPE T1,ERPHIA ;STOP BACKING AT BEGINNING OF BUFFER
SOJ T1, ;ELSE BACK UP
SKIPN T3,ERRBUF(T1) ;GET NEXT WORD
JRST ERBAK ;BACK UP AGAIN IF STILL ZERO
LSH T3,-^D27 ;KEEP JUST TYPE CODE
CAIE T3,.ESEOF ;EOF MARKER?
AOJA T1,ERPHIA ;NO, DO NOT OVERWRITE IT
ERFEOF: MOVEM T1,SSELBK ;[602]SAVE WC FOR IPCF PACKET
TXNN F,R.INF ;DOING SEQUENCE NUMBER INITIALIZATION?
JRST ERFILL ;NO, GO STORE OVER CODE
MOVE T1,ERRBUF(T1) ;GET THE EOF MARKER BACK
TXZ T1,EH.TYP ;KEEP JUST SEQUENCE NUMBER
JUMPE T1,E.INF ;MUST HAVE BEEN WRITTEN BY OLD DAEMON
MOVEM T1,ERRSEQ ;SETUP INITIAL SEQUENCE NUMBER
JRST RELFCT ;RELEASE CHANNEL AND RETURN
ERFIL0: TRNE F,R.PAE!R.INF ;THINGS ARE VERY BAD IF AVAIL.SYS DOESN'T
JRST ERRFIX ;EXIST, SO GIVE UP NOW
SKIPA T2,[1] ;SO USETO WILL WRITE FIRST BLOCK
ERFIL5: MOVEI T2,AVLWRK+1 ;APPEND TO WORKING ENTRY IN AVAIL.SYS
ERFIL3: SETZM ERRBUF ;[534] CLEAR FIRST WORD
MOVE T1,[ERRBUF,,ERRBUF+1] ;[534] SET UP TO CLEAR ANY JUNK
BLT T1,ERRBFE ;[534][1004] BLITTTT!
MOVE T1,[.ESOFF_9,,1];[534] PUT POINTER TO FIRST ENTRY IN BLOCK
MOVEM T1,ERRBUF ;[534] INTO FIRST WORD OF BLOCK
;+[1004]
; Here to write out the entry in one swell I/O command so we
; don't end up writing a partial entry if the monitor crashes.
; The following will only work on a KL or KS since it assumes
; that the contents of a BLT pointer is known after the BLT
; Also BEWARE heavy use of 18 bit address arithmetic which will
; not work in non-zero section.
;
; T1 has OFFSET to first word to write in ERRBUF
; P4 has ADDRESS of last word written in ERABUF
;
ERFILL: USETO FCT,(T2) ;SET UP THE BLOCK NUMBER TO OUTPUT
HRLI T1,ERABUF ;STUFF SOURCE FIELD INTO BLT POINTER
ADDI T1,ERRBUF ;MAKE DESTINATION FIELD
SUBI P4,ERABFS-1 ;P4 NOW HAS # OF WORDS OF DATA
DPB P4,[POINT 9,ERABUF,35] ;SAVE LENGTH IN HEADER
ADDI P4,EL.HED ;AND ACCOUNT FOR HEADER WORDS NOW
ERFIL1: HRREI T3,-1(P4) ;GET WORDS - 1
JUMPL T3,ERFIL2 ;DONE IF NEGATIVE
MOVEI T2,-ERRBUF(T1) ;GET INDEX INTO ERRBUF
ADD T3,T2 ;CALCULATE LAST WORD TO WRITE
IORI T2,BLKSIZ-1 ;AND LAST WORD IN THIS BLOCK
CAIL T3,(T2) ;CAN WE WRITE IT ALL?
JRST ESPLIT ;NOPE, SPLIT IT UP
BLT T1,ERRBUF(T3) ;WRITE THE REMAINING PART
ERFIL2: MOVSI T3,.ESEOF_9 ;STUFF CODE
IOR T3,ERRSEQ ;INCLUDING SEQ NUMBER
MOVEM T3,(T1) ;TO MARK EOF
MOVNI T1,-<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: SETZM ERRDTM ;INIT SAVED ENTRY DATE/TIME
MOVEI T1,ERRBUF-1 ;I/O BUFFER
HRRM T1,ILIST ;SAVE FOR LATER
MOVX T1,.IODMP ;INIT A CHANNEL FOR LOOKUPS
MOVE T2,CERDEV ;GET DEVICE
MOVEI T3,0 ;NO BUFFERS
OPEN FCT,T1 ;OPEN THE CHANNEL
JRST E.INF1 ;CAN'T INIT ERRDEV
MOVEI T1,RBEXTE-RBCNTE ;LENGTH FOR EXTENDED LOOKUP
MOVEM T1,RBCNTE ;SAVE IN LOOKUP BLOCK
MOVE T1,[SIXBIT/ERROR/] ;AND SET UP NAME
MOVEM T1,RBNAME ; FOR LOOKUP
MOVEI T1,'SYS' ;START AT SYS
ERRST1: HRLZM T1,RBEXTE ;SAVE EXT FOR LOOKUP
MOVE T2,CERPPN ;SET UP DIRECTORY
MOVEM T2,RBPPNE ; FOR LOOKUP
LOOKUP FCT,EBLOCK ;LOOK UP THIS ONE
JRST ERRST3 ;FAILED
ERRST2: HRRZM T1,ERREXT ;SAVE EXTENSION
PUSHJ P,NXTEXT ;STEP TO NEXT EXTENSION
ERROR <Too many error files found>,OPR,E.IEF
INPUT FCT,ILIST ;READ A BUFFER
MOVE T2,ERRBUF+1+.EHDTM ;GET FIRST ENTRY DATE/TIME
MOVEM T2,ERRDTM ;SAVE
JRST ERRST1 ;TRY NEXT EXTENSION
ERRST3: HRRZ T2,RBEXTE ;GET ERROR CODE
CAIE T2,ERFNF% ;FILE NOT FOUND?
JRST ERRST2 ;NO, KEEP LOOKING
CAIN T1,'SYS' ;FIND NO FILES AT ALL?
POPJ P, ;NO, USE DEFAULT SEQUENCE NUMBER
PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME
SUB T1,ERRDTM ;COMPUTE DIFFERENCE
HLRZS T1 ;KEEP ONLY DAYS
CAIGE T1,7 ;OLDER THAN A WEEK?
JRST ERRST4 ;NO
PUSHJ P,NXTEXT ;STEP TO NEXT EXTENSION
ERROR <Too many error files found>,OPR,E.IEF
MOVEM T1,ERREXT ;SAVE STARTING EXTENSION
TXZA F,R.INF ;VIRGIN FILE
ERRST4: TXO F,R.INF ;FLAG SEQ NUMBER INITIALIZATION
PUSHJ P,INIFIN ;GO INITIALIZE ERRSEQ
TXZ F,R.INF ;TURN OFF FLAG
POPJ P, ;RETURN
;SUBROUTINE TO STEP TO NEXT EXTENSION
NXTEXT: MOVE T1,ERREXT ;GET EXTENSION
CAIN T1,'SYS' ;THIS THE FIRST ONE
MOVEI T1,'X01'-1 ;YES, SETUP NEXT ONE
ADDI T1,1 ;INCREMENT EXTENSION
TRNN T1,7 ;SHOULD WE CARRY TO SECOND DIGIT?
ADDI T1,100-10 ;YES, CAUSE THE SIXBIT TO CARRY
CAIG T1,'X77' ;HAS THE EXTENSION OVERFLOWED?
AOS (P) ;NO
POPJ P, ;RETURN
;SUBROUTINE TO RETURN DATE AND TIME IN NBS FORMAT,
; DAYS SINCE NOV 17, 1858 IN LH, FRACTION OF DAY IN RH
NBSDAT: MOVE T1,[%CNDTM] ;[562] WAS %CNDAT
PJRST GTBDFL ;GET DATE AND RETURN
;ROUTINE TO FLUSH ANY IPCF PACKETS IN DAEMON'S INPUT QUEUE CAUSED
;BY PREVIOUS SENDS THAT FAILED. ALSO CLEARS BLOCK BEFORE RETURN.
;CALL: PUSHJ P,FLSPAK
; RETURN
;DESTROYS T1,T2
FLSPAK: MOVEI T2,0 ;START WITH ZERO FLAGS
FLSPA1: PUSHJ P,CLRIPC ;CLEAR RECEIVE BLOCK
TLO T2,(IP.CFB!IP.CFT) ;NON-BLOCKING AND TRUNCATE LENGTH
MOVEM T2,IPCPDB+.IPCFL ;STORE IN FLAGS WORD
MOVEI T1,SSELBK ;LEN=0,,ADDRESS OF MESSAGE BLOCK
MOVEM T1,IPCPDB+.IPCFP ;STORE IN BLOCK
MOVE T1,[4,,IPCPDB] ;GET LEN,,ADDR OF BLOCK
IPCFR. T1, ;GET ANY PACKETS
JRST [CAIE T1,IPCPR% ;PAGE MODE?
PJRST CLRIPC ;NO, CLEAR IPCF BLOCK AND RETURN
MOVEI T2,IP.CFV ;GET PAGE MODE FLAG
JRST FLSPA1] ;TRY IT THIS WAY
JRST FLSPAK ;GET ANY REMAINING PACKETS
;ROUTINE TO CLEAR THE IPCF MESSAGE AREA.
;CALL: PUSHJ P,CLRIPC
; RETURN
;DESTROYS T1
CLRIPC: MOVE T1,[IPCPDB,,IPCPDB+1] ;SETUP FOR BLT
SETZM IPCPDB+.IPCFL ;CLR FIRST WD
BLT T1,SSELBK+7 ;CLEAR THE REST
POPJ P,0 ;RETURN
;ROUTINE TO SEND A MESSAGE TO THE ON-LINE SYSTEM ERROR LOGGER TO
;TELL IT THAT AN ERROR HAS OCCURRED. CALL WITH DATA TO SEND IN SSELBK.
;CALL: PUSHJ P,SNDSEL
; RETURN
;DESTROYS T1
SNDSEL: MOVEI T1,001001 ;MSG TYPE,FORMAT
HRLM T1,SSELBK ;INTO THE MSG
PUSHJ P,FNDSEL ;FIND SEL
POPJ P, ;NOT THERE, GIVE UP
;; PJRST SNDPAK ;AND SEND HIM A PRESENT
;ROUTINE TO SEND A MESSAGE TO ANOTHER PROCESS.
;CALL: MOVEI T1,PID OF RECEIVER
; PUSHJ P,SNDPAK
; RETURN
;DESTROYS T1
SNDPAK: MOVEM T1,IPCPDB+.IPCFR ;SAVE RECEIVER'S PID
MOVE T1,[^D8,,SSELBK] ;GET POINTER TO MESSAGE
MOVEM T1,IPCPDB+.IPCFP;INTO THE PDB
MOVE T1,[6,,IPCPDB] ;GET LEN,,ADDR OF BLOCK
IPCFS. T1, ;SEND THE MSG
JFCL ;DON'T CARE ABOUT ERRORS
POPJ P,0 ;RETURN
;ROUTINE TO FIND THE PID OF A SYSTEM PROCESS. ENTER AT FNDSEL TO
;FIND THE SYSTEM ERROR LOGGER PID, FNDACT TO FIND THE ACCOUNTING
;PID.
;CALL: PUSHJ P,FNDXXX
; NOT THERE
; RETURN WITH T1=PID
FNDACT: SKIPA T1,ACTPTR ;SETUP TO GET [SYSTEM]ACCOUNTING PID
FNDSEL: MOVE T1,SELPTR ;SET UP TO GET SEL'S PID
PUSHJ P,GTBSPY ; GET IT
POPJ P, ;NOT THERE, GIVE ERROR
SKIPE T1 ;GET BACK ONE?
CPOPJ1: AOS (P) ;YES RETURN +1
CPOPJ: POPJ P,0 ;NO RETURN NORMALLY
SUBTTL AVAIL.SYS UPDATE ROUTINE
;ROUTINE TO UPDATE THE WORKING ENTRY IN AVAIL.SYS.
UPDAVL: PUSHJ P,SAVE4 ;SAVE P1-P4
MOVE T1,[MRVBLK,,ERABUF] ;MAKE BLT POINTER
BLT T1,ERAEND ;MOVE THE ENTRY TO THE BUFFER
LDB P2,[POINT 9,ERABUF,35] ;GET LEN OF BODY FOR LATER
MOVSI T1,FCT+<(FO.PRV)> ;CHANNEL IS FCT
HRRI T1,.FOSAU ;FUNCTION IS SINGLE ACCESS UPDATE
MOVEM T1,D.FLOP+.FOFNC;STORE IN BLOCK
MOVEI T1,.IODMP ;USE DUMP MODE
MOVEM T1,D.FLOP+.FOIOS
MOVE T1,CERDEV ;DEVICE IS ERRDEV
MOVEM T1,D.FLOP+.FODEV
SETZM D.FLOP+.FOBRH ;NO BUFFERS
SETZM D.FLOP+.FONBF ;AND NO BUFFER COUNT
MOVEI T1,D.LKB ;POINT AT LOOKUP BLOCK
MOVEM T1,D.FLOP+.FOLEB
SETZM D.LKB ;CLEAR FIRST WORD OF LOOKUP BLOCK
MOVE T1,[D.LKB,,D.LKB+1] ;MAKE BLT POINTER
BLT T1,D.LKB+.RBSIZ ;CLEAR ENTIRE BLOCK
MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL
MOVEM T1,D.LKB+.RBNAM
MOVSI T1,'SYS' ;EXTENSION IS SYS
MOVEM T1,D.LKB+.RBEXT
MOVSI T1,155000 ;MAKE PROTECTION 155
MOVEM T1,D.LKB+.RBPRV
MOVEI T1,.RBSIZ ;COUNT IS .RBSIZ
MOVEM T1,D.LKB+.RBCNT
MOVEI P1,5 ;NUMBER OF TIMES TO RETRY ON ERFBM%
UPDAV1: MOVE T1,CERPPN ;GET PPN INTO WHICH TO WRITE FILE
MOVEM T1,D.LKB+.RBPPN ;STORE IN BLOCK
HLLZS D.LKB+.RBEXT ;CLEAR ANY ERROR CODE
MOVE T1,[.FOLEB+1,,D.FLOP] ;POINT TO FILOP. BLOCK
FILOP. T1, ;OPEN THE FILE
JRST [PUSHJ P,FBMTRY ;CHECK FOR ERFBM%
JRST UPDAV1 ;IS, RETRY
POPJ P,] ;NOT, GIVE UP
MOVNI T1,AWELEN(P2) ;GET -VE LENGTH OF BODY PLUS HEADER
HRLI T1,ERABUF-1 ;MAKE SWAPPED IOWD
MOVSS T1 ;MAKE IT RIGHT
MOVEI T2,0 ;MAKE IOWD TERMINATE ON A ZERO
OUTPUT FCT,T1 ;WRITE THE WORKING ENTRY
STATZ FCT,IO.ERR ;ANY ERRORS?
JRST RELFCT ;YES, RELEASE CHANNEL AND QUIT
ADDI P2,AWELEN+BLKSIZ-1 ;ROUND UP TO A BLOCK BOUNDARY
LSH P2,-B2WLSH ;COMPUTE NUMBER BLOCKS WRITTEN
SUBI P2,AVLWRK ;COMPUTE -NUMBER BLOCKS LEFT IN AVLWRK
SETZM ERABUF ;CLEAR FIRST WORD OF BLOCK
MOVE T3,[ERABUF,,ERABUF+1] ;MAKE BLT POINTER
BLT T3,ERABUF+BLKSIZ-1 ;CLEAR ENTIRE BLOCK
HRLI T1,-BLKSIZ ;SETUP IOWD TO ZERO FILL BLOCK
UPDAV2: AOJG P2,RELFCT ;LOOP UNTIL ALL AVLWRK BLOCKS ARE
OUTPUT FCT,T1 ; ZERO FILLED
STATO FCT,IO.ERR ;ANY ERRORS?
JRST UPDAV2 ;NO, LOOP
PJRST RELFCT ;RELEASE CHANNEL AND RETURN
;ROUTINE TO SEE IF THE AGE OF AVAIL.SYS IS GREATER THAN 7 DAYS
;AND RENAME IT TO AVAIL.ANN IF IT IS.
;RETURNS CPOPJ ALWAYS WITH DISK COPY UPDATED IF LESS THAN 7 DAYS
; AND NEW FILE CREATED IF OLDER THAN 7 DAYS
;[1005] CHANGE TO RENAME .LWK TO .ANN, THEN RENAME .SYS TO .LWK
AVLAGE: PUSHJ P,NBSDAT ;GET CURRENT UNIVERSAL DATE/TIME
SUB T1,MRVBLK+AWECDA ;SUBTRACT CREATION DATE OF THIS AVAIL
HLRZS T1 ;KEEP JUST DIFFERENCE IN DAYS
CAIGE T1,7 ;OLDER THAN A WEEK?
JRST [PUSHJ P,MRVSCN ;NO, UPDATE CORE COPY OF MRV ENTRY
PJRST UPDAVL] ;AND UPDATE FILE COPY OF WORKING ENTRY
PUSHJ P,SAVE1 ;GET A REGISTER TO USE
PUSHJ P,ENDAVL ;APPEND .ESEAV ENTRY TO FILE
MOVEI P1,'A01' ;FIRST EXTENSION TO TRY IS A01
AVLAG1: MOVE T1,[SIXBIT/AVAIL/] ;FILENAME IS AVAIL
MOVEI T4,(P1) ;EXTENSION IS XNN
PUSHJ P,OPNFIE ;TRY TO LOOKUP THE FILE
TRNE T2,-1 ;ERROR CODE MUST BE FILE NOT FOUND
SKIPA ;TRY NEXT EXTENSION
JRST AVLAG2 ;FOUND ONE, RENAME TO THAT
ADDI P1,1 ;BUMP EXTENSION BY 1
TRNN P1,7 ;NEED TO CARRY INTO THE 10S DIGIT?
ADDI P1,100-10 ;YES, CARRY
CAILE P1,'A77' ;TRIED THEM ALL?
WARN <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
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?
JRST READC3 ;YES, DO SYSTEM ERROR QUEUE
PUSHJ P,DSPERR ;GO PROCESS THIS ENTRY
MOVE T1,EPKIDX ;GET POINTER TO TABLE BACK
MOVE T2,ERPTSZ ;GET SIZE OF ENTRY
ADDI T1,-1(T2) ;INCREMENT TO NEXT BLOCK-1
AOBJN T1,READC1 ;INCREMENT TO NEXT BLOCK AND LOOP
READC3: PUSHJ P,RSEBLK ;PROCESS ANY SYSTEM ERROR BLOCKS
;FALL INTO CRSINF
;HERE TO CREATE AN ENTRY OF EXTRACTED INFO FROM THE CRASH
;SUCH AS UPTIME, DISK STATS,ETC
CRSINF: MOVSI T1,.ESCIN_9 ;CODE FOR THIS ENTRY
PUSHJ P,ERRINB ;CREATE HEADER AND PUSH LIST
PUSH P4,D.DEV ;(R0) STR NAME FOR THIS CRASH
MOVE T1,[%SYERR] ;SYS WIDE ERROR COUNT
PUSHJ P,GTBSPY ;GET IT
MOVE T1,PATTERN ;LOOSER?
PUSH P4,T1 ;(R1)
MOVE P1,CRSGTB ;START OF GETTAB TABLE
MOVE T1,P1
HRRI T1,1 ;PNTR FOR SYSERR
PUSH P4,T1 ;(R2)
PUSHJ P,CRSDMP ;(R3-R110)DUMP GETTAB ENTRIES
PUSH P4,[0] ;(R111) NO LONGER PUT DISK STUFF HERE
;NOW CHECK FOR CUSTOMER DEFINED ITEMS TO DUMP
MOVE P1,CRSGT1 ;PNTR OF ITEMS
TLNE P1,-1 ;NULL LIST?
PUSHJ P,CRSDMP ;NO, DUMP THEM ALSO
PUSHJ P,ERRFIN ;CLOSE THE ENTRY AND WRITE IT
PUSHJ P,DMPDSK ;NOW DUMP ALL DISK STATS
JRST DMPHSB ;CONTINUE AHEAD
;ROUTINE TO EXTRACT GETTAB ITEMS FROM A CRASH.
;CALL: MOVE P1,AOBJN POINTER TO TABLE OF GETTABS
; PUSHJ P,CRSDMP
; RETURN
CRSDMP: MOVE T1,0(P1) ;GET NEXT GETTAB FROM TABLE
TLNN T1,-1 ;IF LH=0, THIS IS A SUBTABLE
JRST CRSDM1 ;SO GO DO THAT SPECIAL
MOVE P3,T1 ;SAVE FOR POSSIBLE SUBTABLE FOLLOWING
PUSHJ P,GTBSPY ;GET VALUE
MOVE T1,PATTERN ;CAN'T, FLAG FOR SYSERR
PUSH P4,T1 ;SAVE IN BUFFER
JRST CRSDM2 ;JOIN COMMON ENDING CODE
CRSDM1: MOVE T3,P3 ;GET BASE POINTER SET ABOVE
MOVE T2,T1 ;MOVE SUBTABLE INDEX TO T2
HRLI T2,.GTC0V ;DO ONLY CPU0 FOR NOW
PUSHJ P,GSUBTB ;GET VALUE FROM SUBTABLE
MOVE T1,PATTERN ;CAN'T, FLAG FOR SYSERR
PUSH P4,T1 ;SAVE IN BUFFER
CRSDM2: AOBJN P1,CRSDMP ;LOOP FOR ENTIRE TABLE
POPJ P, ;RETURN
;THIS IS THE TABLE OF GETTAB ITEMS TO BE EXTRACTED FROM A CRASH.
;ADDITIONAL ITEMS SHOULD NOT BE ADDED HERE BY A SITE BECAUSE IT WILL
;CONFUSE SYSERR VERY BADLY. USE THE TABLE CRSGT1 INSTEAD.
; ";***" INDICATES A SUBTABLE ITEM
CRSGTB: XWD .-CRSGTE,.+1 ;PNTR FOR TABLE LENGTH
%CNTIM ;(R3) TIME OF DAY
%CNSIZ ;(R4) SYSTEM MEMORY SIZE
%CNPOK ;(R5) LAST ADDR POKED
%CNLNM ;(R6) # JOBS LOGGED IN
%CNTIC ;(R7) #TICKS PER SECOND
%CNVER ;(R10) MONITOR VERSION
%CNDBG ;(R11) DEBUG STATUS WORD
%CNHSO ;(R12) START OF MONITO HIGH SEG
%CNNWC ;(R13) #OF WORDS OF CORE
%NSUPT ;(R14) UPTIME IN TICKS
%NSMMS ;(R15) MEMORY SIZE
%NSTPE ;(R16) TOTAL MEM PAR ERRORS
%NSSPE ;(R17) TOTAL SPURIOUS PARITY ERRORS
%NSMPC ;(R20) MULTIPLE PARITY ERRORS
%NSMPA ;(R21) LAST PARITY ADDR
%NSMPW ;(R22) LAST PARITY WORD
%NSMPP ;(R23) LAST PARITY PC
%NSEPO ;(R24) # UNREC EXEC PDL OV
%NSEPR ;(R25) # RECOVERED EXEC PDL OV
%SWERC ;(R26) SWAP ERROR COUNT
%SYDEL ;(R27) DISABLED HARDWARE ERROR COUNT
%SYSCD ;(R30) LAST STOPCD
%SYNDS ;(R31) # DEBUG STOPCDS
%SYNJS ;(R32) # JOB STOPCDS
%SYSJN ;(R33) LAST STOPCD-JOB NUMBER
%SYSPN ;(R34) LAST STOPCD-PROGRAM NAME
%SYSUU ;(R35) LAST STOPCD-UUO
%SYSPP ;(R36) LAST STOPCD-P,PN
%CCPAR ;(R37) PARITY SUBTABLE
%CVPLA ;(R40) **HIGHEST ADDR OF PARITY ERROR
%CVPMR ;(R41) **ADDRES IN SEGMENT OF PAR ERR
%CVPTS ;(R42) **PAR ERRORS THIS SWEEP
%CVPSC ;(R43) **#SWEEPS
%CVPUE ;(R44) **USER ENABLED
%CVPAA ;(R45) **LOGICAL AND OF ADDR
%CVPAC ;(R46) **LOGICAL AND OF WORDS
%CVPOA ;(R47) **LOG OR OF ADDR
%CVPOC ;(R50) **LOG OR OF DATA
%CVPCS ;(R51) **COUNT OF SPUR CHANNEL ERROS
%CCRSP ;(R52) ADDR OF RESPONSE SUBTABLE
%CVRSO ;(R53) **SUM TTY OUT UUO RES
%CVRNO ;(R54) **NUM TTY OUT UUO
%CVRHO ;(R55) **HI-SUM SQ TTY OUT UUO
%CVRLO ;(R56) **LO-SUM " "
%CVRSI ;(R57) **SUM TTY INP UUO
%CVRNI ;(R60) **NUMBER TTY INP UUO
%CVRHI ;(R61) **HI-SUM SQ TTY INP UUO
%CVRLI ;(R62) **LO-SUMSQ TTY INP UUO
%CVRSR ;(R63) **SUM QUANTUM REQ RES
%CVRNR ;(R64) **NUMBER QUANTUM REQ RES
%CVRHR ;(R65) **HI-SUM SQ QUANTUM RES
%CVRLR ;(R66) **LO-SUM SQ QUANTUM REQ RES
%CVRSX ;(R67) **SUM ONE OF ABOVE
%CVRNX ;(R70) **NUMBER ONE OF ABOVE
%CVRHX ;(R71) ** HI-SUM SQ ONE OF ABOVE
%CVRLX ;(R72) **LO-SUM SQ ONE OF ABOVE
%CVRSC ;(R73) **SUM CPU RES
%CVRNC ;(R74) **NUMBER CPU RES
%CVRHC ;(R75) **HI-SUM CPU RES
%CVRLC ;(R76) **LO-SUM CPU RES
%CVUPT ;(R77) UPTIME
%CVLST ;(R100) LOST TIME
%CVNUL ;(R101) NULTIME
%CVOHT ;(R102) OVERHEAD TIME IN JIFFIES
%CVTUC ;(R103) TOTAL UUO COUNT
%CVTJC ;(R104) TOTAL JOB CONTEXT SWITCH COUNT
%CVTNE ;(R105) TOTAL NXM
%CVSNE ;(R106) TOTAL SPUR NXM
%CVNJA ;(R107) # JOBS AFFECTED LAST NXM
%CVMNA ;(R110) FIRST ADDR LAST NXM
CRSGTE==.-1 ;END OF TABLE
CRSGT1: XWD .-CRSGT2, .+1 ;PNTR FOR TABLE TO BE DEFINED BY CUSTOMER
;SYSERR WILL LIST TESE ITEMS IN OCTAL ONLY, IFF PRESENT
CRSGT2==.-1
;ROUTINE TO DETERMINE IF CRASH IS A KS10 SYSTEM DUMP AND IF SO
;MAKE A HALT STATUS BLOCK ENTRY
DMPHSB: MOVE T1,[%FTERR] ;FEATURE SWITCH SETTINGS
PUSHJ P,GTBSPY ;GET IT
POPJ P, ;CAN'T, THEN FORGET THIS
TRNN T1,F%KS10&777777;IS THIS A KS10 SYSTEM DUMP?
POPJ P, ;NO--LET'S GO HOME
MOVEI T1,424 ;ADDRESS OF FIRST WORD IN HSB
PUSHJ P,PEKSPY ;GET IT
JUMPE T1,CPOPJ ;IF IT'S ZERO, NO HSB HAS BEEN STORED
MOVSI T1,.ESHSB_9 ;HSB ENTRY CODE
PUSHJ P,ERRINB ;CREATE HEADER AND PUSH POINTER
SETZ T1, ;GET HALT STATUS CODE (LOC 0)
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R0)STORE IT
MOVEI T1,1 ;GET HALT PC (LOC 1)
PUSHJ P,PEKSPY
PUSH P4,T1 ;(R1)STORE IT
MOVE T1,[XWD -22,4] ;HSB POINTER
PUSH P4,T1 ;(R2)STORE IT
PUSH P4,[0] ;(R3)STORE IT
MOVSI T2,-22 ;AOBJN WORD FOR SIZE OF HSB
DMPHS0: MOVEI T1,424(T2) ;FORM ADDRESS TO WORD IN HSB
PUSHJ P,PEKSPY ;GET IT
PUSH P4,T1 ;STORE IT
AOBJN T2,DMPHS0 ;GET'EM ALL
PUSHJ P,ERRFIN ;CLOSE OUT ENTRY AND WRITE IT
POPJ P, ;DONE
;ROUTINE TO SETUP TO SIMULATE SPYING FROM THE CRASH FILE AND
;GET ALL THE INITIAL DATA NEEDED TO PROCESS THE CRASH.
;CALL: PUSHJ P,SIMSPY
; ERROR RETURN
; ALL OK
;
;ASSUMPTION: ABSTAB, THE GETTAB TABLES THAT IT POINTS AT (NUMTAB),
;AND ALL GETTABS DONE BY THIS ROUTINE ARE MAPPED 1-FOR-1 VIRTUAL TO
;PHYSICAL. IN ORDER TO CORRECTLY SIMULATE PAGING, WE NEED ALL THE
;VALUES SETUP BY THIS ROUTINE. THEREFORE, WE MUST BE ABLE TO GET
;THE NECESSARY VALUES WITH SIMULATED PHYSICAL REFERENCES, HENCE 1-FOR-1.
SIMSPY: SETOM DSKBLF ;CLEAR INITIAL DISK BLOCK
TRO F,R.DINI ;FORCE ABSOLUTE ADDRESSING
MOVEI T2,BLKSIZ ;NEED 1 BLOCK FOR THE .EXE DIRECTORY
PUSHJ P,GETCOR ;GET IT
POPJ P, ;FAILED, GIVE UP
MOVEM T2,EXEADR ;STORE FOR PEKDSK
SOS T1,T2 ;BACK UP 1 WORD AND MOVE TO T1
HRLI T1,-BLKSIZ ;MAKE AN IOWD
MOVEI T2,0 ;TERMINATED BY A ZERO
USETI DSKX,1 ;GET BLOCK 1
IN DSKX,T1 ;READ THE FIRST BLOCK OF THE DIRECTORY
CAIA ;SKIP OVER FAIL RETURN
POPJ P, ;READ FAILED
HLRZ T2,1(T1) ;GET LH OF FIRST WORD
HRRZ T1,1(T1) ;AND RH OF SAME WORD
CAIN T2,.SVDIR ;MUST BE AN EXE DIRECTORY
CAILE T1,BLKSIZ-1 ;WHICH IS LESS THAN A BLOCK LONG
POPJ P, ;NO
MOVEI T1,ABSTAB ;GET POINTER TO GETTABS
PUSHJ P,REDDSK ;READ IT FROM UNMAPPED ADDRESSING
TLNE T1,-1 ;MAKE SURE ZERO LH
POPJ P, ;NO, GIVE UP
CAILE T1,ABSTAB ;MAKE SURE IT MAKES SOME SENSE
CAML T1,DSKFLG ; ..
POPJ P, ;NO, GIVE UP
HRRZ T2,T1 ;SAVE FOR TEST LATER
ADDI T1,.GTSLF ;ADD OFFSET FOR GETTAB IMMEDIATE
PUSHJ P,REDDSK ;READ THAT PLACE
CAIE T2,(T1) ;SEE IF IT MATCHES
POPJ P, ;NO, GIVE UP
LSH T1,-^D27 ;KEEP JUST MAX ENTRY IN NUMTAB
MOVEM T1,MAXGTB ;SAVE MAX GETTAB NUMBER
MOVNI T3,1(T1) ;-NUMBER OF GETTABS TO T3
HRLI T3,(T2) ;MAKE SWAPPED AOBJN POINTER TO NUMTAB
MOVSS T3 ;MAKE IT AOBJN POINTER
MOVEI T2,1(T1) ;GET LENGTH OF NUMTAB
PUSHJ P,GETCOR ;ALLOCATE THAT MUCH CORE
POPJ P, ;CAN'T, GIVE UP
MOVEM T2,GTBST ;SAVE ADDRESS OF START OF NUMTAB
SIMSP2: MOVEI T1,(T3) ;GET ADDRESS OF NEXT ITEM IN NUMTAB
PUSHJ P,REDDSK ;GET IT FROM UNMAPPED ADDRESS SPACE
MOVEM T1,(T2) ;SAVE IN TABLE
ADDI T2,1 ;BUMP TABLE ADDRESS
AOBJN T3,SIMSP2 ;BUMP NUMTAB ADDRESS AND LOOP
MOVE T2,GTBST ;GET ADDRESS OF START OF OUR NUMTAB
MOVE T1,MAXGTB ;GET LARGEST GETTAB TABLE
CAIGE T1,.GTIDX ;HAVE A RANGE TABLE?
TDZA T1,T1 ;NO, USE ZERO
HRRZ T1,.GTIDX(T2) ;GET ADDRESS OF RNGTAB FROM NUMTAB
MOVEM T1,RNGTAB ;SAVE FOR GETTAB SIMULATION
MOVE T1,[%VMPPB] ;GETTAB ARG POINTER TO
PUSHJ P,GTBSPY ;GET BEGINNING OF PER PROCESS ADDRESS SPACE
MOVX T1,EVDPPB ;DEFAULT
MOVEM T1,EVAPPB ;SET IT
MOVE T1,[%VMPPE] ;GETTAB ARG POINTER TO
PUSHJ P,GTBSPY ;GET END (+1) OF PER PROCESS ADDRESS SPACE
MOVX T1,EVDPPE ;DEFAULT
MOVEM T1,EVAPPE ;SET IT
MOVE T1,[%CNPDB] ;SET UP PDB POINTER FOR CRASH FILE
PUSHJ P,GTBDFL ;SEE IF IT IS THERE
MOVEM T1,PDBPTR ;STORE ZERO OR VALUE
MOVE T1,[%CNVER] ; GET CRASHED MONITORS
PUSHJ P,GTBDFL ; VERSION INTO A
HRRZM T1,MONVER ; AND STORE IT AWAY
MOVE T1,[%FTERR] ;GETTAB ARG FOR FEATURE TESTS
PUSHJ P,GTBSPY ;GET IT
POPJ P, ;MUST HAVE THAT
ANDI T1,<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
DSKBLF: 0
CRASH: SIXBIT /CRASH/
CRSPPN: XWD 1,4
CRSCHP: BLOCK 1 ;SAVED P AFTER CRSCHK DOES PUSHES
DSKFLG: BLOCK 1 ;FLAG (AND MAX SIZE) OF DSK INPUT FILE
EXEADR: BLOCK 1 ;ADDRESS OF THE .EXE DIRECTORY FOR THIS CRASH
EPKIDX: Z ;AOBJN POINTER TO NEXT RELATIVE ENTRY IN
;ERPTBK TABLE IN CRASHED MONITOR
ERPTMX: Z ;LENGTH OF TABLE
ESVIDX: Z ;PHYSICAL ADDR OF ERROR TABLE
ERPTSZ: BLOCK 1 ;SIZE OF EACH ERPTBK ENTRY
EPT: BLOCK 1 ;CORE ADDRESS OF OUR COPY OF THE EPT
EMAP: BLOCK 1 ;CORE ADDRESS OF OUR COPY OF THE EXEC
;SECTION 0/1 MAP (KL PAGING ONLY)
EMAPAG: BLOCK 1 ;CORE PAGE NUMBER FROM WHICH WE READ THE
;EXEC SECTION 0/1 MAP (KL PAGING ONLY)
ESECTB: BLOCK 1 ;CORE ADDRESS OF THE START OF THE SECTION
;TABLE IN THE EPT (I.E., C(EPT)+540)
;(KL PAGING ONLY)
CRSHAC: BLOCK 20 ;SAVE AC'S HERE ON REENTER (FOR DEBUGING)
CRSHPC: BLOCK 1 ;SAVE PC (.JBOPC) HERE ON REENTER
SUBTTL DATA AND STORAGE, BUFFERS, ETC.
ILIST: XWD -200,0 ;DUMP MODE INPUT COMMAND LIST
0
OLIST: XWD -P2,0 ;DUMP MODE OUTPUT COMMAND LIST (WORD COUNT WILL
0 ; BE FILLED IN.)
IFN FTUNSUPPORTED,<
DLIST:
BPSTRT: IOWD 200,DAEBUF
0
>
DSKIOW:
UPDLST: IOWD 200,SECBUF
0
PDL: IOWD PDLEN,PDLIST
PATTERN:XWD 252525,252525
HEADR0: INSVL.(EL.FVR,EH.FFM)!INSVL.(EL.HVR,EH.HFM)!INSVL.(EL.HED,EH.HLN)
ERRSEQ: EXP 0 ;SEQUENCE NUMBER
IFN FTUNSUPPORTED,<
JBYSUN: POINT 3,SEGSWP,4 ;SWAP UNIT POINTER
JBYLKN: POINT 13,SEGSWP,17 ;SWAP BLOCK POINTER
>
QUECOD: POINT 5,T1,14
SELPTR: XWD .IPCPL,.GTSID ;[602]GETTAB ARG FOR SEL PID
ACTPTR: XWD .IPCPA,.GTSID ;GETTAB ARG FOR [SYSTEM]ACCOUNTING PID
IFN FTUNSUPPORTED,<
COMLST:
SIXBIT .DCORE.
SIXBIT .DUMP.
SIXBIT .SAVE.
SIXBIT .SSAVE.
SIXBIT .E.
SIXBIT .D.
SIXBIT .VERSIO.
SIXBIT .OSAVE.
SIXBIT .OSSAVE.
COMLEN==.-COMLST
COMDSP:
DCORE
DUMP
SAVE
SAVE
ECOM
DCOM
VERCOM
SAVE
SAVE
> ;END IFN FTUNSUPPORTED
JBTCLK: Z 0(J)
IFN FTUNSUPPORTED,<
QIKNAM: ASCIZ \@SYS:QUIKDM.CCL\
>
;[62]THIS CODE MUST GO HERE TO AVOID BLT OF ZEROES.
IOERR: BLOCK 1 ;[62]FLAG TO STOP IO TO ERROR FILE
IERCNT: EXP ^D10 ;[62]COUNTER FOR TIMED RETRIES
NEWEXT: EXP ^D10 ;[62]COUNT TO PREVENT TOO MANY NEW EXTS. IN ROW
CERDEV: ERRDEV ;DEVICE FOR ERROR FILE
ERREXT: 'SYS' ;[62]ERROR FILE EXTENSION
ERRDTM: BLOCK 1 ;OLDEST (FIRST) ENTRY DATE/TIME
CERPPN: ERRPPN ;PPN FOR ERROR FILE
RELINS: RELEAS 0, ;[535] CHANNEL # INSERTED BEFORE XCT
XLIST ;LITERALS UNDER XLIST
LIT
LIST
ZER:!
CTYLIN: BLOCK 1 ;LINE NUMBER FOR CTY
IFN FTUNSUPPORTED,<
CCLFIL: BLOCK 1 ;SIXBIT JOB NUMBER IN LH FOR CCL FILES
CURBLK: BLOCK 1
CURWRD: BLOCK 1
C.BH: BLOCK 3
>
DAQNAM: BLOCK 1
D.FLOP: BLOCK .FOPPN+1 ;BLOCK FOR FILOP. FUNCTIONS
D.DEV: BLOCK 1
D.NAM: BLOCK 1
BLOCK 1
D.EXT: BLOCK 1
D.DIR: BLOCK 1
BLOCK 1
D.PROT: BLOCK 1
D.DPTH: BLOCK .PTMAX ;LAST WORD SURE TO BE ZERO
D.LKB: BLOCK .RBSTS+1 ;EXTENDED LOOKUP BLOCK
EBLOCK: ;BLOCK FOR EXTENDED LOOKUPS AND ENTERS
RBCNTE: BLOCK 1
RBPPNE: BLOCK 1
RBNAME: BLOCK 1
RBEXTE: BLOCK 1
RBPRVE: BLOCK 1
RBSIZE: BLOCK 1
LSTSTP: BLOCK 1 ;LAST SUBTABLE POINTER USED IN GSUBTB
LSTSTV: BLOCK 1 ;LAST BALUE OF SUBTABLE POINTER
GTBST: BLOCK 1 ;BEGINNING OF TABLE OF GETTAB PTRS
IFN FTUNSUPPORTED,<
HGHOFF: BLOCK 1 ;BEGINNING OF HIGH SEGMENT
HGHREL: BLOCK 1 ;LENGTH OF HIGH SEGMENT
JOBJLT: BLOCK 1 ;LOGIN TIME OF JOB REQUESTING SERVICE
>
HJOB: BLOCK 1 ;HIGHEST JOB NO IN RH
LINE==HJOB ;LH LINE NO OF DUMP/DCORE COMMAND
INTADR: BLOCK 1 ;ADDR TO RESTART FOR ERROR INTERCEPT
INTBLK: BLOCK 4 ;ERROR INTERCEPT BLOCK
MAXGTB: BLOCK 1 ;HIGHEST LEGAL GETTAB TABLE
RNGTAB: BLOCK 1 ;ADDRESS OF RNGTAB
JBTMXL: BLOCK 1 ;JOBN+SEGN-1. THIS IS THE MAXIMUM INDEX FOR
;GETTAB TABLES INDEXED BY JOB OR SEGMENT NUMBER.
;THE NUMTAB ENTRY IS NOT USED FOR THESE TABLES
;BECAUSE THE 9 BIT FIELD OVERFLOWS ON SYSTEMS
;WITH JOBN+SEGN-1 .GT. 511.
EVAADR: BLOCK 1 ;ADDRESS OF 1ST WORD IN EVABUF
EVABUF: BLOCK EVASIZ ;BUFFER FOR FUNNY SPACE DATA FROM PEKUSR
PDLIST: BLOCK PDLEN
IFN FTUNSUPPORTED,<
PTRADR: BLOCK 1
REMBLK: BLOCK 1
REMWRD: BLOCK 1
STRADR: BLOCK 1 ;SAVE .JBSA HERE DURING SAVE
>
DSKBUF:
SECBUF: BLOCK 200
IFN FTUNSUPPORTED,<
SEGREL: BLOCK 1
SWPADR: BLOCK 1
>
SEGSWP: BLOCK 1
EXECT1: BLOCK 1 ;WORD FOR ADDRESS OF EXEC AC T1 IN USER'S JOBDAT
ERPTBK: BLOCK 4 ;4 WORD BLOCK FOR ERRPT. UUO
.UPJOB: BLOCK 1 ;OFFSET OF JOB NUMBER IN UPMP
IFN FTUNSUPPORTED,<
.UPLST: BLOCK 1 ;OFFSET OF POINTER TO SWAPPABLE DDBS IN UPMP
>
FTKLP: BLOCK 1 ;NON-ZERO IF THIS MONITOR USES KL PAGING
EVAPPB: BLOCK 1 ;START OF "PER PROCESS" ADDRESS SPACE
EVAPPE: BLOCK 1 ;END (+1) OF "PER PROCESS" ADDRESS SPACE
LDDBSH: BLOCK 1 ;LENGTH OF SHORT DDB
IFN FTUNSUPPORTED,<
LDDBLN: BLOCK 1 ;LENGTH OF LONG DDB
LDDBDS: BLOCK 1 ;LENGTH OF DISK DDB
>
KONREG: BLOCK 1 ;OFFSET OF # OF DRIVE REGS IN KDB
UNISCR: BLOCK 1 ;OFFSET OF DRIVE REGISTERS IN UNIT DATA BLOCK
UNICCT: BLOCK 1 ;OFFSET TO # BAT SLOTS LEFT IN UDB [463]
DEFINE X (ARG),<CHN'ARG: BLOCK 1>
CHNDAT:!DEFCHN ;CHANNEL DATA BLOCK OFFSETS
MONVER: BLOCK 1 ;[545] MONITOR VERSION
IFN FTSVSL,<
PSRCH: BLOCK 1 ;LEN,,ADDR OF OUR SEARCH LIST
SRCLST: BLOCK 3*^D9+4 ;SPACE FOR OUR SEARCH LIST
> ;END IFN FTSVSL
IFN FTSVSL!FTUNSUPPORTED,<
USRLST: BLOCK 3*^D9+4 ;SPACE FOR USER SEARCH LIST
>
THSJOB: BLOCK 1 ;OUR JOB NUMBER
THSLIN: BLOCK 1 ;OUR LINE NUMBER
USRCOR: BLOCK MAXUCR+BLKSIZ
USRUPM: BLOCK MAXUPM
IFN FTUNSUPPORTED,<
THSOFF: BLOCK 1
THSSEG: BLOCK 1
UPDFLG: BLOCK 1 ;-1 IF MUST DO USETO FOR NORMAL WRITE, 0 IF NOT
USRADR: BLOCK 1
USRPPN: BLOCK 1
WRDCNT: BLOCK 1 ;WORDS FROM LAST PATTERN
SWPUNI: BLOCK 1 ;NAME OF SWAP UNIT BEING ACCESSED
SWPSLB: BLOCK 1 ;C(UNISLB) FOR UNIT BEING ACCESSED
SWPTAB: BLOCK 1 ;ADDRESS OF SWPTAB
SWPMAX: BLOCK 1 ;LENGTH OF SWPTAB
UNISLB: BLOCK 1 ;OFFSET OF UNISLB IN UDB
> ;END IFN FTUNSUPPORTED
PDBPTR: BLOCK 1 ;ADDRESS OF JBTPDB IN MONITOR FOR SPY
NEXTUP: BLOCK 1 ;NEXT TIME TO CAUSE A WAKE
NEXTJB: BLOCK 1 ;JOB TO WAKE
QPNTR: BLOCK 1 ;POINTER TO QUEUE
OPRPPN: BLOCK 1 ;PPN OF THE OPERATOR
JIFSEC: BLOCK 1 ;JIFFIES PER SECOND
JIFDAY: BLOCK 1 ;JIFFIES PER DAY
MILJIF: BLOCK 1 ;MILLISECONDS PER JIFFY
JDPCNT: BLOCK 1 ;NUMBER OF JOBS SEEN STOPPED FOR HDW ERRORS
UUOJOB: BLOCK 1 ;JOB NUMBER OF JOB DOING LAST DAEMON UUO
UUOFNC: BLOCK 1 ;FUNCTION CODE FROM LAST DAEMON UUO
SAVXWD: BLOCK 1 ;SAVE UUO XWD (FROM EXEC AC T2)
IFN FTUNSUPPORTED,<
CMDJOB: BLOCK 1 ;JOB NUMBER OF JOB DOING LAST COMMAND
CMDCMD: BLOCK 1 ;COMMAND INDEX OF LAST COMMAND
>
DFNJOB: BLOCK 1 ;JOB NUMBER OF LAST JOB DAEFIN'ED
UUXCOD: BLOCK 1 ;ERROR CODE RETURNED TO JOB IN UUXJOB
UUXJOB: BLOCK 1 ;JOB WHICH LAST CAME THROUGH UUEXIT
DPMJOB: BLOCK 1 ;JOB NUMBER OF LAST JOB RELEASED BECAUSE
;JS.DPM WAS ON
DPMCNT: BLOCK 1 ;COUNT OF JOBS RELEASED DUE TO ABOVE
ZZZDTM: BLOCK 1 ;UNIVERSAL DATE/TIME OF LAST WAKE AT ZZZ
DLKDTM: BLOCK 1 ;UNIVERSAL DATE/TIME LAST TIME THRU DALOOK
DLJDTM: BLOCK 1 ;UNIVERSAL DATE/TIME LAST TIME THRU DALOKJ
IFN FTUNSUPPORTED,<
FNCJBS: BLOCK 1 ;DEBUG - LAST JBTSTS READ IN FINCHK
FNCJBA: BLOCK 1 ;DEBUG - LAST JBTADR READ IN FINCHK
FNCJBJ: BLOCK 1 ;DEBUG - LAST JOB OR SEG NUMBER USED IN FINCHK
FRCGUF: BLOCK 1 ;DEBUG - COUNTS FRCUUO FAILURES
>
PDLGUF: BLOCK 1 ;DEBUG - CONTAINS ERRONEOUS P CONTENTS
GTBGUF: BLOCK 1 ;DEBUG - COUNTS MISTAKES IN GTBSPY
ATTGUF: BLOCK 1 ;DEBUG - COUNTS ATTACH FAILURES
FINGUF: BLOCK 1 ;DEBUG - COUNTS DAEFIN ERROR RETURNS
IFN FTSVSL,<
STRGUF: BLOCK 1 ;DEBUG - COUNTS STRUUO ERROR RETURNS
>
WAKGUF: BLOCK 1 ;DEBUG - COUNTS ERROR RETURNS FROM WAKE UUO
CLKGUF: BLOCK 1 ;DEBUG - COUNTS CLOCK REQUESTS ON UNASSIGNED CHANNELS
INTGUF: BLOCK 1 ;DEBUG - COUNTS INTERCEPTS
OUTGUF: BLOCK 1 ;COUNTS TIMES WE WANTED TO OUTSTR BUT WERE DETACHED
IFN FTUNSUPPORTED,<
SWRGUF: BLOCK 1 ;COUNTS SWAP READ ERRORS
SWWGUF: BLOCK 1 ;COUNTS SWAP WRITE ERORS
WRTGUF: BLOCK 1 ;COUNTS FAILURES IN MARKSPT
>
IFG FTFACT,<
FCTGUF: BLOCK 1 ;COUNTS FACT FILE ERRORS
BSYFCT: BLOCK 1 ;COUNTS TIMES FACT FILE BEING MODIFIED TOO LONG
>
SPTGUF: BLOCK 1 ;DEBUG - COUNTS SWAPPING POINTER FAILURES
HSSGUF: BLOCK 1 ;DEBUG - COUNTS HIGH SEG STATUS FAILURES
UPMGUF: BLOCK 1 ;DEBUG - COUNTS UPMP FAILURES
SUOGUF: BLOCK 1 ;DEBUG - COUNTS SWAP UNIT OPEN FAILURES
SWPGUF: BLOCK 1 ;DEBUG - COUNTS SWAP POINTER INCONSISTENCIES
CURJOB: BLOCK 1 ;DEBUG - LAST JOB SERVICED
INTFLG: BLOCK 1 ;DEBUG - REASONS FOR LAST JOBINT
INTPC: BLOCK 1 ;DEBUG - PC OF LAST JOBINT
WTUERR: BLOCK 1 ;FLAG TO PREVENT RECURSIVE CALLS OF WTUCOR WHEN
;IT GETS IO ERRORS ON THE SWAPPING DEVICE WHILE
;ATTEMPTING TO WRITE THE EXIT VALUES FOR A UUO.
IPCPDB: BLOCK 6 ;[602]IPCF PACKET DESCRIPTOR BLK \*** KEEP
SSELBK: BLOCK 10 ;[602]IPCF MSG AREA /*** TOGETHER
IFN FTDEBG,< ;DON'T WASTE SPACE
PATT: BLOCK 100 ;SPACE FOR PATCHES
>
SAVEP4: BLOCK 1 ;SAVE P4 HERE IN ERRFIN
IFG FTFACT,<
FACTSZ: BLOCK 1 ;NUMBER OF WORDS IN FACT BUFFER
>
NXMLEN: BLOCK 1 ;LENGTH OF NXMTAB
NXMTAB: BLOCK 1 ;POINTER TO FIRST COPY OF NXMTAB
; SUPPORT IN THIS MONITOR
NSYN==<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