ASMB,L,C,R  RTE-M SEGMENTED PROGRAM PREPARATION PROGRAM 
* 
*     NAME:   RTE-M SGPRP 
*     SOURCE: 91740-18070 
*     RELOC:  91740-16070 
*     PROGMR: E.J.W.,C.E.J. 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1978.  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.        * 
*  **************************************************************** 
* 
* 
*  TO INITIATE SGPRP: 
*         *RU,SGPRP,FI,LN,MN
*  OR 
*         *RU,SGPRP,LU
*  WHERE: 
*         FILNMN IS AN ASCII ANSWER FILE CONTAINING THE NAMR OF THE MAIN
*                PROGRAM'S FILE AS THE FIRST RECORD, FOLLOWED BY THE
*                SEGMENT(S)' NAMR(S) IN CONSECUTIVE RECORDS, ENDING WITH
*                AN "/E". 
* 
*         LU IS THE LOGICAL UNIT NUMBER OF THE DEVICE FROM WHICH SGPRP
*            IS TO TAKE DATA. 
* 
*         THE DEFAULT VALUE FOR THE PARAMETER IS LU # 1 (SYSTEM CONSOLE). 
* 
* 
      NAM SGPRP,3,90 91740-16070 REV 1805 771118
      EXT $LIBR,$LIBX,EXEC,$CVT1,$CVT3,$PARS
      EXT OPEN,READF,WRITF,CLOSE,POSNT
* 
A     EQU 0 
B     EQU 1 
* 
* 
SGPRP NOP 
      CLA 
      STA PRMPT 
      STA INLU
      LDA B,I       GET INPUT PARAMETER 
      CMA,INA       LU OR FILE NAME?
      ADA B77 
      SSA 
      JMP FILE      FILE--GO MOVE NAME INTO STORAGE 
* 
      LDA B,I       LU--RESET A REG.
      SZA,RSS         DEFAULTED?
      LDA D1        YES--GET DEFAULT LU 
      STA INLU        AND SAVE FOR INPUT RETRIEVAL
* 
      JSB EXEC      SEE IF DEVICE IS INTERACTIVE
       DEF *+1+6
       DEF D13
       DEF INLU 
       DEF DVR
       DEF TEMP 
       DEF SUB
      LDA DVR       DVR00, DVR05 SUB. 0, AND DVR07 SUB. 0 
      ALF,ALF         ARE DRIVERS FOR INTERACTIVE DEVICES 
      AND B77 
      SZA,RSS 
      JMP SETPM 
      CPA D5
      JMP SUB?
      CPA D7
      JMP SUB?
      JMP BEGIN 
SUB?  LDA SUB 
      AND B37 
      SZA 
      JMP BEGIN 
SETPM ISZ PRMPT     IF INTERACTIVE--SET PROMPT FLAG 
      LDA INLU
      IOR B400        AND ECHO BIT IN LU
      STA INLU
      JMP BEGIN 
* 
FILE  LDA .FLNM     MOVE FILE NAME INTO LOCAL STORAGE 
      SWP 
      MVW D3
* 
      JSB OPEN      OPEN THE FILE 
       DEF *+1+3
       DEF IDCB1
       DEF ERR
.FLNM  DEF FILNM    IGNORE ERRORS ON THIS FILE
* 
      JSB READF     READ FILE NAME OF MAIN
       DEF *+1+5     AND SAVE FOR MUCH LATER. 
       DEF IDCB1
       DEF ERR
       DEF MBUF 
       DEF D10
       DEF MLEN 
      JMP SEGMT 
* 
BEGIN LDA PRMPT     SEE IF LU INTERACTIVE 
      SZA,RSS 
      JMP RMAIN 
      JSB EXEC      IF SO--WRITE "SGPRP STARTED"
       DEF *+1+4
       DEF D2 
       DEF INLU 
       DEF MESS1
       DEF D7 
      JSB EXEC        AND PROMPT "MAIN PROGRAM NAME?" 
       DEF *+1+4
       DEF D2 
       DEF INLU 
       DEF ASKMP
       DEF D10
* 
RMAIN JSB EXEC      READ FILE NAME OF MAIN
       DEF *+1+4      AND SAVE FOR MUCH LATER.
       DEF D1 
       DEF INLU 
       DEF MBUF 
       DEF D10
      STB MLEN
