FTN4,L,M
C  NAME:    START 
C  SOURCE:  92070-18160 
C  RELOC:   92070-16160 
C  PGMR:    HLC 
C 
C 
C  **************************************************************** 
C  *  (C)  COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS    * 
C  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
C  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
C  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
C  **************************************************************** 
C 
C 
C  PURPOSE: START WILL PERFORM THE FOLLOWING TASKS: 
C 
C           *  ALLOCATE AND INITIALIZE THE SWAP FILE. 
C           *  SET UP AN ID SEGMENT FOR FMGR AND SCHEDULE IT. 
C           *  PASS A STRING TO FMGR THAT WILL TRANSFER TO WELCOM.
C 
C 
C  INVOKE:  RU, START, SWAP, FMGR, WELCOME, CARTRIDGE 
C 
C           OR
C 
C           DESIGNATE START AS THE START-UP PROGRAM DURING THE
C           USER PROGRAM RELOCATION PHASE AT GENERATION TIME. 
C 
C           WHERE:
C             'SWAP' IS THE SWAP FILE SECURITY CODE 
C             'FMGR' IS THE FMGR FILE SECURITY CODE 
C             'WELCOME' IS THE WELCOME FILE SECURITY CODE 
C             'CARTRIDGE' IS THE CARTRIDGE REFERENCE FOR ALL THREE FILES
C 
C 
C  SUBROUTINES UNIQUE TO START
C 
C  CDPX:    PATCHES THE FIRST WORD OF THE CARTRIDGE DIRECTORY 
C           IF THE FIRST WORD OF THE DIRECTORY IS EQUAL OR
C           LESS THAN ZERO. 
C 
C           INVOKE: CALL CDPX(LU) 
C 
C                   OR
C 
C                   OLD = CDPX(LU)
C 
C           WHERE:  'LU' IS THE VALUE TO BE PLACED IN THE FIRST WORD OF 
C                   THE CARTRIDGE DIRECTORY.
C 
C                   'OLD' IS THE PREVIOUS CONTENTS OF THE CARTRIDGE 
C                   DIRECTORY.
C 
C 
C           IF:     'LU' IS SET TO ZERO, THE DIRECTORY WILL NOT BE
C                   MODIFIED. 
C 
C                   'OLD' IS RETURNED AS A VALUE GREATER THAN ZERO, THEN
C                   THE FIRST WORD OF THE DIRECTORY ALREADY HAD A POSITIVE
C                   VALUE IN IT, AND WAS NOT PATCHED. 
C 
C  SWPIN:   INITIALIZES THE SWAP TABLE TO BE USED BY THE SWAP FILE, AND 
C           RETURNS THE ACTUAL NUMBER OF BLOCKS USED, TO ALLOW  
C           FOR TRUNCATION. 
C 
C           INVOKE: I=SWPIN(DCB, ERR, BLKS) 
C 
C           WHERE:  'DCB' IS THE DATA CONTROL BLOCK USED BY "SWAP". 
C 
C                   'ERR' (SAME AS 'I') IS AN ERROR CODE RETURNED   
C                   TO THE CALLING PROGRAM AS FOLLOWS:  
C 
C                    0      NO ERROR
C                   -7      WRONG SECURITY CODE 
C                   -11     FILE NOT OPEN 
C                   -42     SWAPPING ACTIVE 
C                   -43     SYSTEM DOES NOT ALLOW SWAPPING
C                   -44     WRONG FILE TYPE 
C                   -45     FILE TOO SMALL
C 
C                   'BLKS' IS THE NUMBER OF BLOCKS USED.
C 
C 
      PROGRAM START  (3,45) ,  92070-16160  REV.1941  800124
      IMPLICIT INTEGER  (A-Z) 
      INTEGER DCB (144) 
      INTEGER FMGR (3)
      INTEGER RBUF (5)
      INTEGER WELCOM (12) 
      INTEGER SWAP (3)
      DATA FMGR/2HFM,2HGR,2H  / 
      DATA SWAP/2HSW,2HAP,2H  / 
      DATA WELCOM/2H::,2HWE,2HLC,2HOM,2H: ,2HXX,2HXX,2HXX,2H: / 
