/ /EAG:193 / COPYRIGHT (C) 1975 /EAG:193 / DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. /EAG:193 / /EAG:193 / THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY /EAG:193 / ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH /EAG:193 / THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS /EAG:193 / SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- /EAG:193 / VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON /EAG:193 / EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO /EAG:193 / THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE /EAG:193 / SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. /EAG:193 / /EAG:193 / THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE /EAG:193 / WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- /EAG:193 / MITMENT BY DIGITAL EQUIPMENT CORPORATION. /EAG:193 / /EAG:193 / DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY /EAG:193 / OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. /EAG:193 / /EAG:193 .TITLE FORCE INITIALIZATION CODE ABOVE 4K /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THE MONITOR INITIALIZATION CODE DOES MANY THINGS IN PAGE /EAG:191 / MODE. IN ORDER TO SOLVE THE POTENTIAL PAGE ADDRESSING /EAG:191 / PROBLEM WE FORCE ALL INITIALIZATION CODE TO BE LOADED ABOVE /EAG:191 / THE 4K BOUNDARY (I.E., IN PAGE 1) /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 .IFNEG .-10000 /EAG:191 .LOC 10000 /EAG:191 .ENDC /EAG:191 .TITLE MONITOR INITIALIZATION FIRST TIME /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / COME HERE FOLLOWING MANUAL BOOTSTRAP LOADS. THE BOOTSTRAP /EAG:191 / HAS LOADED RESMON (INCLUDING SGNBLK, SYSBLK, AND COMBLK) /EAG:191 / INTO BANK ZERO AND THEN TRANSFERED TO THIS LOCATION. THE /EAG:191 / TRANSFER TO THIS LOCATION IS PERFORMED BY INDIRECTING THROUGH /EAG:191 / LOCATION 105 (.SCOM LOCATION SC.SST). THIS ROUTINE THEN /EAG:191 / PERFORMS THE FOLLOWING ACTIONS: /EAG:191 / /EAG:191 / 1. ENABLE THE CLOCK (AFTER ZEROING WORD 7), JUST IN /EAG:191 / CASE WE HAVE COME FROM RSX OR SOMEONE ELSE WHO /EAG:191 / PASSES US THE DATE AND TIME. /EAG:191 / /EAG:191 / 2. COPY RESMON FROM BANK ZERO TO THE HIGHEST BANK OF /EAG:191 / MEMORY. /EAG:191 / /EAG:191 / 3. TRANSFER CONTROL TO THE HIGHEST BANK OF MEMORY. /EAG:191 / /EAG:191 / 4. CLEAR AND INITIALIZE .SCOM IN BANK ZERO. /EAG:191 / /EAG:191 / FOLLOWING THESE ACTIONS THIS ROUTINE TRANSFERS TO THE NORMAL /EAG:191 / MONITOR INITIALIZATION ROUTINE (INIT). /EAG:191 / /EAG:191 / /EAG:191 / THIS ROUTINE IS INDEPENDENT OF THE BANK INTO WHICH THE /EAG:191 / BOOTSTRAP LOADS RESMON. THE ONLY RESTRICTION (IF YOU WANT /EAG:191 / TO CALL IT THAT) IS THAT IT MUST BE LOADED BELOW 32K. /EAG:191 / HOWEVER IT DOES REQUIRE THAT THERE BE AT LEAST TWO BANKS /EAG:191 / (16K) OF MEMORY. IT ALSO ASSUMES THAT IT IS IN THE HIGH /EAG:191 / PAGE OF A BANK OF MEMORY. /EAG:191 / /EAG:191 / /EAG:191 / THE BOOTSTRAP SHOULD TRANSFER TO THIS ROUTINE WITH THE /EAG:191 / FOLLOWING INSTRUCTION: /EAG:191 / /EAG:191 / JMS IN /EAG:191 / /EAG:191 / THE PURPOSE OF USING A JMS INSTRUCTION IS TO LET THIS ROUTINE /EAG:191 / KNOW IN WHICH BANK THE BOOTSTRAP RESIDES. WE ASSUME THAT /EAG:191 / THE BOOTSTRAP RESIDES IN THE HIGHEST BANK OF MEMORY. THE /EAG:191 / JMS INSTRUCTION NEED NOT BE EXACTLY AS SHOWN -- IN FACT IT /EAG:191 / WILL PROBABLY BE AN INDIRECT TRANSFER THROUGH LOCATION /EAG:191 / SC.SST. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / INITIAL ENTRY /EAG:191 /EAG:191 IN JMS .,X / PUT JMS HERE JUST IN CASE /EAG:191 / SOMEONE CALLS US WITH JMP /EAG:191 / THE ",X" DOES NOT INDICATE /EAG:191 / AN INDEXED REFERENCE, SINCE /EAG:191 / THE BOOTSTRAP COMES HERE IN /EAG:191 / BANK MODE. RATHER, ITS JUST /EAG:191 / A KLUDGE TO GET MACRO TO /EAG:191 / GENERATE THE PROPER BANK BIT /EAG:191 / IN THE INSTRUCTION'S ADDRESS. /EAG:191 CAF / CAF ALSO HERE JUST IN CASE /EAG:191 DBA / ENTER PAGE MODE /EAG:191 DZM* (7) / ZERO CLOCK SO WON'T OVERFLOW /EAG:191 CLON / AND START IT COUNTING. THIS /EAG:191 / IS SO THAT WE DON'T LOSE /EAG:191 / TRACK OF TIME IF WE HAVE BEEN /EAG:191 / PASSED IT BY, SAY, RSX. /EAG:191 LAC IN / GET ADDRESS OF HIGH BANK /EAG:191 AND (60000 / MASK OUT BANK BITS /EAG:191 DAC IN.00A / SAVE IN TEMPORARY /EAG:191 / WE WILL USE THIS VALUE AS AN /EAG:191 / INDIRECT (INDEXED) TRANSFER /EAG:191 / VECTOR TO THE HIGH BANK. /EAG:191 LAC (RM.TBS) / COPY MONITOR FROM BANK ZERO /EAG:191 PAX / TO THIS BANK. START AT /EAG:191 TAD (RM.TLN) / RM.TBS AND TRANSFER RM.TLN /EAG:191 PAL / WORDS. /EAG:191 .X=(0) IN.002 LAC* .X,X / AND TRANSFER RESMON TO THE /EAG:191 DAC* IN.00A,X / HIGH BANK /EAG:191 AXS 1 / DONE YET? /EAG:191 JMP IN.002 / NO. /EAG:191 LAC (IN.010) / SET UP ADDRESS TO TRANSFER TO /EAG:191 XOR IN / IN HIGH BANK. LABEL IS /EAG:191 AND (717777) / IN.010, MUST COPY BANK BITS /EAG:191 XOR IN / FROM IN. /EAG:191 DAC IN.00A / STORE INTO TRANSFER VECTOR /EAG:191 JMP* IN.00A / AND GO THERE. /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.00A 0 / TEMPORARY USED BY ABOVE /EAG:191 / ROUTINES. /EAG:191 .TITLE .SCOM INITIALIZATION FIRST TIME /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THIS IS A CONTINUATION OF THE FIRST TIME MONITOR /EAG:191 / INITIALIZATION ROUTINE (ENTRY POINT IN). AT THE TIME /EAG:191 / CONTROL REACHES THIS POINT THE FOLLOWING ACTIONS HAVE BEEN /EAG:191 / PERFORMED: /EAG:191 / /EAG:191 / 1. THE CLOCK HAS BEEN TURNED ON. /EAG:191 / /EAG:191 / 2. RESMON HAS BEEN COPIED TO THE HIGHEST BANK /EAG:191 / OF MEMORY (ASSUMED TO BE THE BANK IN WHICH /EAG:191 / THE BOOTSTRAP IS LOCATED). /EAG:191 / /EAG:191 / 3. CONTROL HAS BEEN TRANSFERRED TO THE HIGH BANK. /EAG:191 / /EAG:191 / THIS (IN.010) IS THE "ENTRY POINT" INTO THE HIGH BANK /EAG:191 / COPY OF RESMON. WE COMPLETE THE INITIALIZATION BY CLEARING /EAG:191 / AND SETTING UP .SCOM, AND THEN JOINING THE NORMAL MONITOR /EAG:191 / INITIALIZATION CODE. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.010 LAC* (SC.DAY) / REMEMBER DATE AND TIME IN /EAG:195 DAC IN01.A / CASE THEY'VE BEEN PASSED TO /EAG:195 LAC* (SC.TIM) / US BY SOMEONE LIKE RSX. /EAG:195 DAC IN01.B /EAG:195 LAC (SC.BAS) / PUT BASE ADDRESS OF .SCOM /EAG:191 PAX / INTO XR /EAG:191 TAD (SC.LEN) / FORM END ADDRESS OF .SCOM /EAG:191 PAL / AND PUT INTO LR /EAG:191 .X=(0) IN.012 DZM* .X,X / ZERO OUT .SCOM. /EAG:191 AXS 1 /EAG:191 JMP IN.012 /EAG:191 LAC SG.MOD / SET UP SC.MOD FROM SGNBLK /EAG:191 .X=SC.XVM!SC.UC15!SC.PLR / MASK OUT ILLEGAL BITS /EAG:192 .X=.X!SC.LPSZ!SC.BNK!SC.FIL /EAG:192 .X=.X!SC.9CH!SC.TAB!SC.API /EAG:192 .X=.X!SC.UB1!SC.UB2 /EAG:201 AND (.X) /EAG:192 XOR (SC.NRM) / PRETEND NON-RES. MON. JUST /EAG:192 / IN CORE, SO .DAT WILL BE /EAG:192 / GOTTEN FROM SGNBLK INSTEAD /EAG:192 / OF DISK BLOCK 37. /EAG:192 DAC* (SC.MOD) /EAG:191 LAC SG.MSZ / COPY SG.MSZ (SGNBLK) TO /EAG:191 DAC* (SC.MSZ) / SC.MSZ (.SCOM) /EAG:191 LAC SG.LFR / ALSO SG.LFR TO SC.TMR /EAG:194 DAC* (SC.TMR) /EAG:194 LAC SG.VTF / AND SG.VTF TO SC.VTF /EAG:191 .X=SC.HFN!SC.VTN /EAG:192 AND (.X) /EAG:192 DAC* (SC.VTF) /EAG:191 LAC SG.PRC / AND SG.PRC TO SC.PRC /EAG:191 DAC* (SC.PRC) /EAG:191 LAW -16-16 / SET UP .SCOM .DAT AND .UFDT /EAG:191 TAD SG.NMD / REGISTERS TO REFER TO IMAGE /EAG:191 CLL!RAR / OF DEFAULT .DAT IN SGNBLK /EAG:191 DAC* (SC.SLT) / # OF .DAT SLOTS /EAG:191 LAC (SG.BAS+1+15) / CALCULAT ADDR. OF .DAT+0 /EAG:191 TAD SG.NMP /EAG:191 TAD IN.00A /EAG:192 DAC* (SC.DAT) /EAG:191 TAD* (SC.SLT) / AND ADDR. OF .UFDT+0 /EAG:191 AAC 1+15 /EAG:191 DAC* (SC.UFD) /EAG:191 LAC (041723) / PUT .SIXBT "DOS15" INTO /EAG:191 DAC* (SC.NMN) / SC.SPN AND SC.NMN /EAG:191 DAC* (SC.SPN) /EAG:191 LAC (616500) /EAG:191 DAC* (SC.NMN+1) /EAG:191 DAC* (SC.SPN+1) /EAG:191 LAC (230322) / PUT .SIXBT "SCR" INTO SC.UIC /EAG:191 DAC* (SC.UIC) /EAG:191 LAC (SC.TMM) / CAUSE NON-RES. MONITOR TO /EAG:192 DAC* (SC.NMF) / OUTPUT MODE MESSAGE /EAG:192 LAC IN01.A / SET UP DATE AND TIME TO WHAT /EAG:195 DAC* (SC.DAY) / THEY WERE BEFORE ZEROING /EAG:195 LAC IN01.B / .SCOM. THIS WILL USUALLY BE /EAG:195 DAC* (SC.TIM) / ZERO, EXCEPT WHEN WE ARE /EAG:195 / BOOTSTRAPPED FROM RSX. /EAG:195 JMP IN.110 / GO JOIN COMMON (NORMAL) /EAG:191 / MONITOR INITIALIZATION CODE /EAG:191 /EAG:195 /EAG:195 IN01.A 0 / PLACE TO REMEMBER SC.DAY /EAG:195 /EAG:195 IN01.B 0 / PLACE TO REMEMBER SC.TIM /EAG:195 .TITLE MONITOR INITIALIZATION OTHER THAN FIRST TIME /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / WE COME HERE EVERY TIME THE MONITOR RE-BOOTS AND /EAG:191 / REINITIALIZES ITSELF -- I.E. EVERY TIME WE CONSTRUCT A NEW /EAG:191 / CORE LOAD. THE BOOTSTRAP IS USED TO READ RESMON (INCLUDING /EAG:191 / SGNBLK, SYSBLK, AND COMBLK) INTO THE HIGHEST BANK OF MEMORY, /EAG:191 / THEN WE TRANSFER HERE. THIS ROUTINE THEN TRANSFERS THE /EAG:191 / RESIDENT MONITOR TO BANK ZERO AND INITIALIZES IT THERE. /EAG:191 / /EAG:191 / /EAG:191 / THIS ROUTINE PERFORMS THE FOLLOWING TASKS: /EAG:191 / /EAG:191 / 1. IT TURNS ON THE CLOCK, AFTER FIRST CLEARING /EAG:191 / LOCATION 7 SO THAT IT WON'T OVERFLOW. THIS IS /EAG:191 / SO THAT THE MONITOR WILL NOT LOSE TRACK OF THE /EAG:191 / CURRENT TIME. /EAG:191 / /EAG:191 / 2. DETERMINES WHICH BANK WE ARE RUNNING IN AND SAVES /EAG:191 / THIS INFORMATION (BANK BITS) IN IN.BNK. THIS /EAG:191 / INFORMATION IS DETERMINED BY EXECUTING A JMS. /EAG:191 / /EAG:191 / 3. SAVES THE RESIDENT MONITOR SIZE (TO BE USED IN /EAG:191 / SETTING SC.RMS LATER) IN IN.RMS. THIS INFORMATION /EAG:191 / IS OBTAINED FROM LOCATION SC.RMS IN THIS BANK -- /EAG:191 / I.E. FROM LOCATION SC.RMS OF THE DISK IMAGE /EAG:191 / OF THE RESIDENT MONITOR. /EAG:191 / /EAG:191 / 4. VERIFIES THAT THE MONITOR WILL FIT WITHIN THE /EAG:191 / SPACE ALLOCATED FOR IT WHEN THIS FILE WAS /EAG:191 / ASSEMBLED. THIS TEST CAN ONLY FAIL IF THE MONITOR /EAG:191 / IS PATCHED SO AS TO MAKE IT LARGER. /EAG:191 / /EAG:191 / 5. VERIFIES THAT THE RESIDENT PATCH AREA (ALLOCATED /EAG:191 / WITH SGEN) IS NOT TOO LARGE. IF IT IS TOO LARGE /EAG:191 / IT WILL BE TRUNCATED TO THE LARGEST SIZE POSSIBLE. /EAG:191 / /EAG:191 / 6. VERIFIES THAT THERE IS SUFFICIENT CORE TO RUN -- /EAG:191 / I.E. THAT WE HAVE AT LEAST 16K. THIS /EAG:191 / INITIALIZATION ROUTINE ASSUMES THAT IT RUNS IN /EAG:191 / A BANK OTHER THAN ZERO, WHICH IS WHERE IT BUILDS /EAG:191 / THE RESIDENT MONITOR. /EAG:191 / /EAG:191 / 7. COPIES THE OLD IMAGE OF .SCOM FROM BANK ZERO TO /EAG:191 / THE HIGHEST BANK (THE BANK IN WHICH THIS ROUTINE /EAG:191 / IS RUNNING). /EAG:191 / /EAG:191 / 8. COPIES THE OLD RESIDENT PATCH AREA (ALLOCATED WITH /EAG:191 / SGEN) FROM BANK ZERO TO THIS BANK. THE PATCH AREA /EAG:191 / WILL SUBSEQUENTLY BE COPIED BACK TO BANK ZERO BY /EAG:191 / THE ROUTINE IN.MON. /EAG:191 / /EAG:191 / 9. COPIES THE OLD .DAT AND .UFDT TABLES FROM BANK /EAG:191 / ZERO TO THIS BANK. THEY ARE SAVED IN A BUFFER /EAG:191 / WHOSE NAME IS "IN.SVD". /EAG:191 / /EAG:193 / 10. COPIES THE VT15 (CTRL-X) DISPLAY BUFFER FROM BANK /EAG:193 / ZERO TO THE BEGINNING OF PAGE ONE WITHIN BANK /EAG:193 / ZERO. THE BEGINNING OF PAGE ONE IS USED AS /EAG:193 / TEMPORARY STORAGE TO HOLD THE DISPLAY BUFFER /EAG:193 / UNTIL IN.VT TAKES CARE OF IT. /EAG:193 / /EAG:191 / 11. CLEARS PAGE ZERO. /EAG:191 / /EAG:191 / 12. SETS UP THE RESIDENT MONITOR IN BANK ZERO. THIS /EAG:191 / ESSENTIALLY STARTS AT LOCATION ZERO AND WORKS UP, /EAG:191 / BUT WITH EXCEPTIONS. THIS WILL BE DETAILED AS /EAG:191 / WE GET TO IT. /EAG:191 / /EAG:191 / THE MONITOR FIRST TIME INITIALIZATION ROUTINE JOINS THIS /EAG:191 / ROUTINE AT STEP 2 (LABEL IN.110). /EAG:191 / /EAG:191 / /EAG:191 / THIS ROUTINE MUST RUN IN THE SAME BANK AS THE BOOTSTRAP, /EAG:191 / WHICH BANK IS ASSUMED TO BE THE HIGHEST BANK AVAILABLE FOR /EAG:191 / EXECUTABLE CODE (I.E., THE HIGHEST BANK BELOW 32K). THIS /EAG:191 / ROUTINE INITIALLY DETERMINES THE BANK IN WHICH IT IS BEING /EAG:191 / RUN WITH A JMS INSTRUCTION. THIS INFORMATION (THE BANK /EAG:191 / BITS) IS THEN STORED IN LOCATION IN.BNK, WHICH IS USED BY /EAG:191 / THE REST OF THE INITIALIZATION CODE. .SCOM LOCATION SC.COD /EAG:191 / IS ALSO SET FROM THIS INFORMATION. THIS ROUTINE ALSO /EAG:191 / ASSUMES THAT IT IS IN THE HIGH PAGE OF THE BANK. /EAG:191 / /EAG:191 / /EAG:191 / THIS ROUTINE SHOULD BE ENTERED BY THE FOLLOWING INSTRUCTION: /EAG:191 / /EAG:191 / JMP INIT /EAG:191 / /EAG:191 / THE SOLE EXCEPTION IS WHEN THE FIRST TIME INITIALIZATION /EAG:191 / CODE TRANSFERS HERE. THAT TRANSFER SKIPS THE CLOCK /EAG:191 / SET UP CODE (SINCE IT HAS ALREADY SET UP THE CLOCK), AND THUS /EAG:191 / COMES HERE VIA: /EAG:191 / /EAG:191 / JMP IN.110 /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 INIT CAF / CAF HERE JUST IN CASE /EAG:191 DBA / ENTER PAGE MODE /EAG:191 CLON / AND ENABLE CLOCK. /EAG:191 / NEXT INSTRUCTION IS ENTRY POINT FROM FIRST TIME INIT. ROUTINE /EAG:191 IN.110 JMS IN.111 / DETERMINE BANK IN WHICH /EAG:191 IN.111 0 / WE ARE RUNNING /EAG:191 LAC IN.111 /EAG:191 AND (60000) /EAG:191 DAC IN.BNK / AND SAVE FOR LATER USE /EAG:191 PAX / ALSO STICK IN XR SO CAN /EAG:191 / ACCESS MONITOR /EAG:191 .X=(SC.RMS) LAC* .X,X / SAVE RESIDENT MONITOR SIZE /EAG:191 DAC IN.RMS / FROM DISK IMAGE IN IN.RMS /EAG:191 CLL / VERIFY RESIDENT MONITOR SIZE /EAG:191 TAD (-RM.LMT) / AGAINST ITS LIMIT /EAG:191 SNL / SKIP IF NOT OK /EAG:191 JMP IN.112 / OK -- GO CHECK PATCH AREA /EAG:191 SNA / EXCEPT THAT ZERO IS OK TOO /EAG:191 JMP IN.112 /EAG:191 JMS IN.BIG / TYPE 'RES. MON. TOO BIG,' /RKB-198 JMS IN.MSG / TYPE REST /RKB-198 .ASCII "OLD IMAGE"<000> /RKB-198 JMP IN.FAL / AND GO TO FAILURE ROUTINE /EAG:191 /EAG:191 /EAG:191 IN.112 TAD SG.PSZ / VERIFY THAT PATCH AREA SIZE /EAG:191 SNL / ISN'T TOO BIG. SKIP IF BAD /EAG:191 JMP IN.113 / GO CHECK CORE SIZE /EAG:191 SNA / ZERO IS OK TOO /EAG:191 JMP IN.113 /EAG:191 TCA / DETERMINE MAXIMUM PATCH AREA /EAG:191 TAD SG.PSZ / SIZE /EAG:191 DAC SG.PSZ / AND USE IT /EAG:191 JMS IN.MSG / OUTPUT MESSAGE TO USER /EAG:191 .ASCII <015>"RES. PATCH AREA TOO BIG, TRNCTD. TO "<0> /RKB-198 LAC SG.PSZ /EAG:191 JMS IN.OCT /EAG:191 JMS IN.MSG /EAG:191 .ASCII "(8)"<000> /RKB-198 DZM IN.OVF / INDICATE THAT A MEMORY /EAG:193 / OVERFLOW OCCURED. /EAG:193 IN.113 LAC IN.BNK / VERIFY THAT WE ARE NOT /EAG:191 SZA / RUNNING IN BANK ZERO. /EAG:191 JMP IN.114 /EAG:191 JMS IN.MSG / OUTPUT ERROR MESSAGE /EAG:191 .ASCII <015>"BOOT. < 24K"<000> /RKB-198 JMP IN.FAL / AND GO TO FAILURE ROUTINE /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / COPY OLD .SCOM FROM BANK ZERO TO THIS BANK. /EAG:191 / NEXT WE WILL COPY THE RESIDENT PATCH AREA FROM BANK ZERO TO /EAG:191 / THIS BANK. /EAG:191 / THEN WE WILL COPY THE OLD .DAT AND .UFDT TABLES FROM /EAG:191 / BANK ZERO TO THIS BANK. /EAG:191 / LAST WE WILL ZERO BANK ZERO. /EAG:191 / /EAG:191 /EAG:191 IN.114 LAC (SC.BAS) / BASE ADDR. (WITHIN BANK) OF /EAG:191 PAX / .SCOM TO XR /EAG:191 TAD (SC.LEN) / FORM END ADDR. AND PUT IN LR /EAG:191 PAL /EAG:191 .X=(0) IN.116 LAC* .X,X / COPY .SCOM FROM BANK ZERO TO /EAG:191 DAC* IN.BNK,X / THIS BANK (ADDR IN IN.BNK) /EAG:191 AXS 1 /EAG:191 JMP IN.116 /EAG:191 LAC IN.RMS / SET UP TO COPY RESIDENT /EAG:191 PAX / PATCH AREA /EAG:191 TAD SG.PSZ /EAG:191 SAD IN.RMS / DOES PATCH AREA EXIST? /EAG:191 JMP IN.118 / NO -- GO COPY .DAT /EAG:191 PAL / YES -- SO LET'S DO IT /EAG:191 .X=(0) IN.117 LAC* .X,X / COPY RESIDENT PATCH AREA /EAG:191 DAC* IN.BNK,X / TO THIS BANK /EAG:191 AXS 1 /EAG:191 JMP IN.117 /EAG:191 IN.118 LAW -15 / SET UP TO COPY .DAT /EAG:191 TAD* (SC.DAT) / GET BASE ADDR. OF .DAT /EAG:191 DAC IN.11A / INTO IN.11A /EAG:192 CLX / START AT BEGINNING OF .DAT /EAG:192 LAC* (SC.SLT) / AND COPY THE WHOLE THING /EAG:192 AAC 16 /EAG:192 CLL!RAL /EAG:192 PAL /EAG:192 IN.119 LAC* IN.11A,X / COPY .DAT AND .UFDT /EAG:192 DAC IN.SVD,X /EAG:192 AXS 1 /EAG:191 JMP IN.119 /EAG:191 LAC* (SC.VTR) / SEE IF DISPLAY BUFFER IS SET /EAG:193 SNA / UP -- I.E., DOES ONE EXIST. /EAG:193 JMP IN.121 / NO DISPLAY BUFFER -- SKIP /EAG:193 AAC VTCOPY-VTMAIN / GET BASE ADDRESS OF SECTION /EAG:193 DAC IN.11A / TO PRESERVE. /EAG:193 LAC (VTEND-1-VTCOPY) / POINT XR TO LAST LOCATION TO /EAG:193 PAX / SAVE, AND LR TO FIRST. WE /EAG:193 CLLR / MUST COPY THE VT DISPLAY /EAG:193 IN.120 LAC* IN.11A,X / BUFFER HIGHEST ADDRESS FIRST /EAG:193 .X=(10000) DAC* .X,X / (RATHER THAN MORE NORMAL /EAG:193 AXS -1 / ORDER) BECAUSE DISPLAY BUFFER /EAG:193 SKP / AND PLACE WE ARE COPYING IT /EAG:193 JMP IN.120 / TO MAY OVERLAP. /EAG:193 IN.121 CLX / SET UP TO ZERO OUT PAGE ZERO /EAG:191 LAC (7) / CLEAR LOCATIONS 0 TO 6, THEN /EAG:191 PAL / SKIP LOC. 7, SO WON'T MESS /EAG:191 / UP CLOCK /EAG:191 .X=(0) IN.122 DZM* .X,X / CLEAR TO ADDR IN LR /EAG:191 AXS 1 /EAG:191 JMP IN.122 /EAG:191 LAC (SC.BAS+SC.LEN) / MOVE LIMIT TO TOP OF .SCOM /RKB-203 PAL /EAG:191 AXS 1 / HAVE WE DONE THIS BEFORE? /EAG:191 JMP IN.122 / NO. AXS SKIPPED OVER LOC. 7 /EAG:191 JMP IN.HWA / ... GO BUILD RESMON. /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.11A 0 / TEMPORARY USED ABOVE /EAG:191 .TITLE IN.HWA -- DETERMINE HARDWARE AVAILABILITY /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / PERFORM APPROPRIATE BLACK MAGIC TO DETERMINE WHAT HARDWARE /EAG:191 / IS ON SYSTEM. THIS INFORMATION IS USED TO SET UP THE /EAG:191 / FOLLOWING LOCATIONS: /EAG:191 / /EAG:191 / IN.SAPI CONTAINS SKP IF API PRESENT, NOP OTHERWISE /EAG:191 / /EAG:191 / IN.SUC CONTAINS SKP IF UC15 PRESENT, NOP OTHERWISE /EAG:191 / /EAG:191 / IN.SXM CONTAINS SKP IF XM15 (XVM HARDWARE OPTION) /EAG:191 / IS PRESENT, NOP OTHERWISE /EAG:191 / /EAG:191 / IN.AMS CONTAINS THE ACTUAL (PHYSICAL) MEMORY SIZE, /EAG:191 / IN THE SAME FORM AS SC.AMS. IF THE SYSTEM /EAG:191 / DOES NOT HAVE AN XM15 (I.E., IN.SXM CONTAINS /EAG:191 / A NOP) THIS LOCATION WILL ALWAYS CONTAIN /EAG:191 / 077777, INDICATING 32K OF MEMORY. /EAG:191 / /EAG:191 / IN.SVT CONTAINS SKP IF VT15 PRESENT, NOP OTHERWISE /EAG:191 / /EAG:191 / IN.SCLK CONTAINS SKP IF KW15 CLOCK IS PRESENT, NOP /EAG:191 / OTHERWISE. /EAG:191 / /EAG:191 / /EAG:191 / NOTE: IN THE COURSE OF DETERMINING THE AVAILABLE HARDWARE /EAG:191 / THE FOLLOWING SIDE EFFECTS ARE CAUSED: /EAG:191 / /EAG:191 / 1. INTERRUPTS ARE DISABLED (VIA .INH) AND LEFT /EAG:191 / DISABLED. /EAG:191 / /EAG:191 / 2. THE UC15 (IF PRESENT) IS DISABLED AND LEFT /EAG:191 / DISABLED (I.E., INTERRUPTS FROM THE PDP-11 ARE /EAG:191 / DISABLED). /EAG:191 / /EAG:191 / 3. THE MM REGISTER OF THE XM15 HARDWARE OPTION /EAG:191 / (IF PRESENT) IS LOADED WITH THE RELOCATE /EAG:191 / DISABLE, 17-BIT INDIRECT ADDRESSING, AND IOT /EAG:191 / PROTECT DISABLE FLAGS. THE MM REGISTER IS LEFT /EAG:191 / SET THIS WAY. /EAG:191 / /EAG:191 / 4. THE PAGE SIZE BITS IN THE VT15 DISPLAY PROCESSOR /EAG:191 / ARE SET AND LEFT THAT WAY. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / FIRST CHECK FOR PRESENCE OF API AND SET IN.SAPI /EAG:191 /EAG:191 IN.HWA .INH / DISABLE INTERRUPTS, JUST IN /EAG:191 / CASE API IS HERE & ECO'ED. /RKB-203 / /RKB-203 / SINCE THE CLOCK IS NOW RUNNING AND MAY BE WAITING TO /RKB-203 / INTERRUPT US, AND WE ARE ABOUT TO ENABLE API FOR THIS /RKB-203 / ECO TEST, WE WILL CONNECT A SERVICE SUBROUTINE TO THE /RKB-203 / CLOCK API VECTOR FOR THE CASE WHEN IT INTERRUPTS /RKB-203 / US WHILE WE'RE WORKING. THE INTERRUPT SERVICE MERELY /RKB-203 / CLEARS THE FLAG AND RETURNS. IT IS NOT REQUIRED TO /RKB-203 / REMEMBER THE FLAG IN ORDER TO PROPERLY KEEP TRACK OF /RKB-203 / THE TIME OF DAY; WE NEED ONLY THE ELAPSED TICK COUNT /RKB-203 / IN LOCATION 7. /RKB-203 / /RKB-203 LAC (INHW.G) / THE ADDR OF CLOCK SERVICE /RKB-203 TAD IN.BNK / SUBROUTINE /RKB-203 DAC* (2) / SAVE IT IN PAGE 0, LOCATION 2 /RKB-203 LAC (JMS+20000+2) / AND PUT A JMS* 2 /RKB-203 DAC* (KW.API) / INTO THE API VECTOR /RKB-203 / /RKB-203 / CHECK FOR RE-ENTRANCY ECO PACKAGE, ECO'S 49-52, INCL. /RKB-203 / AT THE SAME TIME, THE NO-API CASE WILL FALL OUT. NO API /RKB-203 / AND API BUT NOT ECO'ED WILL BE TREATED THE SAME BY THE /RKB-203 / MONITOR, EXCEPT IN THE NOT-ECO'ED CASE A SPECIAL MESSAGE /RKB-203 / WILL BE OUTPUT. /RKB-203 / /RKB-203 / WE CHECK FOR THE TWO POINTS OF THE ECO PACKAGE IN WHICH WE /RKB-203 / ARE INTERESTED (ALTHOUGH CHECKING FOR JUST ONE SHOULD DO): /RKB-203 / THAT INTERRUPTS ARE HELD OFF FOR ONE INST. FOLLOWING A 'JMS' /RKB-203 / AND THAT THE .ENB AND .INH INSTRUCTIONS WORK. /RKB-203 / /RKB-203 / CHECK FOR BOTH BY QUEUEING A SOFTWARE LEVEL 5 INTERRUPT. /RKB-203 / /RKB-203 LAC (JMP+20000+1) / SETUP LEVEL 5 VECTOR /RKB-203 DAC* (41) / WITH A JMP* 1 /RKB-203 LAC (INHW.F) / POINT LOC. 1 (TV) TO ERROR /RKB-203 TAD IN.BNK // /RKB-203 DAC* (1) / ROUTINE UP HERE /RKB-203 / /RKB-203 LAC (API.ON!API.R5) / QUEUE THE INTERRUPT /RKB-203 ISA // /RKB-203 / /RKB-203 NOP / FREE INSTRUCTION /RKB-203 NOP / IN CASE A SLOW API SYNC /RKB-203 / /RKB-203 / IF API IS PRESENT BUT NOT ECO'ED, WE'RE NOT HERE, WE'VE /RKB-203 / INTERRUPTED TO 'INHW.F'. SINCE WE ARE HERE, IT MEANS EITHER /RKB-203 / THIS MACHINE DOESN'T HAVE API, OR ITS BEEN ECO'ED. /RKB-203 / IN ORDER TO GUARANTEE THIS, WE NOW CHECK FOR FREE INST. /RKB-203 / FOLLOWING A JMS INST. OBSERVE: /RKB-203 / /RKB-203 LAC (INHW.0) / CHECK NOW FOR FREE INST /RKB-203 TAD IN.BNK /RKB-203 / FOLLOWING A 'JMS'. GET SET /RKB-203 / LOADING AC WITH NEW INTERRUPT /RKB-203 / ADDRESS. WATCH. /RKB-203 .ENB / ENABLE THE BREAK /RKB-203 JMS .+1 / THE JMS IS FREE (FOLLOWS /RKB-203 / AN IOT) AND SHOULD CAUSE /RKB-203 / EXACTLY ONE MORE FREE INST /RKB-203 XX // /RKB-203 / /RKB-203 / IF NO FREE INST AFTER A JMS, CONTROL WILL GO TO 'INHW.F' /RKB-203 / BEFORE THE FOLLOWING 'DAC*' CAN OCCUR. THE INTERRUPT /RKB-203 / SHOULD BE HONORED AFTER THE 'DAC*' (WE'LL GIVE IT AN EXTRA /RKB-203 / 'NOP' TO BE SURE) IF THE ECO'S ARE IN. SINCE WE'VE JUST /RKB-203 / CHANGED THE INTERRUPT ADDRESS TO 'INHW.0', WE END UP THERE /RKB-203 / IF EITHER THE API IS ABSENT OR ITS ECO'ED. /RKB-203 / /RKB-203 DAC* (1) / THE CRUCIAL INSTRUCTION /RKB-203 / /RKB-203 NOP / IN CASE WE MISSED API SYNC /RKB-203 INHW.0 RPL / GET BACK THE API REGISTER /RKB-203 / /RKB-203 / IF WE TOOK THE ERROR TRIP TO 'INHW.F' VIA THE INTERRUPT, /RKB-203 / THE NON-ECO'ED API UNIT HAS BEEN DISSABLED, HENCE TO BE /RKB-203 / TREATED AS NON-EXISTENT. /RKB-203 / /RKB-203 / 000000 => NO API /EAG:191 / 400004 => API PRESENT /RKB-203 SMA!CLA / CONSTRUCT IN.SAPI WORD /EAG:191 LAC (SKP\NOP) /EAG:191 XOR (SKP) /EAG:191 DAC IN.SAPI /EAG:191 / /RKB-203 / WE MAY HAVE AN API CONDITION TO CLEAR UP, PLUS A FLAG /RKB-203 / /RKB-203 CAF / SO DO IT /RKB-203 / (NOTE THAT THE CLOCK IS OK) /RKB-203 .INH / RETURN TO PROTECTED STATE /RKB-203 / /RKB-203 / NOTE: WE LEAVE INTERRUPTS DISABLED (VIA .INH) /EAG:191 / NOW CHECK FOR UC15 AND SET IN.SUC /EAG:191 /EAG:191 CLA!IAC / LOAD AC WITH 000001 /EAG:191 LDRS / AND DISABLE UC15 INTERRUPTS /EAG:191 / (IF UC15 PRESENT) /EAG:191 LAW -76 / DELAY (ABOUT 100.8 USEC.) /EAG:191 INHW.1 SZA!IAC /EAG:191 JMP INHW.1 /EAG:191 RDRS / READ BACK UC15 STATE /EAG:191 RAR / ENABLE/DISABLE BIT TO LINK /EAG:191 / 0 => NO UC15 /EAG:191 / 1 => UC15 PRESENT /EAG:191 SNL!CLA / CONSTRUCT IN.SUC WORD /EAG:191 LAC (SKP\NOP) /EAG:191 XOR (SKP) /EAG:191 DAC IN.SUC /EAG:191 /EAG:191 / NOTE: WE LEAVE UC15 DISABLED /EAG:191 / NOW CHECK FOR XM15 AND SET IN.SXM /EAG:191 /EAG:191 LAC (400000) / SET RELOCATE DISABLE FLAG /EAG:192 LDMM / IN MM REGISTER. /EAG:193 LAW -76 / DELAY (ABOUT 100.8 USEC.) /EAG:191 INHW.2 SZA!IAC /EAG:191 JMP INHW.2 /EAG:191 RDMM / READ BACK MM REGISTER. WILL /EAG:191 SAD (400000) / BE IDENTICAL IF XM15 PRESENT. /EAG:191 CLA!SKP / CONSTRUCT IN.SXM WORD /EAG:191 LAC (SKP\NOP) /EAG:191 XOR (SKP) /EAG:191 DAC IN.SXM /EAG:191 /EAG:191 / NOTE: WE LEAVE THE MM REGISTER WITH THE VARIOUS FLAGS SET /EAG:191 / NOW DETERMINE MEMORY SIZE. /EAG:191 /EAG:191 LAC IN.BNK / ASSUME XM15 NOT PRESENT /RKB-208 TAD (17777) / SET TO BOOT ADDR /RKB-208 DAC IN.AMS / AND SET IN.AMS ACCORDINGLY /EAG:191 XCT IN.SXM / XM15 PRESENT? /EAG:191 JMP INHW.B / NO. DON'T SIZE MEMORY /EAG:191 LAC (JMP+20000+22) / XM15 PRESENT, SO SIZE MEMORY /EAG:191 DAC* (21) / SET UP SO THAT NON-EXISTENT /EAG:191 LAC (INHW.6) / MEMORY TRAP (WHICH WILL TRAP /EAG:191 XOR IN.BNK / TO LOCATION 20) WILL COME /EAG:191 DAC* (22) / BACK TO US AT INHW.6 /EAG:191 LAC (INHW.4) / SET UP XR SO AS TO START /EAG:193 XOR IN.BNK / SIZING AT LOCATION 0. /EAG:193 TCA /EAG:193 PAX /EAG:193 LAC (377777) / LOAD LR WITH MAX. LIMIT /EAG:191 PAL /EAG:191 CLL / CLEAR LINK TO INDICATE WE /EAG:191 / HAVEN'T HIT LIMIT YET. WHEN /EAG:191 / WE HIT THE LIMIT THE FIRST /EAG:191 / TIME, WILL SET LINK. IF HIT /EAG:191 / LIMIT TWICE, HAVE GONE THRU /EAG:191 / ALL 256K OF MEMORY, SO ERROR /EAG:191 MPEU / ENTER USER MODE SO NON-EX. /EAG:192 / MEM. REF.'S WILL TRAP. NOTE /EAG:192 / THAT RELOCATE DISABLE WAS SET /EAG:192 / PREVIOUSLY. /EAG:192 INHW.4 LAC .,X / AND SIZE MEMORY. ACCESS /EAG:191 INHW.5 AXS 200 / SUCCESSIVELY HIGHER LOCATIONS /EAG:191 JMP INHW.4 / UNTIL GET NON-EXISTENT MEM. /EAG:191 / REF. TRAP /EAG:191 SNL!CML / HAVE WE HIT LIMIT BEFORE? /EAG:191 JMP INHW.4 / NO -- SET LINK AND CONTINUE /EAG:191 JMP INHW.7 / YES. GO PRINT ERROR MESSAGE. /EAG:191 /EAG:191 /EAG:191 INHW.6 MPSNE / VERIFY THAT WE TRAPPED DUE /EAG:191 / TO NON-EXISTENT MEMORY REF. /EAG:191 JMP INHW.7 / NO! TYPE ERROR MESSAGE. /EAG:191 LAC* (20) / DID TRAP OCCUR FROM RIGHT /EAG:191 AND (077777) / PLACE? /EAG:191 XOR IN.BNK /EAG:191 SAD (INHW.5) /EAG:191 JMP INHW.8 / YES -- GO STORE MEMORY SIZE /EAG:191 INHW.7 JMS IN.MSG / TRAP DID NOT OCCUR PROPERLY /EAG:191 / OUTPUT ERROR MESSAGE. /EAG:191 .ASCII <15>"HARDWARE FAILURE WHILE SIZING MEM."<000> /RKB-198 JMP INHW.9 / GO OUTPUT REST OF ERROR MSG /EAG:191 / AND USE TOP OF THIS BANK AS /EAG:191 / MEMORY SIZE. /EAG:191 /EAG:191 /EAG:191 INHW.8 PXA / HAVE COMPLETED SIZING -- /EAG:191 TAD IN.BNK / GET MEMORY SIZE. /EAG:193 TAD (INHW.4-1) /EAG:193 DAC IN.AMS /EAG:191 CLL!TCA / VERIFY THAT MEMORY SIZE IS /EAG:191 TAD IN.BNK / ABOVE BOOTSTRAP ADDRESS /EAG:191 TAD (17776) /EAG:191 SNL /EAG:191 JMP INHW.A / MEMORY SIZE OK -- GO CLEAN UP /EAG:191 / AFTER SIZING OPERATION /EAG:191 JMS IN.MSG / MEMORY SIZE LESS THAN BOOT- /EAG:191 / STRAP ADDRESS -- OUTPUT MSG /EAG:191 .ASCII <15>"ACT. MEM. SIZE < BOOT."<000> /RKB-198 INHW.9 LAC IN.BNK / MEMORY SIZE BAD -- USE BOOT- /EAG:191 XOR (17777) / STRAP ADDRESS FOR MEMORY SIZE /EAG:191 DAC IN.AMS /EAG:191 JMS IN.MSG / OUTPUT MESSAGE /EAG:191 .ASCII <15>"BOOT. ADDR. ("<000> /RKB-198 LAC IN.AMS / AND TELL USER WHAT IT IS /EAG:191 JMS IN.NMK /EAG:191 JMS IN.MSG /EAG:191 .ASCII ") WILL BE USED."<000> /EAG:191 INHW.A MPCNE / CLEAN UP AFTER SIZING -- /EAG:191 / FIRST CLEAR NON-EXISTENT MEM. /EAG:191 / FLAG, THEN /EAG:191 DZM* (20) / RE-ZERO ANY LOCATIONS IN /EAG:191 DZM* (21) / BANK ZERO WE MAY HAVE USED /EAG:191 DZM* (22) /EAG:191 DZM* (0) / THIS ONE JUST IN CASE /EAG:191 /EAG:191 / NOW CHECK IF VT15 IS PRESENT /EAG:191 /EAG:191 INHW.B LAC (340) / SET PAPER SIZE BITS TO ALL /EAG:191 SIC / ONE'S /EAG:191 LAW -76 / DELAY (ABOUT 100.8 USEC.) /EAG:191 INHW.C SZA!IAC /EAG:191 JMP INHW.C /EAG:191 RS1+10 / CHECK PAPER SIZE BITS IN /EAG:191 SNA!CLA / STATUS REGISTER, AND BUILD /EAG:191 LAC (SKP\NOP) / IN.SVT WORD /EAG:191 XOR (SKP) /EAG:191 DAC IN.SVT /EAG:191 /EAG:191 / NOTE: PAPER SIZE BITS LEFT SET /EAG:191 / NOW CHECK OF CLOCK IS PRESENT. NOTE THAT THE CLOCK HAS /EAG:191 / HAS ALREADY TURNED ON (IT WAS THE FIRST THING THE /EAG:191 / INITIALIZATION CODE DID. /EAG:191 /EAG:191 LAC (360000) / SET UP LOOP COUNTER TO WAIT /EAG:191 PAX / FOR CLOCK TICK. LOOP TIME IS /EAG:191 CLLR / ABOUT 39.3 MSEC. WE MUST /EAG:191 / GET A CLOCK TICK IN THIS TIME /EAG:191 / OR ELSE WE WILL ASSUME WE /EAG:191 / DON'T HAVE A CLOCK. /EAG:191 LAC* (7) / GET CURRENT CLOCK VALUE /EAG:191 INHW.D AXS 1 / HAVE WE WAITED LONG ENOUGH? /EAG:191 JMP INHW.E / YES -- NO CLOCK PRESENT /EAG:191 SAD* (7) / HAS CLOCK CHANGED YET? /EAG:191 JMP INHW.D / NO -- WAIT UNTIL IT DOES /EAG:191 CLA!SKP / EXISTS CLOCK -- GENERATE SKP /EAG:191 INHW.E LAC (SKP\NOP) / NO CLOCK -- GENERATE NOP /EAG:191 XOR (SKP) /EAG:191 DAC IN.SCLK /EAG:191 XCT IN.SCLK / IF WE THINK CLOCK DOESN'T /EAG:191 CLOF / EXIST, TURN IT OFF (JUST IN /EAG:191 / CASE) /EAG:191 JMP IN.LOW / CONTINUE WITH INITIALIZATION /EAG:191 / /RKB-203 / THIS IS THE INTERRUPT ROUTINE FOR THE API LEVEL 5 USED IN /RKB-203 / DETERMINING WHETHER API EXITSTSAND IS FULLY ECO'ED. /RKB-203 / /RKB-203 / IF WE GET HERE ITS BECAUSE API IS PRESENT AND NOT ECO'ED. /RKB-203 / IN THIS CASE WE WILL ISSUE A SPECIAL MESSAGE, AND PROCEED /RKB-203 / WITH INITIALIZATION AS IF API IS NOT AVAILABLE. /RKB-203 / NOTE THAT WE WILL BE GETTING THE 'API NOT AVAIL' MESSAGE /RKB-203 / A LITTLE LATER ON ALSO. /RKB-203 / /RKB-203 INHW.F CAF / TURN OFF API AND CLEAR REGS /RKB-203 JMS IN.MSG / TYPE THE ERROR /RKB-203 .ASCII <15>"REENTRANCY ECO'S (KP15 #49-52) MISSING"<0> /RKB-203 JMS IN.MSG // /RKB-203 .ASCII " -- API CANNOT BE USED"<000> /RKB-203 JMP INHW.0 / REJOIN MY CODE, SHOWING /RKB-203 / THAT API IS NOT PRESENT /RKB-203 / /RKB-203 INHW.G XX / TEMP. CLOCK INTERRUPT SVC /RKB-203 CLON / CLEAR THE CLOCK FLAG /RKB-203 DBR / DEBREAK FROM LEVEL 3 SO /RKB-203 / MY LEVEL 5 CAN COME THROUGH /RKB-203 JMP* INHW.G / AND EXIT /RKB-203 / /RKB-203 .TITLE IN.LOW -- INITIALIZE LOCATIONS 0 THROUGH 37 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / LOCATIONS 0 THROUGH 37 (INCLUSIVE) ARE SET UP ACCORDING TO /EAG:191 / THE FOLLOWING MEMORY MAP: /EAG:191 / /EAG:191 / 00/ PROGRAM INTERRUPT ENTRY POINT /EAG:191 / 01/ JMP TO SKIP CHAIN /EAG:191 / 02/ CONTAINS JMP TO BOOTSTRAP. IS ACTUALLY /EAG:191 / INDIRECT JMP THROUGH LOCATION 05 /EAG:191 / 03/ ENTRY POINT TO .MED (MONITOR ERROR DIAGNOSTIC /EAG:191 / ROUTINE) /EAG:191 / 04/ JMP TO .MED ROUTINE IN MONITOR /EAG:191 / 05/ CONTAINS ADDRESS OF BOOTSTRAP ENTRY POINT. /EAG:191 / USED BY LOCATION 02. /EAG:191 / 06/ RESERVED /EAG:191 / 07/ CLOCK COUNTER /EAG:191 / 10/ AUTO-INCREMENT REGISTER X10 /EAG:191 / . . /EAG:191 / . . /EAG:191 / . . /EAG:191 / 17/ AUTO-INCREMENT REGISTER X17 /EAG:191 / 20/ CAL ENTRY POINT. INITIALIZED TO POINT TO /EAG:191 / INDIRECT CAL ERROR ROUTINE. /EAG:191 / 21/ JMP TO CAL HANDLER /EAG:191 / 22/ WORD COUNT/CURRENT ADDRESS PAIRS FOR MULTI- /EAG:191 / 23/ CYCLE BLOCK TRANSFER DEVICES /EAG:191 / . . /EAG:191 / . . /EAG:191 / . . /EAG:191 / 36/ LAST WORD COUNT/CURRENT ADDRESS PAIR /EAG:191 / 37/ /EAG:191 / /EAG:191 / THIS ROUTINE DOES NOT ACTUALLY SET UP ANY LOCATIONS. /EAG:191 / LOCATION 01 IS SET UP BY IN.SKP. LOCATIONS 02 AND 05 ARE /EAG:191 / SET UP BY IN.TRN. LOCATION 04 IS SET UP BY IN.ERR. /EAG:191 / LOCATION 07 HAS ALREADY BEEN SET UP (AND THE CLOCK STARTED). /EAG:191 / LOCATIONS 20 AND 21 ARE SET UP BY IN.CAL. THE REMAINING /EAG:191 / LOCATIONS ARE LEFT UNINITIALIZED. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.LOW JMP IN.API / GO CONTINUE WITH INITIALIZE /EAG:191 .TITLE IN.API -- INITIALIZE API INTERRUPT VECTORS /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THIS ROUTINE SETS UP THE API INTERRUPT VECTORS (LOCATIONS /EAG:191 / 40 THROUGH 77). LOCATIONS 40, 41, 42, AND 43 (THE SOFTWARE /EAG:191 / LEVEL INTERRUPT VECTORS) ARE INITIALIZED TO A JMS* THROUGH /EAG:191 / THE APPROPRIATE .SCOM LOCATIONS (SC.LV4, SC.LV5, SC.LV6, /EAG:191 / AND SC.LV7 RESPECTIVELY). ALL OTHER API VECTORS (LOCATIONS /EAG:191 / 44 THROUGH 77) ARE INITIALIZED TO A JMS 0. THUS AN INTERRUPT /EAG:191 / TO AN API VECTOR WHICH HAS NOT YET BEEN SET UP (VIA THE /EAG:191 / .SETUP CAL) IS EFFECTIVELY TRANFORMED INTO AN ORDINARY, /EAG:191 / NON-API PROGRAM INTERRUPT. THIS INVOKES THE SKIP CHAIN, /EAG:191 / WHICH WILL HANDLE THE UNEXPECTED INTERRUPT PROPERLY. /EAG:191 / /EAG:191 / THIS ROUTINE ALSO INITIALIZES SC.LV4, SC.LV5, SC.LV6, AND /EAG:191 / SC.LV7 TO POINT TO AN ERROR ROUTINE, WHICH ROUTINE WILL /EAG:191 / ISSUE AN IOPS 30 ERROR. THE ROUTINE ENTRY POINT IS LABEL /EAG:191 / SERR. /EAG:191 / /EAG:191 / IF THE UNEXPECTED INTERRUPT IS AN ILLEGAL (IOPS 3) INTERRUPT, /EAG:191 / IT WILL FALL THROUGH TO THE END OF THE SKIP CHAIN TO THE /EAG:191 / ROUTINE WHICH CAUSES THE IOPS 3 ERROR (FOR MORE INFORMATION /EAG:191 / SEE THE COMMENTS ABOUT THE SKIP CHAIN AT IN.SKP). IF THE /EAG:191 / INTERRUPT COMES FROM A DEVICE (SUCH AS AN LT19) WHICH CAN /EAG:191 / CAUSE RECOVERABLE SPURIOUS INTERRUPTS, IT WILL FALL THROUGH /EAG:191 / THE SKIP CHAIN TO THE ENTRY FOR THAT PARTICULAR DEVICE. /EAG:191 / THAT ENTRY WILL CONTAIN CODE TO CLEAR THE INTERRUPT FLAG /EAG:191 / AND RECOVER FROM THE SPURIOUS INTERRUPT. /EAG:191 / /EAG:191 / IT SHOULD BE NOTED THAT A POTENTIAL REENTRANCY PROBLEM /EAG:191 / EXISTS HERE. IF WE ARE ALREADY IN THE SKIP CHAIN, DUE TO /EAG:191 / A PREVIOUS INTERRUPT (MOST LIKELY A VALID INTERRUPT FROM A /EAG:191 / NON-API DEVICE) AND AN UNEXPECTED INTERRUPT AT A HIGHER /EAG:191 / PRIORITY OCCURS, WE WILL LOSE TRACK OF FROM WHERE THE /EAG:191 / ORIGINAL INTERRUPT CAME. THERE ARE TWO DISTINCT CASES: /EAG:191 / /EAG:191 / 1. THE SPURIOUS INTERRUPT IS UNRECOVERABLE AND SHOULD /EAG:191 / CAUSE AN IOPS 3 ERROR. THE LACK OF REENTRANCY IS /EAG:191 / NO PROBLEM. WE EFFECTIVELY RESTART OUR SCAN OF THE /EAG:191 / SKIP CHAIN FOR THE ORIGINAL INTERRUPT. WE THEN GO /EAG:191 / OFF AND SERVICE THE ORIGINAL INTERRUPT, FOLLOWING /EAG:191 / WHICH WE RESUME THE SKIP CHAIN SCAN IN THE MIDDLE. /EAG:191 / WE SUBSEQUENTLY FALL OFF THE END OF THE SKIP CHAIN /EAG:191 / AND CAUSE AN IOPS 3 ERROR, JUST AS DESIRED. /EAG:191 / /EAG:191 / 2. THE SPURIOUS INTERRUPT IS RECOVERABLE. AGAIN, WE /EAG:191 / RESTART OUR SCAN OF THE SKIP CHAIN. ONE OF THE /EAG:191 / INTERRUPTS IS SERVICED (WHICH ONE DEPENDS UPON /EAG:191 / THE ORDER OF THEIR SKIPS IN THE SKIP CHAIN). /EAG:191 / WE RESUME THE SKIP CHAIN SCAN IN THE MIDDLE. THE /EAG:191 / OTHER INTERRUPT IS SERVICED (THIS IS GUARANTEED, /EAG:191 / ALTHOUGH I WON'T EXPLAIN THE LOGIC WHICH PROVES /EAG:191 / IT). AGAIN WE RESUME THE SKIP CHAIN SCAN IN THE /EAG:191 / MIDDLE (DUE TO LACK OF REENTRANCY). THIS TIME WE /EAG:191 / FALL OFF THE END OF THE SKIP CHAIN AND CAUSE AN /EAG:191 / IOPS 3 ERROR. /EAG:191 / /EAG:191 / THIS SECOND CASE COULD CAUSE A REAL PROBLEM. IT OCCURS /EAG:191 / WHENEVER WE HAVE A DEVICE WHICH CAN CAUSE RECOVERABLE /EAG:191 / SPURIOUS INTERRUPTS AT API LEVEL 0, 1, OR 2. LEVEL 3 ISN'T /EAG:191 / A PROBLEM SINCE NON-API INTERRUPTS ARE ALSO AT LEVEL 3. /EAG:191 / THE ONLY SUCH DEVICE IS THE VP15. RATHER THAN GO TO A LOT /EAG:193 / OF TROUBLE TO HANDLE THIS ONE RARE CASE I HAVE CHOSEN TO /EAG:193 / IGNORE IT, SO THAT IF ONE TRIES HARD ENOUGH ONE CAN CAUSE /EAG:193 / IOPS 3 ERRORS BY HITTING THE VP15 SCREEN ERASE BUTTON. /EAG:193 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.API LAC (JMS+20000+SC.LV4) / GET CONTENTS OF VECTOR, AND /EAG:191 DAC* (40) / STUFF IT IN. /EAG:191 AAC SC.LV5-SC.LV4 / DITTO FOR OTHER VECTORS. /EAG:191 DAC* (41) /EAG:191 AAC SC.LV6-SC.LV5 /EAG:191 DAC* (42) /EAG:191 AAC SC.LV7-SC.LV6 /EAG:191 DAC* (43) /EAG:191 CLX / POINT LR TO 100, AND XR TO /EAG:191 AXR 100 / 44. THESE LOCATIONS BRACKET /EAG:191 PXL / HARDWARE API VECTORS. /EAG:191 AXR 44-100 /EAG:191 LAC (JMS+0) / CONTENTS OF VECTORS /EAG:191 .X=(0) INAP.1 DAC* .X,X / AND STUFF IT IN /EAG:191 AXS 1 /EAG:191 JMP INAP.1 /EAG:191 LAC (SERR) / POINT SOFTWARE TRAP VECTORS /EAG:191 DAC* (SC.LV4) / (IN .SCOM) TO ERROR ROUTINE /EAG:191 DAC* (SC.LV5) /EAG:191 DAC* (SC.LV6) /EAG:191 DAC* (SC.LV7) /EAG:191 JMP IN.SCM / AND CONTINUE INITIALIZATION /EAG:191 .TITLE IN.SCM -- SET UP .SCOM /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / INITIALIZE THE NEW .SCOM (LOCATED IN BANK ZERO), USING /EAG:191 / FOR INPUTS THE OLD .SCOM CONTENTS (LOCATED IN THIS BANK), /EAG:191 / THE HARDWARE AVAILABILITY/CONFIGURATION INFORMATION, AND /EAG:191 / THE CONTENTS OF SGNBLK. /EAG:191 / /EAG:191 / THE ORDER IN WHICH WE DO THINGS IS NOT MEANINGFUL /EAG:191 / /EAG:191 / THIS ROUTINE INITIALIZES THE FOLLOWING .SCOM LOCATIONS: /EAG:191 / /EAG:191 / SC.MOD, SC.COD, SC.MSZ, SC.AMS, SC.FRH, /EAG:191 / SC.FRH+1, SC.NMF, SC.SDV, SC.LFR, SC.BLN, /EAG:191 / SC.BTL /EAG:191 / /EAG:191 / THIS ROUTINE INITIALIZES THE FOLLOWING .SCOM LOCATIONS /EAG:191 / BY MERELY COPYING THEIR VALUES FROM THE OLD .SCOM: /EAG:191 / /EAG:191 / SC.FNM, SC.FNM+1, SC.FNM+2, SC.UIC, SC.SPN, SC.SLT, /EAG:191 / SC.SPN+1, SC.NMN, SC.NMN+1, SC.DAY, SC.TIM, SC.ETT, /EAG:191 / SC.PRC, SC.TLM, SC.TMR, SC.BNM, SC.ETS /EAG:191 / /EAG:191 / OF THE .SCOM LOCATIONS SET UP BY THIS ROUTINE (LISTED ABOVE) /EAG:191 / THE FOLLOWING MAY POSSIBLY BE MODIFIED BY OTHER ROUTINES: /EAG:191 / /EAG:191 / SC.MOD POSSIBLY MODIFIED BY SYSTEM LOADER /EAG:191 / SC.FNM+2 POSSIBLY MODIFIED BY SYSTEM LOADER /EAG:191 / SC.BNM POSSIBLY MODIFIED BY SYSTEM LOADER /EAG:191 / SC.FNM POSSIBLY MODIFIED BY IN.DAT /EAG:192 / SC.ETS POSSIBLY MODIFIED BY IN.BOS /EAG:194 / SC.NMF POSSIBLY MODIFIED BY IN.BAT /EAG:196 / /EAG:191 / THE FOLLOWING .SCOM LOCATIONS ARE SET UP BY OTHER ROUTINES: /EAG:191 / /EAG:191 / SC.LV4, SC.LV5, SC.LV6, SC.LV7 -- ALREADY SET UP BY /EAG:191 / IN.API. /EAG:191 / /EAG:191 / SC.RMS SET UP BY IN.MON AND LATER MODIFIED /EAG:191 / BY IN.SKP, IN.DAT, ETC. /EAG:191 / /EAG:191 / SC.UST, SC.BTB, SC.OTB, SC.ACT, SC.BTA -- /EAG:191 / THESE ARE SET UP BY THE SYSTEM /EAG:191 / LOADER AND/OR THE OTHER LOADERS. /EAG:191 / /EAG:191 / SC.DAT, SC.UFD THESE ARE SET UP BY IN.DAT /EAG:191 / /EAG:191 / SC.VTF, SC.VTR THESE ARE SET UP BY IN.VT /EAG:191 / /EAG:191 / SC.BOS, SC.RTF THESE ARE SET UP BY IN.BOS /EAG:191 / /EAG:196 / SC.RTF, SC.BFNM, SC.BFNM+1, SC.BUIC, SC.BDEV -- /EAG:196 / THESE ARE SET UP BY IN.BAT /EAG:196 / /EAG:191 / SC.CTT SET UP BY IN.TTA /EAG:191 / /EAG:191 / SC.EEP+1 SET UP BY IN.ERR /EAG:191 / /EAG:191 / SC.TRN SET UP BY IN.TRN /EAG:191 / /EAG:191 / SC.FRL, SC.FRL+1 -- SET UP BY IN.LDR /EAG:191 / /EAG:193 / SC.TCB SET UP BY IN.UC15 /EAG:193 / /EAG:197 / SC.CQF, SC.CQB SET UP BY IN.CTQ /EAG:197 / /EAG:191 / THE FOLLOWING LOCATIONS ARE NOT SET UP AT ALL. THUS THEY /EAG:191 / ARE LEFT ZERO: /EAG:191 / /EAG:191 / SC.SST, SC.TTP, SC.TTA, SC.MTS, SC.BBN, SC.TMT, /EAG:191 / SC.TMA /EAG:191 / /EAG:191 / THE READER IS CAUTIONED AGAINST ASSUMING THAT THE ABOVE /EAG:191 / INFORMATION IS ENTIRELY ACCURATE OR COMPLETE. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / FIRST WE WILL SET UP SC.NMF, WHICH CONTAINS VARIOUS /EAG:191 / FLAGS USED BY THE NON-RESIDENT MONITOR. FIRST WE WILL /EAG:191 / MASK OFF THE FLAGS WHICH ARE PRESERVED. THEN WE WILL /EAG:191 / SET THE HARDWARE PRESENT BITS APPROPRIATELY. AT THIS /EAG:191 / POINT WE ARE DONE WITH SC.NMF. THE CODE FOLLOWING, /EAG:191 / HOWEVER, WHICH SETS UP SC.MOD, MAY SET BIT SC.TMM IN /EAG:191 / SC.NMF. /EAG:191 / /EAG:191 /EAG:191 IN.SCM LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:191 LAC SC.NMF+10000,X / AND FETCH OLD SC.NMF /EAG:191 .X=SC.MIC!SC.NRE!SC.NRO / CALCULATE MASK TO MASK OUT /EAG:191 .X=.X!SC.LPON!SC.DMP!SC.HLT / UNDESIRED BITS. /EAG:191 .X=.X!SC.KPN!SC.TMM /EAG:196 AND (.X) / MASK OUT UNWANTED STUFF /EAG:191 .X=SC.PAPI!SC.PUC15!SC.PXVM / CALCULATE MASK OF ALL /EAG:191 .X=.X!SC.PVT!SC.PCLK / HARDWARE PRESENT BITS, AND /EAG:197 XOR (.X) / USE IT TO SET THEM. WE /EAG:197 / ASSUME ALL HARDWARE IS PRSNT. /EAG:191 XCT IN.SAPI / VERIFY IF API IS PRESENT /EAG:191 AND (777777-SC.PAPI) / IF NOT, CLEAR BIT /EAG:191 XCT IN.SUC / DITTO FOR UC15 /EAG:191 AND (777777-SC.PUC15) /EAG:191 XCT IN.SXM / AND FOR XVM /EAG:191 AND (777777-SC.PXVM) /EAG:191 XCT IN.SVT / AND FOR VT15 /EAG:197 AND (777777-SC.PVT) /EAG:197 XCT IN.SCLK / AND FOR REAL TIME CLOCK /EAG:197 AND (777777-SC.PCLK) /EAG:197 DAC* (SC.NMF) / AND PUT INTO .SCOM /EAG:191 / /EAG:191 / NEXT WE WILL SET UP SC.MOD, WHICH CONTAINS OPERATING /EAG:191 / MODE INFORMATION. WE WILL USE THE OLD SC.MOD AFTER /EAG:191 / VERIFYING VARIOUS FLAGS AGAINST THE CURRENT HARDWARE /EAG:191 / CONFIGURATION. /EAG:191 / THIS VERIFICATION WILL BE DONE WITH A SUBROUTINE INSC.0, /EAG:191 / DEFINED BELOW /EAG:191 / /EAG:191 LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:191 LAC SC.MOD+10000,X / FETCH OLD SC.MOD /EAG:191 .X=SC.XVM!SC.UC15!SC.PLR / CALCULATE MASK TO EXTRACT /EAG:191 .X=.X!SC.LPSZ!SC.BNK!SC.FIL / DESIRED BITS FROM SC.MOD /EAG:191 .X=.X!SC.9CH!SC.TAB!SC.API /EAG:191 .X=.X!SC.UB1!SC.UB2 /EAG:201 AND (.X) / MASK OUT BITS WORTH KEEPING /EAG:191 DAC* (SC.MOD) / AND USE FOR NEW SC.MOD /EAG:191 JMS INSC.0 / AND CHECK FOR API, /EAG:191 SC.API / (BIT TO BE CHECKED) /EAG:191 XCT IN.SAPI / (SKIP IF HRDWR PRESENT) /EAG:191 .ASCII "API"<000> / (NAME FOR NOT AVAIL. MSG) /EAG:191 JMS INSC.0 / AND CHECK FOR XVM /EAG:191 SC.XVM /EAG:191 XCT IN.SXM /EAG:191 .ASCII "XVM"<000> /EAG:191 JMS INSC.0 / AND CHECK FOR UC15 /EAG:191 SC.UC15 /EAG:191 XCT IN.SUC /EAG:191 .ASCII "UC15"<000> /EAG:191 JMS INSC.0 / AND CHECK FOR KW15 (NEEDED /EAG:191 SC.PLR / BY POLLER) /EAG:191 XCT IN.SCLK /EAG:191 .ASCII "CLK"<000> /EAG:191 SNL / WAS NOT AVAIL. MSG OUTPUT? /EAG:191 JMP INSC.2 / NO -- GO INIT. MORE .SCOM /EAG:191 JMS IN.MSG / YES -- MUST ADD ADDENDUM /EAG:191 .ASCII " -- POLLER DISABLED"<000> /EAG:191 JMP INSC.2 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SUBROUTINE TO VERIFY THAT A HARDWARE OPTION REQUIRED BY /EAG:191 / A MODE SETTING IN SC.MOD IS ACTUALLY PRESENT. IF THE /EAG:191 / HARDWARE ISN'T PRESENT, THE BIT IN SC.MOD WILL BE CLEARED, /EAG:191 / BIT SC.TMM IN SC.NMF WILL BE SET, /EAG:191 / AND A MESSAGE WILL BE OUTPUT SAYING THAT THE OPTION /EAG:191 / IS NOT AVAILABLE. CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS INSC.0 /EAG:191 / SC.??? / BIT FLAG IN SC.MOD TO CHECK /EAG:191 / SKP/NOP / AN INSTRUCTION WHICH SHOULD /EAG:191 / / BE (EFFECTIVELY) A SKP IF THE /EAG:191 / / HARDWARE OPTION IS PRESENT, A /EAG:191 / / NOP IF IT IS ABSENT. /EAG:191 / .ASCII "????"<000> / A 1 TO 4 CHARACTER NAME OF /EAG:191 / / THE HARDWARE OPTION, FOR USE /EAG:191 / / IN THE NOT AVAILABLE MESSAGE /EAG:191 / /EAG:191 / IF THE OPTION IS NOT REQUESTED (I.E., BIT IN SC.MOD CLEAR) /EAG:191 / OR IF THE HARDWARE IS PRESENT, THEN THIS SUBROUTINE RETURNS /EAG:191 / TO THE CALLER WITH THE LINK CLEAR. IF THE OPTION IS /EAG:191 / REQUESTED AND THE HARDWARE IS NOT PRESENT, THEN THIS /EAG:191 / SUBROUTINE CLEARS THE BIT IN SC.MOD, PRINTS THE MESSAGE: /EAG:191 / /EAG:191 / ???? NOT AVAILABLE /EAG:191 / /EAG:191 / (WHERE ???? IS THE NAME PROVIDED IN THE CALLING SEQUENCE), /EAG:191 / SETS BIT SC.TMM IN SC.NMF, AND RETURNS TO THE CALLER /EAG:191 / WITH THE LINK SET. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 INSC.0 0 /EAG:191 LAC* INSC.0 / GET BIT MASK /EAG:191 ISZ INSC.0 /EAG:191 AND* (SC.MOD) / AND CHECK REQUEST BIT /EAG:191 SNA / IF NOT REQUESTED RETURN /EAG:191 JMP INSC.1 /EAG:191 XCT* INSC.0 / HARDWARE PRESENT? /EAG:191 SKP / NO -- PRINT MESSAGE AND CLEAR /EAG:191 / REQUEST BIT /EAG:191 JMP INSC.1 / YES -- RETURN /EAG:191 XOR* (SC.MOD) / CLEAR BIT IN SC.MOD /EAG:191 DAC* (SC.MOD) /EAG:191 JMS IN.MSG / START OUT WITH CARRAIGE /EAG:191 .ASCII <015> / RETURN /EAG:191 LAC INSC.0 / GET ADDRESS OF NAME /EAG:191 AND (77777) /EAG:191 IAC /EAG:191 PAX / IN XR /EAG:191 JMS IN.TYP / AND TYPE IT /EAG:191 JMS IN.MSG / TYPE REST OF MESSAGE /EAG:191 .ASCII " NOT AVAILABLE"<000> /EAG:191 LAC* (SC.NMF) / SET BIT SC.TMM IN SC.NMF /EAG:191 AND (777777-SC.TMM) / CLEAR IT FIRST /EAG:191 XOR (SC.TMM) / THEN SET IT /EAG:191 DAC* (SC.NMF) / AND PUT IT BACK /EAG:191 STL!SKP / SET MESSAGE OUTPUT FLAG /EAG:191 INSC.1 CLL / CLEAR MESSAGE OUTPUT FLAG /EAG:191 ISZ INSC.0 / BUMP PAST ARGUMENTS, AND /EAG:191 ISZ INSC.0 /EAG:191 ISZ INSC.0 /EAG:191 JMP* INSC.0 / RETURN TO CALLER /EAG:191 /EAG:191 .EJECT /EAG:191 / /EAG:191 / NOW WE WILL SET UP THE .SCOM LOCATIONS HAVING TO DO /EAG:191 / WITH MEMORY LAYOUT AND ALLOCATION. THESE ARE THE FOLLOWING /EAG:191 / LOCATIONS: SC.COD, SC.MSZ, SC.AMS, SC.FRH, AND SC.FRH+1 /EAG:191 / THE LOCATIONS SC.RMS, SC.FRL, AND SC.FRL+1 ARE LOGICALLY /EAG:191 / PART OF THIS GROUP, BUT THEY ARE LEFT TILL LATER. /EAG:191 / /EAG:191 /EAG:191 INSC.2 LAC IN.BNK / AVOID BANK ERROR /EAG:191 PAX /EAG:191 XOR (BT.BAS-1) / AND MAKE ADDRESS OF BOOTSTRAP /EAG:191 DAC* (SC.COD) / SC.COD /EAG:191 .X=(SC.MSZ) LAC* .X,X / ASSUME SC.MSZ OK /EAG:191 DAC* (SC.MSZ) /EAG:191 LAC* (SC.COD) / VERIFY THAT MEMSIZ ABOVE /EAG:191 AND (770000) / BOOTSTRAP. START BY GETTING /EAG:191 XOR (7777) / ADDRESS OF TOP OF BOOTSTRAP, /EAG:191 TCA!CLL / COMPLEMENTING IT, AND THEN /EAG:191 TAD* (SC.MSZ) / COMPARE WITH MEMSIZ. /EAG:191 SNL / SKIP IF OKAY /EAG:191 JMP INSC.3 / NOT OK -- GO TYPE MESSAGE /EAG:191 LAC IN.AMS / NOW VERIFY THAT MEMSIZ IS /EAG:191 TCA!CLL / WITHIN THE ACTUAL OR PHYSICAL /EAG:191 TAD* (SC.MSZ) / MEMORY SIZE. /EAG:191 SNA / IF SIZES ARE EQUAL, OK /EAG:191 JMP INSC.4 /EAG:191 SNL / IF PHYSICAL SIZE BIGGER OK /EAG:191 JMP INSC.4 /EAG:191 / COME HERE IF REQUESTED MEMORY SIZE IS NOT OK. WHEN WE GET /EAG:191 / THE AC CONTAINS (THE MEM. SIZE TO USE)-(THE REQESTED MEM. /EAG:191 / SIZE). THE REQUESTED MEM. SIZE IS ALSO IN SC.MSZ. /EAG:191 INSC.3 TCA / GET PROPER MEMSIZ TO USE /EAG:191 TAD* (SC.MSZ) /EAG:191 DAC* (SC.MSZ) / AND STORE IN .SCOM /EAG:191 LAC* (SC.NMF) / SET BIT SC.TMM IN SC.NMF SO /EAG:192 AND (777777-SC.TMM) / NON-RESIDENT MONITOR WILL /EAG:192 XOR (SC.TMM) / TYPE MODE MESSAGE /EAG:192 DAC* (SC.NMF) /EAG:192 JMS IN.MSG / OUTPUT MESSAGE. START WITH /EAG:191 .ASCII <015> / CARRAIGE RETURN, /EAG:191 LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:192 LAC SC.MSZ+10000,X / FOLLOW WITH /EAG:191 JMS IN.NMK / REQUESTED MEMSIZ IN "K" /EAG:191 JMS IN.MSG / FOLLOW WITH TEXT /EAG:191 .ASCII " NOT AVAIL., MEM. SIZE = "<000> /RKB-198 LAC* (SC.MSZ) / FOLLOW WITH MEMSIZ WHICH WILL /EAG:191 JMS IN.NMK / BE USED, ALSO IN "K" /EAG:191 INSC.4 LAC IN.AMS / SET UP SC.AMS, WHOSE CONTENTS /EAG:191 DAC* (SC.AMS) / WE'VE ALREADY DETERMINED /EAG:191 LAW -1 / SET UP SC.FRH /EAG:191 DAC* (SC.FRH) / ASSUME NO FREE MEMORY UP /EAG:191 DAC* (SC.FRH+1) / THERE /EAG:191 LAC* (SC.MOD) / CHECK IF XVM MODE ENABLED /EAG:191 AND (SC.XVM) /EAG:191 SNA /EAG:191 JMP INSC.5 / NO -- GO DO SOMETHING ELSE /EAG:191 LAC* (SC.COD) / ROUND SC.COD UP TO NEXT PAGE /EAG:191 AND (770000) / BOUNDARY, TO CALCULATE /EAG:191 TAD (10000) / ADDRESS ABOVE BOOTSTRAP /EAG:191 TCA!CLL / VERIFY THAT SC.MSZ IS ABOVE /EAG:191 TAD* (SC.MSZ) / THIS, AS OTHERWISE THERE IS /EAG:191 SZA / NO FREE MEMORY UP THERE. /EAG:191 SNL!TCA / SKIP IF EXISTS FREE MEMORY /EAG:191 JMP INSC.5 / NO FREE MEMORY -- DO OTHER /EAG:191 TAD* (SC.MSZ) / GET BACK ADDRESS ABOVE BOOT. /EAG:191 DAC* (SC.FRH) / AND POINT SC.FRH TO IT. /EAG:191 LAC* (SC.MSZ) / SC.COD. SET UP SC.FRH TO /EAG:191 DAC* (SC.FRH+1) / POINT TO IT. /EAG:191 JMP INSC.5 / AND GO DO SOMETHING ELSE /EAG:191 /EAG:191 .EJECT /EAG:191 / /EAG:191 / NOW WE WILL SET UP VARIOUS MISCELLANEOUS LOCATIONS. THESE /EAG:191 / INCLUDE SC.SDV, SC.LFR, SC.BLN, SC.BTL. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 INSC.5 LAC SG.SYS / FETCH SYSTEM DEVICE NAME /EAG:192 IAC / AND CONVERT TO "A" HANDLER /EAG:192 JMS IN.GNU / CONVERT TO HANDLER # /EAG:192 SKP / NOT FOUND -- FATAL ERROR /EAG:192 JMP INSC.6 / GO STORE INTO SC.SDV /EAG:192 JMS IN.MSG / PRINT ERROR MESSAGE /EAG:191 .ASCII <15>"NO SYS. DISK 'A' HANDLER"<000> /RKB-198 JMP IN.FAL / GO TO FAILURE ROUTINE /EAG:191 /EAG:191 /EAG:191 INSC.6 DAC* (SC.SDV) / STORE SYS. DEV. CODE /EAG:192 LAC SG.LFR / COPY LINE FREQUENCY FROM /EAG:191 DAC* (SC.LFR) / SGNBLK /EAG:191 LAC SG.BLN / COPY BUFFER LENGTH FROM /EAG:191 DAC* (SC.BLN) / SGNBLK /EAG:191 LAC (RM.BTL) / AND INITIALIZE BUSY TABLE /EAG:191 DAC* (SC.BTL) / LENGTH /EAG:191 JMP INSC.8 / AND CONTINUE /EAG:191 /EAG:191 .EJECT /EAG:191 / /EAG:191 / COPY VARIOUS LOCATIONS FROM OLD .SCOM TO NEW. FOR A LIST /EAG:191 / OF THESE SEE BELOW. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 INSC.8 LAC IN.BNK / POINT XR TO THIS BANK SO CAN /EAG:191 PAX / SUCCESSFULLY FETCH .SCOM LOCS /EAG:197 XOR (INSC.A) / SET UP POINTER INTO TABLE /EAG:191 DAC INSC.B /EAG:191 INSC.9 LAC* INSC.B / FETCH NEXT .SCOM ADDRESS /EAG:191 SNA / REACHED END OF TABLE? /EAG:191 JMP IN.MON / YES -- GO DO MONITOR /EAG:191 DAC INSC.C / PUT IN TEMPORARY /EAG:191 LAC* INSC.C,X / FETCH OLD .SCOM /EAG:191 DAC* INSC.C / AND PUT INTO NEW /EAG:191 ISZ INSC.B / BUMP TO NEXT ADDRESS /EAG:191 JMP INSC.9 / AND LOOP /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / TABLE OF .SCOM LOCATIONS TO COPY FROM OLD .SCOM INTO NEW /EAG:191 / .SCOM. /EAG:191 / /EAG:191 /EAG:191 INSC.A SC.FNM /EAG:191 SC.FNM+1 /EAG:191 SC.FNM+2 /EAG:191 SC.UIC /EAG:191 SC.SPN /EAG:191 SC.SPN+1 /EAG:191 SC.NMN /EAG:191 SC.NMN+1 /EAG:191 SC.DAY /EAG:191 SC.TIM /EAG:191 SC.ETT /EAG:191 SC.PRC /EAG:191 SC.TLM /EAG:191 SC.TDT / TOMORROWS DATE /RKB-207 SC.TMR /EAG:191 SC.BNM /EAG:191 SC.ETS /EAG:194 SC.SLT /EAG:195 SC.U01 /EAG:201 SC.U02 /EAG:201 SC.U03 /EAG:201 SC.U04 /EAG:201 SC.U05 /EAG:201 0 / END OF TABLE FLAG /EAG:191 /EAG:191 /EAG:191 /EAG:191 INSC.B -1 / HOLDS POINTER INTO ABOVE TBL /EAG:191 /EAG:191 INSC.C -1 / HOLDS .SCOM POINTER /EAG:191 .TITLE IN.MON -- COPY RESIDENT MONITOR TO BANK ZERO /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / TRANSFER RESIDENT MONITOR FROM THIS BANK TO BANK ZERO. /EAG:191 / THIS IS A STRAIGHTFORWARD COPY OPERATION. WE WILL ACTUALLY /EAG:191 / TRANSFER BOTH THE RESIDENT MONITOR PROPER PLUS ANY RESIDENT /EAG:191 / MONITOR (DYNAMIC) PATCH AREA. SAID PATCH AREA IS ALLOCATED /EAG:191 / BY SGEN. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / VERIFY THAT RESIDENT MONITOR DOES NOT OVERLAP .SCOM /EAG:191 /EAG:191 .IFPNZ SC.BAS+SC.LEN-RM.BAS /EAG:191 ERROR RESIDENT MONITOR OVERLAPS .SCOM /EAG:191 ERROR .LOC .-1 /EAG:191 .ENDC /EAG:191 /EAG:191 /EAG:191 /EAG:191 / NOW DO THE ACTUAL TRANSFER /EAG:191 /EAG:191 IN.MON LAC (RM.BAS) / BEGIN AT THE BEGINNING /EAG:191 PAX /EAG:191 LAC IN.RMS / IN.RMS (I.E. SC.RMS ON DISK) /EAG:191 / INCLUDES .SCOM /EAG:191 TAD SG.PSZ / ALLOW FOR PATCH AREA /EAG:191 PAL /EAG:191 DAC* (SC.RMS) / PUT RESIDENT MONITOR SIZE /EAG:191 / INTO .SCOM /EAG:191 INMN.1 LAC* IN.BNK,X / TRANSFER MONITOR FROM THIS /EAG:191 .X=(0) DAC* .X,X / BANK TO BANK ZERO /EAG:191 AXS 1 /EAG:191 JMP INMN.1 /EAG:191 JMP IN.CAL /EAG:191 .TITLE IN.CAL -- INITIALIZE CAL HANDLER /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP CAL TRAP VECTOR TO JUMP TO CAL HANDLER. FOR MORE /EAG:191 / INFORMATION SEE COMMENTS PRECEEDING CAL HANDLER (CL.ENT). /EAG:191 / /EAG:195 / IN ADDITION, IF API WILL NOT BE IN USE, WE MUST CONDITION /EAG:195 / THE CAL HANDLER FOR THIS MODE OF OPERATION. THIS INVOLVES /EAG:195 / ELIMINATING A SUBSTANTIAL AMOUNT OF CODE IN CL.ENT (BY /EAG:195 / OVERLAYING IT WITH NOP'S) AND REPLACING THE ROUTINE RQ.LV4 /EAG:195 / WITH THE VERSION IN THE TEMPLATE BELOW. /EAG:195 / /EAG:191 /EAG:191 /EAG:191 IN.CAL LAC (JMS+CL.ENT) / POINT CAL TRAP VECTOR /EAG:191 DAC* (CL.VCT+1) / TO CAL ENTRY POINT /EAG:191 LAC (CL.IND) / AND POINT CAL*'S /EAG:191 DAC* (CL.VCT) / TO ERROR ROUTINE. /EAG:191 LAC* (SC.MOD) / CHECK OF API WILL BE USED /EAG:195 AND (SC.API) /EAG:195 SZA / SKIP IF IT WON'T /EAG:195 JMP INCL.2 / API ON -- SKIP THIS /EAG:195 CLX / API OFF -- CONDITION CAL /EAG:195 CLLR / HANDLER TO RUN WITHOUT API. /EAG:195 AXR CLEN.1-CLEN.2 / OVERLAY CL.ENT LOCATIONS /RKB-210 LAC (NOP) / CLEN.0 AND CLEN.1 THROUGH /EAG:196 DAC* (CLEN.0) / CLEN.2-1 INCLUSIVE WITH NOP'S /RKB-210 .X=(CLEN.2) INCL.0 DAC* .X,X /EAG:196 AXS 1 /EAG:195 JMP INCL.0 /EAG:195 CLX / REPLACE ROUTINE RQ.LV4 WITH /EAG:195 AXR INCL.A-INCL.B-1 / NON-API VERSION FROM TEMPLATE /EAG:195 INCL.1 LAC INCL.B+1,X / BELOW /EAG:195 .X=(RQ.LV4+1-INCL.A+INCL.B+1) DAC* .X,X /EAG:195 AXS 1 /EAG:195 JMP INCL.1 /EAG:195 INCL.2 JMP IN.XIT / FINISHED /EAG:195 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / TEMPLATE BELOW IS THE NON-API VERSION OF RQ.LV4. LOCATIONS /EAG:195 / INCL.A THROUGH INCL.B INCLUSIVE REPLACE RQ.LV4+1 THROUGH /EAG:195 / WHATEVER. NOTE THAT THE "+10000"S BELOW ARE JUST TO AVOID /EAG:195 / BANK ERRORS, AND HAVE NO MEANING. /EAG:195 / /EAG:195 /EAG:195 INCL.A LAC* RQ.LV4+10000 / PICK UP AUX. ROUTINE ADDR. /EAG:195 AAC 2 / BUMP TO ENTRY POINT /EAG:195 DAC RQL4.A+10000 / SAVE IT AWAY /EAG:195 ISZ RQ.LV4+10000 / PICK UP INTERRUPT VECTOR /EAG:195 LAC* RQ.LV4+10000 / ADDRESS AND SAVE IT AWAY /EAG:195 DAC RQL4.B+10000 /EAG:195 ISZ RQ.LV4+10000 / BUMP TO RETURN /EAG:195 LAC* RQL4.B+10000 / PICK UP INTERRUPT RETURN /EAG:195 DAC* RQL4.A+10000 / ADDRESS (FROM VECTOR) AND /EAG:195 / GIVE TO AUX. ROUTINE. /EAG:195 AND RQL4.D+10000 / AND WITH CONSTANT 600000 /EAG:195 / MASK OFF MODE BITS AND FORCE /EAG:195 XOR RQL4.A+10000 / TO EXEC. MODE, COMBINE WITH /EAG:195 IAC / AUX. ROUTINE ADDRESS, AND /EAG:195 DAC* RQL4.B+10000 / REPLACE INT. RETURN ADDR. /EAG:195 / WITH THIS. /EAG:195 INCL.B JMP* RQ.LV4+10000 / DONE, SO RETURN /EAG:195 .TITLE IN.XIT -- INITIALIZE .EXIT PROCESSOR /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / FOR INFORMATION SEE COMMENTS PRECEEDING .EXIT CAL FUNCTION /EAG:191 / ROUTINE (ENTRY POINT EXIT). /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.XIT JMS IN.BBT / ADD BANK BITS INTO: /EAG:191 EXIT.B /EAG:191 EXIT.C /EAG:191 -1 /EAG:191 JMP IN.XVM /EAG:191 .TITLE IN.XVM -- SET UP .XVMON/.XVMOFF CAL HANDLER /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / CHECK TO SEE IF XVM MODE IS DISABLED. IF IT IS, PUT A: /EAG:193 / /EAG:193 / JMP CL.ERR /EAG:193 / /EAG:193 / AT LOCATION XMOF.0. THIS HAS THE EFFECT OF CAUSING ANY /EAG:193 / INADVERTENT USE OF THE .XVMON CAL TO RESULT IN AN IOPS 0. /RKB-203 / NOTE THAT THE .XVMOFF CAL MAY BE ISSUED ANYTIME. /RKB-203 / /EAG:193 /EAG:193 /EAG:193 IN.XVM LAC* (SC.MOD) / CHECK IF XVM MODE IS ENABLED. /EAG:193 AND (SC.XVM) /EAG:193 SZA / SKIP IF IT ISN'T. /EAG:193 JMP IN.CTQ / IT IS ENABLED -- SKIP THIS. /EAG:193 LAC (JMP+CL.ERR) / IT IS DISABLED -- PUT JMP TO /EAG:193 DAC* (XMOF.0) / CL.ERR IN PROPER PLACE. /RKB-203 JMP IN.CTQ / AND CONTINUE /EAG:193 .TITLE IN.CTQ -- SET UP .GET/.PUT/^Q /EAG:197 /EAG:197 /EAG:197 /EAG:197 / /EAG:197 / INITIALIZE THE .SCOM REGISTERS USED BY .GET AND .PUT. /EAG:197 / THIS INVOLVES A MASKED COPY OF SC.CQF FROM THE OLD .SCOM /EAG:197 / TO THE NEW .SCOM. ALSO SET UP SC.CQB AS A THREE WORD /EAG:197 / PARAMETER BLOCK TO CONTROL DISK TRANSFERS BETWEEN CORE /EAG:197 / AND THE QAREA. THE INFORMATION DESCRIBING THE QAREA /EAG:197 / IS EXTRACTED FROM SYSBLK. FINALLY WE CONDITION THE /EAG:197 / GET/PUT CAL FUNCTION ROUTINE TO ISSUE IOPS 77'S UNDER /EAG:197 / THE RIGHT CIRCUMSTANCES. THERE ARE THREE CONDITIONS, /EAG:197 / BASED UPON THE SIZE OF THE QAREA RELATIVE TO THE /EAG:197 / BOOTSTRAP ADDRESS: /EAG:197 / /EAG:197 / 1. NO QAREA EXISTS. PLACE A NOP IN LOCATION PTGT.0, /EAG:197 / CAUSING ALL .PUT'S AND .GET'S TO PRODUCE IOPS 77. /EAG:197 / /EAG:197 / 2. A QAREA EXISTS, BUT IS TOO SHORT FOR ALL CORE BELOW /EAG:197 / THE BOOTSTRAP TO BE SAVED/RESTORED. PLACE A SNA /EAG:197 / IN LOCATION PTGT.0, SO THAT ALL .PUT'S AND .GET'S /EAG:197 / WHICH WILL EXIT BY RESTORING CORE (OVERLAYING IT /EAG:197 / FROM THE QAREA) WILL PRODUCE IOPS 77. .PUT'S AND /EAG:197 / .GET'S WHICH EXIT TO THE NON-RESIDENT MONITOR WILL /EAG:197 / STILL OPERATE SUCCESSFULLY. /EAG:197 / /EAG:197 / 3. A QAREA EXISTS, AND IT IS LONG ENOUGH SO THAT ALL /EAG:197 / CORE BELOW THE BOOTSTRAP WILL BE SAVED/RESTORED. /EAG:197 / PLACE A SKP IN LOCATION PTGT.0, SO THAT NO .PUT'S /EAG:197 / OR .GET'S WILL PRODUCE IOPS 77. /EAG:197 / /EAG:197 / BESIDES ALL OF THE ABOVE, THIS ROUTINE ALSO SETS UP THE /EAG:197 / ^Q DUMP ROUTINE. ALL WE NEED DO IS DISABLE ^Q DUMPS IN /EAG:197 / THE CASE OF NO ^Q AREA EXISTING (CASE #1 ABOVE). WE DO /EAG:197 / THIS BY DEPOSITING A CLA INSTRUCTION IN LOCATIONS ER.CTQ /EAG:197 / AND TTCTLQ. /EAG:197 / /EAG:197 /EAG:197 IN.CTQ LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:197 LAC SC.CQF+10000,X / GET SC.CQF FROM OLD .SCOM /EAG:197 .X=SC.QNF!SC.QPUT!SC.QNRM / MASK OUT BITS TO BE /EAG:197 AND (.X!SC.QRTN) / PRESERVED IN NEW .SCOM /EAG:197 DAC* (SC.CQF) /EAG:197 LAC IN.BNK / SEARCH SYSBLK FOR ENTRY /EAG:197 TAD (INCQ.A) / FOR "^QAREA" /EAG:197 JMS IN.SSB /EAG:197 JMP INCQ.0 / NOT FOUND /EAG:197 LAC SB.BAS+SB.NB,X / VERIFY THAT LENGTH ISN'T /EAG:197 SNA / ZERO /EAG:197 JMP INCQ.0 /EAG:197 LAC SB.BAS+SB.FB,X / PUT FIRST DISK BLOCK /EAG:197 DAC* (SC.CQB) / NUMBER INTO .SCOM /EAG:197 LAC SB.BAS+SB.FA,X / PUT FIRST CORE ADDRESS /EAG:197 AAC -1 / MINUS 1 INTO .SCOM /EAG:197 DAC* (SC.CQB+1) /EAG:197 LAW -1 / GET SIZE -1 /EAG:197 TAD SB.BAS+SB.PS,X /EAG:197 CLL / AND CALCULATE LAST CORE /EAG:197 TAD SB.BAS+SB.FA,X / ADDRESS OF QAREA TRANSFER /EAG:197 SZL!TCA / COMPLEMENT /EAG:197 CLA!IAC!CLL / TRUNCATE IF > 2**18 /EAG:197 TAD* (SC.MSZ) / COMPARE AGAINST MEMSIZ /EAG:197 SNL!TCA / AND WITH THE POSITIVE ... /EAG:197 CLA /EAG:197 TAD* (SC.MSZ) / ... VALUE OF THE SMALLER. /EAG:197 CMA / TAKE TWO'S COMPLEMENT /EAG:197 TAD SB.BAS+SB.FA,X / ALLOW FOR BASE ADDRESS /EAG:197 SZL / MAKE SURE RESULTING XFER /EAG:197 JMP INCQ.0 / LENGTH IS > 0 /EAG:197 DAC* (SC.CQB+2) / AND USE FOR XFER LENGTH /EAG:197 TCA / GET BACK LAST ADDRESS /EAG:197 TAD SB.BAS+SB.FA,X / TRANSFERRED /EAG:197 TCA / AND COMPARE WITH SC.COD /EAG:197 TAD* (SC.COD) / TO SEE IF ALL MEMORY BELOW /EAG:197 LAC (SKP) / BOOTSTRAP WILL BE /EAG:197 SZL / TRANSFERRED. CONDITION /EAG:197 LAC (SNA) / PUT/GET CAL ROUTINE /EAG:197 DAC* (PTGT.0) / APPROPRIATELY. /EAG:197 JMP IN.TRN / FINISHED HERE /EAG:197 /EAG:197 /EAG:197 / /EAG:197 / COME HERE IF ANY OF THE FOLLOWING HOLDS: /EAG:197 / /EAG:197 / 1. NO ENTRY EXISTS IN SYSBLK FOR A QAREA. /EAG:197 / /EAG:197 / 2. A SYSBLK ENTRY EXISTS, BUT HAS ZERO LENGTH. /EAG:197 / /EAG:197 / 3. A QAREA EXISTS, BUT THE TRANSFER OFFSET AND MEMSIZ /EAG:197 / ARE SUCH THAT NO INFORMATION WILL BE TRANSFERRED. /EAG:197 / THIS CASE WILL NEVER OCCUR, BUT IT IS STILL CHECKED /EAG:197 / FOR. /EAG:197 / /EAG:197 / IN ALL OF THESE CASES ALL .GET/.PUT OPERATIONS MUST BE /EAG:197 / PROHIBITED, AS NO TRANSFERS TO THE QAREA ARE POSSIBLE. /EAG:197 / /EAG:197 /EAG:197 INCQ.0 LAC (NOP) / CONDITION .GET/.PUT CAL /EAG:197 DAC* (PTGT.0) / ROUTINES APPROPRIATELY. /EAG:197 LAC (CLA) / DISABLE ^Q /EAG:197 DAC* (TTCTLQ) /EAG:197 DAC* (ER.CTQ) /EAG:197 JMP IN.TRN / FINISHED. /EAG:197 /EAG:197 /EAG:197 /EAG:197 INCQ.A .SIXBT "^QAREA" / NAME OF QAREA FOR /EAG:197 / SEARCHING SYSBLK. /EAG:197 .TITLE IN.TRN -- INITIALIZE RES. MON. TRAN ROUTINE /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP RESIDENT MONITOR .TRAN ROUTINE. THIS INCLUDES /EAG:191 / STUFF TO THE BOOTSTRAP, AMONG OTHERS. THIS ROUTINE /EAG:191 / DOES THE FOLLOWING: /EAG:191 / /EAG:191 / 1. INSERTS A JUMP TO RM.TRN IN .SCOM LOCATION SC.TRN. /EAG:191 / SEE THE COMMENTS PRECEEDING THE .MTRAN CAL FUNCTION /EAG:191 / ROUTINE (ENTRY POINT MTRAN). /EAG:191 / /EAG:191 / 2. ADDS BANK BITS TO SOME LOCATIONS WITHIN DSKTRN, /EAG:191 / THE MONITOR .TRAN ROUTINE PROPER. SEE THE /EAG:191 / COMMENTS PRECEEDING IT FOR MORE INFORMATION. /EAG:191 / /EAG:191 / 3. MODIFIES THE BOOTSTRAP SO THAT IT RETURNS TO THE /EAG:191 / APPROPRIATE PLACE WITHIN DSKTRN IF IT ENCOUNTERS /EAG:192 / ANY ERRORS. THE TRANSFER IS ACCOMPLISHED WITH /EAG:192 / A JMS INSTRUCTION. NORMALLY THE BOOTSTRAP WOULD /EAG:192 / HALT. /EAG:192 / /EAG:192 / 4. PUTS A JMP TO THE BOOTSTRAP RE-BOOT ENTRY POINT /EAG:192 / INTO LOCATION 2. THIS IS FOR USE IN CASE OF A /EAG:192 / SYSTEM CRASH OR SOME SUCH THING. THE JMP IN /EAG:192 / LOCATION 2 USES LOCATION 5 AS A TRANSFER VECTOR. /EAG:192 / /EAG:197 / THERE IS ONE OTHER LOCATION IN THE RESIDENT MONITOR .TRAN /EAG:197 / ROUTINE WHICH GETS SET UP. LOCATION DKTR.U IS INITIALIZED /EAG:197 / BY IN.SKP TO CONTAIN A JMP TO THE SKIP CHAIN. /EAG:197 / /EAG:191 /EAG:191 /EAG:191 IN.TRN LAC (JMP+RM.TRN) / PUT JMP TO RM.TRN IN SC.TRN /EAG:191 DAC* (SC.TRN) /EAG:191 JMS IN.BBT / PUT BANK BITS INTO DSKTRN /EAG:191 DKTR.V /EAG:192 DKTR.W /EAG:191 DKTR.X /EAG:191 DKTR.Y /EAG:191 DKTR.Z /EAG:191 -1 /EAG:191 LAC (JMS+20000+BT.ERR+1) /EAG:191 DAC BT.ERR / CAUSE BOOTSTRAP TO GO TO /EAG:191 LAC (DKTR.1) / DKTR.1 ON DISK ERRORS /EAG:191 DAC BT.ERR+1 /EAG:191 LAC (JMP+20000+5) / PUT JMP* THROUGH 5 INTO LOC. /EAG:192 DAC* (2) / 2, AND POINT LOC. 5 AT /EAG:192 LAC (BT.BOO) / BOOTSTRAP RE-BOOT ENTRY /EAG:192 XOR IN.BNK / POINT. THUS A USER/PROGRAM /EAG:192 DAC* (5) / CAN CAUSE A SYSTEM COLD-START /EAG:192 / BY STARTING AT/JUMPING TO /EAG:192 / LOCATION 2. /EAG:192 JMP IN.ERR /EAG:191 .TITLE IN.ERR -- INITIALIZE MONITOR ERROR ROUTINES /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP THE ERROR ROUTINES. USUALLY ALL WE DO IS PUT /EAG:195 / TRANSFERS TO THE ERROR ROUTINES IN APPROPRIAE PLACES. /EAG:195 / HOWEVER IF EITHER THE HALT COMMAND OR THE QDUMP COMMAND /EAG:195 / HAS BEEN GIVEN TO THE NON-RESIDENT MONITOR (EITHER BIT /EAG:195 / SC.HLT OR BIT SC.DMP SET IN SC.NMF) THEN WE MUST ALTER /EAG:195 / THE MANNER IN WHICH NON-RECOVERABLE (FATAL) IOPS ERRORS /EAG:195 / ARE HANDLED. THIS INVOLVES ALTERING LOCATIONS ER.FTL /EAG:195 / AND ER.FTL+1. IT SHOULD BE NOTED THAT THESE LOCATIONS /EAG:195 / MAY ALSO BE ALTERED BY IN.BCH TO CAUSE ERRORS TO BE TREATED /EAG:195 / AS BATCH WANTS THEM TO BE. /EAG:195 / /EAG:197 / LOCATION .MED+1 IS ALSO INITIALIZED BY THE RESIDENT MONITOR /EAG:197 / .TRAN ROUTINE (DSKTRN). /EAG:197 / /EAG:197 / LOCATION ER.CTQ IS ALSO INITIALIZED BY IN.CTQ, THE ^Q /EAG:197 / SET UP ROUTINE. /EAG:197 / /EAG:191 /EAG:191 /EAG:191 IN.ERR LAC (JMS+ER.MED) / PUT TRANSFERS TO ERROR /EAG:192 DAC* (.MED+1) / ROUTINES INTO .MED+1 /EAG:192 LAC (JMS+ER.EEP) / AND SC.EEP+1. /EAG:192 DAC* (SC.EEP+1) /EAG:192 LAC* (SC.NMF) / CHECK IF HALT COMMAND HAS /EAG:195 AND (SC.HLT) / BEEN ISSUED. /EAG:195 SNA / SKIP IF IT HAS /EAG:195 JMP INER.0 / IT HASN'T -- GO CHECK QDUMP /EAG:195 LAC (HLT) / HALT COMMAND IN EFFECT -- /EAG:195 DAC* (ER.FTL) / CONDITION ERROR PROCESSOR TO /EAG:195 JMP INER.1 / HALT ON FATAL IOPS ERRORS. /EAG:195 /EAG:195 INER.0 LAC* (SC.NMF) / CHECK IF QDUMP COMMAND HAS /EAG:195 AND (SC.DMP) / BEEN ISSUED. /EAG:195 SNA / SKIP IF IT HAS /EAG:195 JMP INER.1 / IT HASN'T -- DO SOMETHIN ELSE /EAG:195 LAW 21 / QDUMP COMMAND IN EFFECT -- /EAG:195 DAC* (ER.FTL) / CONDITION ERROR PROCESSOR TO /EAG:195 LAC (JMP+ER.FAK) / DO AUTOMATIC ^Q DUMP ON /EAG:195 DAC* (ER.FTL+1) / FATAL IOPS ERRORS /EAG:195 INER.1 JMP IN.CLK / DONE WITH ERROR ROUTINES /EAG:195 .TITLE IN.CLK -- SET UP CLOCK INTERRUPT ROUTINES /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / THIS ROUTINE CONDITIONS THE CLOCK INTERRUPT ROUTINES FOR /EAG:195 / API VS. NON-API OPERATION. FOR DETAILS OF HOW THIS AFFECTS /EAG:195 / THE CLOCK INTERRUPT ROUTINES SEE THE COMMENTS FOR THEM. /EAG:195 / /EAG:195 /EAG:195 IN.CLK LAC* (SC.MOD) / CHECK IF API WILL BE USED /EAG:195 AND (SC.API) /EAG:195 SZA /EAG:195 JMP INCK.0 / GO SET UP FOR API /EAG:195 / SET UP FOR NON-API OPERATION. /EAG:195 / CK.TMR AND CK.TLM ARE ALREADY SET UP. /EAG:195 LAC (JMP+20000+0) / SET UP CK.INT: /EAG:195 DAC* (CK.RET) / (JMP* 0) --> CK.RET /EAG:195 LAC (IOF) / SET UP CK.STRT: /EAG:195 DAC* (CKST.0) / (IOF) --> CKST.0 /EAG:195 LAC (DAC+0) / (DAC 0) --> CKST.1 /EAG:195 DAC* (CKST.1) /EAG:195 LAC (JMP+CK.INT) / (JMP CK.INT) --> CKST.2 /EAG:195 DAC* (CKST.2) /EAG:195 LAC (ION) / (ION) --> CKST.3 /EAG:195 DAC* (CKST.3) /EAG:195 JMP IN.TTA / FINISHED /EAG:195 /EAG:195 /EAG:195 / COME HERE TO SET UP FOR API OPERATION. /EAG:195 / CK.INT, CK.STRT, AND CK.TLM ARE ALREADY SET UP. /EAG:195 /EAG:195 INCK.0 CLX / COPY API VERSION OF CK.TMR /EAG:195 CLLR / FROM TEMPLATE BELOW INTO REAL /EAG:195 AXR INCK.A-INCK.B-1 / CK.TMR. /EAG:195 INCK.1 LAC INCK.B+1,X /EAG:195 .X=(CKTR.1-INCK.A+INCK.B+1) DAC* .X,X /EAG:196 AXS 1 /EAG:195 JMP INCK.1 /EAG:195 JMP IN.TTA / FINISHED /EAG:195 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / BELOW IS THE TEMPLATE FOR THE API VERSION OF CK.TMR. /EAG:195 / LOCATIONS INCK.A THROUGH INCK.B INCLUSIVE ARE COPIED /EAG:195 / TO CK.TMR BEGINNING AT CKTR.1. IN THE CODE BELOW /EAG:195 / THE "+10000"S ARE TO AVOID BANK ERRORS. THEY /EAG:195 / HAVE NO OTHER MEANING. /EAG:195 / /EAG:195 /EAG:195 INCK.A DAC* CKTR.A+10000 / GIVE TO USER'S ROUTINE /EAG:195 XOR CKTR.0+10000 / PICK UP MODE BITS /EAG:195 XOR CKTR.A+10000 / APPEND TO ROUTINE ADDRESS /EAG:195 IAC / BUMP TO FIRST INSTRUCTION /EAG:195 DAC CKTR.A+10000 / PUT WHERE WE CAN USE IT /EAG:195 LAC CKTR.B+10000 / RESTORE AC /EAG:195 DBR / AND GO TO USER'S ROUTINE /EAG:195 INCK.B JMP* CKTR.A+10000 /EAG:195 /EAG:195 /EAG:195 .IFNEG CKTR.4-CKTR.1-INCK.B+INCK.A /EAG:195 ERROR THE NON-API VERSION OF CK.TMR IS SHORTER /EAG:195 ERROR THAN THE API VERSION, AND THUS THE API VERSION /EAG:195 ERROR WILL NOT FIT. /EAG:195 ERROR .LOC .-3 /EAG:195 .ENDC /EAG:195 .TITLE IN.TTA -- INITIALIZE TELETYPE HANDLER /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP THE SYSTEM TELETYPE HANDLER. THE ONLY STUFF WE /EAG:191 / DO IS TO ADJUST WHETHER IT OUTPUTS TABS OR AN APPROPRIATE /EAG:191 / NUMBER OF SPACES AND ALSO WHETHER OR NOT IT OUTPUTS FILL /EAG:191 / CHARACTERS AFTER CARRAIGE RETURNS. WE ALSO SET UP .SCOM /EAG:192 / LOCATION SC.CTT. WE MUST ALSO CHECK FOR API AND CONDITION /EAG:201 / THE CONTROL CHARACTER INTERRUPT PROCESSING ROUTINE FOR /EAG:201 / ITS PRESENCE OR ABSCENCE. /EAG:201 / /EAG:197 / LOCATION TTCTLQ IS ALSO SET UP BY IN.CTQ, THE ^Q SET UP /EAG:197 / ROUTINE. /EAG:197 / /EAG:191 /EAG:191 /EAG:191 IN.TTA LAC* (SC.MOD) / PICK UP SC.MOD, /EAG:191 AND (SC.TAB) / AND CHECK STATUS OF SC.TAB /EAG:191 SZA / IF CLEAR TYPE SPACES FOR TABS /EAG:192 JMP INTT.0 / IF SET TYPE THE TABS /EAG:192 LAC (SAD+TTY011) / CONDITION TTA TO OUTPUT /EAG:191 DAC* (TT35N1) / SPACES FOR TABS /EAG:191 LAC (JMS+TABOUT) /EAG:191 DAC* (TT35N2) /EAG:191 LAC (JMP+NONULL) /EAG:191 DAC* (TT35N3) /EAG:191 JMP INTT.1 / GO DO SOMETHING ELSE /EAG:191 /EAG:191 INTT.0 LAC (SKP) / CONDITION TTA TO OUTPUT /EAG:191 DAC* (TT35N1) / TABS THEMSELVES /EAG:191 LAC (JMS+TTOSVC) / FOLLOWED BY A FEW NULLS /EAG:191 DAC* (TT35N2) / (I DON'T KNOW HOW MANY) /EAG:191 LAW -2 / (THOUGH I THINK THIS MEANS /EAG:191 DAC* (TT35N3) / ITS 2 NULLS) /EAG:191 INTT.1 LAC* (SC.MOD) / NOW CHECK TO SEE IF WE /EAG:191 AND (SC.FIL) / WANT FILL CHARACTERS AFTER /EAG:191 SNA / CARRAIGE RETURNS /EAG:191 JMP INTT.2 / NO -- GO DO SOMETHING ELSE /EAG:191 LAC (JMS+LA30CR) / YES -- CONDITION TTA TO /EAG:191 DAC* (TTYCR1) / OUTPUT FILL CHARACTERS AFTER /EAG:191 DAC* (TTYCR2) / CARRAIGE RETURNS /EAG:191 DAC* (TTYCR3) /EAG:191 INTT.2 LAC (JMS+TTCBSW) / DONE WITH TTA. -- SET UP /EAG:192 DAC* (SC.CTT) / SC.CTT TO CONTAIN INSTR. TO /EAG:192 / CLEAR TTA. BUSY SWITCH. /EAG:192 / REENTRANT ROUTINE TTCBSW /EAG:192 / DOES THIS. /EAG:192 LAC* (SC.MOD) / IS API IN USE? /EAG:201 AND (SC.API) / IF IT ISN'T, THE CONTROL CHAR /EAG:201 SNA / ROUTINES ARE ALREADY SET UP, /EAG:201 JMP INTT.3 / SO SKIP THIS. /EAG:201 LAC (NOP) / API IN USE -- NOP APPROPRIATE /EAG:201 DAC* (TTL4.3) / PORTIONS OF CTRL CHAR ROUTINE /EAG:201 DAC* (TTL4.4) / NOP'ING THESE TWO LOCATINS /EAG:201 / EFFECTIVELY TURNS OFF MUCH /EAG:201 / OTHER CODE. /EAG:201 LAC (LAC+TTLV4R) / REPLACE OTHER INSTRUCTION /EAG:201 DAC* (TTL4.5) / WHICH MUST BE CHANGED. /EAG:201 INTT.3 JMP IN.SKP /EAG:192 .TITLE IN.SKP -- SET UP SKIP CHAIN AND .SETUP CAL /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP SKIP CHAIN FROM LIST OF SKIPS IN SGNBLK. THE SKIP /EAG:191 / CHAIN IS SET UP ACCORDING TO THE FOLLOWING FORMAT: /EAG:191 / /EAG:191 / 0/ 0 / INTERRUPT ENTRY POINT /EAG:191 / 1/ JMP FOO / JMP TO SKIP CHAIN PROPER /EAG:191 / /EAG:191 / FOO/ DAC TMP / SAVE AC /EAG:191 / IOTSKP / FOUR WORD ENTRY FOR FIRST /EAG:191 / WD2 / SKIP /EAG:191 / WD3 /EAG:191 / WD4 /EAG:191 / . /EAG:191 / . /EAG:191 / . /EAG:191 / IOTSKP / ENTRY FOR LAST SKIP /EAG:191 / WD2 /EAG:191 / WD3 /EAG:191 / WD4 /EAG:191 / IORS / PRINT IOPS3 ERROR /EAG:191 / DAC .MED /EAG:191 / LAW 3 /EAG:191 / JMP .MED+1 /EAG:191 / TMP 0 / PLACE TO SAVE AC /EAG:191 / RECVR LAC TMP / COME HERE TO RECOVER FROM /EAG:191 / ION / FROM UNWANTED INTERRUPTS, /EAG:191 / DBR / SUCH AS WE GET FROM LT19 /EAG:191 / JMP* 0 / KEYBOARDS /EAG:191 / /EAG:191 / THE BEGINNING OF THE SKIP CHAIN PROPER (LABEL FOO ABOVE) IS /EAG:191 / LOCATED IMMEDIATELY ABOVE THE RESIDENT PATCH AREA. THE /EAG:191 / ADDRESS OF THIS LOCATION IS IN SC.RMS WHEN THIS /EAG:191 / ROUTINE IS ENTERED. THIS ROUTINE UPDATES SC.RMS /EAG:191 / TO POINT TO THE END OF THE SKIP CHAIN. THE FORMAT OF THE /EAG:191 / FOUR WORD ENTRY FOR EACH SKIP WILL BE ONE OF THE FORMATS /EAG:191 / DESCRIBED BELOW. /EAG:191 / /EAG:191 / FOR AN ORDINARY, POSITIVE SKIP (A POSITIVE SKIP SKIPS IF /EAG:191 / THE INTERRUPT FLAG IS SET) BEFORE IT IS SET UP: /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 / JMP TO NEXT ENTRY /EAG:191 / JMP .+2 /EAG:191 / 0 / WILL BE TRANSFER VECTOR /EAG:191 / /EAG:191 / /EAG:191 / FOR A POSITIVE SKIP FOR A DEVICE, SUCH AS AN LT19 OR VP15, /EAG:191 / WHICH MAY GENERATE SPURIOUS INTERRUPTS (ALSO BEFORE IT /EAG:191 / IS SET UP): /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 /EAG:191 / IOTCLR / IOT TO CLEAR THE INTERRUPTING /EAG:191 / JMP RECVR / FLAG, THEN GO TO RECOVER /EAG:191 / / ROUTINE /EAG:191 / /EAG:191 / /EAG:191 / FOR A POSITIVE SKIP WHICH HAS BEEN SET UP FOR NON-API USE: /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 /EAG:191 / JMP* .+1 / JMP TO INTERRUPT ENTRY POINT /EAG:191 / ADDR / ADDRESS OF ENTRY POINT /EAG:191 / /EAG:191 / /EAG:191 / FOR A POSITIVE SKIP WHICH HAS BEEN SET UP FOR API USE: /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 /EAG:191 / JMP .+2 /EAG:191 / ADDR / ADDRESS OF ENTRY POINT /EAG:191 / /EAG:191 / /EAG:191 / FOR A NEGATIVE SKIP WHICH HAS NOT BEEN SET UP (A NEGATIVE /EAG:191 / SKIP DOES NOT SKIP IF THE INTERRUPT FLAG IS SET): /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 /EAG:191 / JMP .+2 /EAG:191 / 777777 / FLAGS THIS AS NEG. SKIP /EAG:191 / /EAG:191 / /EAG:191 / FOR A NEGATIVE SKIP WHICH HAS BEEN SET UP FOR NON-API USE: /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP* .+2 / JMP TO INTERRUPT ENTRY POINT /EAG:191 / JMP .+2 /EAG:191 / ADDR / ADDRESS OF ENTRY POINT /EAG:191 / /EAG:191 / /EAG:191 / FOR A NEGATIVE SKIP WHICH HAS BEEN SET UP FOR API USE: /EAG:191 / /EAG:191 / IOTSKP / THE SKIP IOT ITSELF /EAG:191 / JMP .+3 /EAG:191 / JMP .+2 /EAG:191 / ADDR / ADDRESS OF ENTRY POINT /EAG:191 / /EAG:191 / /EAG:191 / IN ALL CASES, WHEN A SKIP IS SET UP, A JMS* THROUGH THE /EAG:191 / LAST WORD OF THE SKIP'S ENTRY (THE ENTRY POINT ADDRESS) /EAG:191 / WILL BE PLACED IN THE API VECTOR. THIS WILL BE DONE /EAG:191 / REGARDLESS OF WHETHER OR NOT API IS ENABLED. /EAG:191 / /EAG:191 / IN THE ABOVE DISCUSSION, WHEN WE SAY A SKIP GETS SET UP WE /EAG:191 / ARE TALKING ABOUT THE .SETUP CAL. THE SKIP CHAIN ENTRIES /EAG:191 / ARE INITIALLY CONSTRUCTED AS ONE OF THE UN-SET UP FORMATS /EAG:191 / DESCRIBED ABOVE. INVOKING THE .SETUP CAL CONVERTS THE /EAG:191 / ENTRY TO THE APPROPRIATE SET UP FORMAT. /EAG:191 / /EAG:191 / THIS ROUTINE ALSO INITIALIZES SOME LOCATIONS IN THE .SETUP /EAG:191 / CAL FUNCTION ROUTINE. THESE ROUTINES ARE STUP.2, STUP.X, /EAG:191 / AND STUP.Y. FOR DETAILS ON WHAT THESE ARE SET UP AS SEE /EAG:191 / THE COMMENTS AT THE .SETUP CAL FUNCTION ROUTINE (ENTRY /EAG:191 / POINT NAME IS SETUP). /EAG:191 / /EAG:197 / LOCATION 1 (CONTAINING A JMP TO THE SKIP CHAIN) IS ALSO /EAG:197 / SET UP BY THE RESIDENT MONITOR .TRAN ROUTINE (DSKTRN). /EAG:197 / WE SAVE THE APPROPRIATE JMP IN LOCATION DKTR.U SO THAT /EAG:197 / IT CAN DO THIS PROPERLY. /EAG:197 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 IN.SKP LAC* (SC.MOD) / FIRST WE WILL CHECK TO SEE /EAG:191 AND (SC.API) / IF API IS ENABLED, /EAG:191 SNA!CLA /EAG:191 LAC (SKP-SZA) / AND THEN INITIALIZE STUP.2 /EAG:191 TAD (SZA) / FOR THE APPROPRIATE CASE. /EAG:191 DAC* (STUP.2) / API ENABLED => (STUP.2)=SZA /EAG:191 / API DISABLED => (STUP.2)=SKP /EAG:191 LAC SG.NMP / CALCULATE BASE ADDRESS OF /EAG:191 TAD SG.NMD / SKIP CHAIN IN SGNBLK /EAG:191 TAD (SG.BAS+1) /EAG:191 XOR IN.BNK /EAG:191 DAC INSK.6 / AND STICK IN INSK.6 /EAG:191 LAC SG.NMS / GET NUMBER OF SKIPS, /EAG:191 TCA / TAKE TWO'S COMPLEMENT AND /EAG:191 DAC* (STUP.X) / GIVE TO .SETUP. /EAG:191 TCA / GET # OF SKIPS BACK AND /EAG:191 CLL!RTL / CONVERT TO LENGTH OF SKIP /EAG:191 IAC / CHAIN WHICH WE WILL BUILD /EAG:191 TAD* (SC.RMS) / AND GET END ADDR. OF SKP CHN /EAG:191 PAL / AND USE FOR LIMIT /EAG:191 LAC* (SC.RMS) / USE TOP OF MONITOR AS SKIP /EAG:191 PAX / CHAIN BASE /EAG:191 IAC / GET ADDRESS OF FIRST SKIP AND /EAG:191 DAC* (STUP.Y) / GIVE IT TO .SETUP /EAG:191 TAD (JMP-1) / CALCULATE JMP TO SKIP CHAIN /EAG:191 DAC* (1) / AND STICK IT WHERE IT BELONGS /EAG:191 DAC* (DKTR.U) / ALSO GIVE TO DSKTRN ROUTINE. /EAG:197 PLA / CALCULATE "DAC TMP" /EAG:191 TAD (DAC+INSK.E-INSK.D) /EAG:191 .X=(0) DAC* .X,X / AND STICK "DAC TMP" THERE /EAG:191 AXS 1 / BUMP XR. SKIP IF NO SKIPS /EAG:191 SKP /EAG:191 JMP INSK.4 / NO SKIPS IN SKIP CHAIN. GO /EAG:191 / FINISH OFF. /EAG:191 INSK.1 PXA / CALCULATE 2ND AND 3RD WORDS /EAG:191 TAD (JMP+4) / OF ENTRY FOR NEXT SKIP /EAG:191 .X=(1) DAC* .X,X / ASSUME WILL BE ENTRY FOR /EAG:191 .X=(2) DAC* .X,X / SKIP (NO SPURIOUS INTERRUPTS) /EAG:191 LAC* INSK.6 / GET SKIP FOR THIS ENTRY /EAG:191 ISZ INSK.6 /EAG:191 SMA / SKIP IF "POSITIVE SKIP" /EAG:191 JMP INSK.2 / GO HANDLE NEGATIVE SKIP /EAG:191 .X=(0) DAC* .X,X / STUFF SKIP INTO ENTRY /EAG:191 .X=(3) DZM* .X,X / FINISH OFF IF ORDINARY SKIP /EAG:191 JMS INSK.7 / TRANSLATE TO CLEAR IOT /EAG:191 / ON RETURN AC WILL BE ZERO IF /EAG:191 / DEVICE DOES NOT CAUSE /EAG:191 / SPURIOUS INTERRUPTS. IF AC /EAG:191 / NON-ZERO, DEVICE DOES CAUSE /EAG:191 / SPURIOUS INTERRUPTS AND AC /EAG:191 / CONTAINS IOT TO CLEAR FLAG /EAG:191 SNA / SKIP IF SPURIOUS INT. DEVICE /EAG:191 JMP INSK.3 / NORMAL DEVICE -- THUS DONE /EAG:191 .X=(2) DAC* .X,X / INSERT CLEAR IOT /EAG:191 PLA / NOW CALCULATE "JMP RECVR" /EAG:191 TAD (JMP+INSK.F-INSK.D) /EAG:191 .X=(3) DAC* .X,X / AND INSERT /EAG:191 JMP INSK.3 / FINISHED WITH THIS IOT /EAG:191 /EAG:191 /EAG:191 INSK.2 CMA / UN-COMPLEMENT NEGATIVE SKIP /EAG:191 .X=(0) DAC* .X,X / INSERT /EAG:191 LAW -1 / INSERT NEGATIVE SKIP FLAG /EAG:191 .X=(3) DAC* .X,X /EAG:191 INSK.3 AXS 4 / BUMP TO NEXT ENTRY, SKIP IF /EAG:191 JMP INSK.1 / DONE WITH SKIP CHAIN /EAG:191 INSK.4 PXA / NOW APPEND TAIL -- IOPS3,ETC /EAG:191 TAD (LAC+INSK.E-INSK.D) /EAG:191 / CALCULATE "LAC TMP" FOR TAIL /EAG:191 DAC INSK.F /EAG:191 TAD (INSK.G-LAC-INSK.E) /EAG:191 PAL / CALCULATE END OF TAIL FOR LR /EAG:191 TCA / NOW CALCULATE MAGIC OFFSET /EAG:191 TAD (INSK.G) / TO IMAGE OF TAIL /EAG:191 TAD IN.BNK /EAG:191 DAC INSK.6 /EAG:191 INSK.5 LAC* INSK.6,X / COPY TAIL INTO SKIP CHAIN /EAG:191 .X=(0) DAC* .X,X /EAG:191 AXS 1 /EAG:191 JMP INSK.5 /EAG:191 PXA / AND UPDATE RESIDENT MONITOR /EAG:191 DAC* (SC.RMS) / SIZE /EAG:191 AND (770000) / VERIFY MONITOR DIDN'T CROSS /EAG:191 SNA / PAGE BOUNDARY /EAG:191 JMP IN.UC15 / IT DIDN'T, SO OK /EAG:191 JMS IN.BIG / TYPE 'RES. MON. TOO BIG DUE TO/RKB-198 JMS IN.MSG / MONITOR TOO BIG -- OUTPUT MSG /EAG:191 .ASCII "SKIP CHAIN"<000> /RKB-198 JMS IN.MSG /EAG:191 .ASCII "DUE TO SKIP CHAIN"<000> /EAG:191 JMP IN.FAL / GO TO FAILURE ROUTINE /EAG:191 /EAG:191 /EAG:191 INSK.6 0 / TEMPORARY USED ABOVE /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SUBROUTINE TO CHECK IF SKIP IS FOR A DEVICE WHICH MAY CAUSE /EAG:191 / SPURIOUS INTERRUPTS. IF SO, RETURNS WITH CLEAR FLAG IOT IN /EAG:191 / AC. IF NOT, RETURNS WITH ZERO IN AC. EXPECTS SKIP IOT IN /EAG:191 / AC. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 INSK.7 0 /EAG:191 DAC INSK.A / SAVE THE SKIP FOR LATER /EAG:191 LAC (INSK.C-1) / POINT INSK.B TO TABLE /EAG:191 XOR IN.BNK /EAG:191 DAC INSK.B /EAG:191 INSK.8 ISZ INSK.B / BUMP POINTER TO SKIP IOT /EAG:191 LAC* INSK.B / PICK UP SKIP IOT /EAG:191 ISZ INSK.B / BUMP PTR TO CLR FLG IOT /EAG:191 SNA / HAVE WE REACHED END OF TABLE? /EAG:191 JMP INSK.9 / YES -- GO CHECK FOR LT19 /EAG:191 SAD INSK.A / DO SKIP IOTS MATCH? /EAG:191 SKP /EAG:191 JMP INSK.8 / NO -- KEEP LOOKING /EAG:191 LAC* INSK.B / YES -- PICK UP CLR FLG IOT /EAG:191 JMP* INSK.7 / AND RETURN /EAG:191 /EAG:191 /EAG:191 / COME HERE AFTER WE'VE EXHAUSTED TABLE TO CHECK FOR LT19 OR /EAG:191 / LT15 SKIP. /EAG:191 /EAG:191 INSK.9 LAW 777117 / MASK OUT LINE NUMBER /EAG:191 AND INSK.A /EAG:191 XOR (KSF1) / AND SEE IF ITS LT19 IOT /EAG:191 SZA!CLA / SKIP IF IT IS /EAG:191 JMP* INSK.7 / IT ISN'T -- RETURN ZERO /EAG:191 LAC INSK.A / PICK UP SKIP IOT /EAG:191 TAD (KRB1-KSF1) / AND CONVERT TO CLR FLG IOT /EAG:191 JMP* INSK.7 / AND RETURN /EAG:191 /EAG:191 /EAG:191 INSK.A 0 / TEMPORARY IN WHICH TO SAVE /EAG:191 / THE SKIP IOT /EAG:191 /EAG:191 INSK.B -1 / USED TO HOLD POINTER INTO /EAG:191 / FOLLOWING TABLE (INSK.C) /EAG:191 /EAG:191 / FOLLOWING TABLE INDICATES CORRESPONDENCE BETWEEN SKIP IOTS /EAG:191 / AND CLEAR FLAG IOTS. EACH TWO WORD ENTRY HAS THE SKIP IOT /EAG:191 / IN THE FIRST WORD AND THE CLEAR FLAG IOT IN THE SECOND. THE /EAG:191 / TABLE IS TERMINATED BY A ZERO WORD. /EAG:191 /EAG:191 INSK.C SDDF / VP15 STORAGE TUBE DISPLAY /EAG:191 CDDF /EAG:191 CLSF / KW15 REAL TIME CLOCK /EAG:191 CLON /EAG:191 KSF / CONSOLE TELETYPE KEYBOARD /EAG:191 KRB /EAG:191 TSF / CONSOLE TELETYPE PRINTER /EAG:191 TCF /EAG:191 0 /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THE FOLLOWING TABLE IS COPIED INTO THE SKIP CHAIN TO FORM /EAG:191 / THE "TAIL" OF THE SKIP CHAIN. THE WORD IN THE CENTER /EAG:191 / (LABEL INSK.F) IS FIRST RELOCATED RELATIVE TO THE BASE OF THE /EAG:191 / "TAIL". /EAG:191 / /EAG:191 / IT SHOULD BE NOTED THAT ALL THE "+10000"S BELOW ARE JUST /EAG:191 / THERE TO AVOID GETTING BANK ERRORS. IF MACRO WERE ASSEMBLING /EAG:191 / THE CODE AT ITS ACTUAL LOCATION THEY WOULD ALL BE LEFT OFF. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 INSK.D IORS / GET IO STATUS WORD /EAG:191 DAC .MED+10000 / TO OUTPUT IN IOPS 3 ERROR /EAG:191 LAW 3 /EAG:191 JMP .MED+1+10000 / AND GO OUTPUT ERROR MESSAGE /EAG:191 /EAG:191 INSK.E 0 / TEMPORARY USED TO STORE AC /EAG:191 /EAG:191 INSK.F LAC INSK.E-INSK.D+10000 / RESTORE AC /EAG:191 ION / AND RETURN FROM THE INTERRUPT /EAG:191 DBR /EAG:191 JMP* 0+10000 /EAG:191 INSK.G=. /EAG:191 .TITLE IN.UC15 -- SET UP FOR UC15 ON /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / ALLOCATE SPACE FOR TASK CONTROL BLOCKS USED FOR /EAG:193 / COMMUNICATION WITH THE UNICHANNEL I/O PROCESSOR. ONLY /EAG:193 / ALLOCATE THIS SPACE IF THE UC15 OPTION IS ON (I.E. BIT /EAG:193 / SC.UC15 IN SC.MOD IS SET). ALSO CHECK IF UC15 IS OFF /EAG:193 / AND SYSTEM DISK IS RK -- GIVE ERROR MESSAGE IF THIS /EAG:193 / CONDITION HOLDS, AS IT'S ILLEGAL. /EAG:193 / /EAG:195 / IN ADDITION TO ALLOCATING THE TCB AREA, IF UC15 IS ON WE /EAG:195 / ISSUE A STOP ALL TASKS DIRECTIVE TO THE UNICHANNEL. IF /EAG:195 / THE UNICHANNEL FAILS TO RESPOND TO THIS WE PRINT AN /EAG:195 / APPROPRIATE MESSAGE AND TURN UC15 OFF. IF UC15 IS STILL /EAG:195 / ON WHEN WE'RE DONE WITH ALL THIS WE APPEND TO THE MONITOR /EAG:195 / A ROUTINE (INUC.D BELOW) WHICH ISSUES A STOP ALL TASKS. WE /EAG:195 / ARRANGE FOR THIS ROUTINE TO BE CALLED AT APPROPRIATE TIMES, /EAG:195 / SUCH AS DURING .EXIT PROCESSING. /EAG:195 / /EAG:193 /EAG:193 /EAG:193 IN.UC15 LAC* (SC.MOD) / CHECK IF UC15 IS ON /EAG:193 AND (SC.UC15) /EAG:193 SZA / SKIP IF IT ISN'T /EAG:193 JMP INUC.0 / IT IS ON -- GO ALLOCATE TCB'S /EAG:193 DZM* (SC.TCB) / INDICATE NO TCB TABLE /EAG:193 LAC SG.SYS / CHECK IF SYSTEM DISK IS RK /EAG:193 SAD (221300) / SKIP IF IT ISN'T /EAG:193 SKP / IT IS -- ERROR! /EAG:193 JMP IN.PLR /EAG:193 JMS IN.MSG / PRINT MESSAGE /EAG:193 .ASCII <15>"UC15 OFF ILL., SYS. DISK = RK"<000> /RKB-198 LAC* (SC.MOD) / FORCE UC15 ON /EAG:193 XOR (SC.UC15) /EAG:193 DAC* (SC.MOD) /EAG:193 LAC* (SC.NMF) / AND CAUSE MODE MESSAGE /EAG:193 AND (777777-SC.TMM) / PRINTOUT /EAG:193 XOR (SC.TMM) /EAG:193 DAC* (SC.NMF) /EAG:193 INUC.0=. /EAG:193 .IFZER RKTCB /EAG:193 LAC SG.SYS / IF RK TCB WILL NOT BE /EAG:193 SAD (221300) / GENERATED CANNOT HAVE RK FOR /EAG:193 JMP INUC.7 / SYSTEM DISK. IF SO, ERROR. /EAG:193 .ENDC /EAG:193 LAC (INUC.B) / SET UP A POINTER TO /EAG:193 XOR IN.BNK / THE TCB DEFINITION TABLE /EAG:193 DAC INUC.A /EAG:193 LAC* (SC.RMS) / ALLOCATE SPACE FOR TCB /EAG:193 PAX / TABLE, AND POINT XR AND /EAG:193 DAC* (SC.TCB) / AND SC.TCB TO IT. /EAG:193 AAC INUC.C-INUC.B /EAG:193 DAC* (SC.RMS) /EAG:193 PAL / ALSO POINT LR PAST IT /EAG:193 .X=(0) INUC.1 DAC* .X,X / STORE ADDRESS NEXT TCB INTO /EAG:193 TAD* INUC.A / TABLE, THEN CALC. ITS END. /EAG:193 SAD* (SC.RMS) / CHECK IF ZERO LENGTH TCB. /EAG:193 .X=(0) DZM* .X,X / AND ZERO POINTER IF IT IS /EAG:193 DAC* (SC.RMS) / REMEMBER HOW MUCH MEMORY /EAG:193 ISZ INUC.A / USED SO FAR, BUMP TCB DEF. /EAG:196 AXS 1 / POINTER, AND CHECK IF AT END /EAG:196 JMP INUC.1 / OF LOOP. /EAG:196 PAL / POINT LR PAST ALL TCB'S /EAG:193 AND (770000) / AND VERIFY THAT TCB AREA /EAG:193 SZA / DIDN'T OVERFLOW PAGE ZERO. /EAG:193 JMP INUC.8 / ERROR IF IT DID. /EAG:193 .X=(0) INUC.2 DZM* .X,X / AND CLEAR OUT TCB'S /EAG:193 AXS 1 /EAG:193 JMP INUC.2 /EAG:193 LAC* (SC.RMS) / RELOCATE TRANSFER VECTOR /EAG:195 AAC INUC.I-INUC.D / USED BY INUC.D /EAG:195 DAC INUC.H /EAG:195 JMS IN.MOV / AND APPEND INUC.D TO MONITOR /EAG:195 INUC.D /EAG:195 INUC.G / START OF ABSOLUTE SECTION /EAG:195 INUC.J+1 / END OF INUC.D /EAG:195 SZL / DID IT FIT? SKIP IF YES. /EAG:195 JMP INUC.8 / DIDN'T FIT -- GO ERROR /EAG:195 CLA!IAC / ISSUE STOP ALL TASKS TO /EAG:195 INUC.3 SNA!IAC / UNICHANNEL, PUTTING TIME /EAG:195 JMP INUC.5 / OUTS ON EVERYTHING. IF WE /EAG:195 SIOA / TIME OUT GO TO INUC.5 TO GIVE /EAG:195 JMP INUC.3 / ERROR. /EAG:195 LAC INUC.H / USE TCB FROM INUC.D /EAG:195 AAC INUC.J-INUC.I / FORM POINTER TO EVENT /EAG:195 DAC INUC.H / VARIABLE, AND CLEAR EVENT /EAG:195 DZM* INUC.H / VARIABLE /EAG:195 AAC INUC.I-INUC.J / ISSUE TCB TO UNICHANNEL /EAG:195 LIOR /EAG:195 DZM INUC.G / SET UP TIME OUT COUNTER /EAG:195 INUC.4 LAC* INUC.H / TCB FINISHED YET? /EAG:195 SZA / SKIP IF IT ISN'T /EAG:195 JMP INUC.6 / YES -- GO FINISH UP /EAG:195 ISZ INUC.G / CHECK TIMEOUT /EAG:195 JMP INUC.4 / KEEP TRYING /EAG:195 INUC.5 JMS IN.MSG / UNICHANNEL TIMEOUT ERROR /EAG:195 .ASCII <15>"UC15 DOESN'T RESPOND"<000> /RKB-198 JMP INUC.9 / GO CHECK IF FATAL ERROR /EAG:195 /EAG:195 /EAG:195 / COME HERE AFTER STOP ALL TASKS COMPLETES /EAG:195 /EAG:195 INUC.6 LAC INUC.H / FORM JMS TO INUC.D /EAG:195 TAD (JMS+INUC.D-INUC.J) /EAG:195 DAC* (UCSTP1) / PUT IT WHERE IT BELONGS /EAG:195 JMP IN.PLR / DONE /EAG:195 /EAG:195 /EAG:193 /EAG:193 /EAG:193 .IFZER RKTCB /EAG:193 /EAG:193 / COME HERE IF RK TCB WILL NOT BE GENERATED AND SYSTEM DISK /EAG:193 / IS RK. THIS COMBINATION OF EVENTS IS A FATAL ERROR. /EAG:193 /EAG:193 INUC.7 JMS IN.MSG / TYPE MESSAGE /EAG:193 .ASCII <15>"NO RK TCB"<000> /RKB-198 JMP IN.FAL /EAG:193 /EAG:193 .ENDC /EAG:193 /EAG:193 /EAG:193 /EAG:193 / COME HERE IF TCB AREA OVERFLOWS PAGE ZERO. /EAG:193 /EAG:193 INUC.8 JMS IN.BIG / "RES. MON. TOO BIG DUE TO " /RKB-198 JMS IN.MSG / TYPE THE REST /RKB-198 .ASCII "UC15 TCB AREA"<000> /RKB-198 DZM IN.OVF / INDICATE MEMORY OVERFLOW /EAG:195 / HAS OCCURED /EAG:195 INUC.9 LAC SG.SYS / IF SYSTEM DEVICE IS RK /EAG:193 SAD (221300) / DISK, FATAL ERROR /EAG:193 JMP IN.FAL /EAG:193 LAC* (SC.MOD) / ELSE CAN RECOVER BY TURNING /EAG:193 AND (777777-SC.UC15) / UC15 OFF /EAG:193 DAC* (SC.MOD) /EAG:193 LAC* (SC.NMF) / ALSO SET MODE MESSAGE TYPE /EAG:193 AND (777777-SC.TMM) / OUT BIT IN SC.NMF /EAG:193 XOR (SC.TMM) /EAG:193 DAC* (SC.NMF) /EAG:193 LAC* (SC.TCB) / DELETE SPACE ALREADY /EAG:193 DAC* (SC.RMS) / ALLOCATED TO TCB AREA. /EAG:193 DZM* (SC.TCB) / AND INDICATE NO TCB AREA. /EAG:193 JMS IN.MSG / AND FINISH MESSAGE /EAG:193 .ASCII " -- "<015><011><011>"UC15 ON IGNORED."<000> /EAG:193 JMP IN.PLR / AND TRY SOMETHING ELSE. /EAG:193 /EAG:193 /EAG:193 /EAG:193 INUC.A 0 / POINTER TO TCB DEFINITION /EAG:193 / TABLE /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / TCB DEFINTION TABLE. EACH ENTRY CONTAINS LENGTH OF /EAG:193 / CORRESPONDING TCB OR ZERO IF IT DOESN'T EXIST. /EAG:193 / /EAG:193 /EAG:193 INUC.B RKTCB / RK DISK DRIVE(S) /EAG:193 LPTCB / LINE PRINTER /EAG:193 CDTCB / CARD READER /EAG:193 PLTCB / PLOTTER (XY) /EAG:193 TCB1 / SPARE #1 /EAG:193 TCB2 / SPARE #2 /EAG:193 TCB3 / SPARE #3 /EAG:193 LVTCB / PRINTER/PLOTTER /EAG:197 DLTCB / COMMUNICATIONS /EAG:197 INUC.C=. /EAG:193 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / FOLLOWING ROUTINE ISSUES A STOP ALL TASKS TO THE UNICHANNEL. /EAG:195 / IT IS APPENDED TO THE MONITOR WHEN UC15 IS ON AND WILL BE /EAG:195 / INVOKED FROM ALL THE RIGHT PLACES. IT PLACES A TIME LIMIT /EAG:195 / ON HOW LONG THE UNICHANNEL HAS TO RESPOND. IF THE UNICHANNEL /EAG:195 / DOESN'T RESPOND IN TIME THE ROUTINE TIMES OUT AND RETURNS /EAG:195 / ANYWAY, WITHOUT WAITING FOR THE STOP ALL TASKS TO COMPLETE. /EAG:195 / NORMALLY THIS ROUTINE WAITS FOR THE STOP ALL TASKS TO /EAG:195 / COMPLETE BEFORE RETURNING. THE POLLER SHOULD BE SHUT DOWN /EAG:195 / PRIOR TO CALLING THIS ROUTINE. /EAG:195 / /EAG:195 / THE LABELS INUC.D, INUC.G, AND INUC.J ARE USED TO DELIMIT /EAG:195 / THE VARIOUS SECTIONS OF THE ROUTINE, IN ADDITION TO /EAG:195 / BEING USED AS ORDINARY LABELS. /EAG:195 / /EAG:195 /EAG:195 INUC.D 0 /EAG:195 CLA!IAC / SET UP TIMEOUT FOR SIOA /EAG:195 INUC.E SNA!IAC / WAIT FOR UNICHANNEL TO BE /EAG:195 JMP* INUC.D / ABLE TO ACCEPT TCB POINTER /EAG:195 SIOA /EAG:195 JMP INUC.E /EAG:195 DZM INUC.J / CLEAR EVENT VARIABLE /EAG:195 LAC INUC.H / PICK UP TCB POINTER /EAG:195 LIOR / GIVE IT TO UNICHANNEL /EAG:195 DZM INUC.G / SET UP TIMEOUT /EAG:195 INUC.F LAC INUC.J / TCB COMPLETE YET? /EAG:195 SZA / SKIP IF NOT /EAG:195 JMP* INUC.D / YES -- RETURN /EAG:195 ISZ INUC.G / CHECK TIMEOUT /EAG:195 JMP INUC.F / KEEP TRYING /EAG:195 JMP* INUC.D / TIMED OUT -- RETURN /EAG:195 /EAG:195 INUC.G 0 / TIMEOUT COUNTER /EAG:195 /EAG:195 INUC.H INUC.I / TCB POINTER. RELOCATED BY /EAG:195 / IN.UC15 /EAG:195 /EAG:195 INUC.I 0 / STOP ALL TASKS TCB /EAG:195 200 /EAG:195 INUC.J 0 / EVENT VARIABLE /EAG:195 .TITLE IN.PLR -- SET UP UNICHANNEL POLLER /EAG:194 /EAG:194 /EAG:194 /EAG:194 /EAG:194 / /EAG:194 / APPEND THE UNICHANNEL POLLER TO THE RESIDENT MONITOR AND /EAG:194 / INITIALIZE IT APPROPRIATELY. THE POLLER WILL BE SET UP /EAG:194 / ONLY IF BOTH UC15 AND POLLER ARE ON -- I.E. IF BOTH BIT /EAG:194 / SC.UC15 AND BIT SC.PLR ARE SET IN SC.MOD. BESIDES /EAG:194 / APPENDING THE POLLER TO THE MONITOR (VIA IN.MOV) WE MUST /EAG:194 / ALSO RELOCATE SEVERAL TRANSFER VECTORS WITHIN THE POLLER, /EAG:194 / INSERT CALLS TO THE POLLER AT VARIOUS PLACES WITHIN THE /EAG:194 / MONITOR, AND INVOKE PLR.ST TO START IT UP. THE POLLER /EAG:194 / MUST BE ENTIRELY CONTAINED WITHIN THE FIRST 4K OF MEMORY /EAG:194 / AS IT CONTAINS TCB'S REFERENCED BY THE UNICHANNEL. /EAG:194 / /EAG:194 /EAG:194 IN.PLR LAC* (SC.MOD) / VERIFY THAT UC15 IS /EAG:194 AND (SC.UC15) / ENABLED /EAG:194 SNA /EAG:194 JMP IN.BAT /EAG:194 LAC* (SC.MOD) / AND ALSO THE POLLER /EAG:194 AND (SC.PLR) /EAG:194 SNA /EAG:194 JMP IN.BAT /EAG:194 LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:194 LAC PLST.A+10000,X / AND RELOCATE TRANSFER VECTORS /EAG:194 TAD* (SC.RMS) / WITHIN THE POLLER /EAG:194 DAC PLST.A+10000,X /EAG:194 LAC PLMS.E+10000,X /EAG:194 TAD* (SC.RMS) /EAG:194 DAC PLMS.E+10000,X /EAG:194 LAC PLMS.F+10000,X /EAG:194 TAD* (SC.RMS) /EAG:194 DAC PLMS.F+10000,X /EAG:194 LAC (PLR.MB) / ZERO MESSAGE BUFFER WITHIN /EAG:194 PAX / POLLER'S TCB AS A PRECAUTION /EAG:194 AAC PLR.NT*3 / AGAINST SPURIOUS MESSAGES. /EAG:194 PAL /EAG:194 INPL.0 DZM* IN.BNK,X /EAG:194 AXS 1 /EAG:194 JMP INPL.0 /EAG:194 JMS IN.MOV / APPEND POLLER TO MONITOR /EAG:194 PLRREL /EAG:194 PLRABS /EAG:194 PLREND /EAG:194 SZL / AND VERIFY THAT IT FIT /EAG:194 JMP INPL.2 / IT DIDN'T -- GO GIVE ERROR /EAG:194 LAW 770000 / VERIFY THAT IT DIDN'T /EAG:194 AND* (SC.RMS) / OVERFLOW PAGE ZERO /EAG:194 SZA /EAG:194 JMP INPL.1 / GO DEALLOCATE MEMORY AND /EAG:194 / GIVE ERROR MESSAGE /EAG:194 LAC* (SC.RMS) / CALCULATE XCT PLR.SW /EAG:194 TAD (XCT+PLR.SW-PLREND) /EAG:194 DAC* (PLR.X1) / AND PUT IT WHERE ITS WANTED /EAG:194 DAC* (PLR.X2) /EAG:194 TAD (JMS+PLR.CK-XCT-PLR.SW) / CALCULATE JMS PLR.CK /EAG:194 DAC* (PLR.J1) / STICK IT AWAY /EAG:194 TAD (PLR.FN-PLR.CK) / DITTO WITH JMS PLR.FN /EAG:194 DAC* (PLR.F1) /EAG:194 TAD (PLR.ST-PLR.FN) / DITTO WITH JMS PLR.ST /EAG:194 DAC* (PLR.S1) /EAG:194 DAC* (PLR.S2) /EAG:194 TAD (-JMS) / GET ADDRESS OF PLR.ST /EAG:194 DAC INPL.A / STORE IT /EAG:194 LAC (JMS* INPL.A) / AND PUT JMS TO PLR.ST /EAG:194 DAC PLR.S3 / INTO INITIAL START UP /EAG:194 JMP IN.BAT /EAG:194 /EAG:194 /EAG:194 /EAG:194 / COME HERE IF POLLER HAS BEEN APPENDED TO MONITOR ALREADY YET /EAG:194 / IT OVERFLOW PAGE ZERO (WHICH CAN'T BE ALLOWED). DEALLOCATE /EAG:194 / THE SPACE IT OCCUPIES, THEN FALL INTO ERROR MESSAGE ROUTINE. /EAG:194 /EAG:194 INPL.1 LAW PLRREL-PLREND / PICK UP NEG. LENGTH OF POLLER /EAG:194 TAD* (SC.RMS) / AND BACK UP SIZE OF MONITOR /EAG:194 DAC* (SC.RMS) /EAG:194 INPL.2 DZM IN.OVF / POLLER DIDN'T FIT, SO /EAG:194 LAC* (SC.MOD) / INDICATE MEMORY OVERFLOW /EAG:194 AND (777777-SC.PLR) / AND CLEAR POLLER BIT SO IT /EAG:194 DAC* (SC.MOD) / WON'T HAPPEN AGAIN. /EAG:194 JMS IN.BIG / "RES. MON. TOO BIG DUE TO" /RKB-198 JMS IN.MSG /EAG:194 .ASCII "UC15 POLLER"<000> /RKB-198 JMP IN.BAT / AND CONTINUE INITIALIZATION /EAG:194 /EAG:194 /EAG:194 /EAG:194 /EAG:194 INPL.A 0 / TEMPORARY USED ABOVE /EAG:194 .TITLE IN.BAT -- SET UP MONITOR BATCH FACILITY /EAG:196 /EAG:196 /EAG:196 /EAG:196 / /EAG:196 / CHECK IF BATCH IS REQUESTED AND SET IT UP IF IT IS. BATCH /EAG:196 / IS REQUESTED IF BIT SC.BCH OF THE OLD SC.NMF IS SET AND /EAG:196 / BIT SC.BMD OF THE OLD SC.BOS IS CLEAR. /EAG:196 / /EAG:196 /EAG:196 IN.BAT LAC BT.FLG / CLEAR BATCH FLAGS /EAG:196 AND (77777) / IN BOOTSTRAP /EAG:196 DAC BT.FLG /EAG:196 LAW -10000 / AVOID BANK ERRORS /EAG:196 PAX /EAG:196 LAC SC.NMF+10000,X / HAS BATCH BEEN REQUESTED? /EAG:196 AND (SC.BCH) /EAG:196 SNA /EAG:196 JMP IN.VT / SC.BCH CLEAR -- NO /EAG:196 LAC SC.BOS+10000,X /EAG:196 AND (SC.BMD) /EAG:196 SZA /EAG:196 JMP IN.BOS / BOSS MODE -- SO GO DO IT /RKB-198 LAC SC.BFNM+10000,X / BATCH HAS BEEN REQUESTED. /EAG:196 SZA!CLA / SET BA.CNT TO NUMBER OF /EAG:196 LAC SC.RTF+10000,X / LINES TO SKIP AT BEGINNING /EAG:196 CMA / OF FILE. /EAG:196 DAC BA.CNT+10000,X /EAG:196 JMS IN.MOV / APPEND BATCH TO MONITOR /EAG:196 BA.REL /EAG:196 BA.ABS /EAG:196 BA.END /EAG:196 SZL / DID IT FIT? /EAG:196 JMP INBT.0 / NO -- GO ERROR /EAG:196 LAC BT.FLG / SET FLAG BIT IN BOOTSTRAP /EAG:196 XOR (400000) / FOR COMPATABILITY WITH /EAG:196 DAC BT.FLG / OLD (DOS-15) BATCH. /EAG:196 LAC* (SC.NMF) / SET FLAGS IN SC.NMF FOR /EAG:196 XOR (SC.BCH+SC.DT7) / SYSTEM LOADER. /EAG:196 DAC* (SC.NMF) /EAG:196 LAW -10000 / AVOID BANK ERROR /EAG:196 PAX /EAG:196 LAC SC.RTF+10000,X / COPY .SCOM LOCATIONS USED /EAG:196 DAC* (SC.RTF) / BY BATCH FROM OLD .SCOM /EAG:196 LAC SC.BFNM+10000,X / TO NEW .SCOM. /EAG:196 DAC* (SC.BFNM) /EAG:196 LAC SC.BFNM+1+10000,X /EAG:196 DAC* (SC.BFNM+1) /EAG:196 LAC SC.BFXT+10000,X /RKB-205 DAC* (SC.BFXT) /RKB-205 LAC SC.BUIC+10000,X /EAG:196 DAC* (SC.BUIC) /EAG:196 LAC SC.BDEV+10000,X /EAG:196 DAC* (SC.BDEV) /EAG:196 LAC SC.BUNT+10000,X /RKB-205 DAC* (SC.BUNT) /RKB-205 LAC SC.BOSS+10000,X /RKB-204 DAC* (SC.BOSS) /RKB-204 /RKB-210 / NEED TO PATCH A TRANSFER VECTOR /RKB-210 / IN BA.PAU'S .WRITE OF THE $PAUSE /RKB-210 / REPLY PROMPTING MESSAGE. /RKB-210 /RKB-210 LAW BA.PTV-BA.END / CALCULATE THE DISPLACEMENT /RKB-210 / OF THE .WRITE BUFFADD T.V. /RKB-210 / FROM THE BACK OF BATCH EXEC /RKB-210 TAD* (SC.RMS) / NOW GET THE RELOCATED ADDRESS /RKB-210 DAC INBT.A / AND SAVE IT IN A TEMPORARY /RKB-210 LAW BA.PRMT-BA.END / NOW COMPUTE THE DISPACEMENT /RKB-210 / OF THE ACTUAL BUFFER FROM /RKB-210 / THE BACK OF BATCH /RKB-210 TAD* (SC.RMS) / MAKE IT THE RELOCATED VALUE /RKB-210 DAC* INBT.A / STUFF IT INTO .WRITE MACRO /RKB-210 /RKB-210 LAW BA.CTT-BA.END / MODIFY TTA. CONTROL CHAR. /RKB-198 TAD* (SC.RMS) / TO CAUSE ^T TO SCAN FOR /RKB-198 DAC* (TTTABL+2) / NEXT $JOB CARD /RKB-198 LAW BA.REL-BA.END / AND TO /RKB-198 TAD* (SC.RMS) / TREAT ^C AS A $EXIT /EAG:196 DAC* (TTTABL+1) /EAG:196 IAC / CAUSE BATCH FILE TO BE USED /EAG:196 DAC IN.CMD / FOR COMMAND INPUT DEVICE. /EAG:196 JMP IN.VT /EAG:196 /EAG:196 /EAG:196 /EAG:196 / COME HERE IF INSUFFICIENT ROOM FOR BATCH. /EAG:196 /EAG:196 INBT.0 DZM IN.OVF / INDICATE MEMORY OVERFLOW /EAG:196 LAC* (SC.NMF) / AND CAUSE MODE MESSAGE /EAG:196 AND (777777-SC.TMM) / TYPEOUT /EAG:196 XOR (SC.TMM) /EAG:196 DAC* (SC.NMF) /EAG:196 JMS IN.BIG / "RES. MON. TOO BIG DUE TO" /RKB-198 JMS IN.MSG / AND DO THE MESSAGE /EAG:196 .ASCII "BATCH"<000> /RKB-198 JMP IN.VT /EAG:196 /RKB-210 /RKB-210 /RKB-210 / THE FOLLOWING LOCATION IS A /RKB-210 / TEMPORARY USED TO HOLD THE /RKB-210 / ADDRESS OF THE BUF ADD PARAMETER /RKB-210 / OF THE .WRITE REQUEST IN /RKB-210 / BA.PAU FOR RELOCATING THE /RKB-210 / POINTER TO THE LINE BUFFER. /RKB-210 /RKB-210 INBT.A 0 /RKB-210 .TITLE IN.BOSS -- SET UP BOSS / /RKB-198 / /RKB-198 / /RKB-198 / CHECK SC.BMD OF SC.BOS TO SEE IF RESIDENT BOSS SHOULD BE /RKB-198 / INCLUDED IN THIS MOITOR LOAD. IF WE ARE IN BOSS MODE WE /RKB-198 / CHECK FURTHER TO SEE IF WE ARE LOADING NON-RESIDENT BOSS /RKB-198 / AND IF SO, DON'T SET UP RESIDENT BOSS, SINCE NON-RES BOSS /RKB-198 / DOESN'T USE RES BOSS. /RKB-198 / /RKB-198 / /RKB-198 / /RKB-198 IN.BOS LAW -10000 / SET UP XR /RKB-198 PAX // /RKB-198 LAC SC.BOS+10000,X / IS BOSS REQUIRED? (LOOK IN /RKB-198 AND (SC.BMD) / THE OLD SCOM) /RKB-198 SNA / SKIP IF WE NEED BOSS /RKB-198 JMP IN.VT / NOT BOSS'ING, TRY NEXT THING /RKB-198 LAC SC.BOS+10000,X / MOVE DOWN BOSS-RELATED .SCOMS /RKB-198 DAC* (SC.BOS) // /RKB-198 LAC SC.RTF+10000,X // /RKB-198 DAC* (SC.RTF) // /RKB-198 LAC SC.ETS+10000,X // /RKB-198 DAC* (SC.ETS) // /RKB-198 LAC SC.TLM+10000,X // /RKB-198 DAC* (SC.TLM) // /RKB-198 LAC SC.SPN+10000,X / ARE WE TRYING TO LOAD /RKB-198 SAD IN.BSS / NON-RES BOSS? (.SIXBT 'BOS') /RKB-198 SKP / PERHAPS, LOOK AT SECOND HALF /RKB-198 JMP IN.BS1 / DEFINATELY NOT BOSS, CONTINUE /RKB-198 LAC SC.SPN+1+10000,X / PICK UP SECOND HALF /RKB-198 SAD IN.BSS+1 / AND CHECK (.SIXBT 'S@@') /RKB-198 JMP IN.BSNR / YES, WE'RE GOING FOR NRBOSS /RKB-198 IN.BS1 LAC (IN.BSS) / LOOKUP 'BOSS' IN SYSBLK /RKB-198 TAD IN.BNK / ADD IN BANK BITS /RKB-198 JMS IN.SSB / CALL THE SEARCH SYSBLK RTNE /RKB-198 JMP IN.BSM / RETURN 1, BOSS IS MISSING /RKB-198 LAC SB.BAS+SB.FB,X / RETURN 2, FOUND, GET # OF BLK /RKB-198 DAC INBS.2 / SAVE IT TEMPORARILY /RKB-198 LAC* (SC.RMS) / GET WHERE WE'RE PUTTING BOSS /RKB-198 DAC IN.BSTR / SAVE START OF RES BOSS /RKB-198 JMS IN.MOVE / MOVE RES BOSS DOWN TO MONITOR /RKB-198 .DSA BS.REL / START OF BOSS /RKB-198 .DSA BS.ABS / ABSOLUTE SECTION /RKB-198 .DSA BS.END / END OF ABSOLUTE /RKB-198 SZL / DID IT FIT OK? /RKB-198 JMP IN.BSRM / NO, GO ANNOUNCE ERROR /RKB-198 / /RKB-198 / BOSS RESIDENT CODE IS NOW IN PLACE /RKB-198 / NOW GO AND MAKE THE REQUIRED PATCHES /RKB-198 / TO BOSS (RESIDENT) AND THE MONITOR /RKB-198 / /RKB-198 / MAKE PATCHES FOR IOPS ERRORS AND ^Q /RKB-198 / /RKB-198 LAC (JMP+BS.ERR-BS.REL) / GET OFFSET OF ERROR ENTRY /RKB-198 TAD IN.BSTR / ADD BASE ADDR OF RES BOSS /RKB-198 DAC* (ER.FTL) / TRAP THE FATAL ERROR PROCESS /RKB-198 / /RKB-198 / PATCH RESMON SO THAT A .EXIT GOES TO RES BOSS /RKB-198 / /RKB-198 LAC (JMP+BS.XT0-BS.REL) / OFFSET TO .EXIT PROCESS /RKB-198 TAD IN.BSTR / THIS IS WHERE IT IS NOW /RKB-198 DAC* (EXIT.1) / STUFF IT IN .EXIT ROUTINE /RKB-198 / /RKB-198 / PATCH THE CONTENTS OF DAT SLOTS -2 AND -3 /RKB-198 / SO THAT THEY POINT TO RES-BOSS /RKB-198 / /RKB-198 LAC (BS.DT3-BS.REL) / GET ADDR OF .DAT -3 ROUTINE /RKB-198 TAD IN.BSTR / PLUS BASE ADDR /RKB-198 DAC IN.CNSL / AND PUT IT IN TELEPRINTER /RKB-198 LAC (BS.DT2-BS.REL) / GET ADDR OF .DAT -2 ROUTINE /RKB-198 TAD IN.BSTR // /RKB-198 DAC IN.CMD / ASSIGN TO THE 'CMD' SLOT /RKB-198 / /RKB-198 / PATCH TTY HANDLER SO THAT CONTROL "T" GOES /RKB-198 / TO RES-BOSS /RKB-198 / /RKB-198 LAC (BS.CTT-BS.REL) / GET ADDRESS IN BOSS TO GO /RKB-198 TAD IN.BSTR / UPON ^T /RKB-198 DAC* (TTTABL+2) / AND SET IT IN TTY HANDLER /RKB-198 / /RKB-198 / PATCH TTY SO THAT CONTROL 'C' (^C) EXITS FROM BOSS MODE /RKB-198 / /RKB-198 LAC (BS.CTC-BS.REL) / ADDR OF BOSS ^C ROUTINE /RKB-198 TAD IN.BSTR // /RKB-198 DAC* (TTTABL+1) / SET IT IN ^C PLACE /RKB-198 / /RKB-198 / PATCH RESMON SO THAT CONTROL GOES TO /RKB-198 / RESIDENT BOSS ON A TIME OUT (USER EXCEEDED HIS OR /RKB-198 / HER TIME ESTIMATE). /RKB-198 / /RKB-198 LAC (JMP+BS.TLE-BS.REL) / OFFSET TO TIME LIMIT EXP. /RKB-198 TAD IN.BSTR / ADD IN BASE ADDRESS /RKB-198 DAC* (CKTL.0) / AND STUFF JMP IN CK.TLM RTNE /RKB-198 / /RKB-198 / MAKE PATCH FOR .PUT AND .GET CAL'S TO GO TO RES BOSS /RKB-198 / /RKB-198 LAC (JMP+BS.GPR-BS.REL) / FUNNEL .GET/.PUT REQUESTS /RKB-198 TAD IN.BSTR / INTO RESIDENT BOSS /RKB-198 DAC* (PTGT.B) // /RKB-198 / /RKB-198 / PATCH RES-BOSS CODE THAT WAS NOT RELOCATED /RKB-198 / CORRECTLY BY SUBR. "IN.MOVE" /RKB-198 / /RKB-198 LAC (BS.TRN-4-BS.REL) /GET OFFSET OF MTRAN CPB TV /RKB-198 TAD IN.BSTR / MAKE IT RIGHT /RKB-198 DAC INBS.1 / SAVE ADDRESS /RKB-198 IAC / GET ADDR OF CPB PROPER /RKB-198 DAC* INBS.1 / BS.TRN-4 POINTS TO BS.TRN-3 /RKB-198 ISZ INBS.1 / NOW POINT AT BS.TRN-3 ITSELF /RKB-198 LAC INBS.2 / FIRST BLOCK OF BOSS /RKB-198 DAC* INBS.1 / IS NOW IN MTRAN CPB /RKB-198 / /RKB-198 / PATCH UP BUFFER ADDRESSES FOR DAT -3 PROCESSING /RKB-198 / /RKB-198 LAC (BS.LBUF-BS.REL) / OFFSET TO LP BUFFER /RKB-198 TAD IN.BSTR / MAKE IT REAL ADDRESS /RKB-198 DAC INBS.1 / SAVE IT TEMPORARILY /RKB-198 LAC (BS.LPCL+2-BS.REL) / DISPL. OF TV IN .WRITE /RKB-198 TAD IN.BSTR // /RKB-198 DAC INBS.2 / SAVE IT /RKB-198 LAC INBS.1 / RECALL BUFFER ADDRESS /RKB-198 DAC* INBS.2 / STUFF IN '.WRITE 6,2,XX,54' /RKB-198 LAC (BS.LPBF-BS.REL) / OFFSET TO POINTER TO /RKB-198 TAD IN.BSTR / 'BS.LPBF+2', DATA IN LP BUF /RKB-198 DAC INBS.2 / PUT ADDRESS AWAY /RKB-198 LAC INBS.1 / RECALL BUFFER ADDRESS /RKB-198 AAC 2 / POINT PAST HEADER WP TO DATA /RKB-198 DAC* INBS.2 / AND SET IT UP /RKB-198 / /RKB-198 / SETUP THE LINE COUNT SKIP INDEX "BS.LCNT" /RKB-198 / SO THAT RES-BOSS WILL SKIP OVER THE LINES /RKB-198 / THAT IT HAS ALREADY READ /RKB-198 / /RKB-198 ISZ INBS.2 / BUMP POINTER, THESE TWO FOL- /RKB-198 LAC* (SC.RTF) / LOW EACH OTHER IN RES BOSS /RKB-198 AND (777) / SET NUMBER OF RTF LINES READ /RKB-198 CMA / ALREADY, MINUS MINUS ONE /RKB-198 DAC* INBS.2 / AND STUFF IT IN RES BOSS /RKB-198 / /RKB-198 / ALL PATCHES HAVE BEEN MADE /RKB-198 / MAKE SURE BITS SC.DT6, SC.DT7, AND SC.BCH /RKB-198 / OF SC.NMF ARE SET SO THAT THE /RKB-198 / SYSTEM LOADER WILL DO THE INITIALIZATION /RKB-198 / FOR DAT SLOTS 6 AND -7 /RKB-198 / /RKB-198 LAW SC.DT6!SC.DT7!SC.BCH\777777 / FIRST CLEAR THEM /RKB-198 AND* (SC.NMF) / IN THE NEW SCOM /RKB-198 AAC SC.DT6!SC.DT7!SC.BCH / THEN TURN THEM ON /RKB-198 DAC* (SC.NMF) / AND PUT THE FLAG WORD BACK /RKB-198 JMP IN.VT / ALL DONE, DO NEXT THING /RKB-198 / /RKB-198 / NON-RESIDENT BOSS IS TO BE LOADED, THEREFORE, WE /RKB-198 / DON'T NEED RES-BOSS, SO CLEAR IT'S .SYSLD INDICATOR BITS /RKB-198 / IN SC.NMF SO THE .SYSLD DOES NOT TRY TO /RKB-198 / DO THE AUTOMATIC LOADING OF THE DISK AND LP HANDLERS /RKB-198 / /RKB-198 IN.BSNR LAW SC.DT6!SC.DT7!SC.BCH\777777 /TURN 'EM OFF /RKB-198 AND* (SC.NMF) // /RKB-198 DAC* (SC.NMF) / AND PUT BACK THE FLAG WORD /RKB-198 JMP IN.VT / THAT'S ALL FOLKS /RKB-198 / /RKB-198 / /RKB-198 / NON-RESIDENT BOSS IS NOT IN SYS BLOCK /RKB-198 / THEREFORE CAN NOT RUN IN BOSS MODE /RKB-198 / CLEAR ALL BITS IN SCOM REG'S USED BY /RKB-198 / BOSS, AND DO A .EXIT, CAUSING US /RKB-198 / TO RECONFIGURE THE MONITOR OVER. /RKB-198 / /RKB-198 IN.BSM JMS IN.MSG / TELL USER BOSS IS MISSING /RKB-198 .ASCII <15>"BOSS NOT IN SYSBLK"<000> /RKB-198 IN.BSER DZM* (SC.ETS) / CLEAR TIME ESTIMATE /RKB-198 DZM* (SC.BOSS) / CLEAR BOSS MODE FLAG WORD /RKB-198 DZM* (SC.RTF) / CLEAR RTF LINES READ COUNT /RKB-198 DZM* (SC.TLM) / SHUT OFF THE TIME LIMIT /RKB-198 LAW SC.DT6!SC.DT7!SC.BCH\777777 / CLEAR MORE BITS /RKB-198 AND* (SC.NMF) // /RKB-198 DAC* (SC.NMF) // /RKB-198 DZM IN.OVF / IT MAY NOT REALLY BE AN OVERFL /RKB-198 / BUT THIS WILL CAUSE A .EXIT /RKB-198 / AS SOON AS THE MONITOR CAN /RKB-198 / TAKE IT. /RKB-198 LAW 777777-SC.TMM / FORCE MODE MESSAGE TYPE OUT /RKB-198 AND* (SC.NMF) // /RKB-198 XOR (SC.TMM) // /RKB-198 DAC* (SC.NMF) // /RKB-198 JMP IN.VT / CONTINUE WITH INITIALIZATION /RKB-198 / /RKB-198 / /RKB-198 / RESIDENT BOSS DOESN'T FIT IN PAGE 0. /RKB-198 / TYPE ERROR MESSAGE, SET MONITOR TO TYPE /RKB-198 / THE 'MODE' MESSAGE, CLEAR ALL BOSS- /RKB-198 / RELATED .SCOM LOCATIONS AND ABORT /RKB-198 / FURTHER BUILDING OF THE RESIDENT MONITOR /RKB-198 / /RKB-198 / /RKB-198 IN.BSRM JMS IN.BIG / "RES. MON. TOO BIG DUE TO " /RKB-198 JMS IN.MSG / /RKB-198 .ASCII "BOSS"<000> /RKB-198 JMP IN.BSER / CONTINUE ERROR PROCESSING /RKB-198 / /RKB-198 / /RKB-198 IN.BSS .SIXBT 'BOSS@@' / SYSBLK NAME FOR NON-RES BOSS /RKB-198 IN.BSTR 0 / START OF RES BOSS AFTER MOVE /RKB-198 INBS.1 0 / TEMPORARIES /RKB-198 INBS.2 0 // /RKB-198 .TITLE IN.VT -- SET UP CTRL-X FEATURE /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / THIS ROUTINE ADDS THE VT15 CODE (CTRL-X FEATURE) TO THE /EAG:193 / RESIDENT MONITOR, INITIALIZES IT, AND CONNECTS IT TO /EAG:193 / TTA. /EAG:193 / /EAG:193 /EAG:193 /EAG:193 IN.VT LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:197 LAC SC.VTF+10000,X / COPY SC.VTN AND SC.HFN BITS /EAG:193 AND (SC.VTN!SC.HFN) / FROM OLD TO NEW .SCOM, /EAG:193 DAC* (SC.VTF) / ON ASSUMPTION THAT VT IS /EAG:193 AND (SC.VTN) / OFF. CHECK IF VT IS ON OR /EAG:193 SNA / OFF. SKIP IF IT'S ON. /EAG:193 JMP IN.DT1 / VT OFF -- DONE. /EAG:193 XCT IN.SVT / IS VT15 PRESENT ON SYSTEM? /EAG:193 JMP INVT.7 / NO -- GO GIVE ERROR. /EAG:193 LAC SC.VTF+10000,X / VT ON -- MUST ALSO COPY /EAG:193 .X=SC.VTN!SC.HFN!SC.DMN / SC.DMN FROM OLD .SCOM TO /EAG:193 AND (.X) / THE NEW. /EAG:193 DAC* (SC.VTF) /EAG:193 LAC* (SC.RMS) / VERIFY THAT VT15 CODE WILL BE /EAG:193 AND (770000) / GOING INTO PAGE ZERO, AS IT /EAG:193 SZA / CONNECTS TO TTA. AND .SCOM /EAG:193 JMP INVT.6 / DIRECTLY. JMP IF WON'T. /EAG:193 LAC IN.OVF / IF PREVIOUS MEMORY OVERFLOW /EAG:193 SNA / OCCURED IT MAY HAVE CLOBBERED /EAG:193 DZM SC.VTR+10000,X / SAVED DISPLAY BUFFER, SO /EAG:193 / DELETE IT. /EAG:193 LAC* (SC.RMS) / ASSUME SAVED DISPLAY BUFFER /EAG:193 TAD (VTBUF-VTREL) / DOESN'T EXIST AND POINT VTMN3 /EAG:193 DAC VTMN3+10000,X / TO WHERE DISPLAY BUFFER WILL /EAG:193 LAC* (SC.VTF) / BE. CHECK IF HALF IS ON /EAG:193 AND (SC.HFN) / AND GET PROPER LINE COUNT /EAG:193 SNA!CLA / FOR VTM26. /EAG:193 AAC 34 / 67 OCTAL IF HALF IS OFF. /EAG:193 AAC 33 / 33 OCTAL IF HALF IS ON. /EAG:193 DAC VTM26+10000,X / ALSO COMPARE AGAINST LINE /EAG:193 SAD* (10000-VTCOPY+VTM26) / COUNT IN SAVED /EAG:193 SKP / DISPLAY BUFFER AND DELETE THE /EAG:193 DZM SC.VTR+10000,X / BUFFER IF THEY'RE DIFFERENT. /EAG:193 / NOTE THAT VTMN3 AND VTM26 /EAG:193 / WILL BE OVERWRITTEN LATER IF /EAG:193 / A SAVED BUFFER EXISTS AND IS /EAG:193 / NOT DELETED. /EAG:193 LAC* (SC.MOD) / CHECK IF TTA. WILL ECHO TABS /EAG:193 AND (SC.TAB) / AS SPACES AND CONDITION VT15 /EAG:193 SNA!CLA / TO ACCEPT OR IGNORE TABS (ON /EAG:193 LAC (JMP+VTIGNR\NOP) / INPUT ONLY!) AS APPROPRIATE. /EAG:193 XOR (NOP) /EAG:193 DAC VTTAB+10000,X /EAG:193 JMS IN.MOV / APPEND VT15 CODE TO MONITOR /EAG:193 VTREL /EAG:193 VTABS /EAG:193 VTBUF /EAG:193 SZL / DID IT SUCCEED? /EAG:193 JMP INVT.6 / NO -- GO PRINT MESSAGE. /EAG:193 LAC* (SC.RMS) / SET UP MAIN DISPLAY FILE. /EAG:193 TAD (VTMAIN-VTBUF) / FIRST SAVE ITS ADDRESS IN /EAG:193 DAC INVT.A / INVT.A /EAG:193 AAC VTMREL-VTMAIN / THEN BRACKET XR,LR ABOUT /EAG:193 PAX / ABOUT DISPLAY INSTRUCTIONS /EAG:193 AAC VTMFIL+1-VTMREL / WHICH NEED TO BE RELOCATED. /EAG:193 PAL /EAG:193 .X=(0) INVT.1 LAC* .X,X / NOW RELOCATE THE DISPLAY /EAG:193 TAD INVT.A / INSTRUCTIONS. DO IT /EAG:193 .X=(0) DAC* .X,X / OURSELVES BECAUSE IN.MOV /EAG:193 AXS 1 / DOESN'T KNOW HOW TO RELOCATE /EAG:193 JMP INVT.1 / DISPLAY INSTRUCTIONS. /EAG:193 LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:197 LAC SC.VTR+10000,X / EXISTS PREVIOUS DISPLAY BUF? /EAG:193 SNA / SKIP IF YES /EAG:193 JMP INVT.5 / NO -- DON'T NEED TO SET IT UP /EAG:193 TAD (VTBUF-VTMAIN) / MUST APPEND DISPLAY BUFFER TO /EAG:193 TCA / VT15 CODE. FIRST WE WILL /EAG:193 TAD* (SC.RMS) / RELOCATE ALL THE DISPLAY /EAG:193 DAC INVT.A / BUFFER POINTERS. RELOCATION /EAG:193 TAD SC.VTR+10000,X / FACTOR IN INVT.A, RELOCATE /EAG:193 DAC* (SC.VTR) / RESTART ADDRESS FIRST. /EAG:193 LAC (INVT.E) / GET POINTER TO DISPLAY BUFFER /EAG:193 XOR IN.BNK / POINTER TABLE. /EAG:193 DAC INVT.C /EAG:193 INVT.2 LAC* INVT.C / PICK UP ADDRESS NEXT DISPLAY /EAG:193 SPA / BUFFER POINTER, CHECK IF AT /EAG:193 JMP INVT.3 / END. /EAG:193 PAX / IF NOT AT END RELOCATE IT. /EAG:193 .X=(10000) LAC* .X,X /EAG:193 TAD INVT.A /EAG:193 .X=(10000) DAC* .X,X /EAG:193 ISZ INVT.C /EAG:193 JMP INVT.2 /EAG:193 /EAG:193 INVT.3 LAC* (SC.RMS) / MUST ALSO RELOCATE DJMSI /EAG:194 AAC VTCOPY-VTBUF / INSTRUCTIONS LOCATED WITHIN /EAG:194 TCA / VT LINE BUFFER. THERE ARE /EAG:194 TAD* (10000-VTCOPY+VTPT0) / TWO OF THESE, POINTED /EAG:194 PAX / TO BY VTPT0 AND VTPT1. HERE /EAG:194 .X=(10000) LAC* .X,X / WE USE THE FACTS THAT BOTH /EAG:194 TAD INVT.A / INSTRUCTIONS ARE IDENTICAL /EAG:194 .X=(10000) DAC* .X,X / AND VTPT1 ALWAYS POINTS ONE /EAG:194 .X=(10001) DAC* .X,X / WORD PAST VTPT0. /EAG:194 LAC* (SC.RMS) / NOW COPY DISPLAY BUFFER FROM /EAG:193 AAC VTCOPY-VTBUF / WHERE IT HAS BEEN SAVED (AT /EAG:193 DAC INVT.A / BEGINNING OF PAGE ONE) TO /EAG:193 CLX / JUST ABOVE VT15 CODE. /EAG:193 LAC* (SC.VTF) / DETERMINE LENGTH OF BUFFER /EAG:193 AND (SC.HFN) / JUST COPY WHAT WE NEED TO. /EAG:193 SZA!CLA /EAG:193 LAC (VT.HAF-VT.FUL) /EAG:193 TAD (VTEND-VTCOPY) /EAG:193 PAL /EAG:193 .X=(10000) INVT.4 LAC* .X,X /EAG:193 DAC* INVT.A,X /EAG:193 AXS 1 /EAG:193 JMP INVT.4 /EAG:193 INVT.5 LAC* (SC.RMS) / REMEMBER LOCATION OF VTBUF /EAG:193 DAC INVT.A / IN VT15 CODE. /EAG:193 LAC* (SC.VTF) / DETERMINE LENGTH OF BUFFER /EAG:193 AND (SC.HFN) / AND ALLOCATE SPACE FOR IT. /EAG:193 SNA!CLA /EAG:193 LAC (VT.FUL-VT.HAF) /EAG:193 TAD (VT.HAF) /EAG:193 TAD* (SC.RMS) /EAG:193 DAC* (SC.RMS) /EAG:193 LAC INVT.A / PICK UP BUF. ADDR. OF VT15 /EAG:193 TAD (JMP+VTDISP-VTBUF) / CODE AND GET (JMP VTDISP). /EAG:193 DAC* (TTYVT2) / PUT INTO TTA. /EAG:193 TAD (VTLBUF-JMP-VTDISP) / GET ADDRESS OF VTLBUF AND PUT /EAG:193 DAC* (EDCXAD) / AT TTA.-2 FOR EDITVT. /EAG:193 TAD (VTTEST-VTLBUF) / GET ADDRESS OF VT SETUP /EAG:193 DAC INVT.A / ROUTINE, /EAG:193 JMS* INVT.A / AND CALL VT SETUP ROUTINE. /EAG:193 JMP IN.DT1 / DONE. /EAG:193 /EAG:193 /EAG:193 / COME HERE IF CANNOT LOAD VT15 CODE DUE TO INSUFFICIENT ROOM /EAG:193 / IN PAGE ZERO. /EAG:193 /EAG:193 INVT.6 DZM* (SC.VTR) / INDICATE DISP. BUF. NOT /EAG:193 / SET UP (JUST IN CASE). /EAG:193 LAC* (SC.VTF) / AND TURN OF VT ON /EAG:194 AND (777777-SC.VTN) /EAG:194 DAC* (SC.VTF) /EAG:194 JMS IN.BIG / "RES. MON. TOO BIG DUE TO " /RKB-198 JMS IN.MSG / TYPE APPRO. MESSAGE. /EAG:193 .ASCII "VT ON"<000> /RKB-198 DZM IN.OVF / INDICATE MEM. OVERFLOW /EAG:193 / HAS OCCURED. /EAG:193 JMP IN.DT1 / AND PROCEED. /EAG:193 /EAG:193 /EAG:193 /EAG:193 / COME HERE IF VT ON HAS BEEN REQUESTED BUT VT15 ISN'T PRESENT /EAG:193 / ON SYSTEM. /EAG:193 /EAG:193 INVT.7 JMS IN.MSG / TYPE ERROR MESSAGE /EAG:193 .ASCII <015>"VT15 NOT AVAILABLE"<000> /EAG:193 LAC* (SC.VTF) / CLEAR VT ON BIT IN SC.VTF /EAG:193 AND (777777-SC.VTN) /EAG:193 DAC* (SC.VTF) /EAG:193 LAC* (SC.NMF) / AND SET MODE MESSAGE TYPE /EAG:193 AND (777777-SC.TMM) / OUT BIT IN SC.NMF /EAG:193 XOR (SC.TMM) /EAG:193 DAC* (SC.NMF) /EAG:193 JMP IN.DT1 / AND GO TRY NEXT THING /EAG:193 /EAG:193 /EAG:193 /EAG:193 / TEMPORARIES USED ABOVE /EAG:193 /EAG:193 INVT.A 0 / MISCELLANEOUS TEMPORARY /EAG:193 /EAG:193 INVT.C 0 / HOLDS POINTER TO DISPLAY /EAG:193 / BUFFER POINTER TABLE. /EAG:193 /EAG:193 /EAG:193 / DISPLAY BUFFER POINTER TABLE. FOLLOWING TABLE LISTS ALL /EAG:193 / POINTERS (WITHIN THE VT15 CODE) TO THE DISPLAY BUFFER. /EAG:193 / THIS TABLE IS USED TO RELOCATE THE POINTERS WHEN THE /EAG:193 / DISPLAY BUFFER SHIFTS. /EAG:193 /EAG:193 INVT.E VTMN1-VTCOPY /EAG:193 VTMN2-VTCOPY /EAG:193 VTMN3-VTCOPY /EAG:193 VTPT0-VTCOPY /EAG:193 VTPT1-VTCOPY /EAG:193 VTPT2-VTCOPY /EAG:193 VTPT3-VTCOPY /EAG:193 VTPT4-VTCOPY /EAG:193 VTPT6-VTCOPY /EAG:193 VTPT7-VTCOPY /EAG:193 -1 / NEGATIVE FLAGS END /EAG:193 .TITLE IN.DT1 -- INITIALIZE .DAT AND .UFDT, PHASE 1 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / THE INITIALIZATION OF .DAT AND .UFDT IS DIVIDED INTO TWO /EAG:195 / PHASES. THE INITIAL PHASE, PERFORMED HERE, MUST BE DONE /EAG:195 / BEFORE INTERRUPTS ARE ENABLED (BY IN.GO). THE SECOND PHASE /EAG:195 / USES THE MONITOR .TRAN ROUTINE (.MTRAN) AND THUS MUST BE /EAG:195 / PERFORMED AFTER INTERRUPTS ARE ENABLED. /EAG:195 / /EAG:195 / THIS ROUTINE PERFORMS THE FIRST PART OF INITIALIZING .DAT /EAG:195 / AND .UFDT. THIS INVOLVES ALLOCATING THE SPACE FOR THESE /EAG:195 / TABLES, SETTING UP THE .SCOM LOCATIONS WHICH REFER TO /EAG:195 / THEM, AND COPYING THE OLD IMAGE OF .DAT AND .UFDT (FROM /EAG:195 / THE PREVIOUS CORE LOAD, OR FROM SGNBLK IF THIS IS A /EAG:195 / COLD-START) INTO .DAT AND .UFDT. ADDITIONALLY WE CAUSE /EAG:200 / .DAT SLOTS -2 AND -3 TO REFER TO DEVICES CMD AND TTA, /EAG:200 / RESPECTIVELY, AND ZERO .DAT SLOT -7 (CAUSING IT TO REFER /EAG:200 / TO NON). /EAG:200 / /EAG:195 / THE NET EFFECT OF THIS IS AS FOLLOWS. THE ONLY .DAT SLOTS /EAG:195 / USED BY THE NON-RESIDENT MONITOR ARE -2, -3, AND -12, /EAG:195 / PLUS -7 IF EITHER OF BATCH OR BOSS IS IN USE. /EAG:195 / THE NON-RESIDENT MONITOR RESTORES -12 TO A HANDLER NUMBER /EAG:195 / (INDEX INTO SGNBLK) BEFORE IT EXITS. HERE WE RESTORE /EAG:195 / SLOTS -2, -3, AND -7 TO HANDLER NUMBERS. THUS, IF THE NON- /EAG:195 / RESIDENT MONITOR WAS THE LAST PROGRAM IN CORE WE END UP /EAG:195 / WITH A .DAT TABLE IN WHICH NO SLOTS ARE SET UP. ALL SLOTS /EAG:195 / CONTAIN HANDLER NUMBERS; NO SLOTS CONTAIN HANDLER ADDRESSES. /EAG:195 / THIS IDEALIZED OR VIRGIN .DAT TABLE IS WHAT WE WILL WRITE /EAG:195 / OUT TO DISK AS PART OF IN.DT2. THE ABSENSE OF HANDLER /EAG:195 / ADDRESSES IS ESSENTIAL AS WHEN THE .DAT TABLE IS READ BACK /EAG:195 / FROM DISK FOR A LATER CORE LOAD THE APPROPRIATE HANDLER /EAG:195 / ADDRESSES MAY HAVE CHANGED. /EAG:195 / /EAG:195 / IF THE NON-RESIDENT MONITOR WAS NOT THE LAST PROGRAM IN /EAG:195 / CORE, MOST OF THE WORK WE DO HERE GOES FOR NAUGHT. WHEN /EAG:195 / WE GET TO IN.DT2 A NEW .DAT TABLE WILL BE READ IN FROM /EAG:195 / DISK (WHICH WILL HAVE NO SET UP DEVICES, AS DESCRIBED /EAG:195 / ABOVE) TO REPLACE THE ONE WE CONSTRUCT HERE. THE ONLY /EAG:195 / PURPOSE IN CONSTRUCTING A .DAT TABLE HERE (ONLY TO THROW /EAG:195 / IT AWAY) IS IF A ^C SHOULD BE TYPED BEFORE WE REACH IN.DT2. /EAG:195 / IN THIS CASE WE NEED A .DAT TABLE -- ANY .DAT TABLE -- TO /EAG:195 / BE THERE TO BE FOUND BY THE INITIALIZATION CODE. WHILE /EAG:195 / ALL WE NEED DO IS ALLOCATE SPACE FOR .DAT AND .UFDT AND /EAG:195 / SET UP THE .SCOM LOCATIONS, IT IS EASIER NOT TO CHECK FOR /EAG:195 / THIS CASE /EAG:195 / /EAG:195 / IT SHOULD BE NOTED THAT SC.SLT HAS BEEN COPIED (BY IN.SCM) /EAG:195 / FROM THE OLD .SCOM TO THE NEW .SCOM PRIOR TO REACHING /EAG:195 / THIS ROUTINE. /EAG:195 / /EAG:195 / THE OTHER THING DONE BY THIS ROUTINE IS TO TRANSLATE ALL /EAG:200 / REFERENCES TO SYS TO REFERENCES TO SYA, AND ALL REFERENCES /EAG:200 / TO CMA TO CMD. THIS ALLOWS THE USER TO TYPE SY, SYS, AND /EAG:200 / SYA INTERCHANGEABLY YET ALWAYS GET SYA, OR TO TYPE CM, CMA /EAG:200 / AND CMD INTERCHANGEABLY YET ALWAYS GET CMD. /EAG:200 / /EAG:200 /EAG:195 IN.DT1 LAC* (SC.RMS) / ALLOCATE SPACE FOR .DAT /EAG:195 DAC IND1.A / AND .UFDT TABLES. ALSO /EAG:195 AAC 15 / REMEMBER BASE ADDRESS OF /EAG:195 DAC* (SC.DAT) / THEM IN IND1.A FOR LATER /EAG:195 TAD* (SC.SLT) / COPY LOOP. ALSO SET UP /EAG:195 AAC 16 / SC.DAT AND SC.UFD. /EAG:195 DAC* (SC.UFD) /EAG:195 TAD* (SC.SLT) /EAG:195 IAC /EAG:195 DAC* (SC.RMS) /EAG:195 DZM IN.SVD+15-7 / ZERO .DAT -7 /EAG:200 LAC (242401) / .SIXBT "TTA" /EAG:200 JMS IN.GNU / PUT HANDLER NUMBER OF TTA /EAG:200 CLA / INTO .DAT -3 /EAG:200 DAC IN.SVD+15-3 /EAG:200 LAC (031504) / .SIXBT "CMD" /EAG:200 JMS IN.GNU / PUT HANDLER NUMBER OF CMD /EAG:200 CLA / INTO .DAT -2 /EAG:200 DAC IN.SVD+15-2 /EAG:200 LAC (031501) / .SIXBT "CMA" /EAG:200 JMS IN.GNU / REMEMBER HANDLER NUMBER OF /EAG:200 LAW -1 / CMA FOR TRANSLATE/COPY LOOP /EAG:200 DAC IND1.B /EAG:200 LAC (233123) / .SIXBT "SYS" /EAG:200 JMS IN.GNU / REMEMBER HANDLER NUMBER OF /EAG:200 LAW -1 / SYS FOR TRANSLATE/COPY LOOP /EAG:200 DAC IND1.C /EAG:200 LAC (233101) / .SIXBT "SYA" /EAG:200 JMS IN.GNU / REMEMBER HANDLER NUMBER OF /EAG:200 CLA / SYA FOR TRANSLATE/COPY LOOP /EAG:200 DAC IND1.D /EAG:200 CLX / SET UP FOR COPY LOOP. ZERO /EAG:195 LAC* (SC.SLT) / TO XR, LENGTH OF .DAT TO LR /EAG:200 AAC 16 /EAG:200 PAL /EAG:195 IND1.0 LAC IN.SVD,X / AND COPY .DAT TO BANK ZERO /EAG:200 AND (77777) / EXTRACT HANDLER NUMBER /EAG:200 SAD IND1.B / IS IT CMA? /EAG:200 LAC IN.SVD+15-2 / IF SO, SUBSTITUTE CMD /EAG:200 SAD IND1.C / IS IT SYS? /EAG:200 LAC IND1.D / IF SO, SUBSTITUTE SYA /EAG:200 XOR IN.SVD,X / RESTORE UNIT NUMBER TO /EAG:200 AND (77777) / (POSSIBLY ALTERED) HANDLER /EAG:200 XOR IN.SVD,X / NUMBER. /EAG:200 DAC* IND1.A,X / SAVE IN BANK ZERO. /EAG:200 AXS 1 /EAG:195 JMP IND1.0 /EAG:195 PLA / MULTIPLY LR BY TWO, SO /EAG:200 CLL!RAL / IT NOW CONTAINS COMBINED /EAG:200 PAL / LENGTH OF .DAT AND .UFDT. /EAG:200 IND1.1 LAC IN.SVD,X / COPY .UFDT TO BANK ZERO /EAG:200 DAC* IND1.A,X /EAG:200 AXS 1 /EAG:200 JMP IND1.1 /EAG:200 JMP IN.GO / FINISHED UNTIL IN.DT2. /EAG:195 /EAG:195 /EAG:195 IND1.A 0 / SAVES ADDRESS OF .DAT /EAG:195 /EAG:200 IND1.B 0 / SAVES HANDLER NUMBER OF CMA /EAG:200 /EAG:200 IND1.C 0 / SAVES HANDLER NUMBER OF SYS /EAG:200 /EAG:200 IND1.D 0 / SAVES HANDLER NUMBER OF SYA /EAG:200 .TITLE IN.GO -- CRANK UP THE MONITOR /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / START UP MONITOR NOW THAT WE HAVE THE SKIP CHAIN /EAG:191 / SET UP. THIS PRIMARILY INVOLVES ISSUEING AN ION AND /EAG:191 / ALSO TURNING API ON (IF PRESENT AND REQUESTED). WE /EAG:191 / MUST ALSO CONNECT THE VARIOUS MONITOR INTERRUPT /EAG:191 / HANDLERS TO THEIR SKIP CHAIN ENTRIES AND API VECTORS. /EAG:191 / THE HANDLERS WE ARE CONCERNED WITH ARE THE CLOCK /EAG:191 / INTERRUPT HANDLER AND THE TELETYPE. ALSO THE VARIOUS /EAG:191 / ERROR INTERRUPTS -- NON-EXISTENT MEMORY, ETC. /EAG:191 / THE VERY LAST THING WE DO IS ENABLE THE CLOCK. THIS MAY /EAG:191 / NOT BE NECESSARY (AS WE'VE TURNED IT ON PREVIOUSLY), BUT IS /EAG:191 / DONE AS A "JUST IN CASE" MEASURE. NOTE THAT IF THE CLOCK /EAG:191 / INTERRUPTS BETWEEN OUR ENABLING INTERRUPTS AND OUR CONNECTING /EAG:191 / IT TO THE SKIP CHAIN IT WILL BE TURNED OFF. /EAG:191 / /EAG:191 / IT SHOULD BE NOTED THAT THE MONITOR IS RUNNING AND /EAG:191 / OPERATIONAL AS SOON AS WE TURN ON INTERRUPTS. THUS WE /EAG:191 / COMPLETELY INITIALIZE THE MONITOR PROPER (WHICH WE HAVE /EAG:191 / DONE) BEFORE TURNING ON INTERRUPTS. AFTER THIS POINT /EAG:191 / WE MUST USE THE REAL TELETYPE HANDLER (TTA.) TO DO ANY /EAG:191 / CONSOLE I/O, RATHER THAN DOING IT OURSELVES (AS WE HAVE /EAG:191 / BEEN DOING). IF A FATAL ERROR OCCURS, THOUGH, WE CAN /EAG:191 / STILL DO THE I/O OURSELVES AFTER FIRST TURNING OFF /EAG:191 / INTERRUPTS AND ISSUEING A CAF. THIS IS BEST ACCOMPLISHED /EAG:191 / BY A JMS* (RM.CAF) /EAG:191 / /EAG:191 / IF WE ARE RUNNING IN XVM MODE WE MUST SET UP THE MM /EAG:192 / REGISTER BEFORE TURNING ON INTERRUPTS. /EAG:192 / /EAG:191 /EAG:191 /EAG:191 IN.GO=. / CRANK UP THE MONITOR /RKB-210 / /RKB-203 / I AM ASSUMING THAT ALL INITIALIZATION MESSAGES HAVE BEEN /RKB-203 / DETECTED AND PRINTED BY NOW. THESE MESSAGES HAVE BEEN /RKB-203 / GOING DIRECTLY TO THE CONSOLE TERMINAL. ANY FURTHER /RKB-203 / MESSAGES WILL BE GOING TO THE VT, SO WE WOULD LIKE TO DO /RKB-203 / A CR/LF TO THE CONSOLE TERMINAL TO LEAVE THE PRINT HEAD /RKB-203 / IN A NICE PLACE. /RKB-203 / /RKB-203 LAC IN.CHR / HAS THE TTY ROUTINE BEEN /RKB-203 SNA / CALLED? SKIP IF YES /RKB-203 JMP .+3 / NO TYPEOUT, NO CR/LF! /RKB-203 LAW 15 / IN.CHR GIVES A FREE LF /RKB-203 JMS IN.CHR / FOLLOWING A CR. /RKB-203 CAF / DO CAF JUST IN CASE A FLAG /EAG:191 / HAS BEEN SET /EAG:191 LAC* (SC.MOD) / CHECK IF XVM MODE ENABLED /EAG:192 AND (SC.XVM) /EAG:192 SNA / SKIP IF IT IS /EAG:192 JMP INGO.0 /EAG:192 .IFUND %PRTCT /EAG:193 LAC (700000) / MAGIC CONSTANT CONSISTS OF /EAG:192 / RELOCATE DISABLE AND 17-BIT /EAG:192 / G-MODE ENABLE FLAGS /EAG:192 LDMM / AND STICK IT THERE /EAG:192 .ENDC /EAG:193 .IFDEF %PRTCT /EAG:193 LAC (040000) / SET UP TO RUN /EAG:193 LDMM / IN PROTECT MODE. SET IOT /EAG:193 LAC* (SC.MSZ) / PROTECT DISABLE IN MM /EAG:193 AAC -377 / REGISTER, POINT BOUNDARY /EAG:193 MPLD / REGISTER TO MEMSIZ, AND /EAG:193 CLA / RELOCATION REGISTER TO ZERO. /EAG:193 MPLR /EAG:193 MPEU / AND ENTER USER MODE SO LIMIT /EAG:193 / CHECKING WILL HAPPEN. /EAG:193 .ENDC /EAG:193 PLR.S3=. /EAG:194 INGO.0 NOP / START UP UNICHANNEL POLLER /EAG:194 / (IF IT'S ENABLED). THIS /EAG:194 / INSTRUCTION IS MODIFIED BY /EAG:194 / IN.PLR. /EAG:194 LAC* (SC.MOD) / CHECK IF API REQUESTED /EAG:191 AND (SC.API) /EAG:191 SNA / SKIP IF YES /EAG:191 JMP INGO.1 /EAG:191 LAC (API.ON) / TURN ON API /EAG:191 ISA /EAG:191 INGO.1 ION / TURN ON INTERRUPTS /EAG:191 .ENB / JUST IN CASE /EAG:194 .SETUP KW.API,CLSF,CK.INT / CONNECT CLOCK INT. /EAG:191 .SETUP 0,KSF,TIINT / CONNECT CONSOLE TTY KEYBOARD /EAG:191 .SETUP 0,TSF,TOINT / AND TTY PRINTER /EAG:191 JMS INGO.2 / SET UP NXM ERROR IF IN SKIP /EAG:192 .SETUP 0,MPSNE,NEMERR / CHAIN /EAG:192 JMS INGO.2 / ALSO MEM. PROTECT VIOLATION /EAG:192 .SETUP 0,MPSK,MPVERR /EAG:192 JMS INGO.2 / ALSO MEM. PARITY ERROR /EAG:192 .SETUP MP.API,SPE,MPEERR /EAG:192 JMS INGO.2 / ALSO POWER FAIL TRAP /EAG:192 .SETUP KF.API,PFSF,PFERR /EAG:192 JMS* (CK.STRT) / START UP CLOCK /EAG:194 LAC* (SC.VTR) / CHECK IF VT15 DISPLAY BUFFER /EAG:193 SZA / HAS BEEN SET UP (I.E. EXISTS) /EAG:193 LSD / AND START UP DISPLAY IF SO. /EAG:193 JMP IN.DT2 /EAG:191 /EAG:192 /EAG:192 /EAG:192 / /EAG:192 / SUBOUTINE TO CHECK IF SKIP IS IN SKIP CHAIN AND ISSUE .SETUP /EAG:192 / IF THE SKIP IS IN THE SKIP CHAIN, BYPASS THE .SETUP IF THE /EAG:192 / SKIP IS NOT IN THE SKIP CHAIN. /EAG:192 / /EAG:192 / CALLING SEQUENCE: /EAG:192 / /EAG:192 / JMS INGO.2 /EAG:192 / .SETUP API,SKIP,ENTRY /EAG:192 / /EAG:192 / THIS SUBROUTINE EXTRACTS THE SKIP FROM THE .SETUP EXPANSION /EAG:192 / AND CHECKS TO SEE IF IT IS IN THE SKIP CHAIN. IF SO, IT /EAG:192 / RETURNS NORMALLY AND THE .SETUP IS EXECUTED. IF NOT, IT /EAG:192 / RETURNS BY SKIPPING PAST THE .SETUP. /EAG:192 / /EAG:192 /EAG:192 INGO.2 0 /EAG:192 ISZ INGO.2 / POINT TO SKIP IN .SETUP /EAG:192 ISZ INGO.2 / EXPANSION /EAG:192 LAC SG.NMP / POINT XR AND LR TO SKIP /EAG:192 TAD SG.NMD / CHAIN IN SGNBLK /EAG:192 PAX /EAG:192 TAD SG.NMS /EAG:192 PAL LAC* INGO.2 / PICK UP SKIP IOT /EAG:192 INGO.3 SAD SG.BAS+1,X / AND SEARCH FOR IT /EAG:192 JMP INGO.4 / FOUND IT /EAG:192 AXS 1 /EAG:192 JMP INGO.3 /EAG:192 CLA!IAC / IT ISN'T THERE -- BUMP INGO.2 /EAG:192 IAC!SKP / PAST .SETUP /EAG:192 INGO.4 LAW -2 / FOUND IT -- BACK UP INGO.2 TO /EAG:192 / START OF .SETUP /EAG:192 TAD INGO.2 /EAG:192 DAC INGO.2 /EAG:192 JMP* INGO.2 / AND RETURN /EAG:192 .TITLE IN.DT2 -- INITIALIZE .DAT AND .UFDT, PHASE 2 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / THE INITIALIZATION OF THE .DAT AND .UFDT TABLES IS PERFORMED /EAG:195 / IN TWO PHASES. THIS PHASE, THE SECOND AND FINAL PHASE, /EAG:195 / USES THE MONITOR TRAN ROUTINE (.MTRAN) AND THUS MUST /EAG:195 / BE DONE AFTER THE INTERRUPT SYSTEM HAS BEEN TURNED ON /EAG:195 / BY IN.GO. THE FIRST PHASE MUST BE PERFORMED BEFORE /EAG:195 / INTERRUPTS ARE ALLOWED. /EAG:195 / /EAG:195 / THE FIRST PHASE ALLOCATED SPACE FOR THESE TABLES AND /EAG:195 / SET THEM UP TO BE (ESSENTIALLY) WHAT THEY WERE FOR THE /EAG:195 / PREVIOUS CORE LOAD. IF THE PREVIOUS CORE LOAD WAS THE /EAG:195 / NON-RESIDENT MONITOR WE WANT TO SAVE THE TABLES (IN DISK /EAG:195 / BLOCK 37) FOR LATER RE-USE. IF THE PREVIOUS CORE LOAD WAS /EAG:195 / NOT THE NON-RESIDENT MONITOR WE THROW AWAY THE TABLES FROM /EAG:195 / THE PREVIOUS CORE LOAD AND USE THE ONES SAVED IN DISK BLOCK /EAG:195 / 37 INSTEAD. /EAG:195 / /EAG:195 / IT SHOULD BE NOTED THAT IT IS ESSENTIAL THAT THE SAVED IMAGE /EAG:195 / OF THESE TABLES (SAVED IN DISK BLOCK 37) MUST NOT CONTAIN /EAG:195 / ANY SET UP .DAT SLOTS -- I.E. .DAT SLOTS WHICH CONTAIN /EAG:195 / HANDLER ADDRESSES RATHER THAN HANDLER NUMBERS. HANDLER /EAG:195 / NUMBERS ARE INDICES INTO THE SGNBLK HANDLER TABLE. BASED /EAG:195 / ON THE ASSUMPTION THAT THE NON-RESIDENT MONITOR ONLY USES /EAG:195 / .DAT SLOTS -2, -3, -7, AND -12 (-7 IS ONLY USED IF BATCH /EAG:195 / OR BOSS IS IN USE), AND THUS THESE FOUR .DAT SLOTS ARE THE /EAG:195 / ONLY .DAT SLOTS WHICH MIGHT BE SET UP, IN.DT1 HAS ENSURED /EAG:195 / THAT THE .DAT TABLE MEETS THIS CONDITION IF THE /EAG:195 / NON-RESIDENT MONITOR WAS THE PREVIOUS CORE LOAD. /EAG:195 / /EAG:195 / FOLLOWING THE TRANSFERRAL OF .DAT AND .UFDT TO OR FROM /EAG:200 / DISK BLOCK 37, WE HANDLE .DAT SLOT TRANSLATION. UNLESS /EAG:200 / WE ARE LOADING THE NON-RESIDENT MONITOR, WE TRANSLATE THE /EAG:200 / ENTIRE .DAT TABLE. IF WE ARE LOADING THE NON-RESIDENT /EAG:200 / MONITOR, THEN WE TRANSLATE SLOTS -2 AND -3. ADDITIONALLY, /EAG:200 / WHEN LOADING THE NON-RESIDENT MONITOR WE CHECK WHETHER /EAG:200 / LP IS ON OR OFF AND DO THE RIGHT THING FOR SLOT -12. /EAG:200 / THE ACTUAL TRANSLATION IS PERFORMED BY THE ROUTINE IND2.E /EAG:200 / BELOW, WHICH ROUTINE SHOULD BE REFERENCED TO DETERMINE /EAG:200 / WHICH I/O HANDLERS ARE MAPPED INTO WHICH OTHER I/O HANDLERS. /EAG:200 / /EAG:200 /EAG:195 IN.DT2 LAW -10000 / AVOID BANK ERROR /EAG:197 PAX /EAG:195 LAC SC.MOD+10000,X / WAS LAST CORE LOAD THE /EAG:195 AND (SC.NRM) / NON-RESIDENT MONITOR? /EAG:195 SZA!CLL / CLEAR LINK IF NOT, /EAG:195 STL / SET LINK IF IT WAS /EAG:195 JMS IND2.D / TRANSFER .DAT TO/FROM DISK /EAG:195 LAC* (SC.UFD) / SET UP .UFDT -7 TO BNK /EAG:195 PAX / OR PAG AS APPROPRIATE /EAG:195 AXR -7 / POINT XR TO .UFDT -7 /EAG:195 LAC* (SC.MOD) /EAG:195 AND (SC.BNK) /EAG:195 SZA!CLA /EAG:195 LAC (021613\200107) / CONSTANT IS: /EAG:195 / <.SIXBT "BNK">\<.SIXBT "PAG"> /EAG:195 XOR (200107) / CONSTANT IS: /EAG:195 / .SIXBT "PAG" /EAG:195 .X=(7-7) DAC* .X,X /EAG:195 DZM IND2.9 / ASSUME NOT LOADING NON-RES. /EAG:200 / MONITOR. ZERO HANDLER # /EAG:200 / TO BE TRANSLATED NEXT. /EAG:200 LAC* (SC.SPN) / ARE WE LOADING THE /EAG:200 SAD* (SC.NMN) / NON-RESIDENT MONITOR? /EAG:200 SKP / FALL THROUGH IF WE ARE, /EAG:200 JMP IND2.5 / GO TO IND2.5 IF WE AREN'T. /EAG:200 LAC* (SC.SPN+1) /EAG:200 SAD* (SC.NMN+1) /EAG:200 SKP /EAG:200 JMP IND2.5 /EAG:200 LAC* (SC.DAT) / CONSTRUCT A POINTER TO .DAT-3 /EAG:200 AAC -3 /EAG:200 DAC IND2.9 /EAG:200 AAC 3-12 / AND A POINTER TO .DAT-12 /EAG:200 DAC IND2.8 /EAG:200 LAC* IND2.8 / SAVE ORIGINAL CONTENTS OF /EAG:200 DAC* (SC.FNM) / .DAT-12 IN SC.FNM SO THAT /EAG:200 / THE NON-RESIDENT MONITOR CAN /EAG:200 / RESTORE IT AS REQUIRED. /EAG:200 LAC* IND2.9 / TRANSLATE CONTENTS OF .DAT-3 /EAG:200 JMS IND2.E /EAG:200 DAC* IND2.9 /EAG:200 LAC* (SC.NMF) / CHECK FOR LP ON /EAG:200 AND (SC.LPON) / IF LP OFF JMP TO IND2.0 /EAG:200 SNA / TO USE TTA (FROM .DAT-3) /EAG:200 JMP IND2.0 / FOR .DAT-12. /EAG:200 LAC (142001) / .SIXBT "LPA" /EAG:200 JMS IN.GNU / IF LP ON PUT HANDLER NUMBER /EAG:200 IND2.0 LAC* IND2.9 / OF LPA INTO .DAT-12. IF LPA /EAG:200 DAC* IND2.8 / NOT PRESENT OR LP OFF USE /EAG:200 ISZ IND2.9 / TTA FROM .DAT-3. NOTE THAT /EAG:200 LAC* IND2.9 / WE ASSUME LPA NEED NOT BE /EAG:200 JMS IND2.E / TRANSLATED. /EAG:200 DAC* IND2.9 / TRANLATE .DAT-2 /EAG:200 JMP IND2.6 / BACK TO COMMON CODE /EAG:200 /EAG:200 /EAG:200 / FOLLOWING LOOP IS RUN WHEN NOT LOADING NON-RESIDENT MONITOR. /EAG:200 / IT TRANSLATES SUCCESSIVE HANDLER NUMBERS (BEGINNING AT ONE) /EAG:200 / UNTIL A HANDLER NUMBER IS REACHED WHICH DOES NOT GET /EAG:200 / TRANSLATED. THE LOOP IS ENTERED BY ZEROING THE HANDLER /EAG:200 / NUMBER COUNTER (IND2.9) AND JUMPING TO IND2.5. /EAG:200 /EAG:200 .X=(1) IND2.1 XOR* .X,X / EXTRACT UNIT NUMBER /EAG:200 XOR IND2.8 / APPEND TO NEW I/O HANDLER # /EAG:200 .X=(1) DAC* .X,X / AND STORE TRANSLATED SLOT /EAG:200 JMP IND2.4 / AND REJOIN LOOP /EAG:200 /EAG:200 IND2.2 DAC IND2.8 / SAVE VALUE WHICH I/O HANDLER /EAG:200 LAC* (SC.DAT) / NUMBER IN IND2.9 IS TO BE /EAG:200 PAX / TRANSLATED TO, SO WE CAN /EAG:200 AXR -16 / UPDATE APPROPRIATE .DAT SLOTS /EAG:200 TAD* (SC.SLT) / SET UP XR AND LR TO SCAN .DAT /EAG:200 PAL /EAG:200 .X=(1) IND2.3 LAC* .X,X / FETCH NEXT .DAT SLOT, EXTRACT /EAG:200 AND (77777) / HANDLER NUMBER, AND CHECK IF /EAG:200 SAD IND2.9 / IT MATCHES THE HANDLER WE'RE /EAG:200 JMP IND2.1 / TRANSLATING. IF IT DOES, GO /EAG:200 IND2.4 AXS 1 / TRANSLATE IT. /EAG:200 JMP IND2.3 /EAG:200 IND2.5 ISZ IND2.9 / TRANSLATE NEXT HANDLER NUMBER /EAG:200 LAC IND2.9 / FETCH VALUE TO WHICH IT /EAG:200 JMS IND2.E / WANTS TO BE TRANSLATED. /EAG:200 JMP IND2.2 / GO TRANSLATE IT. /EAG:200 / SKIP RETURN FROM IND2.E /EAG:200 / INDICATES HANDLER DOESN'T /EAG:200 / WANT TO BE TRANSLATED, THUS /EAG:200 / WE ARE DONE. /EAG:200 IND2.6 LAC* (SC.DAT) / POINT .DAT+0 TO ITSELF /EAG:200 DAC IND2.9 /EAG:200 DAC* IND2.9 /EAG:200 /RKB-210 /RKB-210 / WE NOW WANT TO ARM THE '.WAIT -3' IN IO.WAT. /RKB-210 / THIS WAIT IS NEEDED TO ALOW THE TELETYPE /RKB-210 / TO STOP BEFORE DOING .EXITS, .OVERLYS, AND .MTRANS /RKB-210 / FAILURE TO DO THIS .WAIT RESULTS IN LOST /RKB-210 / CONSOLE MESSAGES IF THE USER OMMITS HIS /RKB-210 / .WAIT PRIOR TO A .EXIT, ETC. /RKB-210 /RKB-210 / ADDITIONALLY, IT PREVENTS THE BUG KNOWN /RKB-210 / AS THE 'BATCH JIGGLES', WHERE TTA. IS /RKB-210 / .INITED WHILE I/O IS IN PROGRESS. /RKB-210 /RKB-210 / HOWEVER, SINCE IO.WAT IS MATTER-OF-FACTLY /RKB-210 / INVOKED BY THE MONITOR TRAN ROUTINE, /RKB-210 / IF THE .DAT TABLE IS NOT YET SETUP, /RKB-210 / WHEN MTRAN IS USED, AN IOPS2 RESULTS. /RKB-210 / IN FACT, MTRAN IS USED IN THIS ROUTINE /RKB-210 / SO IT IS AFTER THIS ROUTINE THAT THE /RKB-210 / .DAT IS SAFE TO USE. THEREFORE, WE /RKB-210 / WILL CHANGE: /RKB-210 /IOWT.S SKP /RKB-210 / 12 /RKB-210 / TO: /RKB-210 /IOWT.S CAL -3&777 /RKB-210 / 12 /RKB-210 / WHICH IS A LEGAL '.WAIT -3' EXPANSION. /RKB-210 /RKB-210 LAC (CAL -3&777) / OVERLAY THE 'SKP' /RKB-210 DAC* (IOWT.S) / WITH THE PROPER 'CAL' /RKB-210 / TO TURN ON THE '.WAIT -3' /RKB-210 / IN IO.WAT. /RKB-210 /RKB-210 JMP IN.LDR / DONE! /EAG:200 /EAG:195 /EAG:195 /EAG:195 IND2.8 0 / TEMPORARY USED ABOVE /EAG:200 /EAG:200 IND2.9 0 / TEMPORARY USED ABOVE /EAG:195 /EAG:195 /EAG:195 /EAG:195 /EAG:195 / /EAG:195 / SUBROUTINE USED TO TRANSFER .DAT AND .UFDT TO OR FROM DISK /EAG:195 / BLOCK 37. ENTRY POINT IS IND2.D. ENTER WITH LINK CLEAR /EAG:195 / TO READ .DAT AND .UFDT FROM DISK, WITH LINK SET TO WRITE /EAG:195 / .DAT AND .UFDT ONTO DISK. /EAG:195 / /EAG:195 /EAG:195 /EAG:195 IND2.A 37 / DISK BLOCK NUMBER /EAG:195 IND2.B 0 / CORE ADDRESS -1 OF .DAT /EAG:195 IND2.C 0 / - LENGTH OF .DAT AND .UFDT /EAG:195 IND2.D 0 / ADDRESS TO RETURN TO AFTER /EAG:195 / TRANSFER. THUS, JMS ENTRY /EAG:195 / POINT. /EAG:195 LAC* (SC.DAT) / CALCULATE BEGIN OF .DAT /EAG:195 AAC -16 / ACTUALLY BEGIN -1 /EAG:195 DAC IND2.B /EAG:195 LAC* (SC.SLT) / CALCULATE LENGTH OF TABLES /EAG:195 TAD* (SC.SLT) / MUL. *2 WITHOUT GRITCHING LNK /EAG:195 CMA / AGAIN DON'T DISTURB LINK. /EAG:195 / IAC PART OF TCA INCLUDED IN /EAG:195 AAC -16*2+1 / THIS INSTRUCTION /EAG:195 DAC IND2.C /EAG:195 LAC (IND2.A) / GET ADDRESS OF CONTROL TABLE /EAG:195 TAD IN.BNK /EAG:195 .MTRAN / AND GO TO MONITOR .TRAN /EAG:195 /EAG:200 /EAG:200 /EAG:200 /EAG:200 / /EAG:200 / THE FOLLOWING ROUTINE TRANSLATES I/O HANDLER NUMBERS FROM /EAG:200 / WHAT GETS ASSIGNED TO .DAT TO WHAT IS NEEDED FOR EXECUTION. /EAG:200 / IT ASSUMES THAT THE TRANSLATIONS CMA -> CMD AND SYS -> SYA /EAG:200 / HAVE ALREADY BEEN TAKEN CARE OF. IT ALSO ASSUMES THAT /EAG:200 / IN.CMD CONTAINS THE HANDLER ADDRESS OF THE COMMAND INPUT /EAG:200 / INPUT DEVICE (CMD) AND IN.CNSL CONTAINS THE HANDLER ADDRESS /EAG:200 / OF THE CONSOLE OUTPUT DEVICE (TTA). NORMALLY THESE ARE BOTH /EAG:200 / WIRED TO TTA., BUT BOSS AND BATCH MAY WIRE THEM TO SOMETHING /EAG:200 / DIFFERENT. /EAG:200 / /EAG:200 / THE EXACT MAPPING IMPLEMENTED BY THIS ROUTINE IS AS FOLLOWS: /EAG:200 / /EAG:200 / CM* -> IN.CMD (COMMAND INPUT DEVICE) /EAG:200 / /EAG:200 / TT* -> IN.CNSL (CONSOLE OUTPUT DEVICE) /EAG:200 / /EAG:200 / SY* -> THE IDENTICALLY LETTERED VERSION OF THE SYSTEM /EAG:200 / DISK HANDLER. /EAG:200 / /EAG:200 / THIS ROUTINE IS CALLED WITH THE ORIGINAL .DAT SLOT CONTENTS /EAG:200 / (I/O HANDLER NUMBER IN LOW 15 BITS) IN THE AC. IF THE /EAG:200 / HANDLER IS ONE TO BE TRANSLATED A NON-SKIP RETURN IS TAKEN /EAG:200 / WITH THE NEW .DAT SLOT CONTENTS IN THE AC. IF THE HANDLER /EAG:200 / IS NOT ONE WHICH IS TRANSLATED A SKIP RETURN IS TAKEN WITH /EAG:200 / ALL REGISTERS CLOBBERED. /EAG:200 / /EAG:200 / THIS ROUTINE CLOBBERS ALL REGISTERS. /EAG:200 / /EAG:200 /EAG:200 IND2.E 0 /EAG:200 JMS IN.GNA / GET HANDLER NAME /EAG:200 JMP IND2.F / IF NOT FOUND, DON'T TRANSLATE /EAG:200 DAC IND2.J / SAVE HANDLER NAME /EAG:200 AND (777700) / MASK OUT DEVICE NAME /EAG:200 SAD (242400) / IS IT TT? /EAG:200 JMP IND2.I /EAG:200 SAD (031500) / IS IT CM? /EAG:200 JMP IND2.H /EAG:200 SAD (233100) / IS IT SY? /EAG:200 JMP IND2.G /EAG:200 IND2.F ISZ IND2.E / DEVICE DOES NOT GET /EAG:200 JMP* IND2.E / TRANSLATED -- TAKE SKIP RTRN /EAG:200 /EAG:200 IND2.G XOR IND2.J / DEVICE IS SY -- EXTRACT /EAG:200 XOR SG.SYS / HANDLER VERSION LETTER AND /EAG:200 JMS IN.GNU / JOIN TO SYSTEM DISK NAME /EAG:200 CLA / GET HANDLER NUMBER, ZERO IF /EAG:200 JMP* IND2.E / DOESN'T EXIST, AND RETURN /EAG:200 /EAG:200 IND2.H LAC IN.CMD / DEVICE IS CM -- USE COMMAND /EAG:200 JMP* IND2.E / INPUT DEVICE /EAG:200 /EAG:200 IND2.I LAC IN.CNSL / DEVICE IS TT -- USE CONSOLE /EAG:200 JMP* IND2.E / OUTPUT DEVICE /EAG:200 /EAG:200 /EAG:200 IND2.J 0 / SAVES ORIGINAL HANDLER NAME /EAG:200 .TITLE IN.LDR -- TRANSFER TO SYSTEM LOADER /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / SET UP LOCATIONS DESCRIBING FREE MEMORY, CHECK FOR A /EAG:199 / PREVIOUS MEMORY OVERFLOW, AND THEN DO .OVRLA TO .SYSLD. /EAG:199 / /EAG:191 /EAG:191 /EAG:191 IN.LDR LAC* (SC.RMS) / SET UP SC.FRL /EAG:191 DAC* (SC.FRL) / SC.FRL+1 SET UP BELOW /EAG:191 LAC* (SC.BOS) / CHECK IF BOSS IS ACTIVE. /EAG:193 AND (SC.BMD) /EAG:193 SNA / SKIP IF IT IS. /EAG:193 JMP INLD.0 /EAG:193 ISZ IN.OVF / SKIP UNLESS MEMORY OVERFLOW /EAG:193 / OCCURED. /EAG:193 JMP INLD.3 / IF BOSS IS ACTIVE AND MEM. /EAG:193 / OVRFLO OCCURED, ISSUE /EAG:193 / .SYSLD 1 AND EXIT. /EAG:193 INLD.0 LAC (INLD.A) / SEARCH SYSBLK FOR .SYSLD /EAG:199 TAD IN.BNK /EAG:199 JMS IN.SSB /EAG:199 JMP INLD.2 / NOT FOUND -- FATAL ERROR /EAG:199 LAC SB.BAS+SB.FB,X / SET UP .MTRAN PARAMETER /EAG:199 DAC INLD.B / BLOCK FROM DESCRIPTION OF /EAG:199 LAC SB.BAS+SB.FA,X / .SYSLD IN SYSBLK /EAG:199 AAC -1 /EAG:199 TAD IN.BNK /EAG:199 DAC INLD.C /EAG:199 DAC* (SC.FRL+1) / SET UP SC.FRL+1 /EAG:199 LAC SB.BAS+SB.PS,X /EAG:199 TCA /EAG:199 DAC INLD.D /EAG:199 LAC SB.BAS+SB.SA,X /EAG:199 TAD IN.BNK /EAG:199 DAC INLD.E /EAG:199 LAC (INLD.B) / POINT AC TO PARAMETER BLOCK /EAG:199 TAD IN.BNK /EAG:199 EBA / .SYSLD RUNS IN BANK MODE /EAG:199 CLL / AND GO TO SYSLD /EAG:199 .MTRAN /EAG:199 /EAG:199 /EAG:199 / COME HERE IF ENTRY FOR .SYSLD ISN'T FOUND IN SYSBLK /EAG:199 /EAG:199 INLD.2 JMS* (RM.CAF) / TURN OFF INTERRUPT SYSTEM /EAG:199 JMS IN.MSG / GIVE ERROR MESSAGE /EAG:199 .ASCII <15>".SYSLD NOT IN SYSBLK"<0> /EAG:199 JMP IN.FAL / THIS ERROR IS FATAL /EAG:199 /EAG:199 /EAG:199 / COME HERE IF WE OBSERVED A MEMORY OVERFLOW AND BOSS IS /EAG:199 / RUNNING /EAG:199 /EAG:199 INLD.3 LAC* (SC.BOS) / FORCE OUTPUT TO TTA /EAG:199 XOR (SC.BTT) /EAG:199 DAC* (SC.BOS) /EAG:199 LAC (INLD.F) /EAG:199 TAD IN.BNK /EAG:199 DAC INLD.4 / WRITE OUT ERROR MESSAGE /EAG:199 .WRITE -3,2,INLD.F,6 /EAG:199 INLD.4=.-2 /EAG:199 LAC* (SC.BOS) / FORCE .WAIT TO TTA /EAG:199 XOR (SC.BTT) /EAG:199 DAC* (SC.BOS) /EAG:199 .WAIT -3 /EAG:199 LAC (777777-SC.BAB-SC.BERR) /EAG:199 AND* (SC.BOS) /EAG:199 XOR (2+SC.BAB) / SET ERROR CODE IN SC.BOS /EAG:199 DAC* (SC.BOS) /EAG:199 .EXIT /EAG:199 /EAG:199 /EAG:199 /EAG:199 /EAG:199 INLD.A .SIXBT ".SYSLD" / NAME OF SYSTEM LOADER /EAG:199 /EAG:199 /EAG:199 / .MTRAN PARAMETER BLOCK FOR BRINGING IN .SYSLD /EAG:199 /EAG:199 INLD.B -1 / FIRST DISK BLOCK NUMBER /EAG:199 INLD.C -2 / FIRST CORE ADDRESS MINUS ONE /EAG:199 INLD.D 0 / TWO'S COMPLEMENT PGM. SIZE /EAG:199 INLD.E -1 / PROGRAM START ADDRESS /EAG:199 /EAG:199 /EAG:199 /EAG:199 INLD.F 6*400 /EAG:199 0 /EAG:199 .ASCII ".SYSLD 1"<15> /EAG:199 .TITLE IN.BBT -- BANK BIT INITIALIZATION ROUTINE /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / ROUTINE TO APPEND BANK BITS TO TRANSFER VECTORS. CALLING /EAG:191 / SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.BBT /EAG:191 / VCTR.1 / ADDRESS OF FIRST TRANSFER VECTOR /EAG:191 / VCTR.2 / ADDRESS OF SECOND TRANSFER VECTOR /EAG:191 / . /EAG:191 / . /EAG:191 / . /EAG:191 / VCTR.N / ADDRESS OF LAST TRANSFER VECTOR /EAG:191 / -1 / FLAG END OF LIST /EAG:191 / /EAG:191 / THE TRANSFER VECTOR ADDRESSES MUST ALL BE BETWEEN 0 AND 32K. /EAG:191 / THE AC AND THE LINK ARE CLOBBERED. ALL OTHER REGISTERS ARE /EAG:191 / PRESERVED, INCLUDING THE XR AND LR. LOCATION IN.BNK MUST /EAG:191 / BE SET UP BEFORE CALLING THIS ROUTINE. /EAG:191 / /EAG:191 / IT SHOULD BE NOTED THAT THE TRANSFER VECTOR ADDRESSES /EAG:191 / IN THE ARGUMENT LIST WILL NOT BE BANK BIT RELOCATED. THUS /EAG:191 / THIS ROUTINE IS ONLY USEFUL FOR BANK BIT INITIALIZING /EAG:191 / TRANSFER VECTORS IN BANK ZERO -- I.E. TRANSFER VECTORS IN /EAG:191 / THE RESIDENT MONITOR PROPER. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.BBT 0 /EAG:191 INBB.0 LAC* IN.BBT / PICK UP ADDR. NXT XFER VCTR. /EAG:191 ISZ IN.BBT /EAG:191 SPA / HAVE WE REACHED END YET? /EAG:191 JMP* IN.BBT / YES -- RETURN /EAG:191 DAC INBB.A / PUT WHERE WE CAN USE IT /EAG:191 LAC* INBB.A / GET XFER VECTOR CONTENTS /EAG:191 AND (17777) / TRIM OFF ANY OLD BANK BITS /EAG:191 XOR IN.BNK / AND ADD IN THE NEW /EAG:191 DAC* INBB.A / PUT IT BACK IN ITS PLACE /EAG:191 JMP INBB.0 / AND GO DO NEXT ONE /EAG:191 /EAG:191 /EAG:191 INBB.A -1 / TEMPORARY USED ABOVE /EAG:191 .TITLE IN.FAL -- FAILURE ROUTINE. COME HERE TO DIE /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN THE COURSE OF INITIALIZING THE RESIDENT MONITOR, WE /EAG:191 / CHECK FOR VARIOUS PATHOLOGICAL CONDITIONS WHICH WILL NOT /EAG:191 / ALLOW US TO SUCCESSFULLY LOAD AND INITIALIZE THE RESIDENT /EAG:191 / MONITOR. IF ANY SUCH FATAL PROBLEMS ARE ENCOUNTERED WE /EAG:191 / FIRST TYPE A MESSAGE STATING WHAT THE PROBLEM IS AND THEN /EAG:191 / JUMP HERE. THIS ROUTINE THEN TYPES A MESSAGE STATING THAT /EAG:191 / WE CANNOT LOAD THE MONITOR AND THEN DIES -- I.E. IT HALTS. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.FAL JMS IN.MSG / OUTPUT MESSAGE /EAG:191 .ASCII " -- "<015><011><011>"CANNOT LOAD "<000> /EAG:191 JMS IN.MSG /EAG:191 .SYSID < .ASCII ">,< RESIDENT MONITOR."<15><0>> /EAG:191 INFL.0 HLT /EAG:191 JMP INFL.0 /EAG:191 / / /RKB-198 / /RKB-198 / ROUTINE TO TYPE "RES. MON. TOO BIG DUE TO " AS A PREAMBLE /RKB-198 / TO MANY INITIALIZATION ERROR MESSAGES. /RKB-198 / /RKB-198 / CALLING SEQUENCE (TYPICAL): /RKB-198 / JMS IN.BIG / TYPE PREAMBLE /RKB-198 / JMS IN.MSG / FINISH LINE WITH MY PART. ERR /RKB-198 / .ASCII "PARTICULAR REASON"<000> /RKB-198 / / /RKB-198 IN.BIG XX /RKB-198 JMS IN.MSG / TYPE IT /RKB-198 .ASCII <015>"RES. MON. TOO BIG DUE TO "<000> /RKB-198 JMP* IN.BIG / PROVIDED ONLY TO SAVE SPACE /RKB-198 .TITLE IN.MSG,IN.TYP,IN.CHR -- CHAR. I/O SUBR.'S /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.MSG -- TYPE A MESSAGE (INCLUDED IN CALLING SEQUENCE) ON /EAG:191 / THE CONSOLE TERMINAL. THE MESSAGE MAY INCLUDE THE ASCII /EAG:191 / GRAPHICS, TABS, AND CARRAIGE RETURNS. TAB STOPS ARE EVERY /EAG:191 / EIGHT SPACES AND CARRAIGE RETURNS ARE TRANSLATED INTO /EAG:191 / CARRAIGE RETURN/LINE FEEDS. THE MESSAGE IS TERMINATED /EAG:191 / BY A CHARACTER WITH OCTAL CODE ZERO (I.E., A NULL). /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.MSG /EAG:191 / .ASCII "MESSAGE TO BE TYPED"<000> /EAG:191 / (RETURN) /EAG:191 / /EAG:191 / THIS SUBROUTINE CLOBBERS THE AC, THE LINK, AND THE XR. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.MSG 0 /EAG:191 LAC IN.MSG / TAKE POINTER TO MESSAGE /EAG:191 AND (77777) / STRIP OFF MODE BITS /EAG:191 PAX / AND PUT IN XR FOR IN.TYP /EAG:191 JMS IN.TYP / TYPE OUT THE MESSAGE /EAG:191 .X=(0) JMP* .X,X / IN.MSG LEAVES XR POINTING TO /EAG:191 / WORD FOLLOWING MESSAGE -- /EAG:191 / I.E. OUR RETURN /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.TYP -- TYPE A MESSAGE (POINTED TO BY XR) ON THE CONSOLE /EAG:191 / TERMINAL. THE MESSAGE MAY INCLUDE THE ASCII GRAPHICS, TABS, /EAG:191 / AND CARRIAGE RETURNS. TAB STOPS ARE EVERY EIGHT SPACES AND /EAG:191 / CARRAIGE RETURNS ARE TRANSLATED INTO CARRAIGE RETURN/LINE /EAG:191 / FEEDS. THE MESSAGE IS TERMINATED BY A CHARACTER WITH /EAG:191 / OCTAL CODE ZERO (I.E., A NULL). UPON RETURN THE XR IS LEFT /EAG:191 / POINTING TO THE WORD FOLLOWING THE MESSAGE. /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.TYP /EAG:191 / /EAG:191 / EXAMPLE OF ARGUMENT TRANSMISSION: /EAG:191 / /EAG:191 / XR (AT TIME OF CALL) ---------> .ASCII "MESSA" /EAG:191 / .ASCII "GE TO" /EAG:191 / .ASCII " BE T" /EAG:191 / .ASCII "YPED"<000> /EAG:191 / XR (AT TIME OF RETURN) -------> /EAG:191 / /EAG:191 / THIS SUBROUTINE CLOBBERS THE AC AND THE LINK. /EAG:191 / /EAG:191 / THIS SUBROUTINE MAKES USE OF THE FACT THAT .ASCII STRINGS /EAG:191 / ARE PADDED OUT TO A MULTIPLE OF TWO WORDS BY PADDING WITH /EAG:191 / NULLS. THUS THE ONLY CHARACTERS CHECKED TO SEE IF THEY /EAG:191 / ARE A NULL (TERMINATING THE MESSAGE) ARE THE FIFTH (LAST) /EAG:191 / CHARACTER IN EVERY DOUBLE WORD. THE NULL CHARACTERS ARE /EAG:191 / OUTPUT (VIA IN.CHR) BEFORE THEY ARE KNOWN TO BE NULLS -- /EAG:191 / IN.CHR IS SMART ENOUGH TO IGNORE THEM. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.TYP 0 /EAG:191 .X=(0) INTP.1 LAC* .X,X / GET FIRST CHAR (OF FIVE) /EAG:191 SWHA /EAG:191 RTR /EAG:191 JMS IN.CHR / AND TYPE IT /EAG:191 .X=(0) LAC* .X,X / GET SECOND CHAR (OF FIVE) /EAG:191 RTR /EAG:191 RTR /EAG:191 JMS IN.CHR / AND TYPE IT /EAG:191 .X=(1) LAC* .X,X / GET THIRD CHAR (OF FIVE) /EAG:191 RAL /EAG:191 .X=(0) XOR* .X,X /EAG:191 AND (600000) /EAG:191 .X=(0) XOR* .X,X /EAG:191 RTL /EAG:191 RAL /EAG:191 JMS IN.CHR / AND TYPE IT /EAG:191 .X=(1) LAC* .X,X / GET FOURTH CHAR (OF FIVE) /EAG:191 RAL /EAG:191 SWHA /EAG:191 JMS IN.CHR / AND TYPE IT /EAG:191 .X=(1) LAC* .X,X / GET FIFTH CHAR (OF FIVE) /EAG:191 RAR /EAG:191 JMS IN.CHR / AND TYPE IT /EAG:191 .X=(1) LAC* .X,X / ARE WE AT END OF MESSAGE? /EAG:191 AND (376) / ZERO IF SO /EAG:191 AXR 2 / BUMP XR PAST OLD WORD PAIR /EAG:191 SZA /EAG:191 JMP INTP.1 / NO -- GO DO NEXT WORD PAIR /EAG:191 JMP* IN.TYP / YES -- RETURN /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.CHR -- TYPE ONE CHARACTER FROM THE AC. ONLY THE LOW 7 /EAG:191 / BITS OF THE AC MATTER -- THE REST ARE IGNORED (MASKED OUT). /EAG:191 / LEGAL CHARACTERS INCLUDE THE ASCII GRAPHICS, TABS, AND /EAG:191 / CARRAIGE RETURNS. TAB STOPS ARE EVERY EIGHT SPACES AND /EAG:191 / CARRAIGE RETURNS ARE TRANSLATED TO CARRAIGE RETURN/LINE /EAG:191 / FEEDS. /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.CHR /EAG:191 / /EAG:191 / THIS SUBROUTINE CLOBBERS THE AC AND THE LINK. /EAG:191 / /RKB-210 / /RKB-210 / N O T I C E /RKB-210 / /RKB-210 / NOTE THAT THE ENTRY POINT (IN.CHR) IS USED AS A FLAG BY /RKB-203 / IN.GO TO DETERMINE IF A CR/LF SHOULD BE ISSUED TO THE /RKB-203 / CONSOLE TERMINAL BEFORE WE START UP THE MONITOR. THIS /RKB-203 / IS IN ORDER TO LEAVE THE PRINT HEAD AT THE LEFT MARGIN /RKB-203 / AFTER THE MONITOR IS UP IF ANY INITIALIZATION MESSAGES /RKB-203 / WERE TYPED. /RKB-203 / ZERO MEANS NO MESSAGES, ERGO NO CR/LF. THUS IT IS /RKB-203 / NECESSARY TO HAVE IN.CHR BE A '0'. /RKB-203 / /EAG:191 /EAG:191 /EAG:191 IN.CHR 0 /EAG:191 AND (177) / MASK OUT CHARACTER /EAG:191 SNA / IGNORE NULLS (ZEROS) /EAG:191 JMP INCR.3 /EAG:191 SAD (11) / CONVERT TABS TO SPACES WITH /EAG:191 INCR.0 LAW 40 / SIGN BIT SET /EAG:191 ISZ INCR.A / INCR. COLUMN COUNT (FOR TABS) /EAG:191 INCR.1 TLS / PRINT CHARACTER /EAG:191 INCR.2 TSF / WAIT FOR PRINTER TO FINISH /EAG:191 JMP INCR.2 /EAG:191 TCF / AND CLEAR FLAG SO WON'T /EAG:191 / BOTHER US (WITH INTERRUPTS) /EAG:191 SAD (15) / WAS IT CARRAIGE RETURN? /EAG:191 JMP INCR.4 / YES -- OUTPUT LINE FEED /EAG:191 CMA / CLEAR LINK IF DOING TAB, SET /EAG:191 RAL / LINK IF NOT DOING TAB /EAG:191 LAC INCR.A / HAVE WE REACHED TAB STOP YET? /EAG:191 AND (7) / ZERO SIGNIFIES YES /EAG:191 SZA!SNL / SKIPS IF NOT DOING TAB, OR /EAG:191 / TAB HAS REACHED TAB STOP /EAG:191 JMP INCR.0 / NOT DONE WITH TAB -- GO /EAG:191 / OUTPUT ANOTHER SPACE /EAG:191 INCR.3 JMP* IN.CHR / RETURN TO CALLER /EAG:191 /EAG:191 / COME HERE AFTER OUTPUTTING CARRAIGE RETURN /EAG:191 /EAG:191 INCR.4 DZM INCR.A / RESET TAB COLUMN COUNTER /EAG:191 AAC 12-15 / CONVERT CR TO LF /EAG:191 JMP INCR.1 / AND GO OUTPUT IT /EAG:191 /EAG:191 /EAG:191 INCR.A 0 / COLUMN POSITION COUNTER. /EAG:191 / USED FOR TABBING. /EAG:191 .TITLE IN.NMK,IN.NUM,IN.OCT -- NUMERIC I/O SUBR.'S /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.NMK -- TYPE A NUMBER (SUCH AS A MEMORY SIZE) IN "K" /EAG:191 / FORMAT. THIS SUBROUTINE ACCEPTS A NUMBER IN THE AC. THIS /EAG:191 / NUMBER IS INCREMENTED BY 1, DIVIDED (WITH TRUNCATION) BY /EAG:191 / 1024, AND PRINTED. IMMEDIATELY FOLLOWING THE NUMBER THE /EAG:191 / LETTER "K" IS OUTPUT. THIS FORMAT IS DESIGNED FOR /EAG:191 / OUTPUTTING MEMORY SIZES AND ADDRESSES. THE STANDARD /EAG:191 / INTERNAL FORMATS OF SUCH THINGS MAY BE GIVEN DIRECTLY TO /EAG:191 / THIS ROUTINE AND HANDLED PROPERLY. THE NUMBER WILL BE /EAG:191 / TYPED WITH LEADING ZEROS SUPPRESSED. /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.NMK /EAG:191 / /EAG:191 / THIS SUBROUTINE CLOBBERS THE AC, LINK, AND THE EAE REGISTERS /EAG:191 / (MQ AND STEP COUNTER). /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.NMK 0 /EAG:191 IAC / INCREMENT SO THAT THINGS LIKE /EAG:191 / 077777 WILL PRINT AS "32K" /EAG:191 AND (776000) / MASK TO "K" /EAG:191 SWHA / AND SHIFT "K" DOWN TO UNITS /EAG:191 CLL!RAR /EAG:191 JMS IN.NUM / TYPE NUMBER W/ ZERO SUPPRES. /EAG:191 LAW 113 / ASCII CODE FOR "K" /EAG:191 JMS IN.CHR / OUTPUT "K" /EAG:191 JMP* IN.NMK / AND RETURN /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.NUM -- TYPE A NUMBER (PASSED IN THE AC) IN DECIMAL WITH /EAG:191 / LEADING ZEROS SUPPRESSED. THE NUMBER IS ASSUMED TO BE AN /EAG:191 / UNSIGNED, POSITIVE, 18-BIT QUANTITY. IF IT IS ZERO THE /EAG:191 / SINGLE DIGIT "0" WILL BE TYPED. /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.NUM /EAG:191 / /EAG:191 / TO AVOID LEADING ZERO SUPPRESSION EXECUTE A: /EAG:193 / /EAG:193 / DZM INNM.B /EAG:193 / /EAG:193 / BEFORE CALLING THIS ROUTINE. /EAG:193 / /EAG:193 / THIS SUBROUTINE CLOBBERS THE AC, LINK, AND THE EAE REGISTERS /EAG:191 / (MQ AND STEP COUNTER). /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.NUM 0 /EAG:191 LMQ / PUT # INTO MQ /EAG:193 LAW -5 / SET UP DIGIT COUNTER. NOTE /EAG:193 DAC INNM.A / THAT COUNT DOESN'T INCLUDE /EAG:193 / FIRST DIGIT. /EAG:193 LAC (200000) / MAGIC CONSTANT IS ONE AFTER /EAG:193 / POSITION OF BINARY POINT IS /EAG:193 / CONSIDERED. /EAG:193 CLL / FOR MUL. /EAG:193 MUL-13000 / RESULT=(MQ)*(1/100000.)+(AC) /EAG:193 517427 / (1/100000.)*2**(16+18) /EAG:193 LRS+20 / ALIGN BINARY POINT BETWEEN /EAG:193 / AC AND MQ. /EAG:193 INNM.0 AAC 60 / CONVERT DIGIT TO .ASCII /EAG:193 SAD INNM.B / SKIP UNLESS LEADING ZERO. /EAG:193 JMP INNM.1 / LEADING ZERO -- IGNORE IT. /EAG:193 DZM INNM.B / NOT A LEADING ZERO -- CLEAR /EAG:193 / SWITCH SO FOLLOWING ZEROS /EAG:193 / WON'T BE SUPPRESSED. /EAG:193 JMS IN.CHR / AND TYPE OUT THE DIGIT. /EAG:193 INNM.1 CLL!CLA / FOR MUL /EAG:193 MUL-13000 / RESULT=(MQ)*(10.)*0 /EAG:193 12 / 10. /EAG:193 ISZ INNM.A / REACHED LAST DIGIT YET? /EAG:193 JMP INNM.0 / NO -- GO CHECK FOR LEADING /EAG:193 / ZEROS. /EAG:193 AAC 60 / LAST DIGIT -- CONVERT TO /EAG:193 JMS IN.CHR / ASCII AND TYPE IT, REGARDLESS /EAG:193 / OF WHETHER OR NOT IT'S ZERO. /EAG:193 LAC (60) / RESTORE ZERO SUPPRESS SWITCH /EAG:193 DAC INNM.B /EAG:193 JMP* IN.NUM /EAG:193 /EAG:193 /EAG:193 INNM.A 0 / DIGIT COUNTER /EAG:193 /EAG:193 INNM.B 60 / ZERO SUPPRESS SWITCH /EAG:193 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / IN.OCT -- TYPE A NUMBER OUT IN OCTAL WITHOUT ZERO SUPPRESSION /EAG:191 / (I.E. LEADING ZEROS ARE OUTPUT). THE NUMBER IS PASSED IN /EAG:191 / THE AC. /EAG:191 / /EAG:191 / CALLING SEQUENCE: /EAG:191 / /EAG:191 / JMS IN.OCT /EAG:191 / /EAG:191 / THIS ROUTINE CLOBBERS THE AC AND THE LINK. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.OCT 0 /EAG:191 LMQ / SAVE NUMBER TO OUTPUT /EAG:191 LAW -6 / SET UP DIGIT COUNTER /EAG:191 DAC INOC.B /EAG:191 INOC.0 CLA!CLL / GET NEXT DIGIT /EAG:193 LLS+3 /EAG:193 AAC 60 / CONVERT TO ASCII /EAG:191 JMS IN.CHR / AND OUTPUT IT /EAG:191 ISZ INOC.B / DONE YET? /EAG:191 JMP INOC.0 / NO /EAG:191 JMP* IN.OCT / YES -- RETURN TO CALLER /EAG:191 /EAG:191 /EAG:191 INOC.B 0 / DIGIT COUNTER /EAG:192 .TITLE IN.GNU,IN.GNA,IN.GNX -- SGNBLK SEARCH RTN.'S /EAG:192 /EAG:192 /EAG:192 /EAG:192 / /EAG:192 / THE FOLLOWING ROUTINES ARE FOR CONVERTING BETWEEN HANDLER /EAG:192 / NUMBERS AND HANDLER NAMES. HANDLER NAMES ARE STANDARD /EAG:192 / .SIXBT NAMES. HANDLER NUMBERS ARE NUMERIC INDICES INTO /EAG:192 / THE DEVICE HANDLER TABLE IN SGNBLK. THE FIRST TWO /EAG:192 / DEVICE HANDLERS IN THIS TABLE ARE ALWAYS "NON" AND "TTA" /EAG:192 / RESPECTIVELY. DEVICE HANDLER NUMBER ZERO IS "NON" AND /EAG:192 / NUMBER ONE IS "TTA". /EAG:192 / /EAG:192 /EAG:192 /EAG:192 /EAG:192 /EAG:192 / /EAG:192 / ROUTINE TO FIND A HANDLER NUMBER GIVEN A HANDLER NAME. /EAG:192 / CALLING SEQUENCE: /EAG:192 / /EAG:192 / JMS IN.GNU /EAG:192 / NOT FOUND RETURN /EAG:192 / FOUND RETURN /EAG:192 / /EAG:192 / EXPECTS THE HANDLER NAME (IN .SIXBT) IN THE AC. SEARCHES /EAG:192 / THE SGNBLK DEVICE HANDLER TABLE FOR THE NAMED HANDLER. IF /EAG:192 / THE NAMED HANDLER CANNOT BE FOUND THE NOT FOUND (NON-SKIP) /EAG:192 / RETURN IS TAKEN. IF THE NAMED HANDLER IS FOUND THE FOUND /EAG:192 / (SKIP) RETURN IS TAKEN AND THE HANDLER NUMBER IS RETURNED /EAG:192 / IN THE AC. /EAG:192 / /EAG:192 / CLOBBERS THE XR AND LR AND LINK. /EAG:192 / /EAG:192 /EAG:192 /EAG:192 IN.GNU 0 /EAG:192 DAC INGU.A / REMEMBER HANDLER NAME /EAG:192 DZM INGU.B / ZERO HANDLER NUMBER /EAG:192 CLA / AND SET UP IN.GNX TO /EAG:192 JMS IN.GNA / START AT HANDLER #1 (TTA.) /EAG:192 JMP* IN.GNU / NOT FOUND -- RETURN /EAG:192 INGU.0 SAD INGU.A / FOUND HANDLER YET? /EAG:192 JMP INGU.1 / YES -- GO RETURN /EAG:192 ISZ INGU.B / NO -- BUMP HANDLER NUMBER /EAG:192 JMS IN.GNX / AND GET NEXT HANDLER /EAG:192 JMP* IN.GNU / NOT FOUND -- RETURN /EAG:192 JMP INGU.0 / GO CHECK OUT THIS ONE /EAG:192 /EAG:192 /EAG:192 INGU.1 LAC INGU.B / PICK UP HANDLER NUMBER /EAG:192 ISZ IN.GNU / BUMP RETURN ADDRESS /EAG:192 JMP* IN.GNU / AND RETURN /EAG:192 /EAG:192 /EAG:192 INGU.A 0 / TEMPORARY IN WHICH TO /EAG:192 / SAVE HANDLER NAME /EAG:192 /EAG:192 INGU.B 0 / TEMPORARY IN WHICH TO /EAG:192 / ACCUMULATE HANDLER # /EAG:192 /EAG:192 /EAG:192 /EAG:192 /EAG:192 / /EAG:192 / ROUTINE TO FIND A HANDLER NAME GIVEN A HANDLER NUMBER. /EAG:192 / CALLING SEQUENCE: /EAG:192 / /EAG:192 / JMS IN.GNA /EAG:192 / NOT FOUND RETURN /EAG:192 / FOUND RETURN /EAG:192 / /EAG:192 / THE HANDLER NUMBER IS EXPECTED IN THE AC. IF SAID /EAG:192 / HANDLER NUMBER EXISTS ITS NAME (IN .SIXBT) IS RETURNED /EAG:192 / IN THE AC AND THE FOUND (SKIP) RETURN IS TAKEN. IF /EAG:192 / SAID HANDLER DOES NOT EXIST (I.E., THE HANDLER NUMBER IS /EAG:192 / LARGER THAN THE NUMBER OF HANDLERS IN SGNBLK) THE NOT /EAG:192 / FOUND (NON-SKIP) RETURN IS TAKEN. /EAG:192 / /EAG:192 / CLOBBERS THE XR AND LR AND LINK. /EAG:192 / /EAG:192 /EAG:192 /EAG:192 IN.GNA 0 /EAG:192 AND (77777) / MASK OFF ANY UNIT NUMBER /EAG:200 CMA / TRANSFORM HANDLER # /EAG:192 DAC INGA.A / INTO LOOP COUNT /EAG:192 LAC SG.NMP / SET UP XR TO START OF /EAG:192 TAD SG.NMD / DEVICE HANDLER TABLE -1 /EAG:192 TAD SG.NMS /EAG:192 PAX /EAG:192 LAC SG.FRE / AND LR TO ITS END /EAG:192 PAL /EAG:192 INGA.0 JMS IN.GNX / GET FIRST HANDLER NAME /EAG:192 JMP* IN.GNA / REACHED END OF TABLE /EAG:192 / => NOT FOUND RETURN /EAG:192 ISZ INGA.A / REACHED RIGHT HANDLER? /EAG:192 JMP INGA.0 / NO -- LOOP SOME MORE /EAG:192 ISZ IN.GNA / YES -- BUMP RETURN ADDRESS /EAG:192 JMP* IN.GNA / AND RETURN WITH HANDLER /EAG:192 / NAME STILL IN AC /EAG:192 /EAG:192 /EAG:192 INGA.A 0 / TEMPORARY USED FOR LOOP /EAG:192 / COUNTER /EAG:192 /EAG:192 /EAG:192 /EAG:192 /EAG:192 / /EAG:192 / ROUTINE TO GET THE NEXT HANDLER NAME. THIS ROUTINE IS /EAG:192 / PRIMARILY A SUBROUTINE USED BY IN.GNA, BUT IT ALSO /EAG:192 / MAY BE CALLED INDEPENDENTLY TO SEARCH THROUGH THE /EAG:192 / ENTIRE DEVICE HANDLER TABLE. CALLING SEQUENCE: /EAG:192 / /EAG:192 / JMS IN.GNX /EAG:192 / END OF TABLE REACHED RETURN /EAG:192 / NORMAL RETURN /EAG:192 / /EAG:192 / THE XR AND LR MUST BE PRESERVED FROM THE PREVIOUS CALL /EAG:192 / TO IN.GNA OR IN.GNX (THIS ROUTINE). IN.GNA MUST BE /EAG:192 / CALLED BEFORE CALLING THIS ROUTINE SO AS TO SET UP /EAG:192 / THE XR AND LR. TO LOOP THROUGH ALL THE DEVICE HANDLERS /EAG:192 / (EXCEPTING "NON") IN THE DEVICE HANDLER TABLE PROCEED /EAG:192 / AS FOLLOWS: /EAG:192 / /EAG:192 / CLA /EAG:192 / JMS IN.GNA /EAG:192 / SGNBLK FORMAT ERROR /EAG:192 / LOOP JMS IN.GNX /EAG:192 / JMP DONE /EAG:192 / /EAG:192 / JMP LOOP /EAG:192 / /EAG:192 / NOTE THAT THIS ROUTINE RETURNS THE HANDLER NAME IN THE AC. /EAG:192 / /EAG:192 / CLOBBERS THE LINK, UPDATES THE XR AND LR. /EAG:192 / /EAG:192 /EAG:192 /EAG:192 IN.GNX 0 /EAG:192 INGX.0 LAW 777700 / ARE WE AT END OF HANDLERS /EAG:192 AND SG.BAS+1,X / FOR THIS DEVICE? /EAG:192 SNA / SKIP IF NOT /EAG:192 JMP INGX.1 / YES -- GO BUMP XR PAST /EAG:192 / SKIPS FOR THIS DEVICE /EAG:192 LAC SG.BAS+1,X / PICK UP HANDLER NAME (OR /EAG:192 / WORD FOLLOWING HANDLER /EAG:192 / TABLE) /EAG:192 AXS 1 / BUMP XR AND CHECK FOR /EAG:192 / END OF HANDLER TABLE /EAG:192 ISZ IN.GNX / NOT END OF TABLE -- /EAG:192 / TAKE NORMAL RETURN /EAG:192 JMP* IN.GNX /EAG:192 /EAG:192 /EAG:192 / COME HERE IF WE'VE RUN OUT OF HANDLERS FOR THIS DEVICE /EAG:192 / WE BUMP THE XR PAST THE SKIPS FOR THIS DEVICE AND THEN GO /EAG:192 / TRY AGAIN. /EAG:192 /EAG:192 INGX.1 PXA /EAG:192 TAD SG.BAS+1,X /EAG:192 TAD SG.BAS+1,X /EAG:192 TAD SG.BAS+1,X /EAG:192 PAX /EAG:192 AXS 1 / CHECK IF HAVE REACHED END /EAG:192 JMP INGX.0 / NO -- GO TRY AGAIN /EAG:192 JMP* IN.GNX / YES -- TAKE THAT RETURN /EAG:192 .TITLE IN.SSB -- ROUTINE TO SEARCH SYSBLK /EAG:197 /EAG:197 /EAG:197 /EAG:197 / /EAG:197 / THIS ROUTINE SEARCHES SYSBLK FOR A SPECIFIED ENTRY. /EAG:197 / WHEN THIS ROUTINE IS CALLED THE AC SHOULD CONTAIN A /EAG:197 / POINTER TO TWO WORDS CONTAINING THE ENTRY'S NAME IN /EAG:197 / .SIXBT. AT EXIT THE XR CONTAINS A POINTER, RELATIVE /EAG:197 / TO SB.BAS, TO THE APPROPRIATE SYSBLK ENTRY. /EAG:197 / /EAG:197 / CALLING SEQUENCE: /EAG:197 / /EAG:197 / LAC (NAMBLK) /EAG:197 / JMS IN.SSB /EAG:197 / /EAG:197 / /EAG:197 / . /EAG:197 / . /EAG:197 / . /EAG:197 / NAMBLK .SIXBT "NAME" /EAG:197 / /EAG:197 / THE SYSBLK ENTRY SHOULD BE ACCESSED BY INSTRUCTIONS OF /EAG:197 / THE FORM: /EAG:197 / /EAG:197 / LAC SB.BAS+SB.FA,X / GET FIRST CORE ADDRESS /EAG:197 / LAC SB.BAS+SB.NB,X / GET NUMBER OF DISK BLOCKS /EAG:197 / ETC. /EAG:197 / /EAG:197 / FOR DETAILS OF THE FORMAT OF SYSBLK AND ITS ENTRIES SEE /EAG:197 / THE COMMENTS AT THE BEGINNING OF THE MONITOR, WHERE THE /EAG:197 / SYMBOLS SB.** ARE DEFINED. /EAG:197 / /EAG:197 / CLOBBERS THE XR, LR, AC, AND LINK. /EAG:197 / /EAG:197 /EAG:197 IN.SSB 0 /EAG:197 DAC INSS.A / SAVE POINTERS TO THE TWO /EAG:197 IAC / NAME WORDS /EAG:197 DAC INSS.B /EAG:197 LAC SB.FRE / POINT LR TO END OF /EAG:197 PAL / SYSBLK ENTRIES. /EAG:197 CLX / AND XR TO FIRST ENTRY /EAG:197 AXR SB.BEG-SB.BAS /EAG:197 INSS.0 LAC SB.BAS+SB.NM1,X / GET FIRST NAME WORD /EAG:197 SAD* INSS.A / IS IT WHAT WE'RE LOOKING FOR /EAG:197 SKP / MAYBE /EAG:197 JMP INSS.1 / NO -- TRY NEXT ENTRY /EAG:197 LAC SB.BAS+SB.NM2,X / GET SECOND NAME WORD /EAG:197 SAD* INSS.B / IS IT A MATCH? /EAG:197 JMP INSS.2 / YES -- GO TAKE FOUND RETURN /EAG:197 INSS.1 AXS SB.LEN / TRY NEXT ENTRY /EAG:197 JMP INSS.0 /EAG:197 JMP* IN.SSB / REACHED END OF SYSBLK -- /EAG:197 / TAKE NOT FOUND EXIT. /EAG:197 /EAG:197 /EAG:197 / COME HERE WHEN FIND ENTRY WE WANT. /EAG:197 /EAG:197 INSS.2 ISZ IN.SSB / BUMP TO FOUND EXIT /EAG:197 JMP* IN.SSB / AND TAKE IT /EAG:197 /EAG:197 /EAG:197 /EAG:197 INSS.A -1 / POINTERS TO TWO WORDS /EAG:197 INSS.B -1 / CONTAINING NAME WE'RE /EAG:197 / LOOKING FOR /EAG:197 .TITLE IN.MOV -- SUBROUTINE TO ADD CODE TO MONITOR /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / THIS SUBROUTINE IS USED TO APPEND A PIECE OF CODE (SUCH /EAG:193 / AS THE CTRL-X PROCESSOR, BATCH PROCESSOR, ETC.) TO THE /EAG:193 / RESIDENT MONITOR, RELOCATING THE CODE AS APPROPRIATE. /EAG:193 / /EAG:193 / THE BLOCK OF CODE TO BE ADDED MUST BE DIVIDED INTO TWO /EAG:193 / SECTIONS -- A RELOCATABLE SECTION AND AN ABSOLUTE SECTION. /EAG:193 / THE RELOCATABLE SECTION MUST PRECEDE THE ABSOLUTE SECTION /EAG:193 / WITH NO GAP SEPERATING THEM. EITHER SECTION MAY BE EMPTY. /EAG:193 / THE RELOCATABLE SECTION MUST CONTAIN INSTRUCTIONS /EAG:193 / EXCLUSIVELY. THE OPCODE FIELD OF EACH WORD IN THE /EAG:193 / RELOCATABLE SECTION IS EXAMINED TO DETERMINE IF THE WORD'S /EAG:193 / ADDRESS FIELD SHOULD BE RELOCATED. THE ABSOLUTE /EAG:193 / SECTION IS COPIED WITHOUT ANY RELOCATION. NOTE THAT /EAG:193 / NO PROVISION IS MADE IN EITHER SECTION FOR RELOCATING /EAG:193 / TRANSFER VECTORS. /EAG:193 / /EAG:193 / IN ADDITION TO CHECKING OPCODES OF INSTRUCTIONS WITHIN /EAG:193 / THE RELOCATABLE SECTION THIS ROUTINE ALSO CHECKS THE /EAG:193 / OPERAND ADDRESS OF MEMORY REFERENCE INSTRUCTIONS WHEN /EAG:193 / DETERMINING WHETHER OR NOT TO RELOCATE A WORD. THE /EAG:193 / WORD WILL ONLY BE RELOCATED IF ITS OPERAND ADDRESS FALLS /EAG:193 / WITHIN THE BLOCK OF CODE BEING ADDED TO THE MONITOR. IF /EAG:193 / THE ADDRESS IS OUTSIDE THIS RANGE IT WILL NOT BE /EAG:193 / ALTERATION. THIS IS USEFUL WHEN MAKING DIRECT REFERENCES /EAG:193 / TO .SCOM OR OTHER PARTS OF THE MONITOR. IN ORDER TO /EAG:193 / USE THIS FEATURE THE BLOCK OF CODE MUST BE ASSEMBLED /EAG:193 / WITHIN PAGE ZERO. /EAG:193 / /EAG:193 / THE BLOCK OF CODE WILL BE ADDED IMMEDIATELY ABOVE THE /EAG:193 / MONITOR AS DETERMINED BY SC.RMS. SC.RMS WILL BE /EAG:193 / UPDATED BY THE SIZE OF THE BLOCK OF CODE, UNLESS THE /EAG:193 / ATTEMPT TO ADD THE BLOCK OF CODE FAILS. /EAG:193 / /EAG:193 / THIS ROUTINE PERFORMS SEVERAL CHECKS AS IT ADDS THE CODE /EAG:193 / TO THE MONITOR. THE PURPOSE OF THESE CHECKS IS TO ENSURE /EAG:193 / THAT NO PAGE BOUNDARY VIOLATIONS WILL OCCUR WHEN THE /EAG:193 / CODE IS EXECUTED. THE CHECKS ARE AS FOLLOWS. THE /EAG:193 / RELOCATABLE SECTION (WHEN IN POSITION) MUST NOT CROSS /EAG:193 / A PAGE BOUNDARY AND MUST BE ENTIRELY WITHIN PAGE ZERO. /EAG:193 / THE OPERAND ADDRESSES OF ALL MEMORY /EAG:193 / REFERENCE INSTRUCTIONS IN THE RELOCATABLE SECTION MUST /EAG:193 / NOT CROSS A PAGE BOUNDARY. NOTE THAT THE ABSOLUTE SECTION /EAG:193 / MAY CROSS A PAGE BOUNDARY SO LONG AS NO INSTRUCTION IN THE /EAG:193 / RELOCATABLE SECTION ADDRESSES A LOCATION ABOVE THE /EAG:193 / BOUNDARY. IF EITHER OF THESE CHECKS FAIL THE CODE WILL /EAG:193 / NOT BE ADDED TO THE MONITOR, SC.RMS WILL NOT BE ALTERED, /EAG:193 / AND THE LINK WILL BE SET ON RETURN. /EAG:193 / /EAG:193 / CALLING SEQUENCE: /EAG:193 / /EAG:193 / JMS IN.MOVE /EAG:193 / XXREL / FIRST ADDRESS OF CODE BLOCK /EAG:193 / / ALSO START OF RELOC. SECTION /EAG:193 / XXABS / START OF ABSOLUTE SECTION /EAG:193 / / (WHICH FOLLOWS RELOC. SEC.) /EAG:193 / XXEND / ADDRESS FOLLOWING END OF /EAG:193 / / CODE BLOCK /EAG:193 / /EAG:193 / UPON RETURN THE LINK WILL INDICATE WHETHER OR NOT THE ATTEMPT /EAG:193 / WAS SUCCESSFUL -- I.E. WHETHER OR NOT A PAGE BOUNDARY /EAG:193 / VIOLATION WAS ENCOUNTERED. THE LINK IS CLEAR IS IT WAS /EAG:193 / SUCCESSFUL, SET IF IT FAILED. IF THE LINK IS CLEAR SC.RMS /EAG:193 / WILL HAVE BEEN UPDATED BY THE LENGTH OF THE CODE BLOCK /EAG:193 / (XXEND-XXREL). IF THE LINK IS SET SC.RMS WILL BE /EAG:193 / UNCHANGED. /EAG:193 / /EAG:193 /EAG:193 /EAG:193 IN.MOV 0 /EAG:193 LAC* (SC.RMS) / PICK UP DEST. ADDRESS AND /EAG:193 DAC INMV.A / PUT IT WHERE WE CAN USE IT /EAG:193 LAC* IN.MOV / CALCULATE ADDRESS WHERE CODE /EAG:193 XOR IN.BNK / IS NOW AND PUT IT WHERE WE /EAG:193 DAC INMV.B / CAN USE IT. /EAG:193 LAC* IN.MOV / SET UP A CONSTANT FOR /EAG:193 TCA / ADDRESS BOUNDS CHECKING /EAG:193 DAC INMV.C /EAG:193 ISZ IN.MOV / BUMP TO ABS. SECTION ADDR. /EAG:193 TAD* IN.MOV / GET LENGTH OF RELOC. SECT. /EAG:193 ISZ IN.MOV / BUMP TO END ADDRESS /EAG:193 SNA / DOES RELOCATABLE SECT. /EAG:193 JMP INMV.5 / HAVE NON-ZERO LENGTH? /EAG:193 / IF NOT, IGNORE IT /EAG:193 PAL / LENGTH OF RELOC. SECT. TO LR /EAG:193 TAD INMV.A / VERIFY THAT RELOC. SECT. /EAG:193 AND (770000) / WILL FIT WITHIN PAGE ZERO. /EAG:193 SZA /EAG:193 JMP INMV.7 / IT WON'T -- FAIL /EAG:193 LAC INMV.B / GET LOW 12 BITS OF WHERE /EAG:193 AND (7777) / CODE IS NOW, /EAG:193 TCA / AND CALCULATE RELOCATION /EAG:193 TAD INMV.A / FACTOR. /EAG:193 DAC INMV.D / SAVE IT IN INMV.D. /EAG:193 CLX / START AT THE BEGINNING. /EAG:193 INMV.0 LAC* INMV.B,X / FETCH NEXT WORD OF REL. SECT. /EAG:193 AND (740000) / MASK OUT OPCODE. /EAG:193 SAD (CAL) / CHECK TO SEE IF ITS NOT A /EAG:193 JMP INMV.3 / MEMORY REFERENCE INSTRUCTION. /EAG:193 SAD (EAE) / IF SO, GO TO INMV.3 TO HANDLE /EAG:193 JMP INMV.3 / NON-RELOCATED WORD. /EAG:193 SAD (IOT) /EAG:193 JMP INMV.3 /EAG:193 SAD (OPR) /EAG:193 JMP INMV.3 /EAG:193 PXA / DETERMINE ADDRESS WHERE THE /EAG:193 TAD INMV.B / INSTRUCTION IS NOW, /EAG:193 XOR IN.BNK / WITHOUT BANK BITS. /EAG:193 XOR* INMV.B,X / CALCULATE OPERAND ADDRESS. /EAG:193 AND (770000) /EAG:193 XOR* INMV.B,X /EAG:193 TAD INMV.C / AND CHECK IF IT IS WITHIN /EAG:193 SPA!TCA / THE CODE BLOCK. /EAG:193 JMP INMV.1 / JMP IF IT ISN'T. /EAG:193 TAD INMV.C /EAG:193 TAD* IN.MOV /EAG:193 SMA!SZA!TCA / SKIP IF IT ISN'T. /EAG:193 JMP INMV.4 / JMP IF IT IS. /EAG:193 TAD* IN.MOV / RESTORE OPERAND ADDRESS. /EAG:193 JMP INMV.2 /EAG:193 /EAG:193 INMV.1 TAD INMV.C / RESTORE OPERAND ADDRESS. /EAG:193 TCA /EAG:193 / COME HERE WITH OPERAND ADDRESS IN AC IF OPERAND ADDRESS /EAG:193 / IS NOT WITHIN CODE BLOCK. /EAG:193 INMV.2 XOR INMV.A / VERIFY THAT OPERAND ADDRESS /EAG:193 AND (770000) / (WHICH WILL NOT BE RELOCATED) /EAG:193 SZA / WILL BE IN SAME PAGE AS CODE. /EAG:193 JMP INMV.7 / NO -- FAIL. /EAG:193 INMV.3 CLA!SKP / COME HERE FOR NON-RELOCATED /EAG:193 / INSTRUCTIONS. /EAG:193 INMV.4 LAC INMV.D / COME HERE FOR RELOCATED /EAG:193 / INSTRUCTIONS. /EAG:193 TAD* INMV.B,X / CALCULATE RELOCATED INSTR. /EAG:193 DAC* INMV.A,X / AND PUT IT WHERE ITS GOING. /EAG:193 XOR* INMV.B,X / VERIFY PAGE VIOLATION DIDN'T /EAG:193 AND (770000) / OCCUR. /EAG:193 SZA / SKIP IF OK. /EAG:193 JMP INMV.7 / IT DID -- FAIL. /EAG:193 AXS 1 / BUMP TO NEXT WORD /EAG:193 JMP INMV.0 /EAG:193 INMV.5 LAC* IN.MOV / CALCULATE TOTAL LENGTH OF /EAG:193 TAD INMV.C / CODE BLOCK. /EAG:193 PAL / AND PUT IN LR. /EAG:193 INMV.6 LAC* INMV.B,X / COPY ABSOLUTE SECTION INTO /EAG:193 DAC* INMV.A,X / PLACE. /EAG:193 AXS 1 /EAG:193 JMP INMV.6 /EAG:193 PLA / GET LENGTH OF CODE BLOCK, /EAG:193 TAD INMV.A / GET END ADDR. OF CODE BLOCK, /EAG:193 DAC* (SC.RMS) / AND UPDATE SC.RMS. /EAG:193 CLL / ZERO LINK INDICATES SUCCESS /EAG:193 ISZ IN.MOV / BUMP TO RETURN ADDRESS /EAG:193 JMP* IN.MOV / AND RETURN. /EAG:193 /EAG:193 /EAG:193 / COME HERE IF PAGE BOUNDARY VIOLATION CAUSES FAILURE. /EAG:193 /EAG:193 INMV.7 STL / SET LINK INDICATES FAILURE. /EAG:193 ISZ IN.MOV / BUMP TO RETURN ADDRESS /EAG:193 JMP* IN.MOV / AND RETURN /EAG:193 /EAG:193 /EAG:193 /EAG:193 INMV.A 0 / POINTER TO WHERE CODE BLOCK /EAG:193 / IS GOING. /EAG:193 /EAG:193 INMV.B 0 / POINTER TO WHERE CODE BLOCK /EAG:193 / IS COMING FROM. /EAG:193 /EAG:193 INMV.C 0 / TWO'S COMPLEMENT OF START /EAG:193 / ADDRESS OF CODE BLOCK (AND /EAG:193 / RELOCATABLE SECTION) /EAG:193 /EAG:193 INMV.D 0 / RELOCATION FACTOR. /EAG:193 .TITLE GLOBAL VARIABLES USED BY INIT. CODE /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / DEFINE THE VARIOUS GLOBAL VARIABLES USED WITHIN THE /EAG:191 / MONITOR INITIALIZATION CODE. ANY LOCATION WHICH IS NOT /EAG:191 / STRICTLY A LOCAL TEMPORARY IS A GLOBAL VARIABLE. FOR /EAG:191 / EACH VARIABLE WE INCLUDE WHICH ROUTINE SETS IT UP. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THE FOLLOWING LOCATIONS ARE SET UP AT THE VERY BEGINNING /EAG:191 / OF THE INITIALIZATION PROCESS -- I.E. BY INIT ITSELF. /EAG:191 / THESE LOCATIONS ARE USED TO SAVE VARIOUS BITS OF INFORMATION /EAG:191 / FROM THE OLD BANK ZERO FOR USE LATER IN THE INITIALIZATION /EAG:191 / PROCESS. THESE MUST BE REMEMBERED HERE BECAUSE BANK ZERO /EAG:191 / IS ZEROED AT THE BEGINNING OF INITIALIZATION. /EAG:191 / IT SHOULD BE NOTED THAT AT THE SAME TIME THESE LOCATIONS ARE /EAG:191 / SET UP AN IMAGE OF .SCOM IS ALSO SAVED FROM BANK ZERO TO /EAG:191 / THIS BANK. THIS IMAGE OF .SCOM IS CONCEPTUALLY INCLUDED /EAG:191 / WITH THE FOLLOWING LOCATIONS. WE DO NOT ALLOCATE SPACE FOR /EAG:191 / IT BECAUSE THE IMAGE IS STORED AT THE "SAME" POSITION IN /EAG:191 / THIS BANK AS .SCOM NORMALLY OCCUPIES IN BANK ZERO. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.BNK 0 / ADDRESS OF HIGHEST BANK OF /EAG:191 / MEMORY -- I.E. THE BANK IN /EAG:191 / WHICH THE BOOTSTRAP IS /EAG:191 / LOCATED. ALSO KNOWN AS "BANK /EAG:191 / BITS". THIS ADDRESS /EAG:191 / CALCULATED BY MASKING THE OLD /EAG:191 / SC.COD WITH 60000. /EAG:191 /EAG:191 /EAG:191 IN.RMS 0 / LOCATION IN WHICH TO SAVE /EAG:191 / SIZE OF RESIDENT MONITOR /EAG:191 / PROPER. COPIED FROM LOCATION /EAG:191 / SC.RMS IN DISK IMAGE OF /EAG:191 / RESIDENT MONITOR /EAG:191 /EAG:191 /EAG:191 IN.SVD .BLOCK 400 / AREA IN WHICH TO SAVE OLD /EAG:191 / .DAT AND .UFDT TABLES. 256 /EAG:191 / DECIMAL WORDS ARE ENOUGH /EAG:191 / BECAUSE IMAGE OF .DAT AND /EAG:191 / .UFDT IS INCLUDED IN SGNBLK, /EAG:191 / WHICH IS 256 WORDS LONG. /EAG:191 /EAG:191 /EAG:191 /EAG:191 /EAG:191 / /EAG:191 / THE FOLLOWING LOCATIONS ARE SET UP BY IN.HWA TO REFLECT THE /EAG:191 / HARDWARE CONFIGURATION UPON WHICH WE ARE RUNNING. WITH THE /EAG:191 / EXCEPTION OF IN.AMS THEY ARE ALL "SKIP SWITCHES". EACH /EAG:191 / SWITCH CORRESPONDS TO A PARTICULAR PIECE OF HARDWARE. THE /EAG:191 / SWITCH LOCATION CONTAINS A SKP IF THE HARDWARE IS PRESENT /EAG:191 / IN THE CONFIGURATION, A NOP IF THE HARDWARE IS NOT PRESENT. /EAG:191 / THUS AN EXECUTE OF THE SWITCH (XCT IN.S**) BECOMES A "SKIP /EAG:191 / IF HARDWARE PRESENT" INSTRUCTION. /EAG:191 / /EAG:191 /EAG:191 /EAG:191 IN.AMS 0 / ACTUAL (PHYSICAL) MEMORY SIZE /EAG:191 / OF THE CONFIGURATION ON WHICH /EAG:191 / WE ARE RUNNING. THE VALUE /EAG:191 / STORED IS THE ADDRESS OF THE /EAG:191 / LAST LOCATION OF MEMORY (I.E. /EAG:191 / 177777 FOR A 64K SYSTEM). /EAG:191 / THIS IS THE SAME FORMAT AS /EAG:191 / .SCOM LOCATION SC.AMS, WHICH /EAG:191 / IS SET UP BY COPYING THIS /EAG:191 / LOCATION INTO IT. /EAG:191 /EAG:191 /EAG:191 IN.SAPI HLT / SKIP IF API PRESENT /EAG:191 / INSTRUCTION. CONTAINS SKP IF /EAG:191 / API PRESENT, NOP OTHERWISE. /EAG:191 /EAG:191 /EAG:191 IN.SUC HLT / SKIP IF UNICHANNEL PRESENT /EAG:191 / INSTRUCTION. CONTAINS SKP /EAG:191 / IF UC15 PRESENT, NOP /EAG:191 / OTHERWISE. /EAG:191 /EAG:191 /EAG:191 IN.SXM HLT / SKIP IF XVM MACHINE /EAG:191 / INSTRUCTION. CONTAINS SKP IF /EAG:191 / RUNNING ON XVM, NOP IF ON /EAG:191 / ORDINARY PDP-15. NOTE THAT A /EAG:191 / PDP-15 WITH THE XM15 OPTION /EAG:191 / COUNTS AS AN XVM. /EAG:191 /EAG:191 /EAG:191 IN.SVT HLT / SKIP IF VT15 PRESENT /EAG:191 / INSTRUCTION. CONTAINS SKP /EAG:191 / IF VT15 PRESENT, NOP /EAG:191 / OTHERWISE. /EAG:191 /EAG:191 /EAG:191 IN.SCLK HLT / SKIP IF KW15 PRESENT /EAG:191 / INSTRUCTION. CONTAINS SKP /EAG:191 / IF KW15 REAL TIME CLOCK IS /EAG:191 / PRESENT, NOP OTHERWISE. /EAG:191 /EAG:193 /EAG:193 /EAG:193 /EAG:193 / /EAG:193 / FOLLOWING LOCATION IS A FLAG USED TO RECORD THE OCCURANCE /EAG:193 / OF A NON-FATAL MEMORY OVERFLOW. THIS IS THE CASE WHEN THERE /EAG:193 / IS INSUFFICIENT ROOM TO LOAD THE VT15 (CTRL-X) HANDLER, /EAG:193 / THE MONITOR PATCH AREA, BATCH, OR THE LIKE. NORMALLY WE /EAG:193 / RECOVER FROM SUCH PROBLEMS BY MERELY NOT LOADING THE /EAG:193 / OFFENDING MODULE. HOWEVER, IF BOSS IS ACTIVE WE MUST /EAG:193 / ISSUE THE APPROPRIATE .SYSLD ERROR AND ABORT THE JOB. /EAG:193 / THIS CAN'T BE DONE UNTIL WE HAVE COMPLETELY SET UP THE /EAG:193 / MONITOR, HOWEVER. THUS THIS SWITCH. /EAG:193 / /EAG:193 / THE NORMAL STATE OF THIS SWITCH IS -1. IF A MEMORY OVERFLOW /EAG:193 / OCCURS, THE SWITCH WILL BE CLEARED. THE ROUTINE IN.LDR /EAG:193 / CHECKS THIS SWITCH AND DOES THE APPROPRIATE THING. IN.LDR /EAG:193 / MAY OR MAY NOT CLOBBER THE SWITCH AS IT CHECKS IT -- THUS /EAG:193 / NO ONE ELSE SHOULD EVER CHECK IT. /EAG:193 / /EAG:193 /EAG:193 /EAG:193 IN.OVF -1 / MEMORY OVERFLOW FLAG /EAG:193 /EAG:196 /EAG:196 /EAG:196 /EAG:196 / /EAG:196 / THE FOLLOWING LOCATION IS USED TO REMEMBER THE ADDRESS /EAG:196 / OF THE COMMAND INPUT DEVICE. THE DEFAULT IS TTA. IF /EAG:196 / NON-BOSS BATCH IS IN EFFECT IN.BAT POINTS THIS LOCATION /EAG:196 / TO THE BATCH HANDLER. BOSS MAY PLAY WITH THIS TOO (ACTUALLY /EAG:196 / IN.BOS) BUT I DON'T KNOW ABOUT IT WHEN MAKING THESE COMMENTS. /EAG:196 / /EAG:196 /EAG:196 IN.CMD TTA. / COMMAND INPUT DEVICE HANDLER /EAG:196 / /RKB-198 / /RKB-198 / /RKB-198 / THE FOLLOWING LOCATION IS USED TO REMEMBER THE ADDRESS /RKB-198 / OF THE CONSOLE PRINTER DEVICE HANDLER. THE DEFAULT IS /RKB-198 / TTA. IF BOSS IS BEING USED, IN.BOS SETS IN.CNSL TO POINT /RKB-198 / THE THE RESIDENT BOSS MESSAGE ROUTER (BS.DT3) WHICH /RKB-198 / SENDS ALL .DAT -3 OUTPUT TO .DAT 6 (LP) UNLESS SC.BTT OF /RKB-198 / SC.BOSS IS SET. /RKB-198 / THIS SCHEME COULD ALSO BE VERY USEFUL IN FUTURE SYSTEMS (FS) /RKB-198 / /RKB-198 / /RKB-198 /RKB-198 IN.CNSL .DSA TTA. / CONSOLE PRINTER HANDLER /RKB-198 /EAG:199 /EAG:199 /EAG:192 /EAG:192 .LTORG /EAG:193 /EAG:193 .IFPNZ .-SB.BAS /EAG:193 ERROR RESIDENT MONITOR OVERLAPS SYSBLK /EAG:193 ERROR .LOC .-1 /EAG:193 .ENDC /EAG:193 /EAG:193 .END IN /EAG:193