* 
SEGMT CLA           CLEAR OUT WORDS TO SAVE 
      STA HMAIN      HIGHEST MAIN AND HIGHEST BASE PAGE 
      STA HBASE      LOCATIONS USED BY ANY SEGMENT
* 
NXSEG LDA INLU      INPUT FROM FILE OR LU?
      SZA 
      JMP NXLU      LU--BRANCH AROUND 
* 
      JSB READF     FILE--READ SEGMENT NAME 
       DEF *+1+5
       DEF IDCB1
       DEF ERR
       DEF IBUF 
       DEF D10
       DEF LEN
      JMP OPSEG 
* 
NXLU  LDA PRMPT     LU INTERACTIVE? 
      SZA,RSS 
      JMP NXLU2       NO--BRANCH AROUND WRITE 
      JSB EXEC        YES--PROMPT "/E OR SEGMENT NAME?" 
       DEF *+1+4
       DEF D2 
       DEF INLU 
       DEF ASKSG
       DEF MD21 
* 
NXLU2 JSB EXEC      READ SEGMENT NAME 
       DEF *+1+4
       DEF D1 
       DEF INLU 
       DEF IBUF 
       DEF D10
      STB LEN 
* 
OPSEG LDA DIBUF     (A)=INPUT STRING ADDR 
      LDB LEN       (B)=WORD LENGTH OF INPUT STRING 
      JSB PARSE     PARSE INTO FNAME, SC, AND CR COMPONENTS 
      LDA FNAME 
      CPA /E        NO MORE SEGMENTS? 
      JMP UPDAT      RIGHT, GO UPDATE MAIN'S BOUNDS 
* 
      JSB OPEN      OPEN SEGMENT FILE (ABSOLUTE)
       DEF *+7
       DEF IDCB2
       DEF ERR
       DEF FNAME
       DEF ABS
       DEF SC 
       DEF CR 
      SSA 
      JMP FMPER 
* 
      CLA           INITIALIZE SPECIAL RECORD COUNT 
      STA SRECN      TO COUNT TIE-OFF RECORDS 
* 
NXREC JSB READF     READ AN ABSOLUTE RECORD 
       DEF *+6       INTO ABUF
       DEF IDCB2
       DEF ERR
       DEF ABUF 
       DEF D128 
       DEF LEN
      SSA 
      JMP FMPER 
* 
      CCA           END-OF-FILE?
      CPA LEN 
      JMP SGEOF      YES, 
* 
      JSB ABSCK     PERFORM CHECKSUM CHECK
      LDA ABSAD     COULD IT BE SPECIAL RECORD? 
      CPA D2         IE., ADDR=2? 
      RSS 
      JMP NXREC      NO, TRY NEXT RECORD
* 
      LDA LEN       IT MIGHT BE SPECIAL RECORD
      CPA D5         SO CHECK ABSOLUTE RECORD LENGTH
      RSS 
      JMP NXREC     NOT SPECIAL RECORD. 
* 
      ISZ SRECN     IT IS A SPECIAL RECORD. 
      LDA SRECN 
      CPA D7        IS IT PROG'S MAIN ADDR BOUNDS?
      JMP SGMAN      YES, SEE IF THESE ARE THE HIGHEST. 
* 
      CPA D8        IS IT PROG'S BASE PAGE ADDR BOUNDS? 
      JMP SGBAS      YES, SEE IF THESE ARE THE HIGHEST. 
      JMP NXREC 
* 
SGMAN LDA WORD2     GET HIGH ADDR BOUND 
      STA B 
      CMA,INA 
      ADA HMAIN     IS CURRENT SEGMENT HIGH ADDR
      SSA            HIGHER THAN PREVIOUS HIGH? 
      STB HMAIN      YES, SAVE NEW HIGH 
      JMP NXREC 
* 
SGBAS LDA WORD2     GET HIGH BASE PAGE BOUND
      STA B 
      CMA,INA 
      ADA HBASE     IS CURRENT SEGMENT HIGH BASE ADDR 
      SSA            HIGHER THAN PREVIOUS HIGH? 
      STB HBASE      YES, SAVE NEW HIGH BASE
* 
SGEOF JSB CLOSE     DONE NOW. SO, CLOSE FILE
       DEF *+3
       DEF IDCB2
       DEF ERR
      JMP NXSEG     DONE WITH THIS SEGMENT, MORE SEGMENTS?
