.SYSID < .TITLE EXECUTE >,< 000> / / EDIT#003 NS.DG 7-APR-74 / 004 SK 22-OCT-74 ENABLE BANK MODE OPERATION / 005 SK 30-OCT-74 PERMIT EXTRA 4K / REMOVE RESTRICTION ON MAXM. # OF LINKS / REMOVE ILLEGAL PDP-9 INST. / 006 SK 1-NOV-74 BOSS15 SETUP FOR TTY I/O / 007 EAG 6-JAN-75 CHANGE HELLO MESSAGE TO V3B000 / 008 EAG 25-JUN-75 CHANGE CLEAR SUBROUTINE /EAG:008 / SO IT WON'T CLOBBER /EAG:008 / BOOTSTRAP WITH X4K /EAG:008 / 100 24-JUL-75 (RCHM) CHANGE TO EXECUT AND MAKE XVM CHANGES. / SAVE AND RESTORE MQ, AC, AND SC AFTER OVERLAYS. / 101 04-AUG-75 (RCHM) FIX MISUNDERSTANDING ABOUT .XVMON AND .XVM OFF. / 102 04-AUG-75 (RCHM) USE NEW BIT IN ENVIRONMENT WORD FOR UPWARD / COMPATABILITY BETWEEN CHAINS. / 103 06-AUG-75 (RCHM) NEW WORD IN RESIDENT LINK RECORD. WORD 20 IS NOW / THE WORD CONTAINING THE INFORMATION ON EXTENDED MEMORY / BOUNDS. / 103 15-OCT-75 (RCHM) MAKE SURE HELLO DOES NOT APPEAR ON TTY / DURING BOSS PROCESSING. / / / / / / GENERAL REMARKS: / / THE SYSTEM LOADER ENTERS AT 'EXECUT'. / THE USER LINK TABLE ENTRY ENTERS AT 'LKOVLA'. / / AC, LR, AUTO INDEX 10,11 ARE SAVED & RESTORED. / / **** THE INPUT HANDLER MUST SUPPORT .TRAN & .FSTAT *** / / / THE PROGAM USES 1 BUFFER FROM THE BUFFER POOL DURING ITS OVERLAY / PROCESSING. BEFORE ENTERING THE USER PROGRAM IT IS RELEASED. / NO BUFFERS ARE REQUIRED BY EXECUTE DURING USER PROGRAM / EXECUTION. // / / IF NO OVERLAYS: / / THE MAIN PROGRAM IS LOADED IF IT CAN FIT & THEN EXECUT / FREES ITS BUFFER AND ITS CORE AREA. CONTROL THEN GOES / TO THE USER PROGRAM'S MAIN ENTRY POINT. / / / IF OVERLAYS: / / IF THE OVERLAY SYSTEM CAN FIT, EXECUT LOADS THE LINK TABLE, / RESIDENT CODE, & THEN EACH LINK & THEREBY BUILDS A RESIDENT / LINK POINTER TABLE (LPT). / / THE LPT IS USED DURING OVERLAYS FOR DIRECT ACCESS OF THE LINKS / VIA TABLE LOOK-UP. / / FOR STORAGE EFFICIENCY, THE LPT OVERWRITES THE SETUP CODE. / / / AFTER ESTABLISHING THE LPT, CONTROL IS PASSED TO THE USER / PROGRAM'S MAIN ENTRY POINT. / // / / / / ERROR MESSAGES: / / / IOPS13... FILE NOT FOUND / CAN'T FIT... NOT ENOUGH CORE / TOO MANY LINKS... LINK POINTER TABLE TOO SMALL / IOPS55... NOT ENOUGH BUFFERS IN THE BUFFER POOL / / CAN'T RUN... WRONG SYSTEM MODE(PAGE/BANK) / WRONG MODE MODE DIFFERS BETWEEN LOAD AN CURRENT ENVIRONMENT. / WRONG BOOT WRONG BOOT ADDRESS. / /////////////// / MASK1 0 /(RCHM-100) ADDRESS MASK. MASK2 0 /(RCHM-100) OP CODE MASK. / / ////////////////// / / / SYSTEM PARAMETERS / / / / .SCOM=100 /MONITOR COMMUNICATION TABLE. SC.MOD=.SCOM+4 /(RCHM-101) SC.FRH=.SCOM+76 /(RCHM-100) BASE OF EXTEND MEMORY POINTERS. SC.NMF=.SCOM+42 /(RCHM-100) NON RESIDENT MONITOR AVAILABILITY FLAGS. SBA=707761 /(RCHM-100) SKIP IF BANK ADDRESSING. ECLA=641000 /(RCHM-100) OSC=640001 /(RCHM-100) X10=10 /(RCHM-100)PTR TO AR 10. X11=11 /(RCHM-100) SAME FOR AR11. TO=-3 /OUTPUT DEVICE. (CONSOLE) IN=-4 /INPUT DEVICE. (DISK) / / / ///////////////////////// / / CODE ENTERED FOR LINK FETCH / ////////////////////////// / LKOVLA .DSA LKOVLA /LINK TABLE ENTRY ADDRESS AFTER SETUP / / SAVE VOLATILE REGISTERS / DAC ACSAVE /(RCHM-100) SAVE AC. LACQ /(RCHM-100) SAVE MQ. ECLA!OSC /(RCHM-100) SAVE STEP COUNTER. CMA!IAC /(RCHM-100) AND (77) /(RCHM)-100) XOR (NORM) /(RCHM-100) DAC SCSAVE /(RCHM-100) / /EXECUT ENTRY ADDRESS DURING SETUP PASS RAR /SAVE LINK. DAC LNKBIT LAC* (X10) /SAVE AUTO-INDEXES 10 AND 11. DAC XR10 LAC* (X11) DAC XR11 / LAW -1 /POINT TO LINK ENTRY TO BE FIXED. TAD LKOVLA AND (77777) /DESTROY LINK BIT. DAC LKOVLA /POINTS TO JMS* LKOVLA AAC 5 /(RCHM-100) POINT TO LINK NUMBER FIELD -1. DAC* (X10) LAC* X10 /FETCH LINK NUMBER. DAC T1 /SAVE FOR TRAN. LAC* X10 /POINT TO BOTTOM OF AREA. DAC BOTTOM LAC* X10 /POINT TO TOP OF AREA. DAC TOP JMS CLEAR /CLEAR THE AREA. / / SCAN THE LINK TABLE ENTRIES... UPDATE STATUS / LAC LNKBAS /PROCESS THE LINK TABLE. DAC TBLENT /POINTER TO TABLE ENTRY. LNKSCN LAC TBLENT /POINT TO NEW ENTRY. SAD LNKTOP /IS THIS THE END... JMP EXUOUT /YES. END OF TABLE PROCESSING. AAC 2 /(RCHM-100) POINT TO JMS FIELD. DAC JMSFLD AAC 5 /(RCHM-100) POINT TO LINK NUMBER FIELD -1. DAC* (X10) AAC 4 /(RCHM-100) POINT TO NEXT ENTRY. DAC TBLENT / LAC* X10 /GET LINK NUMBER. SAD T1 /SAME AS THIS OVERLAY... JMP SAMLNK /YES. GO PROCESS. LAC TOP /WAS THIS PROGRAM OVERLAYED... CMA!IAC /(RCHM-100) TAD* X10 /BEGINNING OF ENTRY'S CODE. SMA!SZA JMP LNKSCN /OUR TOP < HIS BOTTOM; HE'S OK. LAC* X10 /END OF ENTRY'S CODE. CMA!IAC /(RCHM-100) TAD BOTTOM /OUR BOTTOM. SMA!SZA JMP LNKSCN /OUR BOTTOM > HIS TOP; HE'S OK. / LAC JMS /LINK IS BEING OVERLAID. DAC* JMSFLD /CHANGE TO CAUSE JMS* LKOVLA. JMP LNKSCN /TRY NEXT LINK. / SAMLNK LAW -2 /THIS ROUTINE IN NEW LINK. TAD JMSFLD /ENTRY POINT-2. AND MASK1 /(RCHM-100) BUILD LAC .-2 AT ENTRY+2. XOR (LAC) /(RCHM-100) DAC* JMSFLD /STORE IT. JMP LNKSCN /THIS ENTRY NOW LOADED. / / LINK TABLE PROCESSING DONE / LOAD THE LINK / EXUOUT LAC T1 /GET LINK NO. RCL / X 2 TAD LPTPT /POINT TO DATA IN LPT POSITION -1 DAC* (X11 /SET AUTO INCREMENT LAC* X11 /GET DISK BLOCK ADDRESS OF LINK / DAC TRAN+3 /SETUP FOR I/O JMS GETBUF /GET A BUFFER FROM THE BUFFER POOL JMS TRAN /GET THE 1ST BLOCK OF LINK LAC* X11 /GET THE LOG. REC. POINTER TAD TRAN+4 /ADD BUFFER BASE DAC BPTR /SETUP FOR LOAD JMS LOAD /LOAD IT. JMS GIVBUF /RETURN BUFFER TO BUFFER POOL / LAC XR10 /RESTORE AUTO-INDEXES. DAC* (X10) LAC XR11 DAC* (X11) LAC LNKBIT /RESTORE LINK BIT. RAL LAC (400000) /(RCHM-100) RESTORE STEP COUNTER. SCSAVE XX /(RCHM-100) LAC MQSAVE /(RCHM-100) LMQ /(RCHM-100) LAC ACSAVE /(RCHM-100) JMP* LKOVLA /ENTER USER PROGRAM. / / SUBROUTINE LOAD -- LOAD A LINK. / / WE ALWAYS SKIP THE FIRST LOGICAL RECORD (SINCE IT IS A TYPE 1 / & THEREFORE IS ONLY AN ID RECORD & IS NOT SUBSTANTIVE). / LOAD .DSA 0 READ JMS NEXT /GET THE NEXT LOGICAL RECORD. LAC* X10 /START SUBRECORD. DAC T1 /SAVE SUBRECORD HEADER. AND (700000) /ISOLATE TYPE. SAD (300000) /PATCH RECORD... JMP TYPE3 /YES. LAC T1 /NO. ASSUME TYPE TWO RECORD. SKP / / TYPE 2 RECORD... FIXED FORMAT / STRING OF RELOCATED BINARY RECORDS / TYPE2 LAC* X10 /PICK UP SUBRECORD HEADER. SPA /IF -1, END OF TYPE TWO THIS LRECORD. JMP READ /READ A NEW LOGICAL RECORD. AND (77777) /ISOLATE WORD COUNT FIELD. CMA!IAC /(RCHM-100) SAVE COUNT. DAC LCTRL LAW -1 /COMPUTE DATA-1 ADDRESS. TAD* X10 AND (77777) DAC* (X11) /"TO" FIELD FOR MOVE. / WDLOOP LAC* X10 /MOVE DATA WORDS. DAC* X11 ISZ LCTRL /LOOP CONTROL JMP WDLOOP JMP TYPE2 /RETURN FOR MORE TYPE TWO DATA. / / TYPE 3 RECORDS... HEADER PAIR+STRING OF SUBRECORDS / SUBRECORDS OF 3 FORMATS POSSIBLE / CONTAINING FORWARD REFERENCE PATCHES & COMMON BLOCK ADDRESS / RELOCATIONS. / TYPE3 LAC T1 /PICK UP RECORD HEADER. AND (77777) /ISOLATE COUNT. SNA /COUNT IS TOTAL NUMBER OF PATCHES. JMP* LOAD /END OF LINK PROCESSING. CMA!IAC /(RCHM-100) NON-ZERO COUNT. DAC T1 /SAVE PATCH COUNT. JMP .+3 /SKIP OVER READ. / TYP3RD JMS NEXT /READ A RECORD OF PATCHES. LAC* X10 /IGNORE HEADER WORD. LAC* X10 /COUNT OF PATCHES THIS RECORD. CMA!IAC /(RCHM-100) SET UP LOOP CONTROL. DAC LCTRL NEXTPT LAC* X10 /PATCH HEADER WORD. LMQ /(RCHM-100) SAVE FOR A MINUTE. AND (77777) /(RCHM-100) EXTRACT ADDRESS FIELD. DAC ADDR LACQ /(RCHM-100) FETCH WORD AGAIN. AND (700000) /ISOLATE TYPE. SNA JMP PATCH0 /TYPE ZERO -- PUT WORD 2 IN WORD 1 ADDRESS. SAD (100000) JMP PATCH1 /TYPE ONE -- ADDRESS FIE3D OF WD 2 IN WD 1 / PATCH2 LAC* X10 /TYPE TWO -- ADDRESS IN COMMON. TAD COMMON /BASE ADDRESS OF COMMON. JMP PATOUT / PATCH1 LAC* X10 /GET DATA. AND MASK1 /(RCHM-100) ISOLATE ADDRESS BITS DAC T2 /SAVE. LAC* ADDR /PICK UP USER DATA WORD. AND MASK2 /(RCHM-100) SAVE ONLY OP,INDIRECT. XOR T2 /INSERT ADDRESS. SKP / PATCH0 LAC* X10 /MOVE WHOLE DATA WORD. PATOUT DAC* ADDR /PLACE IN ADDRESS SUPPLIED. ISZ T1 /TOTAL PATCH COUNT. SKP JMP* LOAD /END OF LOAD. ISZ LCTRL /LOOP CONTROL JMP NEXTPT /MORE PATCHES -- GET THEM. JMP TYP3RD /ANOTHER PATCH RECORD. / / / SUBROUTINE TRAN -- INPUT A BLOCK VIA TRAN / SETUP FOR THE NEXT BLOCK / REINIT THE BUFFER POINTER / / TRAN .DSA 0 /READ ONE BLOCK. .TRAN IN,0,0,0,256 /READ ONE BLOCK. LAC TRAN+3 /SAVE CURRENT BLOCK NO. DAC XCUBLK LAC TRAN+4 /POINT TO FIRST WORD. DAC BPTR /POINTER TO FIRST LRHWP AAC 1 /(RCHM-100) POINTER TO FIRST DATA -1. DAC* (X10) /POINTER USED TO EXTRACT DATA. .WAIT IN LAC* BUF377 /GET FORWARD LINK. DAC TRAN+3 /SAVE IT. JMP* TRAN /RETURN TO CALLER. / / SUBROUTINE NEXT -- GET NEXT LOGICAL RECORD FROM FILE / WE FIRST UPDATE THE BUFFER POINTER TO THE NEXT LOGICAL / RECORD HEADER WORD PAIR. / NOTE THAT IOPS BINARY WON'T ALLOW LOGICAL RECORDS TO SPAN / DISK BLOCKS.!!!! / / NEXT .DSA 0 /GET NEXT RECORD. LAC* BPTR /PICK UP LRHWP POINTER. CLL LRS 11 /GET WORD PAIR COUNT. CLL!RAL /CONVERT TO WORD COUNT. TAD BPTR /POINT TO BEGINNING OF NEXT RECORD. SAD BUF376 /POINTER TO END OF PHYSICAL DATA... JMP MUSTRD /READ A NEW RECORD. DAC BPTR AAC 1 /(RCHM-100) POINTER TO FIRST DATA -1. DAC* (X10) /PLACE IN AUTO-INDEX. LAC* BPTR /PICK UP HEADER. SZA /IF ZERO, END OF DATA THIS BLOCK. JMP* NEXT /RETURN TO CALLER. / MUSTRD JMS TRAN /READ A RECORD. JMP* NEXT /RETURN TO CALLER. / / SUBROUTINE CLEAR -- CLEAR CORE FOR INCOMING LINK. / CLEAR .DSA 0 LAC BOTTOM / POINT LCTRL TO BOTTOM OF /EAG:008 DAC LCTRL / AREA TO BE CLEARED /EAG:008 CLRLUP LAC LCTRL / FETCH ADDRESS OF NEXT WORD /EAG:008 SAD TOP / IS IT LAST WORD? /EAG:008 JMP* CLEAR / IF SO DONE, SO EXIT /EAG:008 DZM* LCTRL / IF NOT, CLEAR IT! /EAG:008 SAD* (.SCOM+0) / ARE WE ABOUT TO CLEAR /EAG:008 / BOOTSTRAP? /EAG:008 JMP CLRBOO / YES -- GO SKIP AROUND IT /EAG:008 ISZ LCTRL / NO -- ADVANCE TO NEXT WORD /EAG:008 JMP CLRLUP / AND GO CLEAR IT /EAG:008 /EAG:008 /EAG:008 / COME HERE WHEN WE REACH THE BOOTSTRAP, IN ORDER TO SKIP /EAG:008 / AROUND IT. /EAG:008 /EAG:008 CLRBOO TAD (7777) / ROUND UP TO NEXT PAGE /EAG:008 AND (770000) / BOUNDARY /(RCHM-100) JMP CLRLUP-1 / AND CONTINUE LOOP /EAG:008 / / / SUBROUTINE GETBUF... OBTAIN A BUFFER FROM THE BUFFER POOL / / GETBUF 0 /RETURN ADDRESS .GTBUF /GET THE BUFFER SPA /SKIPS IF SUCCESSFUL JMP NOBUF /ERROR CONDITION DAC GIVBUF+3 /SETS UP DE-ALLOCATION CODE DAC TRAN+4 /TRAN NEEDS THE BUFFER ADDRESS AAC 376 /(RCHM-100) NEXT TO LAST BUFFER WORD. DAC BUF376 /POINTER AAC 1 /(RCHM-100) LAST BUFFER WORD. DAC BUF377 /POINTER JMP* GETBUF /DONE / NOBUF .FSTAT IN,NAME /ISSUES AN IOPS 55 (NO BUFFERS) / / / SUBROUTINE GIVBUF... DE-ALLOCATE A BUFFER TO THE BUFFER POOL / / GIVBUF 0 /RETURN ADDRESS .GVBUF /GIVE BACK BUFFER JMP* GIVBUF /DONE / / / BUILD THE LINK POINTER TABLE & ENTER USER CODE / / LPTBLD JMS NEXT /GET NEXT LOG. REC. LAC* BPTR /GET LRHWP OF TYPE 1 RECORD SAD EOF /CHECK FOR SOFTWARE END OF FILE JMP FIN1 /ALL DONE... ENTER USER CODE LAC XCUBLK /GET CURRENT DISK BLOCK DAC* LPTPTR /STORE IN LPT ISZ LPTPTR /BUMP POINTER LAC TRAN+4 /GET BUFFER ADDRESS CMA!IAC /(RCHM-100) FOR RELATIVE POINTER CALCULATION. TAD BPTR /GET POINTER TO LRHWP OF TYPE 1 REC. DAC* LPTPTR /STORE IN LPT ISZ LPTPTR /BUMP POINTER JMS LOAD /LOAD THE LINK LAC LPTPTR /WATCH OUT FOR TOO MANY LINKS SAD BOTTOM /HIT BOTTOM OF OVERLAY SYSTEM? SKP /YES. REPORT CANT FIT JMP LPTBLD /NEXT LINK .WRITE TO,2,MSG1,0 /LPT OVERFLOW / EXIT .CLOSE TO /WAIT FOR TTY. .EXIT /LEAVE... LOAD NON RESIDENT MONITOR / FIN0 .CLOSE IN /CLEAN UP SYS SOFTWARE XCT DEVICE STATUS FIN1 JMS GIVBUF /RELEASE THE BUFFER JMP* ENTRY /ENTER USER CODE / / / / / ////////////////////// / / STORAGE AND CONSTANTS & OVERWRITABLE CODE / NON-OVERWRITABLE STORAGE FIRST. / ////////////////// / ACSAVE XX /(RCHM-100) MQSAVE XX /(RCHM-100) BOTTOM .DSA 0 /BOTTOM OF INCOMING LINK. TOP .DSA 0 /TOP OF INCOMING LINK. ENTRY .DSA 0 /ENTRY POINT OF MAIN PROGRAM. COMMON .DSA 0 /BASE OF BLANK COMMON. LNKBAS .DSA 0 /BASE OF LINK TABLE. LNKTOP .DSA 0 /TOP OF LINK TABLE. BPTR .DSA 0 /POINTER TO NEXT LRHWP IN BUFFER. JMS JMS* 0 /JMS FOR LINK TABLE USE. LNKBIT 0 /SAVED REGISTERS XR10 0 / " XR11 0 / " T1 0 /TEMPORARIES T2 0 / " ADDR 0 /TYPE 3 REC. PATCH ADDRESS TBLENT 0 /LINK TABLE ENTRY ADDRESS JMSFLD 0 /LINK TABLE JMS FIELD / / ENVIRONMENT WORD. / / BIT 17 -- RESERVED (CURRENTLY UNUSED). / BIT 16 -- BANK/PAGE / BIT 15 -- XVM ON/XVM OFF / BIT 14 -- BOOT 32K/BOOT 24K / BIT 13 -- XVM/DOS/NON-XVM/DOS / / FIRST PART IS IF BIT IS ON, SECOND PART IF BIT IS OFF. / CEV.IN=LCTRL /(RCHM-100) TEMP USED IN SETUP. LCTRL 0 /LOOP CONTROL / EOF 1005 /SOFTWARE END OF FILE LPTPT LPT-3 /BASE TO CALC LPT POSITION -1 BUF376=GETBUF+3 /NEXT TO LAST BUFFER LOCATION POINTER / /USES THE FREE WORD IN .GTBUF BUF377 0 /LAST BUFFER LOCATION POINTER XCUBLK 0 /CURRENT DISK BLOCK ADDRESS LPTPTR LPT /POINTER TO LPT MSG1 4*1000; 0 .ASCII "TOO MANY LINKS"<15> / .LTORG /LITERALS SHOULD NOT BE OVERWRITTEN / / LPT=. /THE LINK POINTER TABLE WILL START HERE. / /ALL FOLLOWING CODE IS OVERWRITABLE. / / / / / / /////////////////// / / THE LINK POINTER TABLE IS CONSTRUCTED IF NEEDED. / IT OVERWRITES THE SETUP CODE. / / AN ENTRY IN THE LPT CONSISTS OF 2 WORDS ... / 1.THE DISK BLOCK ADDRESS OF THE BEGINNING OF THE LINK / 2.THE RELATIVE BUFFER LOCATION OF THE LOGICAL RECORD HEADER WORD / PAIR OF THE TYPE 1 RECORD FOR THE LINK. / / EACH LINK HAS 1 ENTRY IN THE LPT / ///////////////////// / / / / //////////////////////////////// / / / SYSTEM LOADER ENTERS HERE / /////////////////////////// / / EXECUT LAW 0 /(RCHM-100) SET UP ADDRESS MASKS. SBA /(RCHM-100) BANK MODE? LAW 10000 /(RCHM-100) NO, FETCH PAGE MODE MASK. DAC MASK2 /(RCHM-100) SET UP OPCODE MASK. CMA /(RCHM-100) SET UP OP CODE MASK. DAC MASK1 /(RCHM-100) SET UP ADDRESS MASK .INIT TO,1,EXIT /(RCHM-100) OPEN TTY (THE NON-RESIDENT MONITOR / SETUP FOR BOSS15 LAC* (.SCOM+52 /SET I/O TO TTY BIT SPA /(RCHM-104) IS BOSS RUNNING? JMP EXEC10 /(RCHM-104) YES. .WRITE TO,2,MSG0,6 /IDENTIFY PROGRAM EXEC10 JMS INIT /(RCHM-104) INIT THE XCT DEVICE LAC* SCOM3 /COMPUTE END OF CORE. AND (70000) /(RCHM-100) XOR (7777) /(RCHM-100) CALCULATE TOP OF EXECUTABLE CORE BANK. DAC T1 /SAVE FOR FUTURE USE. LAC* (SC.FRH+1) /(RCHM-100) FETCH HIGH BOUND OF EXTENDED MEMORY. SMA /(RCHM-100) ANY HIGH MEMORY THERE? DAC T1 /(RCHM-100) YES, SET UP FOR COMPARISON. LAC* NAME /PICK UP FILE NAME. DAC NAME LAC* NAME+1 DAC NAME+1 JMS FSTAT /GET XCU STARTING BLOCK IN AC / /BUFFER IS OBTAINED THRU HANDLER DAC XCUSAV /SAVE LAC NAME+3 /SET UP FOR XCT FILE DAC NAME+2 JMS FSTAT /FIND "XCT" FILE. JMS INIT /RETURN BUFFER OBTAINED THRU HANDLER JMS GETBUF /GET A BUFFER FROM THE BUFFER POOL JMS TRAN /READ ONE BLOCK. / LAC TRAN+4 /GET BUFFER ADDRESS AAC 3 / PUT COMMON BASE POINTER -1 IN AR10. DAC* (X10 /AUTO-INCREMENT 10 AAC 15 /(RCHM-103) POINT TO POSSIBLE HIGH BOUNDS WORD. DAC XR10 /(RCHM-103) USE XR10 TEMPORARILY. / LAC* X10 /GET COMMON BASE. DAC COMMON LAC* X10 /MAIN PROGRAM ENTRY. DAC ENTRY LAC* X10 /LINK TABLE BASE. DAC LNKBAS LAC* X10 /LINK TABLE TOP. DAC LNKTOP / LAC* X10 /BOTTOM OF USER PROGRAM DAC BOTTOM CMA!IAC /(RCHM-100) CHECK FOR ROOM. TAD* SCOM2 /FIRST FREE ADDRESS SMA!SZA /SKIP IF OK JMP NOGO LAC* X10 /TOP OF USER PROGRAM DAC TOP CMA!IAC /(RCHM-100) CHECK FOR ENOUGH CORE. TAD T1 /ADDRESS OF END OF HIGHEST BANK SPA /SKIP IF OK JMP NOGO /WHOOPS / LAC* X10 /CHECK FOR PROPER SYSTEM MODE:PAGE/BANK DAC CEV.IND /(RCHM-100) SAVE CHAINS ENVIRONMENT INDICATOR. RTR /SYSTEM MODE OF XCU FILE SAVED IN BIT 16 OFWORD 12 IN LTB SBA /(RCHM-100) PAGE OR BANK MODE. SNL!CML /(RCHM-100) LINK = 1 => BANK ADDRESSING. 0 LINK MAPS TO 1 LINK. SNL /(RCHM-100) LINK = 1 => BANK ADDRESSING OR GOOD PAGE ADDRESSING. JMP CNTRUN /(RCHM-100) ERROR. /+ / CHECK FOR COMPATABILITY MODE, BIT 13 OF ENV WORD WILL BE ON IF XVM. /- ALS 17 /(RCHM-102) CHECK BIT 13 (SHIFTED RIGHT 2.) SMA /(RCHM-102) XVM/DOS SYSTEM? JMP BOODON /(RCHM-102) NO. /+ / BANK AND PAGE MODE HAVE BEEN CHECKED, CHECK XVM ON OR OFF AND TURN THEM ON. / IF ON THEN EXECUT WILL RUN IN WIDE MODE THROUGHOUT. IF OFF THEN / THE ASSUMPTION IS MADE THAT ONLY 32K MAX IS USED FOR THIS OVERLAY. /- LAC* (SC.MOD) /(RCHM-101) FETCH CURRENT MODE BITS. RAR /(RCHM-101) PUT XVM ON INTO LINK. LAC CEV.IND /(RCHM-101) FETCH ENVIRONMENT BITS. ALS 17 /(RCHM-101) STICK REQUEST INTO SIGN BIT. SPA!SZL!CMA!CML /(RCHM-101) BOTH OFF? SMA!SNL /(RCHM-101) BOTH ON? SKP!CMA!CML /(RCHM-101) YES. JMP NOX /(RCHM-101) NO. SNL /(RCHM-101) TURN XVM ON? JMP XVDONE /(RCHM-101) NO. .XVMON /(RCHM-101) YES. / / XVM MODE HAS BEEN ENABLED, DISABLED, OR VERIFIED AS NOT NEEDED. CHECK FOR / CORRECT LOCATION OF THE BOOTSTRAP. / XVDONE LAC* (.SCOM) /(RCHM-100) FETCH BOOT ADDRESS. ALS 4 /(RCHM-100) MOVE BIT TO SIGN OF AC /(RCHM-100) THIS IS USED TO DETERMINE THE DIFFERENCE /(RCHM-100) BETWEEN 7XXXX AND 5XXXX BOOT ADDRESSES. RAL /(RCHM-100) PUT AC IN LINK. 0=> 24K 1=> 32K. LAC CEV.IND /(RCHM-100) SET UP AC SIGN BIT WITH CHAIN EXP BOOT. ALS 16 /(RCHM-100) PUT IN SIGN BIT. SPA!SZL!CMA!CML /(RCHM-100) BOTH OFF? SMA!SNL /(RCHM-100) EITHER ON? SKP /(RCHM-100) NO, BOT OFF. JMP WRONGB /(RCHM-101) ERROR, BOOTS DON'T MATCH. / / ALL PARAMETERS HAVE BEEN CHECKED. / XVM IS EITHER AVAILABLE AND OFF OR ON AS REQUIRED OR NOT AVAILABLE AND NOT / RETUIRED. / BOOT ADDRESS IS EITHER 24 OR 32K AND CHECKED. / ENOUGH MEMORY EXISTS TO RUN THE PROGRAM. / THE ONLY REMAINING THING TO DO IS TO SET UP THE HIGH MEMORY BOUNDS. / LAC* XR10 /(RCHM-103) FETCH BOUNDARY. SNA /(RCHM-103) ARE WE TO ALTER BOUNDS? JMP BOODON /(RCHM-103) NO. SPA!CLL!CML /(RCHM-103) CHECK FOR HIGH VERSUS LOW BOUND. CMA!IAC!CLL /(RCHM-103) MAKE ADDRESS RIGHT AND INDICATE LOW MEMORY BOUND. DAC XR10 /(RCHM-103) SAVE POSITIVE VALUE OF CORE BOUND. LAC* (SC.FRH) /(RCHM-1039 CHECK FOR HIGH MEMORY. I'M NOT SURE /(RCHM-103) IF THIS IS STRICTLY NECESSARY BUT /(RCHM-103) CHAIN DOESN'T DIFFERENTIATE THE 24K BOOT /(RCHM-103) AND THE 32K MEMSIZE FROM REAL HIGH CORE. SPA /(RCHM-103) ANY HIGH MEMORY? JMP BOODON /(RCHM-103) NO. LAC (SC.FRH) /(RCHM-103) FETCH POINTER TO MEMORY BOUND. SZL /(RCHM-103) ALTER LOW BOUND? AAC 1 /(RCHM-103) NO, ALTER HIGH BOUND. DAC XR11 /(RCHM-103) SAVE BOUNDS POINTER. LAC XR10 /(RCHM-103) FETCH BOUNDARY. DAC* XR11 /(RCHM-103) SET UP POINTER. BOODON LAW -1 /FITS CORE. ADJUST POINTERS. TAD BOTTOM DAC* SCOM3 /SET LAST FREE ADDRESS POINTER JMS CLEAR /CLEAR AREA FOR MAIN LOAD. / LAC LNKTOP /TOP OF LINK TABLE SAD LNKBAS /IS THERE A TABLE... JMP NOVLY /NO OVERLAYS. LOAD MAIN ONLY. / JMS LOAD /LOAD THE TABLE. LAC LKOVLA /ADDRESS OF EXECUTE PROCESSOR. DAC* LNKTOP LAC LNKTOP /BUILD A JMS. AND MASK1 /(RCHM-100) GET ADDRESS BITS XOR JMS /INSERT "JMS* 0". DAC JMS /SAVE FOR FUTURE USE. JMP MAIN /LOAD THE RESIDENT CODE NOVLY LAC* SCOM1 /ONLY MAIN PROGRAM. FREE EXECUTE'S CORE. DAC* SCOM2 .IFDEF %DEBUG .WAIT TO HLT .ENDC / MAIN LAC XCUSAV /SETUP FOR TRAN DAC TRAN+3 JMS TRAN /READ IN ONE RECORD. JMS LOAD /LOAD MAIN ONLY. .IFDEF %DEBUG HLT .ENDC LAC LNKBAS /MAIN ONLY... SAD LNKTOP JMP FIN0 /YES. ENTER USER CODE. JMP LPTBLD /BUILD THE LPT / NOGO .WRITE TO,2,MSG2,0 /CAN'T FIT IN CORE. JMP EXIT /READY TO CLEAN UP / CNTRUN .WRITE TO,2,MSG3,0 /CAN'T RUN IN CURRENT SYSTEM MODE(PAGE/BANK) JMP EXIT / NOX .WRITE TO,2,MSG4,0 /(RCHM-101) NO XVM HARDWARE AVAILABLE. JMP EXIT /(RCHM-101) ALL DONE. / WRONGB .WRITE TO,2,MSG5,0 /(RCHM-101) BOOT AT WRONG ADDRESS. JMP EXIT /(RCHM-101) ALL DONE. / / / SUBROUTINES FOR SETUP PHASE / / / / / / SUBROUTINE INIT... INITIALIZES THE XCT DEVICE / / INIT 0 /RETURN ADDRESS .INIT IN,0,0 JMP* INIT /DONE / / / SUBROUTINE FSTAT -- LOCATE A FILE BY FSTAT / & SETUP THE TRAN ROUTINE. / A BUFFER IS OBTAINED FROM THE BUFFER POOL / BY THE XCT DEVICE HANDLER. / FSTAT .DSA 0 /LOCATE A FILE. .FSTAT IN,NAME /CHECK PRESENCE OF FILE. SNA /IF ZERO, NOT FOUND. JMP MISS /MISSING FILE. DAC TRAN+3 /STORE FIRST BLOCK NUMBER. JMP* FSTAT /NORMAL EXIT. / / FILE IS MISSING / MISS .WAIT TO /GIVE THE TTY TIME TO FINISH .SEEK IN,NAME /CAUSE AN IOPS 13 WITH FILE NAME. / / /////////////////////////// / / / MISCELLANEOUS STORAGE FOR SETUP PHASE / / / NAME .DSA .SCOM+7 /POINTER TO NAME, OVERLAID BY NAME. .DSA .SCOM+10 .SIXBT "XCU" /MASTER FILE EXTENSION .SIXBT "XCT" /SECONDARY FILE EXTENSION. / MSG0=.-2 /(RCHM-101) .SYSID < .ASCII *EXECUTE >,<000*<15>> /(RCHM-103) MSG2=.-2 .ASCII "CAN'T FIT"<15> / MSG3=.-2 /(RCHM-101) .ASCII "CAN'T RUN"<15> / MSG4=.-2 /(RCHM-101) .ASCII 'WRONG MODE'<15> /(RCHM-101) MSG5=.-2 /(RCHM-101) .ASCII 'WRONG BOOT'<15> /(RCHM-101) / / XCUSAV 0 /RESIDENT CODE STARTING BLOCK ADDRESS SCOM1 .SCOM+1 /1ST LOC. AFTER RESIDENT MONITOR SCOM2 .SCOM+2 /1ST FREE LOC. SCOM3 .SCOM+3 /HIGHEST FREE LOC. / / / .END EXECUT