SPL,L,O ! NAME: SP.. ! SOURCE: 92067-18229 ! RELOC: 92067-16185 ! PGMR: G.A.A. ! ! *************************************************************** ! * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * ! * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * ! * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* ! * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ! *************************************************************** ! NAME SP..(8) "92067-16185 REV.2026 800221" ! ! MODIFICATION RECORD: ! ! DATE REASON ! 1) 780106 TO CLEAR WRITTEN-ON FLAG IN DCB SET-UP (GLM) ! 2) 780221 TO SET LAST PTN USED (ID22)=0 (GLM) ! 3) 780405 TO BYPASS ID EXTENSION SAVE FOR TYPE 5 (BL) ! 4) 780427 TO OVERRIDE SESSION MONITOR CARTRIDGE CHECK & ! TO CALL IER. ON RETURN FROM CREA. (BL) ! 5) 780512 TO ACCESS NEW 256-WORD CARTRIDGE DIRECTORY (BL) ! 6) 780810 TO USE NEW DCB FORMAT ! 7) 790122 TO SAVE ID SEGMENT WORD 32 ! 8) 790125 TO SAVE USER ID, SO TYPE 6 FILE CAN LATER BE PURGED ! BY THIS USER ! 9) 791016 TO ADD PROGRAM PROTECT OPTIONS FOR TYPE 6 FILES ! 10) 800221 TO REMOVE DEFAULT OF CRN TO LU 2 (DCL) ! ! THE SP ROUTINE SAVES A PROGRAM ! IN A FILE. THE FIRST TWO SECTORS ! ARE SET UP TO ALLOW THE PROGRAM ! TO BE RESTORED TO THE SYSTEM ! ! THIS PROGRAM IS INVOKED BY : ! SP,NAME[,PR/GR[,CAP]] ! WHERE: ! NAME IS THE NAME OF THE PROGRAM TO BE SAVED ! PR, IF SPECIFIED, WILL ALLOW ONLY USERS WITH THIS ! PRIVATE ID TO RP OR RUN THIS TYPE 6 PGM ! GR, IF SPECIFIED, WILL ALLOW ONLY USERS WITH THIS ! GROUP ID TO RP OR RUN THIS TYPE 6 PGM ! CAP IS THE CAPABILITY LEVEL REQUIRED TO RP OR RUN ! THIS TYPE 6 PGM ! ! DEFINE THE EXTERNALS ! LET CREA., \FMGR FILE CREATE ROUTINE EXEC, \RTE EXEC IER., \FMGR ERROR PROCESSING OPEN., \FMGR FILE OPEN ROUTINE READF, \FMP FILE READ ROUTINE RWNDF, \FMP FILE REWIND ROUTINE WRITF, \FMP FILE WRITE ROUTINE ISMVE, \MOVE WORDS FROM SCB SESSN \GET SCB ADDRESS IF SESSION BE SUBROUTINE,EXTERNAL ! LET ID.A \FETCH ID SEGMENT ADDRESS BE FUNCTION,EXTERNAL ! LET .E.R., \FMGR ERROR WORD D.SDR, \CARTRIDGE DIRECTORY BUFFER N.OPL, \SUBPARAMETER ARRAY O.BUF, \FMGR INTERNAL BUFFER I.BUF, \FMGR INTERNAL BUFFER S.CAP, \9P - SESSION CAPABILITY OVRD. \CARTRIDGE SEARCH OVERRIDE BE INTEGER,EXTERNAL ! ASSEMBLE ["EXT $OPSY";"EXT $IDEX";"EXT $CL1";"EXT $CL2"] ASSEMBLE ["EXT $SMID";"EXT $SMGP"] ! ! DEFINE INTERNAL ROUTINES ! LET ADS, SP.. BE SUBROUTINE ! LET MF BE FUNCTION ! ! DEFINE CONSTANTS ! LET XEQT BE CONSTANT (1717K) LET SECT2 BE CONSTANT (1757K) LET SECT3 BE CONSTANT (1760K) SP..: SUBROUTINE (N,LIS,ER) GLOBAL IFNOT N THEN [ER_50; RETURN] !IF NO PARAMETERS, ERROR 50 OPT2_[TYP2_[OPT1_[PAD_@ LIS+1]+4]+3]+1 !SET PARAMETER ADDRESSES ID32_[ID27_[ID_ ID.A($PAD)?[ER_14; RETURN]]+26]+5 !IDSEG ADDR ! BF,T1_@I.BUF !POINTERS TO BUFFER FOR IDSEG. FOR T_BF TO BF +127 DO $T_0 !ZERO THE ID SEGMENT BUFFER FOR T_ID TO ID+25 DO [$T1_ $T;T1_T1+1] !COPY 1ST 26 WDS OF IDSEG T1_T1+2 !BUMP POINTER TO BUFFER FOR IDSG FOR T_ID+28 TO ID+29 DO [$T1_$T;T1_T1+1] !COPY IDSEG WDS 29,30 $(@I.BUF+31)_$ID32 !SAVE IDSEG WORD 32 ADS (BF+11) ASSEMBLE ["LDA $OPSY";"STA OPSY";"LDA $IDEX";"STA IDEX"] T_$ID15 AND 7 !GET TYPE OF PGM IF T>1 THEN [IF OPSY = -9 OR T#4 THEN GO TO SP2] !LEGAL CONTINUE ER_56 !ILLEGAL PROGRAM TYPE RETURN ! SP2: IF OPSY = -9 AND T#5 THEN [ \IF RTE-IV & NOT SEG. IF $ID22 >= 0 THEN[$ID22_ ($ID22 AND 177700K)]; \IF PTN NOT ASSIGNED \SET LAST PTN USED=0 \ FOR DISP (780221 GLM) IF $ID29 THEN [ \AND IF EMA T_$(IDEX+(($ID29 AND 176000K)-<6));\THEN INDEX TO ID EXT T1_T1+5; \AND $T1_($T AND 37K) OR 100000K; \SAVE ID EXT WORD 0 T1_T1+1; \AND T_T+1; \SAVE ID EXT WORD 1 $T1_$T AND 176000K]] ! IF $ID15 AND 20K THEN[$(BF+7)_$ID12; \ADJUST FOR SHORT ID T1_ID15 ;\ FOR T_ID23 TO ID26 DO[\ $T_$[T1_T1+1]];\ ID27_ID20] $ID16,$ID17,$(BF+8)_0 $ID18_($ID18 AND 167777K) ! ASSEMBLE ["LDA $SMID";"STA SMID"] ASSEMBLE ["LDA $SMGP";"STA SMGP"] CALL SESSN($XEQT)?[GOTO SP4] !IN SESSION? SESWD_.B. !ID SEGMENT SESSION WORD CALL ISMVE(SESWD,SMID,$ID39,1) !USER ID TO WORD 39 CALL ISMVE(SESWD,SMGP,$ID40,1) !GROUP ID TO WORD 40 IFNOT $(OPT1-1) THEN GO TO SP3 !NO PR/GR PARAMETER? IF $OPT1="PR" THEN \IF PR SPECIFIED, THEN $ID39_$ID39 OR 100000K, ELSE \SET SIGN ON USER ID WORD [IF $OPT1="GR" THEN \IF GR SPECIFIED, THEN $ID40_$ID40 OR 100000K, ELSE \SET SIGN ON GROUP ID WD [ER_56;RETURN]] !ERR, NOT PR,GR OR NULL SP3: IF $TYP2=3 THEN [ER_56;RETURN], \IF CAP OPTION ASCII, ERR ELSE $ID41_$OPT2 !SAVE MINIMUM CAP LEVEL ! SP4: SZR_[SZ_[TY_[CR_ @N.OPL+1]+1]+1]+1 $SZR_128 !SET REC LENGTH TO 128 $TY_6 !SET TYPE TO 6 ! !!! REMOVE DEFAULT OF CRN TO LU 2 (DCL) 800221 !!! IFNOT $CR THEN $CR_-2 !DEFAULT CRN TO -2 ! $SZ_[XF_MF( ID23)+ MF( ID25)]+1 ! IF S.CAP THEN [ \IF IN SESSION, THEN TEMP_OVRD.; \SAVE CURRENT STATE OF OVRD. OVRD._OVRD. OR 40000K] !SET CARTRIDGE SEARCH OVERRIDE CREA. (O.BUF,$PAD,N.OPL)?[ER_-15; \ IF S.CAP THEN OVRD._TEMP;RETURN] IF S.CAP THEN OVRD._TEMP !IF SESSION, RESET OVRD'S STATE IER. ! $(@O.BUF+2)_1 !FORCE TO TYPE 1 ASSEMBLE ["LDA $CL1";"STA CL1";"LDA $CL2";"STA CL2"] CALL EXEC(1,2,D.SDR,256,CL1,CL2) !READ THE SET UP WORD ! $ID35_$(253+@D.SDR) !MOVE TO ID BLOCK I.BUF_ -1 !SET EOF FOR THOSE WHO DON'T KNOW BETTER ! FOR T_BF TO ID33 DO[$ID34_$ID34+$T] ! WRITF(O.BUF,.E.R.,I.BUF) !WRITE ID SEG TO 1ST BLK OF FILE IER. ! ! SET UP A DUMMY DCB FOR RWNDF CALL ! ADS ( [IBUF_@O.BUF+16]+2) !SET UP POINTERS TO DUMMY DCB ! $IBUF_[IF[T_$ID27]<0 THEN 3,ELSE 2] ! SET DISC LU ! $ID12_1 !TYPE (DCB WORD 2) $ID13_(T AND 77600K)-<9 !FILE TRACK ADDR. (DCB WORD 3) $ID14_( T AND 177K) !FILE SECTOR ADDR (DCB WORD 4) $ID15_$SZ-<1 !FILE SIZE (DCB WORD 5) $ID16_128 !RECORD LENGTH (DCB WORD 6) $ID17_210K !UPDATE OPEN (DCB WORD 7) $ID18_ [IF T<0 THEN $ SECT3,ELSE $SECT2] !SEC TRK(DCB WORD 8) $(ID18+1)_$XEQT !OPEN INDICATOR (DCB WORD 9) $ID23,$ID25_0 !RECORD #,EXTENT (DCB 13,15) RWNDF($IBUF,.E.R.) IER. ! RDP: READF ($IBUF,.E.R.,$ID26,256) ! IER. ! WRITF(O.BUF,.E.R.,$ID26,[IF[XF_XF-2]<0 \ THEN 128, ELSE 256]) ! IER. ! IF XF>0 THEN GO TO RDP ! RETURN ! END ! MF: FUNCTION(MAD) !COMPUTE # BLOCKS OF FILE SPACE MFV_($( MAD+1)-$MAD +177K) >-7 RETURN END ! ADS: SUBROUTINE (BASE) ID18_[ID17_[ID16_[ID15_[ID14_[ID13_[ID12\ _ BASE]+1]+1]+1]+1]+1]+1 ID41_[ID40_[ID39_[ID35_[ID34_[ID33_[ID29_[ID26_[ID25_[ID24_[ID23 \ _[ID22_[ID20_ID18+2]+2]+1]+1]+1]+1]+3]+4]+1]+1]+4]+1]+1 ! RETURN END END END$