ASMB,R,L,C  RTE-M SEGMENTED PROGRAM PREPARATION PROGRAM 
* 
*     NAME:   RTE-M SGPRP 
*     SOURCE: 92064-18028 
*     RELOC:  92064-16034 
*     PROGMR: E.J.W.
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.  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.        * 
*  **************************************************************** 
* 
* 
      NAM SGPRP,3,90  92064-16034  REV.1650  761020 
      EXT $LIBR,$LIBX,EXEC,$CVT1,$CVT3,$PARS,$CON 
      EXT OPEN,READF,WRITF,CLOSE,POSNT,IDCB1,IDCB2
* 
A     EQU 0 
B     EQU 1 
* 
* 
SGPRP NOP 
      LDA B,I 
      SZA           LU = 0? 
      JMP MAGLU      YES, SET UP DEFAULT
* 
      LDA $CON,I    GET DEFAULT LU
      AND B77 
* 
MAGLU JSB $LIBR     CONVERT LU TO MAGIC FILENAME
      NOP 
      CCE           (E) = 1 FOR DECIMAL 
      JSB $CVT1 
      JSB $LIBX 
       DEF *+1
       DEF *+1
      IOR A00       FORCE LEADING ZERO IN ASCII 
      STA MAGIC+2   SAVE ASCII CHARACTERS 
* 
      JSB OPEN      OPEN THE INTERACTIVE LU 'FILE'
       DEF *+5
       DEF IDCB1
       DEF ERR
       DEF MAGIC    IGNORE ERRORS ON THIS FILE
       DEF ECHO 
* 
      JSB WRITF     WRITE "SGPRP STARTED" 
       DEF *+5       ON INTERACTIVE LU
       DEF IDCB1     NO ERROR CHECKS ON THIS FILE 
       DEF ERR
       DEF MESS1
       DEF D7 
* 
      JSB WRITF     PROMPT "MAIN PROGRAM NAME?" 
       DEF *+5
       DEF IDCB1
       DEF ERR
       DEF ASKMP
       DEF D10
* 
      JSB READF     READ FILE NAME OF MAIN
       DEF *+6       AND SAVE FOR MUCH LATER. 
       DEF IDCB1
       DEF ERR
DMBUF  DEF MBUF 
       DEF MD20 
       DEF MLEN 
* 
      CLA           CLEAR OUT WORDS TO SAVE 
      STA HMAIN      HIGHEST MAIN AND HIGHEST BASE PAGE 
      STA HBASE      LOCATIONS USED BY ANY SEGMENT
* 
NXSEG JSB WRITF     PROMPT "/E OR SEGMENT NAME?"
       DEF *+5
       DEF IDCB1
       DEF ERR
       DEF ASKSG
       DEF MD21 
* 
      JSB READF     READ SEGMENT NAME 
       DEF *+6
       DEF IDCB1
       DEF ERR
DIBUF  DEF IBUF 
       DEF MD20 
       DEF LEN
* 
      LDA DIBUF     (A)=INPUT STRING ADDR 
      LDB LEN       (B)=CHARACTER 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 JSB WRITF     WRITE "SGPRP DONE"
       DEF *+5
       DEF IDCB1
       DEF ERR
       DEF MESS2
       DEF D5 
* 
EXIT  JSB CLOSE     CLOSE ALL FILES BEFORE TERMINATING
       DEF *+3
       DEF IDCB2
       DEF ERR      IGNORE ERROR RETURNS
      JSB CLOSE     CLOSE INTERACTIVE LU FILE TOO 
       DEF *+3
       DEF IDCB1
       DEF ERR
* 
      JSB EXEC      ALL DONE! 
       DEF *+2
       DEF D6 
* 
* 
PARSE NOP 
      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 
      JSB WRITF     WRITE ERROR MESSAGE 
       DEF *+5
       DEF IDCB1
       DEF ERR
       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,
DABSD DEF WORD1 
LHALF OCT 177400
MAGIC ASC 3,LU..01
ECHO  OCT 410 
/E    ASC 1,/E
ABS   OCT 2310
UPDTA OCT 2312
LEN   NOP 
ERR   NOP 
SRECN NOP 
TEMP2 NOP 
* 
A00   ASC 1,00
B77   OCT 77
D2    DEC 2 
D5    DEC 5 
D6    DEC 6 
D7    DEC 7 
D8    DEC 8 
D10   DEC 10
D12   DEC 12
D128  DEC 128 
MD1   DEC -1
MD20  DEC -20 
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
* 
* 
      BSS 0         SIZE OF MODULE
      END SGPRP 
                    