* 
UPDAT LDA DMBUF     GET ORIGINAL INPUT STRING 
      LDB MLEN       FOR MAIN PROGRAM FILE NAME 
      JSB PARSE      AND PARSE INTO FNAME,SC,CR COMPONENTS
* 
      JSB OPEN      OPEN THE MAIN PROGRAM FILE
       DEF *+7
       DEF IDCB2
       DEF ERR
       DEF FNAME
       DEF UPDTA    UPDATE ABSOLUTE 
       DEF SC 
       DEF CR 
      SSA 
      JMP FMPER 
* 
      CLA 
      STA SRECN     INIT SPECIAL RECORD COUNT 
* 
NXMRC JSB READF 
       DEF *+6
       DEF IDCB2
       DEF ERR
       DEF ABUF 
       DEF D128 
       DEF LEN
      SSA 
      JMP FMPER 
* 
      CCA 
      CPA LEN       END-OF-FILE?
      JMP MNEOF      YES
* 
      JSB ABSCK     PERFORM CHECKSUM CHECK
      LDA ABSAD     IS IT SPECIAL RECORD
      CPA D2         ORIGINED AT 2? 
      RSS            MAYBE
      JMP NXMRC      DEFINITELY NO. 
* 
      LDA LEN 
      CPA D5        IS IT THE RIGHT SIZE (5 WORDS)? 
      RSS            YES
      JMP NXMRC      NO 
* 
      ISZ SRECN 
      LDA SRECN 
      CPA D7        IS IT MAIN'S MAIN ADDR BOUNDS?
      JMP MNMAN      YES
* 
      CPA D8        IS IT MAIN'S BASE PAGE ADDR BOUNDS? 
      JMP MNBAS      YES
      JMP NXMRC 
* 
MNMAN LDA HMAIN     SET UP NEW HIGH MAIN
      SZA,RSS       ANY CHANGE? 
      JMP NXMRC      NO, IGNORE 
      STA WORD2 
      ADA WORD1      AND COMPUTE NEW CHECKSUM 
      ADA ABSAD 
      STA CKSUM 
* 
      JSB POSNT     BACK UP ONE RECORD
       DEF *+4
       DEF IDCB2
       DEF ERR
       DEF MD1
      SSA 
      JMP FMPER 
* 
      JSB WRITF     REWRITE RECORD
       DEF *+5
       DEF IDCB2
       DEF ERR
       DEF ABUF 
       DEF LEN
      SSA 
      JMP FMPER 
      JMP NXMRC 
* 
MNBAS LDA HBASE     FIX UP HIGH BASE PAGE WORD
      SZA,RSS       ANY CHANGE? 
      JMP MNEOF      NO, IGNORE 
      STA WORD2      AND RECOMPUTE THE CHECKSUM 
      ADA WORD1 
      ADA ABSAD 
      STA CKSUM 
* 
      JSB POSNT     BACK UP ONE RECORD
       DEF *+4
       DEF IDCB2
       DEF ERR
       DEF MD1
* 
      JSB WRITF     REWRITE RECORD IN MAIN FILE 
       DEF *+5
       DEF IDCB2
       DEF ERR
       DEF ABUF 
       DEF LEN
      SSA 
      JMP FMPER 
* 
MNEOF LDA PRMPT     IS INPUT DEVICE INTERACTIVE?
      SZA,RSS 
      JMP EXIT
      JSB EXEC      YES--WRITE "SGPRP DONE" 
       DEF *+1+4
       DEF D2 
       DEF INLU 
       DEF MESS2
       DEF D5 
* 
EXIT  JSB CLOSE     CLOSE MAIN PROGRAM'S FILE 
       DEF *+1+2
       DEF IDCB2
       DEF ERR      IGNORE ERROR RETURNS
* 
      LDA INLU      INPUT FROM FILE?
      SZA 
      JMP TERM
      JSB CLOSE     YES--CLOSE IT ALSO
       DEF *+1+2
       DEF IDCB1
       DEF ERR      IGNORE ERROR RETURN 
* 
TERM  JSB EXEC      ALL DONE! 
       DEF *+2
       DEF D6 
* 
* 
PARSE NOP 
      BLS           CONVERT B TO CHARACTER COUNT
      JSB $LIBR 
       NOP
      JSB $PARS 
       DEF PBUF 
      JSB $LIBX 
       DEF PARSE