C 
C 
C 
C  OBTAIN THE SECURITY CODES AND THE CARTRIDGE REFERENCE NUMBERS OF 
C  THE SWAP, FMGR, AND WELCOME FILES. 
C 
      CALL RMPAR (RBUF) 
C 
C  CONVERT THE WELCOME FILE SECURITY CODE AND CARTRIDGE REFERENCE 
C  NUMBER TO AN ASCII STRING. 
C 
      CALL CNUMD (RBUF (3) ,WELCOM (6) )
      CALL CNUMD (RBUF (4) ,WELCOM (10) ) 
C 
C  LOG = LOGICAL UNIT NUMBER OF THE SYSTEM CONSOLE. 
C 
      LOG = LOGLU (SN)
C 
C  DETERMINE IF AN INITIAL CARTRIDGE WAS SPECIFIED AT GENERATION TO 
C  BE MOUNTED AT BOOT UP. IF NOT, PROMPT FOR THE SYSTEM DISC  LU. 
C 
      CALL FSTAT (FIRST,1)
      IF (FIRST.NE.0) GOTO 50 
5     WRITE (LOG,10)
10    FORMAT ("PLEASE ENTER THE LU OF THE SYSTEM DISC") 
      READ (LOG,*) FIRST
C 
C  PATCH THE CARTRIDGE DIRECTORY WITH THE SYSTEM DISC  LU NUMBER. 
C 
      CALL CDPX (FIRST) 
C 
C  CLEAR THE DCB HEADER 
C 
50    DO 60 I = 1,16
      DCB (I)  = 0
60    CONTINUE
C 
C 
C 
C  *** SWAP FILE INITIALIZATION *** 
C 
C 
C 
C  DETERMINE IF THE SYSTEM SUPPORTS SWAPPING.  IF NOT, GO AND 
C  SCHEDULE FILE MANAGER. 
C 
      IF (SWPIN (DCB,IDFLG,BLKS) .EQ.-43)  GOTO 2000
C 
C  DOES THE SWAP FILE ALREADY EXIST?
C 
      CRFLAG=OPEN (DCB,ERR,SWAP,0,RBUF(1),RBUF(4) ) 
      IF (CRFLAG.GE.0)  GOTO 100
C 
C  MAKE SURE THAT THE CARTRIDGE DIRECTORY WAS PATCHED SUCCESSFULLY. 
C  IF NOT, TRY AGAIN. 
C 
      CALL FSTAT (FIRST,1)
      IF (FIRST.GE.0)  GOTO 90
70    WRITE (LOG,80)
80    FORMAT ("  *DISC  MOUNT FAILED*") 
      GOTO 5
90    IF (CRFLAG.NE.-6)  GOTO 300 
C 
C 
C  IF NO SWAP FILE EXISTS, CREATE ONE.
C 
      IF (CREAT (DCB,ERR,SWAP,-1,1,RBUF(1),RBUF(4) ).LT.0)  GOTO 300
C 
C  INITIALIZE THE SWAP TABLE AND RETURN THE NUMBER OF SWAP AREAS
C  AVAILABLE IN THE SWAP FILE.
C 
100   IF (SWPIN (DCB,ERR,BLKS) .LT.0)  GOTO 300 
      WRITE  (LOG,200)  ERR 
200   FORMAT (I4," SWAP AREAS AVAILABLE") 
C 
C  IF THE SWAP FILE WAS CREATED NOW,
C  DETERMINE THE ACTUAL SIZE OF THE SWAP FILE,
C 
      IF(CRFLAG.NE.-6) GOTO 1000
      IF (LOCF (DCB,ERR,SN,SN,SN,SEC) .LT.0)  GOTO 300
      SEC  = SEC/2-BLKS 
C 
C    THEN TRUNCATE ANY PART OF THE SWAP FILE THAT IS NOT NEEDED.
C 
      IF (CLOSE (DCB,ERR,SEC) .GE.0)  GOTO 2000 
C 
C  IF ERROR EXISTS WHEN CLOSING THE FILE, NOTIFY OPERATOR,
C  AND TRY TO CLOSE WITHOUT TRUNCATING. 
C 
300   WRITE (LOG,500)  ERR,SWAP 
500   FORMAT ("  FMP ERROR " I4 " ON " 3A2 "INITIALIZATION")
      IDFLG = 0 
