IDENT OPERATE TITLE OPERATIONS ENTRY ACAP,UDAT,OROPT,FCAP,FDAT,UCAP,BDAT,BCAP EXT SYSRET,REALLOC,E.ERROR INTSYS XTEXT PROCSYM XTEXT TYPES XTEXT RECS MACRO A RE A RJ =XE.ECS ENDM WECS MACRO A WE A RJ =XE.ECS ENDM ECSMAC XTEXT CBLOCK MICRO 1,,*/EOPER/* ECSACT XTEXT * MAKEOPN # MAKE A NEW ORDER-1 OPERATION * * PARAMETERS: AP1 = C: AN ALLOCATION BLOCK * AP2 = D: INDEX IN THE FULL C-LIST * AP3 = D: TYPE OF ACTION, 0 OR NOT 0 FOR CALL OR JUMP * AP4 = C: CLASS CODE * AP5 = D: NUMBER OF PARAMETER SPECIFICATIONS * ECSCODE MKOPN MAKEOPN SA5 B1+P.PARAM+1 . C: ALLOCATION BLOCK SA2 A5+1 SA1 B1+P.PARAM+5 . C: CLASS CODE SA4 B1+P.PARAM+6 . D: NUMBER OF PARAMETER SPECS NG X4,NGCNT . ERROR SA3 B1+P.PARAM+3 . D: TYPE OF ACTION ZR X3,MO1 . IS CALL SX6 J.JUMSUB . ACTION NUMBER EQ MO2 * MO1 SX6 J.CALSUB * MO2 SX7 SYSRET NG X2,NGIX . NEGATIVE C-LIST INDEX SX3 20B ACTION TYPE...NEEDS BIT MASK LX3 54 BX3 X3+X6 BX6 X4 AX6 17 NZ X6,BIGOPRN EQ MKOPRN . CREATE OPERATION ENDECS MKOPN TITLE SUBROUTINE TO MAKE A SINGLE ORDER OPERATION * MKOPRN MAKES AN OPERATION OF ORDER 1 * * ENTRY: X7 = RETURN * X5 = UNIQUE NAME, MOT INDEX FOR ALLOCATION BLOCK * X4 = NUMBER OF PARAMETER SPECIFICATIONS * X3 = ACTION TYPE (UPPER 6 BITS), ACTION NUMBER (LOWER 18 BITS) * X2 = C-LIST INDEX IN FULL LIST FOR RESULTANT CAPABILITY * X1 = CLASS CODE IF NEEDED * SAVES: B1 * ENTRY MKOPRN EXT MAKEOBJ,CAPAB,PUTCAP MKOPRN SB4 MKOPRN6 . RETURN FROM MAKEOBJ LX7 18 BX7 X7+X4 SA7 B1+P.TEMP1 . SAVE RETURN, NUMBER OF PS NZ X4,MKOPRN0 MX7 1 BX3 X7+X3 . PARAMETERLESS BIT MKOPRN0 BX6 X2 BX7 X3 SA6 B1+P.TEMP2 . SAVE C-LIST INDEX SA3 B1+P.CLIST SA3 B1+X3 IX2 X2-X3 SX0 1 NG X2,MKOPRN2 . INDEX OK MKOPRN1 SA3 A3+2 ZR X3,BGIX . INDEX TOO LARGE IX2 X2-X3 PL X2,MKOPRN1 MKOPRN2 SA7 B1+P.TEMP3 . SAVE ACTION TYPE AND NUMBER SB2 1+PS.MASKL+3 . LENGTH OF: HEADER, MASK BITS, AND . POINTERS LX7 1 PL X7,MKOPRN3 . NO CLASS CODE NEEDED BX6 X1 SA6 B1+P.TEMP4 . SAVE CLASS CODE SB2 B2+1 . SPACE FOR CLASS CODE MKOPRN3 SX6 X4-19 . NUMBER OF PS BYTES/WORD NG X6,MKOPRN4 SB2 X0+B2 . INCREMENT LENGTH BX4 X6 EQ MKOPRN3 MKOPRN4 ZR X4,MKOPRN5 SB2 B2+1 . ROUND UP MKOPRN5 SB3 P.SCRL+1+PS.MASKL LT B3,B2,BIGORDER . THIS ORDER IS TOO LARGE FOR THE . SCRATCH AREA SX7 AT.OPER . ALLOCATION TYPE EQ MAKEOBJ * MKOPRN6 MX6 1 LX6 1+18 . NUMBER OF ORDERS SX1 B2-PS.MASKL-1 . LENGTH OF FIRST ORDER BX4 X1 LX1 18+18 BX6 X1+X6 SA0 B1 . ADDRESS OF SCRATCH AREA SA6 B1 . OPERATION HEADER WORD BX0 X5 . ECS ADDRESS OF OPERATION SA1 B1+P.TEMP1 . RETURN, NUBMER OF PS MX5 6 SX2 X1 AX1 18 SB6 X1 . RETURN ADDRESS SA1 B1+P.TEMP3 . ACTION TYPE AND NUMBER BX3 X5*X1 MX5 60-ACTLIM .. WANT MASK BIG ENOUGH FOR LARGE ACTIONL TABLE BX6 -X5*X1 SX5 B2 .. ORIGIN OF NEXT ORDER LX1 1 PL X1,MKOPRN7 . NO CLASS CODE SX4 X4-1 .. CORRECT PS DATA POINTER SB3 B2-1 .. OFFSET OF LAST WORD SA1 B1+P.TEMP4 . CLASS CODE BX7 X1 SA7 B1+B3 MKOPRN7 LX4 18+18 . PS DATA POINTER BX7 X3+X4 . ACTION TYPE SA7 B1+1+PS.MASKL .. FIRST WORD OF ORDER PROPER BX7 X2 .. VISIBLE NUMBER OF PS LX5 18 SA7 A7+1 .. SECOND WORD OF ORDER BX6 X5+X6 . ORIGIN OF NEXT ORDER, ACTION NUMBER MX5 60-3 SA6 A7+1 .. THIRD WORD SX7 0 SA7 B1+1 . PS BIT MASK SHOULD BE ZERO DUP PS.MASKL-1,1 SA7 A7+1 . LIKEWISE ZR X2,MKOPRN10 . NO PS BYTES SA3 MKWORD BX6 X3 MKOPRN8 SB3 X2-19 GE B0,B3,MKOPRN9 SA6 A6+1 SX2 B3+0 EQ MKOPRN8 MKOPRN9 SB3 X2 . N SB4 B3+B3 . 2 * N SB3 B4+B3 . 3 * N LX5 B3,X5 . POSITION MASK BX6 X5*X6 . MAKE ZERO BYTE SA6 A6+1 MKOPRN10 WECS B2 SB5 CAPAB . ADDRESS OF CAPABILITY FROM MAKEOBJ SA1 B1+P.TEMP2 . C-LIST INDEX EQ PUTCAP * MKWORD VFD 3/1,3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE VFD 3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE VFD 3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE VFD 3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE,3/PS.NONE * TITLE ADD AN ORDER TO AN OPERATION * * ADDORDR ADDS A SUBPROCESS CALL OR JUMP ACTION TO AN OPERATION. * * PARAMETERS: * ORG P.PARAM C: EQU 2 . LENGTH OF A CAPABILITY PARAMETER D: EQU 1 . LENGTH OF A DATUM PARAMETER AO.AB BSS C: . AP1 _ AN ALLOCATION BLOCK AO.IX BSS D: . AP2 _ AN INDEX IN THE FULL C-LIST AO.OP BSS C: . AP3 _ AN OPERATION AO.CLSCD BSS C: . AP4 _ A CLASS CODE AO.NOPS BSS D: . AP5 _ NUMBER OF NEW PARAMETER SPECS USE * ECSCODE ADORD ADDORDR SA1 B1+AO.IX . D: INDEX IN THE FULL C-LIST NG X1,NGIX . ERROR (INDEX NEGATIVE) SA2 B1+P.CLIST . POINTER TO THE C-LIST TABLE SA2 B1+X2 . LENGTH OF FIRST C-LIST IX1 X1-X2 SX6 1+PS.MASKL . LENGTH OF OPERATION PREFIX NG X1,AO2 . INDEX OK AO1 SA2 A2+2 . NEXT C-LIST LENGTH ZR X2,BGIX . ERROR (INDEX TOO LARGE) IX1 X1-X2 PL X1,AO1 AO2 SA1 B1+AO.OP+1 . C: AN OPERATION SX0 X1 . MOT INDEX SA0 B1 . SCRATCH AREA RECS 1 SA2 A0 BX1 X1-X2 . COMPARE UNIQUE NAMES MX5 60-21 BX1 X5*X1 NZ X1,MISOPR . ERROR (OPERATION HAS BEEN DELETED) BX0 -X5*X2 . ECS ADDRESS OF OPERATION BX2 X0 . SAVE ORIGIN RECS 1 . HEADER WORD SA1 A0+0 AX1 18+18 SB6 X1 . LENGTH OF FIRST ORDER SB2 B6+1+PS.MASKL . ACCUMULATE LENGTH OF OPERATION SB5 1 . =1 AO3 IX0 X2+X6 . START ADDRESS OF NEXT ORDER RECS B6 SA1 B1+2 AX1 18 SX6 X1 . NEXT ORDER ORIGIN AX1 18 SB6 X1 . LENGTH SB2 B2+B6 . ACCUMULATE TOTAL LENGTH NZ B6,AO3 . STILL MORE IX7 X0-X2 . RELATIVE ORIGIN OF LAST ORDER LX7 24+18 BX0 X7+X6 SA1 B1 . FIRST WORD OF LAST ORDER SA2 B1+AO.NOPS . D: NUMBER OF PARAMETER SPECS NG X2,NGCNT1 . ERROR BX3 X2 AX3 17 NZ X3,BIGOPRN BX3 X3-X3 .. ALWAYS ADD SUBP CALL ORDER SX5 20B . ACTION TYPE FOR CALL OR JUMP SX4 J.CALSUB . ACTION NUMBER FOR CALL ZR X3,AO4 SX4 J.JUMSUB . JUMP AO4 NZ X2,AO5 . NOT PARAMETERLESS SX5 X5+40B . ADD FLAG BIT AO5 LX5 54 . POSITION ACTION TYPE MX3 60-18-18 BX1 -X3*X1 .. CLIST, FL REQUIREMENTS BX5 X5+X1 LX3 18 SA1 B1+B5 .. SECOND WORD OF LAST ORDER BX3 -X3*X1 .. BLOCK, AP-LIST REQUIREMENTS BX3 X3+X2 .. ADD NUMBER OF VISIBILE PARAMS SB4 4 . INITIALIZE SIZE OF NEW ORDER SA6 B1+2 . INITIALIZE A6 FOR LOOP ZR X2,AO8 . BYTE WORDS NOT NEEDED SA1 MKWORD . EOW, ANY, ANY, ... BX6 X1 SB7 P.SCRL MX1 60-3 AO6 SB3 X2-19 LE B3,B0,AO7 SA6 A6+B5 SB4 B4+1 SX2 B3 LE B4,B7,AO6 EQ BIGORDER . ERROR (NEW ORDER TOO BIG FOR . SCRATCH AREA) AO7 SB3 X2 SX2 B3+B3 SB3 X2+B3 . 3 * REMAINDER LX1 B3,X1 BX6 X1*X6 SB4 B4+1 SA6 A6+B5 GT B4,B7,BIGORDER .. ERROR AO8 SA1 B1+AO.CLSCD+1 . C: A CLASS CODE BX6 X1 SA6 A6+B5 SX6 B4 . LENGTH OF NEW ORDER LX6 24 BX6 X6+X0 . ORIGIN OF ORDER SX0 X0+B4 . ORIGIN OF NEW NEXT ORDER SA6 B1+P.TEMP1 . SAVE INFO LX0 18 . POSITION ORIGIN OF NEXT ORDER BX7 X0+X4 SX6 B4-B5 . LENGTH OF NEW ORDER WITHOUT THE . CLASS CODE LX6 18+18 . POSITION PTR POINTER TO PS DATA BX6 X5+X6 SA6 B1 . FIRST WORD OF NEW ORDER BX6 X3 SA6 A6+B5 .. SECOND WORD OF NEW ORDER SA7 A6+B5 .. THIRD WORD OF NEW ORDER SB2 B2+B4 . TOTAL LENGTH OF NEW OPERATION SB4 AO9 . ^RETURN^ FROM MAKEOBJ SX7 AT.OPER . ALLOCATION TYPE SA5 B1+AO.AB+1 . C: AN ALLOCATION BLOCK EQ MAKEOBJ * AO9 SA1 B1+AO.OP+1 SA2 B1+P.TEMP1 SX0 X1 SA0 A2 SB2 X2 . LENGTH OF OLD OPERATION (=ORIGIN OF . NEW ORDER) MX3 60-21 RECS 1 SA4 A0 SA0 B1 BX1 X1-X4 . ***** IS THIS NEEDED ***** BX1 X3*X1 . ***** IS THIS NEEDED ***** NZ X1,DISASTER . ***** IS THIS NEEDED ***** IX0 X5+X2 . ECS ADDRESS FOR NEW ORDER LX2 60-24 SB4 P.SCRL SB3 X2 . LENGTH OF NEW ORDER SX7 B4 WECS B3 BX0 -X3*X4 . ECS ADDRESS OF OLD OPERATION BX3 X5 . SAVE START OF NEW OPERATION GE B4,B2,AO11 . DO LAST (AND FIRST) TRANSFER AO10 RECS P.SCRL IX6 X0+X7 . NEXT ADDRESS IN OLD OP SB2 B2-P.SCRL BX0 X5 WECS P.SCRL IX5 X0+X7 . IN NEW OP BX0 X6 LT B4,B2,AO10 . NOT READY FOR LAST TRANSFER AO11 RECS B2 BX0 X5 WECS B2 LX2 60-18 BX0 X3 MX7 1 LX7 19 RECS 1 SA1 A0 IX7 X1+X7 SA7 A0 SX7 B3 WECS 1 SX2 X2+2 .. PTR TO 3RD WORD OF OLD LAST ORDER IX0 X2+X3 . ECS ADDR OF SAME RECS 1 SA1 A0 LX7 18+18 BX6 X1+X7 . INSERT NEW LENGHT OF LAST ORDER SA6 A0 WECS 1 SA1 B1+AO.IX . C-LIST INDEX SB6 SYSRET SB5 CAPAB EQ PUTCAP ENDECS ADORD * DISASTER RJ =XDISASTR * TITLE ACTION TO COPY AN OPERATION * CPYOPR COPIES AN OPERATION * * PARAMETERS C: AN ALLOCATION BLOCK TO BE CHARGED * D: FULL C-LIST INDEX FOR NEW OPER * C: THE OPERATION TO BE COPIED * * ECSCODE COPOP CPYOPR SA1 B1+P.PARAM+2 .CAPABILITY INDEX NG X1,NGIXX .NEGATIVE C-LIST INDEX SA2 B1+P.CLIST SA2 B1+X2 IX1 X1-X2 .CHECK INDEX SA0 B1+0 NG X1,CPYOPR2 .INDEX OK CPYOPR1 SA2 A2+2 .NEXT C-LIST LENGTH ZR X2,BGIXX .INDEX TOO BIG IX1 X1-X2 PL X1,CPYOPR1 CPYOPR2 SA1 B1+P.PARAM+4 .OPRATION NAME AND MOT PTR. MX3 39 BX0 -X3*X1 .ECS ADDR OF OPERATION MOT RECS 1 .PICK UP MOT ENTRY SA2 A0+0 .OPERATION MOT BX4 X2-X1 BX4 X3*X4 NZ X4,MISOPR .NAMES DON,T MATCH SX7 AT.OPER . ALLOCATION TYPE FOR OPERATION BX0 -X3*X2 SB3 CPYOPR21 . GET THE OBJECT SIZE FROM THE JP =XOBJSIZ . ALLOCATOR, DELIVERED IN X2 CPYOPR21 SB2 X2 . MAY BE MORE THAN 18 BITS LATER SA5 B1+P.PARAM+1 .ALLOC BLK NAME AND MOT INDEX SB4 CPYOPR3 .RETURN EQ MAKEOBJ CPYOPR3 SA1 B1+P.PARAM+4 MX2 39 BX0 -X2*X1 SA0 B1+0 SX4 P.SCRL RECS 1 .OPERATION MOT SA1 A0 BX0 -X2*X1 .ECS ADDR OF OPERATION CPYOPR4 SB3 B2-P.SCRL LE B3,B0,CPYOPR5 .LESS THAN 1 BUFFER LONG RECS P.SCRL .READ SCRATCH AREA FULL IX1 X0+X4 .FIX READ ADDRESS BX0 X5 .WRITE ADDRESS SB2 B3+0 .REMAINING LENGTH WECS P.SCRL .WRITE OUT SCRATCH AREA IX5 X0+X4 .FIX WRITE ADDRESS BX0 X1 .READ ADDRESS EQ CPYOPR4 .LOOP CPYOPR5 RECS B2 .READ PARTIAL BUFFER LOAD BX0 X5 .WRITE ADDRESS SA1 B1+P.PARAM+2 .CAPABILITY INDEX WECS B2 .WRITE PARTIAL BUFFER SB5 CAPAB .CAPABILITY LOCATION SB6 SYSRET .RETURN EQ PUTCAP ENDECS COPOP TITLE DISPLAY AN OPERATION * * DISPLAY OPERATION IS AN ECS ACTION WHCIH COPIES ALL OR PART OF AN * OPERATION INTO THE USER'S FL. THE AMOUNT COPIED = MIN(LENGTH OF OPERATION, * LENTGTH OF USER-SUPPLIED BUFFER). * * PARAMETERS: * ORG P.PARAM DO.OPER BSS C: .. OPERATION TO BE DISPLAYED DO.AD BSS D: .. ADDRESS OF USER BUFFER DO.LEN BSS D: .. LENGTH OF USER BUFFER USE * * ECSCODE DSPOP * DISPOP SA1 B1+P.XPACK+1 .. WORD WITH RA SA2 A1+1 . .. FL AX1 18+18 .. RIGHT JUSTIFY... AX2 18+18 .. ... WITH ZERO FILL SA3 B1+DO.AD .. AP2 SA4 B1+DO.LEN .. AP3 NG X3,NEGADD .. ERROR NG X4,NOTPOS ZR X4,NOTPOS .. ERROR - BUFFER LENGTH MUST BE > 0 IX5 X3+X4 .. = LAST WORD ADDRESS + 1 OF BUFFER NG X5,BIGADD .. ERROR - ADDR + LENGTH IS TOO BIG IX5 X2-X5 NG X5,BIGADD .. ERROR - DITTO SA2 B1+DO.OPER+1 .. UN, MOT INDEX OF AP1 SA0 B1 .. =P.SCR MX5 60-21 .. =HOLE 21 SB2 X4 BX0 -X5*X2 RECS 1 SA4 B1 BX0 -X5*X4 BX4 X2-X4 .. COMPARE UNIQUE NAMES BX4 X5*X4 NZ X4,MISOPR .. ERROR - OPERATION HAS BEEN DESTROYED SB3 DISPOP2 . GET THE OBJECT SIZE FROM THE ALLOCATOR JP =XOBJSIZ . DELIVERED IN X2 DISPOP2 SB3 X2 IX1 X1+X3 .. ABS BUFFER ADDRESS SA0 X1 .. CM ADDRESS FOR ECS TRANSFER GE B3,B2,DISPOP1 .. BUFFER LEN <= OP SIZE SB2 B3 DISPOP1 RECS B2 .. MOVE IT JP SYSRET .. EXIT ENDECS DSPOP TITLE FILL IN PARAMETER SPECIFICATIONS ACAP SB7 ACAP1 . ^RETURN^ FROM O(PERATION) S(CAN) EQ OS * ACAP1 BX1 X1-X1 .. TYPE = 0 MX5 42 SA4 B1+P.PARAM+3 .. OPTION BITS JP UCAP2 * UDAT SB7 UDAT1 . ^RETURN^ EQ OS * UDAT1 SX3 X3-PS.NONE NZ X3,NOTANY . PS MUST HAVE BEEN ANY SA3 B1+P.SCR2+1 AX3 18 SX3 X3-P.APLL PL X3,BIGOPRN .. WOULD EXCEED AP AREA SX1 PS.UDAT-PS.NONE IX7 X2+X1 LX7 B3,X7 SA7 A2+0 . UPDATED PS BYTE WORD WECS B2 . WRITE OUT ORDER SX1 1 .. =(0,0,1) : FIRST WORD DELTA BX2 X1 LX2 18 .. =(0,1,0) : SECOND WORD DELTA BX3 X3-X3 .. =(0,0,0) : THIRD WORD DELTA BX6 X6-X6 .. FLAG TO PREVENT SETTING PARAM TYPE BIT JP UPDATE * OROPT SB7 OROPT1 . RETURN FROM OPSCAN EQ OS * OROPT1 SX3 X3-PS.UCAP NZ X3,NOTUCAP . MUST BE USER-SUPPLIED CAPABILITY SA2 B1+P.PARAM+3 . D: AN OPTION MASK LX2 18 MX3 42 SA1 A0+B5 . PICK UP PS DATA WORD BX6 X3*X2 BX6 X6+X1 SA6 A1 WECS B2 . WRITE OUT UPDATED ORDER EQ SYSRET * FCAP SB7 FCAP1 EQ OS * FDAT SB7 FDAT1 . ^RETURN^ FROM OS EQ OS * BDAT SB7 BDAT1 JP OS * BCAP SB7 BCAP1 JP OS * UCAP SB7 UCAP1 . ^RETURN^ FRLM OS * OS SA1 B1+P.PARAM+1 . C: AN OPERATILN SX0 X1 . MOT INDEX SA0 B1 . SCRATCH AREA RECS 1 SA2 A0 MX3 60-21 BX1 X1-X2 . COMPARE UNIQUE NAMES... BX1 X3*X1 NZ X1,MISOPR . ...THEY DO NOT MATCH BX0 -X3*X2 . ECS ADDRESS OF OPERATION BX5 X0 .. SAVE ORIGIN RECS 1 . OPERATION HEADER WORD SA1 A0 AX1 18 SB6 X1 . NUMBER OF ORDERS AX1 18 SB2 X1 . LENGTH OF FIRST ORDER MX6 60-3 .. =HOLE 3 SA1 B1+P.PARAM+2 . D: PARAMETER SPECIFICATION INDEX NG X1,NGINDX . PS INDEX MUST BE NON-NEGATIVE * * NOW THE ORDERS OF THE OPERATION WILL BE SCANNED TO DETERMINE THE * FOLLOWING: * 1) THE ACTUAL PARAMETER, OR AP, INDEX CORRESPONDING TO THE GIVEN, * VISIBLE PARAMETER SPECIFICATION INDEX. [=VISIBLE INDEX + * # OF FIXED PARAMS BEFORE THE PS IN QUESTION]. IS LEFT IN P.TEMP7 * 2) THE LOCATION OF THE PS BYTE FOR THE GIVEN INDEX. IS LEFT IN A2,X2,X3, * AND B3 * 3) THE LOCATION IN THE PS DATA AREA CORRESPONDING TO THE INDEX. IS LEFT * IN B5 * 4) THE ORIGIN OF THE ORDER CONTAINING THE PS TO BE MODIFIED. * 5) THE ADDRESS OF THE LAST PRECEDING 'NEXT LENGTH' FIELD. * 6) THE CONTENTS OF THE FIRST 3 WORDS OF THE LAST ORDER OF THE OPERATION * ARE RETURNED IN P.SCR2. * * NOTE: THE CODE IS DEPENDENT ON THE ORDER OF THE PS TYPE VALUES. * SX2 1+PS.MASKL .. LENGTH OF HEADER, MASK WORDS IX0 X0+X2 .. ADDRESS OF FIRST ORDER SB4 X1 .. INITIALIZE AP INDEX = VISIBLE INDEX BX7 X7-X7 .. INIT PTR (RELATIVE TO OPERATION) * TO LAST 'NEXT LENGTH' FIELD OS1 RECS B2 .. READ UP NEXT ORDER SA2 A0 .. WORD WITH ACTION TYPE AT LEFT END NG X2,OS3 .. THIS ORDER IS PARAMETERLESS AX2 18+18 .. RIGHT JUSTIFY DATA AREA POINTER SB5 X2 SA2 A0+3 .. FIRST WORD OF PS BYTES SB3 B0 .. INITIALIZE BYTE WORD POSITION COUNTER OS2 BX3 -X6*X2 .. EXTRACT NEXT BYTE LX2 60-3 .. SHIFT TO NEXT BYTE SB3 B3+3 SX4 X3-PS.BLK NZ X3,OS4 .. NOT TO END OF THIS ORDER OS3 SB6 B6-1 .. DECREMENT NUMBER OF ORDERS ZR B6,BGINDX .. ERROR - PS INDEX TOO LARGE SA2 A0+2 .. THIRD WORD OF ORDER AX2 18 SX3 X2 .. ORIGIN OF NEXT ORDER IX7 X0-X5 .. PTR RELATIVE TO OPERATION SX7 X7+2 .. ... OF THIS ORDER-S NEXT LENGTH FIELD IX0 X5+X3 .. ABS ECS ADDRESS OF NEXT ORDER AX2 18 SB2 X2 .. LENGTH OF NEXT ORDER JP OS1 .. READ AGAIN OS4 PL X4,OS.PSDAT .. BLK OR UCAP SX4 X3-PS.FDAT PL X4,OS.FIXED .. FDAT OR FCAP SX4 X3-PS.NONE PL X4,OS.NODAT .. NONE OR UDAT SA2 A2+1 .. NEXT WORD OF BYTES SB3 B0 .. RESET BYTE WORD POSITION JP OS2 .. KEEP GOING OS.FIXED SB4 B4+1 .. INCREMENT AP INDEX SB5 B5+1 .. INCREMENT DATA AREA PTR ZR X4,OS2 .. FDAT - REQUIRES 1 DATA WORD SB5 B5+1 .. FCAP - REQUIRES 2 DATA WORDS JP OS2 OS.PSDAT ZR X1,OS5 .. FOUND IT SB5 B5+1 .. BLK AND UCAP REQUIRE 1 DATA WORD SX1 X1-1 .. DECREMENT VISIBLE PS INDEX JP OS2 .. KEEP LOOKING OS.NODAT ZR X1,OS5 .. FOUND IT SX1 X1-1 JP OS2 OS5 IX4 X0-X5 .. PTR TO RELEVANT ORDER LX7 18 BX7 X7+X4 SA7 B1+P.TEMP6 BX7 X5 .. ABS ECS ADDRESS OF OPERATION SA7 B1+P.TEMP2 SA0 B1+P.SCR2 .. ALTERNATE SCRATCH AREA OS6 RECS 3 SB6 B6-1 ZR B6,OS7 .. THIS IS LAST ORDER SA4 A0+2 AX4 18 SX0 X4 .. ORIGIN OF NEXT ORDER IX0 X5+X0 JP OS6 .. KEEP GOING OS7 LX2 3 .. RIGHT JUSTIFY PS BYTE SB3 B3-3 .. SET COUNT BACK SX6 B4 SA6 B1+P.TEMP7 .. SAVE AP INDEX SA0 B1 JP B7 .. RETURN * FCAP1 SX3 X3-PS.UCAP NZ X3,NOTUCAP SA1 B1+P.PARAM+3 . C: A CAPABILITY SA4 A0+B5 . PICK UP PS DATA WORD BX4 -X4+X1 NZ X4,BADCAP . TYPE OR OPTIONS WRONG SA1 A1+1 . SECOND WORD OF CAPABILITY SB5 B5+1 . BUMP THE PS DATA AREA PTR TO * . SKIP THE OPTION BITS/TYPE WORD SX4 PS.FCAP-PS.UCAP SB7 FCAP2 EQ FIXUP * FDAT1 SX3 X3-PS.UDAT NZ X3,NOTUDAT SA1 B1+P.PARAM+3 . D: A DATA WORD SX4 PS.FDAT-PS.UDAT SB7 FCAP3 EQ FIXUP * BDAT1 SB7 BDAT2 .. RETURN FROM FIXUP SA1 B1+P.PARAM+3 .. BLOCK LENGTH NG X1,NOTPOS ZR X1,NOTPOS .. BLOCK SIZE SHOULD BE > 0 BX4 X4-X4 .. DATUM FLAG = 0 BX6 X1 .. AP AREA REQUIREMENT DELTA JP BCAP2 * BCAP1 SB7 BCAP3 .. RETURN FROM FIXUP SA1 B1+P.PARAM+3 .. BLOCK LENGTH NG X1,NOTPOS ZR X1,NOTPOS .. SHOULD BE > 0 IX6 X1+X1 .. CAPABILITIES REQUIRE 2 WDS EACH IN AP AREA MX4 1 .. CAPABILITY FLAG = 1 NG X6,BIGOPRN .. ERROR - OVERFLOW BCAP2 SX3 X3-PS.NONE NZ X3,NOTANY .. ERROR SA3 B1+P.SCR2+1 .. 2ND WORD OF SAVED LAST ORDER AX3 18 SX5 X3-P.APLL PL X5,BIGOPRN .. ERROR AX3 18 IX3 X3+X6 SX6 P.PBUFL .. BLOCK BUFFER LENGTH IX3 X6-X3 NG X3,BIGOPRN .. ERROR BX1 X1+X4 .. WORD FOR FIXUP SX4 PS.BLK-PS.NONE JP FIXUP * UCAP1 SA1 B1+P.PARAM+3 .. TYPE MX5 42 BX1 -X5*X1 CX6 X1 SX6 X6-9 NZ X6,BADTYPE .. OBJECT TYPE MUST HAVE 9 BITS SET SA4 B1+P.PARAM+4 .. OPTIONS UCAP2 SX3 X3-PS.NONE NZ X3,NOTANY .. ERROR LX4 18 .. POSITION OPTIONS BX4 X5*X4 BX1 X4+X1 .. LEAVE WORD FOR FIXUP SA3 B1+P.SCR2+1 .. SECOND WORD OF SAVED LAST ORDER AX3 18 .. RIGHT JUSTIFY AP LENGTH REQUIREMENT SX3 X3-P.APLL+1 PL X3,BIGOPRN .. ERROR SX4 PS.UCAP-PS.NONE SB7 UCAP3 * FIXUP SB4 P.SCRL-1 LT B4,B2,BIGORDER . TOO LARGE FOR SCRATCH AREA SX5 B2 . LENGTH OF ORDER LX5 18 SX6 A2-B1 . PTR TO PS BYTE WORD BX6 X5+X6 SA6 B1+P.TEMP5 SX6 B5 . PTR TO PLACE FOR NEW WORD SX7 B7 .. RETURN LINK LX7 18 BX6 X7+X6 SA6 B1+P.TEMP3 BX7 X1 SA7 B1+P.TEMP1 . WORD TO ADD TO OPERATION LX7 B3,X4 . WORD TO CHANGE PS BYTE WORD SA7 B1+P.TEMP4 SA2 B1+P.PARAM+1 . MOT INDEX FOR REALLOC SX6 FIXUP1 . RETURN LINK SX1 1 . INCREMENT EQ REALLOC * FIXUP1 SA1 B1+P.PARAM+1 .. OPERATION AGAIN SX0 X1 SA0 B1 RECS 1 .. READ MOT ENTRY MX4 60-21 SA2 B1 BX1 X1-X2 BX2 -X4*X2 BX1 X4*X1 NZ X1,DISASTER SA3 B1+P.TEMP6 SX5 X3 . SAVE PTR TO RELEVANT ORDER SB5 X3 AX3 18 IX0 X2+X3 . ADDRESS OF ^NEXT LENGTH^ FIELD TO U SX7 -1 BX4 X7 LX4 36 RECS 1 SA3 A0 IX6 X3-X4 SA6 A0+0 WECS 1 SA3 B1+P.TEMP5 . LENGTH OF ORDER, PTR TO PS BYTE WD IX0 X2+X5 . ADDRESS OF ORDER BX7 X2 SA7 B1+P.TEMP2 .. SAVE (POSSIBLY NEW) ECS ADDRESS SX3 X3 .. PTR TO BYTE WORD IX0 X0+X3 SA3 B1+P.TEMP4 . WORD TO FIX UP PS BYTE RECS 1 .. READ UP OLD BYTE WORD SA5 B1 IX6 X5+X3 SA6 A5 WECS 1 SA4 B1+P.TEMP3 SX3 X4+B5 . RELATIVE ADDRESS OF NEW WORD AX4 18 SB7 X4 .. RESTORE RETURN LINK SB3 FIXUP3.9 . GET THE OBJECT SIZE FROM THE ALLOCATOR BX0 X2 . A(OBJECT) FOR OBJSIZ JP =XOBJSIZ . DELIVERED IN X2 FIXUP3.9 SX1 1 IX2 X2-X1 IX1 X0+X2 . LWA OF OPERATION (NEW) SB2 P.SCRL . LENGTH OF SCRATCH AREA IX4 X2-X3 SX2 B2 SB3 X4+0 .. TOTAL AMOUNT TO MOVE MX7 59 .. =-1 SA0 B1 FIXUP4 LE B3,B2,FIXUP5 . GO DO LAST TRANSFER IX0 X1-X2 . START ADDR, OLD POSITION SB3 B3-B2 . DECREMENT OTTAL WORD COUNT RECS B2 BX1 X0 IX0 X0-X7 . START ADDR, NEW POSITION WECS B2 EQ FIXUP4 FIXUP5 SX2 B3 IX0 X1-X2 RECS B3 BX1 X0 IX0 X0-X7 WECS B3 BX0 X1 SA0 B1+P.TEMP1 . ADDRESS OF WORD TO ADD TO OPERATION WECS 1 JP B7 .. RETURN * UCAP3 MX1 59 .. =-1 BX3 -X1 LX3 18 .. =(0,1,0) : DELTA FOR THIRD WOD BX1 -X1+X3 .. =(0,1,1) : DELTA FOR FIRST WORD IX2 X3+X3 .. =(0,2,0) : DELTA FOR SECOND WORD MX6 1 .. FLAG TO CAUSE PARAM TYPE BIT TO BE SET JP UPDATE * FCAP2 IX0 X0+X7 GET BACK TO THE OPTION BIT/TYPE SA0 B1+P.PARAM+3 WORD AND WRITE THE ONE THE WECS 1 USER SUPPLIED FCAP3 BX1 X1-X1 .. =(0,0,0) : DELTA FOR FIRST WORD MX2 59 .. =(0,0,-1) : DELTA FOR SECOND WORD BX3 -X2 LX3 18 .. =(0,1,0) : DELTA FOR THIRD WORD BX6 X6-X6 .. FLAG TO PREVENT SETTING PARAM TYPE BIT JP UPDATE * BDAT2 SA1 B1+P.PARAM+3 .. BLOCK LENGTH = M BX2 X1 LX2 18+18 SX3 2 LX3 18 BX2 X2+X3 .. =(M,2,0) : DELTA FOR SECOND WORD SX1 X1+1 .. =(0,0,M+1) : DELTA FOR FIRST WORD AX3 1 .. =(0,1,0) : DELTA FOR THIRD WORD MX6 1 .. PARAM TYPE BIT FLAG JP UPDATE * BCAP3 SA1 B1+P.PARAM+3 .. BLOCK LENGTH = L IX2 X1+X1 LX2 18+18 SX3 2 LX3 18 BX2 X2+X3 .. =(2*L,2,0) : DELTA FOR SECOND WORD AX3 1 .. =(0,1,0) : DELTA FOR THIRD WORD LX1 18 MX4 59 .. =-1 BX1 -X4+X1 .. =(0,L,1) : DELTA FOR FIRST WORD MX6 1 .. PARAM TYPE BIT FLAG JP UPDATE * * * UPDATE IS USED BY THE PARAMETER-SPECIFYING ACTIONS TO UPDATE THE * CUMULATIVE TOTALS AND 'ORIGIN OF NEXT ORDER' FIELDS OF THE MODIFIED AND * SUBSEQUENT ORDERS. FOR THE USE OF FCAP AND FDAT, IF THE INCREMENT TO THE * VISIBLE PARAMETERS FIELD, IN THE LOWER 18 BITS OF THE SECOND WORD, IS * NEGATIVE, UPDATE WILL ZERO IT AFTER APPLYING IT TO THE FIRST UPDATED ORDER. * (THAT IS BECAUSE THIS FIELD IS NOT CUMULATIVE.) UPDATE ALSO SETS THE * PARAMETER TYPE BIT CORRESPONDING TO THE AP INDEX IN P.TEMP7 IF CALLED WITH * X6 .NE. 0. * * PARAMETERS: * * X1 - 60-BIT QUANTITY TO BE ADDED TO EACH ORDER'S FIRST WORD * X2 - DITTO FOR SECOND WORD * X3 - DITTO FOR THIRD WORD * X6 - NOT ZERO => PARAM TYPE BIT WILL BE SET * * EXITS TO SYSRET * UPDATE SA4 B1+P.TEMP2 .. ABS ADDRESS OF START OF OPERATION ZR X6,UPDATE3 .. DO NOT SET PARAM TYPE BIT SA5 B1+P.TEMP7 .. AP INDEX OF MODIFED SPEC SX7 1 .. START QUOTIENT := 1 UPDATE1 SB2 X5-60 .. TRIAL DIVIDEND := DIVIDEND - DIVISOR NG B2,UPDATE2 .. DONE SX7 X7+1 .. QUOTIENT := QUOTIENT + 1 SX5 B2 .. NEW DIVIDEND JP UPDATE1 UPDATE2 IX0 X4+X7 .. ADDRESS IN ECS OF TYPE BIT WORD MX6 1 AX6 B2,X6 .. POSITION NEW TYPE BIT SA0 B1 .. [=P.SCR] RECS 1 SA5 B1 BX6 X5+X6 .. OR IN NEW BIT SA6 A5 WECS 1 UPDATE3 SA5 B1+P.TEMP6 .. SAVED PTR TO RELEVANT ORDER SX5 X5 IX0 X4+X5 .. ABSOLUTE ECS ADDRESS UPDATE4 RECS 3 SA5 A0 .. FIRST WORD OF THIS ORDER IX6 X5+X1 .. PLUS INCREMENTS SA5 A0+1 .. SECOND WORD SA6 A0 IX6 X5+X2 .. PLUS INCREMENTS SA5 A0+2 .. THIRD WORD SA6 A0+1 IX6 X5+X3 SA6 A5 WECS 3 SX5 X2 .. VISIBLE PARAMS FIELD PL X5,UPDATE5 .. OK UNLESS NEGATIVE BX2 X2-X2 .. FCAP AND FDAT DO NOT CHANGE REST OF WORD UPDATE5 AX6 18 SX7 X6+0 .. ORIGIN OF NEXT ORDER IX0 X4+X7 AX6 18 SB2 X6 .. LENGTH OF NEXT ORDER NZ B2,UPDATE4 .. NEXT LENGTH FIELD IS ZERO IN * LAST ORDER OF OPERATION JP SYSRET TITLE DESTROY AN OPERATION EJECT * * DLOPR * * DESTROY AN OPERATION * * IP1 C: OPERATION TO BE DESTROYED (OB.DSTRY) * * USER GETS 7,1,1 ERROR IF OPERATION DOESN'T EXIST * ENTRY DLOPR ECSCODE DLOPR EXT DELOBJ SPACE 2 DLOPR SA5 B1+P.PARAM+1 SX0 X5 .. MOT POINTER SA0 B1 RECS 1 .. READ MOT MX0 60-21 SA1 B1 .. FETCH MOT SB3 1 .. ERROR MODIFIER BX1 X1-X5 .. CHECK IF UNIQUE NAMES MATCH. DONN'T CARE BX1 X1*X0 ABOUT LOWER 21 BITS NZ X1,MOTERR .. ERROR: OPERATION GONE FROM MOT SB7 SYSRET EQ DELOBJ .. DESTROY OPERATION ENDECS DLOPR TITLE ERROR CODE EJECT ERRNUMS XTEXT * * 2,0 ERROR - PARAMETER TOO SMALL (CURRENTLY NO INDEX IS GIVEN) * NOTPOS SX7 E.NEGPAR JP PARMERR .. SET ERROR CLASS AND JP TO E.ERROR * * 2,2 ERROR - POINTER IS NEGATIVE (NO PARAM INDEX GIVEN) * NEGADD SX7 E.NEGPT JP PARMERR * * 2,3 ERROR - POINTER IS TOO LARGE (NO INDEX GIVEN) * BIGADD SX7 E.BIGPT JP PARMERR * NGCNT SX2 4 EQ ERR20 NGCNT1 SX2 5 ERR20 SX7 E.NEGPAR EQ CL2 BGIXX SX7 E.BIGIX EQ CL2 BIGOPRN SX7 E.MANPAR EQ CL7 BIGORDER SX7 E.BIGORD EQ CL7 NOTANY SX7 E.NOTANY EQ CL7 NOTUCAP SX7 E.USER EQ CL7 NOTUDAT EQU NOTUCAP MISOPR SX7 E.NOOP EQ CL7 MOTERR SX3 B3 .. ERROR MODIFIER LX3 18 SX7 E.NOOP .. OPERATION NOT IN MOT BX7 X7+X3 EQ CL7 BADCAP SX7 E.CAPTY SA1 B1+P.PARAM+2 SX1 X1-1 LX1 18 BX7 X1+X7 BADTYPE EQU BADCAP CL7 SX6 E.OPER EQ E.ERROR NGIXX SX2 X1 NGIX SX7 E.NEGIX EQ CL2 BGIX SX7 E.BIGIX SA2 A6 EQ CL2 NGINDX SX7 E.NEGPAR SX2 1 EQ CL2 BGINDX SX7 E.BIGPAR SX2 1 CL2 LX2 18 MX3 42 BX2 X3*X2 BX7 X2+X7 PARMERR SX6 E.PARMS EQ E.ERROR END