* 
ABSCK NOP           ROUTINE FOR CHECKSUM VERIFY 
      LDA ABSCT      IF BAD CHECKSUM THEN 
      AND LHALF      EXIT VIA 'FMP ERROR' 
      ALF,ALF       SHIFT WORD COUNT TO LOW BITS
      CMA,INA 
      STA ERR       SAVE NEGATIVE COUNT 
      LDB ABSAD     GET ADDR, START CKSM
      LDA DABSD 
      STA TEMP2     SET DATA ADDR 
* 
ABSC2 LDA TEMP2,I   GET A WORD
      ADB A          AND ADD TO CKSM
      ISZ TEMP2     BUMP TO NEXT WORD 
      ISZ ERR       BUMP COUNT
      JMP ABSC2     REPEAT TILL DONE
* 
      LDA TEMP2,I 
      CPA B         COMPARE CHECKSUMS 
      JMP ABSCK,I    MATCH, SO RETURN.
* 
      LDA D7         ERROR, SO FALL THROUGH 'FMP ERROR  007'
* 
FMPER LDB PLUS
      SSA           IF NEGATIVE NUMBER
      LDB MINUS      GET ASCII "-"
      STB SIGN
      SSA 
      CMA,INA       MAKE ERROR CODE POSITIVE
      JSB $LIBR      BEFORE CONVERTING TO ASCII 
       NOP           FOR ERROR MESSAGE
      CCE           (E)=1 FOR DECIMAL CONVERSION
      JSB $CVT3 
      JSB $LIBX 
       DEF *+1
       DEF *+1
      INA 
      DLD A,I       GET LAST 4 DIGITS OF ERROR CODE 
      DST ERMNO      INTO ERROR MESSAGE 
      DLD FNAME     MOVE CURRENT FILENAME 
      DST ERMNM      INTO ERROR MESSAGE 
      LDA FNAME+2 
      STA ERMNM+2 
      LDA PRMPT     GET INITIATING TERMINAL'S LU
      SZA,RSS         OR, IF NON-INTERACTIVE, LU # 1
      LDB D1
      SZA 
      LDB INLU
      STB LU2         AND STORE IN EXEC CALL
      JSB EXEC      WRITE ERROR MESSAGE 
       DEF *+1+4
       DEF D2 
       DEF LU2
       DEF ERMSG
       DEF D12
      JMP EXIT
* 
* 
* 
* 
MESS1 ASC 7,SGPRP STARTED 
MESS2 ASC 5,SGPRP DONE
ASKMP ASC 10,MAIN PROGRAM NAME? _ 
ASKSG ASC 11,/E OR SEGMENT NAME? __ 
ERMSG ASC 12, FMP ERROR -####  FNAMEX 
SIGN  EQU ERMSG+5 
ERMNO EQU ERMSG+6 
ERMNM EQU ERMSG+9 
MINUS ASC 1, -
PLUS  ASC 1,
DMBUF DEF MBUF
DIBUF DEF IBUF
DABSD DEF WORD1 
LHALF OCT 177400
FILNM BSS 3 
/E    ASC 1,/E
ABS   OCT 2310
UPDTA OCT 2312
LEN   NOP 
ERR   NOP 
TEMP  EQU ERR 
SRECN NOP 
DVR   EQU SRECN 
TEMP2 NOP 
LU2   EQU TEMP2 
SUB   EQU TEMP2 
INLU  NOP 
PRMPT NOP 
* 
B37   OCT 37
B77   OCT 77
B400  OCT 400 
D1    DEC 1 
D2    DEC 2 
D3    DEC 3 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D10   DEC 10
D12   DEC 12
D13   DEC 13
D128  DEC 128 
MD1   DEC -1
MD21  DEC -21 
* 
HMAIN NOP 
HBASE NOP 
MLEN  NOP 
MBUF  BSS 10
IBUF  BSS 10
ABUF  BSS 128 
ABSCT EQU ABUF
ABSAD EQU ABUF+1
WORD1 EQU ABUF+2
WORD2 EQU ABUF+3
CKSUM EQU ABUF+4
PBUF  BSS 33
FNAME EQU PBUF+1
SC    EQU PBUF+5
CR    EQU PBUF+9
IDCB1 BSS 144 
IDCB2 BSS 144 
* 
* 
      BSS 0         SIZE OF MODULE
      END SGPRP 
                                                                                                                                                                                                                                      