1000  IF (CLOSE (DCB,ERR).GE.0) GOTO 2000 
C 
C  IF CLOSE ERROR STILL EXISTS, CONTINUE WITHOUT CLOSING THE SWAP 
C  FILE, AND NOTIFY OPERATOR OF THE ERROR.
C 
      IF (ERR.EQ.-11) GOTO 2000 
      WRITE (LOG,500)  ERR,SWAP 
      IDFLG = 0 
C 
C 
C 
C  *** SCHEDULE THE FILE MANAGER INTERACTIVELY ***
C 
C 
C 
C  WLNG = LENGTH OF THE STRING THAT TRANSFERS TO THE WELCOM FILE. 
C 
2000  WLNG = 12 
C 
C  DETERMINE IF FMGR ALREADY HAS AN ID SEGMENT. 
C 
      IF (OPEN (DCB,ERR,FMGR,4,RBUF(2),RBUF(4) ).LT.0)  GOTO 2300 
C 
C  SET UP AN ID SEGMENT FOR FMGR. 
C 
      IF (IDRPL (DCB,ERR,FMGR,1) .EQ.23)  GOTO 2050 
      IF (ERR.NE.0) GOTO 2300 
2050  IF (CLOSE (DCB,ERR) .LT.0)  GOTO 2300 
C 
C 
C  SCHEDULE FMGR AND PASS IT THE STRING THAT CAUSES A TRANSFER TO THE 
C  WELCOM FILE.  SET THE NO ABORT BIT SO A SCHEDULING ERROR CAN BE
C  DETECTED.
C 
C 
      P1=LOG
      P2=LOG
      P3=LOG
2100  CALL EXEC  (100012B,FMGR,P1,P2,P3,0,0,WELCOM,WLNG)  
      GOTO 2800 
2150  CALL ABREG (A,B)
      IF  (A.EQ.0)  GOTO 9999 
      WRITE (LOG,2200)
2200  FORMAT ("  FMGR ACTIVE")
      IDFLG = 0 
      GOTO 9999 
C 
C  DETERMINE IF THE CARTRIDGE DIRECTORY WAS SUCCESSFULLY PATCHED. 
C  IF NOT, TRY AGAIN. 
C 
2300  CALL FSTAT (FIRST,1)
      IF (FIRST.LT.0)  GOTO 70
      WRITE (LOG,500)  ERR,FMGR 
      IDFLG = 0 
      IF (CLOSE (DCB,ERR) .GE.0)  GOTO 9999 
      IF (ERR.EQ.-11)  GOTO 9999
      WRITE  (LOG,500)  ERR,FMGR
      IDFLG = 0 
      GOTO 9999 
C 
C  CHECK FOR SCHEDULING ERRORS. 
C  SC05 = FMGR NOT FOUND. 
C         TRY TO SCHEDULE AGAIN.
C  SC10 = NOT ENOUGH SAM TO PASS STRING THAT SCHEDULES WELCOM.
C         TRY TO SCHEDULE AGAIN WITHOUT WELCOM FILE TRANSFER STRING.
C         (THE CARTRIDGE REFERENCE NUMBER IS LOST.) 
C 
C 
2800  CALL ABREG (A,B)
      IF (B.EQ.2H05) GOTO 2000
      IF (B.NE.2H10) GOTO 3300
      IF (WLNG.EQ.0) GOTO 3300
      WLNG = 0
      P1=WELCOM(2)
      P2=WELCOM(3)
      P3=WELCOM(4)
      GOTO 2100 
C 
C  PRINT ERROR MESSAGE IF SCHEDULING ERROR IS OTHER THAN SC05 OR SC10.
C 
3300  WRITE (LOG,3500)  A,B 
3500  FORMAT ("  FMGR SCHEDULING ERROR  "2A2) 
      IDFLG = 0 
C 
C  IF A NON-SWAPPING SYSTEM, RETURN THE ID SEGMENT OF START UPON
C  COMPLETION.
C 
9999  IF (IDFLG.EQ.-43)  CALL IDCLR 
      END 
      END$
                                                              