ASMB,R,L,C
      HED PROM TAPE GENERATOR 
      NAM PTGEN,3 RTE PTGEN 92061-16003 REV.1813 771216 
      SUP 
* 
* 
*   ********************************************************* 
*   * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1976.           * 
*   *                                                       * 
*   * THIS  PROGRAM MAY BE USED WITH ONE COMPUTER SYSTEM AT * 
*   * A  TIME  AND  SHALL  NOT   OTHERWISE   BE   RECORDED, * 
*   * TRANSMITTED OR STORED IN A RETRIEVAL SYSTEM.  COPYING * 
*   * OR  OTHER  REPRODUCTION  OF  THIS  PROGRAM EXCEPT FOR * 
*   * ARCHIVAL PURPOSES IS  PROHIBITED  WITHOUT  THE  PRIOR * 
*   * WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.           * 
*   ********************************************************* 
* 
* 
HEADR ASC 12,RTE PROM TAPE GENERATOR
      ASC  8,REV.1813 771216
* 
      EXT %READ,EXEC,RMPAR
      EXT CREAT,OPEN,PURGE,RWNDF,WRITF,READF,CLOSE
* 
* 
********************
* 
*   I N I T I A L I Z A T I O N    P H A S E
* 
PTGEN NOP 
      JSB SYSIO    GET :RU PARAMETERS 
      JSB TITLE 
      JSB EXEC     SWAP ENTIRE PARTITION
      DEF *+3 
      DEF .22 
      DEF .3
      JSB OPSYS    GET FWA
      DEC 1 
      STA FWA 
      JSB OPSYS    GET LWM
      DEC 2 
      STA LWM 
* 
* GET PROM TAPE OPTIONS 
* 
OPTS  LDA MSG11    WORDS PER PROM?
      JSB NUM 
      SZA,RSS      ZERO SPECIFIED?
      JMP ST13     YES: DISALLOW
      STA WPP      # 24-BIT MICROWORDS
      ALS          # 16-BIT WORDS 
      CLB,INB      ALLOCATE ONE BUFFER
      JSB ALLOC 
      STA PROM     PTR TO BUFFER
      SZB          SUFFICIENT MEMORY? 
      JMP ST12
      LDA ERR14    NO: ABORT
      JSB ERROR 
      JMP ABORT 
ST13  LDA ERR5     INVALID NUMERIC RESPONSE 
      JSB ERROR 
      JMP OPTS
* 
ST12  LDA MSG12    #BITS PER WORD 
      JSB NUM 
      STA BPW 
      CLB          24 MOD BPW = 0?
      LDA =D24
      DIV BPW      B=REMAINDER
      SOS C        BPW=0...?
      SZB          ...OR BPW>24 OR NOT DIVISOR OF 24? 
      JMP *+2 
      JMP ST10
      LDA ERR5     YES
      JSB ERROR 
      JMP ST12
* 
ST10  LDA MSG10    FILL CHAR? 
      JSB CHAR
      SZA          NULL...? 
      CPA "H"      ...OR HI-LEVEL?
      JMP ST11     YES: ONE BY DEFAULT
      CPA "L"      LO-LEVEL?
      JMP ST10A 
      LDA ERR4     NO: MUST BE H OR L 
      JSB ERROR 
      JMP ST10
ST10A CLA          FILL WITH ZEROES 
      STA FILL
      STA FILL+1
* 
ST11  LDA MSG1     PUNCH TAPE ID? 
      JSB YESNO 
      STA PNID? 
* 
      LDA MSG2     SPECIFY VENDOR NAME? 
      JSB VDFLT 
      SZA 
      JMP LPOS0    YES: DEFAULTS TAKEN
* 
      LDA MSG3     NUMBER OF COMMENT LINES? 
      JSB NUM 
      STA #REM
      SZA 
      JSB GETRM 
* 
      LDA MSG4     PUNCH RUBOUTS? 
      JSB YESNO 
      STA RUB?
* 
      LDA MSG5     PUNCH CHECKSUM?
      JSB YESNO 
      STA CKSM? 
* 
      LDA MSG6     START/END TABLE CHARS? 
      JSB CHAR2    (0 ==> NONE) 
      STA STABL 
      STB ETABL 
* 
      LDA MSG7     START/END WORD CHARS?
      JSB CHAR2    (0 ==> NONE) 
      STA SWORD 
      STB EWORD 
* 
      LDA MSG8     HIGH/LOW CHARS?
      JSB CHAR2 
      SZA,RSS      NULL?
      JMP ST9      YES: KEEP DEFAULTS 
      STA HICHR 
      STB LOCHR 
* 
ST9   LDA MSG9+1   PROM ADDR FORMAT?
      JSB PRMPT    A=MSG LENGTH 
      DEF MSG9+2
      JSB ENTER    GET RESPONSE 
      STA PNAD?    PNAD?=0 IF NO RESPONSE 
      SZA,RSS 
      JMP LPOS3    DON'T PUNCH ADDR 
      LDA "OCT"    "OCTAL" SPECIFIED? 
      LDB INBUF 
      JSB CMPB
      DEC 5 
      SZB 
      JMP PNOCT    YES: SUBSET MATCHES
      LDA "DEC"    "DECIMAL" SPECIFIED? 
      LDB INBUF 
      JSB CMPB
      DEC 7 
      SZB,RSS 
      JMP PNERR    NO: SYNTAX ERROR 
      LDA =D10     DECIMAL ADDRESS RADIX
      JMP *+2 
PNOCT LDA =D8      OCTAL ADDRESS RADIX
      STA PNRAD 
      ADB INBUF    BPTR TO NEXT CHARACTER 
      JSB LOADB    SEPARATOR=COMMA? 
      CPA COMMA 
      JMP *+2 
      JMP PNERR    NO: SYNTAX ERROR 
      JSB LOADB    GET DIGIT
      ADA =B-60    CONVERT TO BINARY
      CPA =D1      IS IT A ONE OR TWO?
      JMP *+2 
      CPA =D2 
      JMP *+2 
      JMP PNERR    NO: SYNTAX ERROR 
      STA PNAD? 
      JSB LOADB    TERMINATING BLANK? 
      CPA BLNK
      JMP LPOS4 
PNERR LDA ERR4     NO: SYNTAX ERROR 
      JSB ERROR 
      JMP ST9 
* 
* SET UP TRUTH-TABLE OUTPUT FORMAT
* 
LPOS0 LDA PNAD?    PUNCHING T-T ADDRESSES?
      SZA,RSS 
      JMP LPOS3    NO 
LPOS4 LDA WPP      DETERMINE MAGNITUDE OF WPP 
LPOS1 CLB          = LOG(WPP) + 1 
      DIV PNRAD 
      ISZ #ADR     ACCUMULATE MAGNITUDE 
      SZA 
      JMP LPOS1 
      LDA #ADR     SUBTRACT ADDRESS CHARS FROM USABLE 
      LDB PNAD?    PART OF LINE...
      CPB =D1      DISPLAY FIRST & LAST ADDRS?
      JMP LPOS2    NO: LCNT=72 - #ADR - 2 
      ALS          YES: LCNT=72 - (2 * #ADR + 3)
      INA          FOR SEPARATING DASH
LPOS2 ADA =D2      FOR 2 TRAILING BLANKS
      STA B 
      CMA,INA 
      ADA LCNT
      STA LCNT
      ADB LINE     ALSO COMPUTE BPTR TO 1ST COL 
      STB LCOL1 
      LDA LINE     SET UP BPTRS TO 1ST/2ND ADDR STRINGS 
      ADA #ADR
      ADA =D-1
      STA LADR1    BPTR TO 1ST ADDR 
      ADA #ADR     COMPUTE BPTR TO 2ND ADDR 
      INA           (NB: NOT USED IF DISPLAYING 
      STA LADR2      ONLY ONE ADDRESS)
* 
LPOS3 LDB SWORD    COMPUTE PROM WORD STRING SIZE
      SZB          =BWP + 1 + (IF SWORD THEN 2) 
      LDB =D2 
      ADB BPW 
      INB 
      LDA LCNT     LCNT=72 - (PROM ADDR SIZE ABOVE) 
      STB LCNT     (TEMPORARY)
      CLB          COMPUTE # PROM WORDS PER LINE
      DIV LCNT     =ENTIER(LINE SIZE / PROM WORD SIZE)
      CMA,INA 
      LDB =D8      NO MORE THAN 8...FOR THE 
      ADB A         HP PROM WRITER KLUDGE 
      SSB          A-REG > 8? 
      LDA =D-8     YES: REVERT TO 8 
      STA LCNT
* 
* OPEN OBJECT CODE DISC FILE OR BUILD TEMPORARY FILE. 
* IF THE LATTER, COPY OBJECT CODE FROM INPUT DEVICE 
* TO DISC FILE AND SWITCH OBJECT INPUT TO NEW FILE. 
* IF A FILE ERROR OCCURS DURING TRANSFER, WE IGNORE 
* TEMPORARY FILE AND USE ORIGINAL OBJECT CODE INPUT 
* DEVICE THROUGHOUT.
* 
      LDA OBJLU    OBJ CODE ON DISC?
      CPA =D2 
      JMP *+2      YES
      JMP TDISC 
      JSB FOPEN    OPEN DISC FILE 
      SZA 
      JMP PHAS2 
      LDA ERR3     NO OBJ CODE
      JSB ERROR 
      JMP ABORT 
TDISC JSB TBILD    BUILD TEMPORARY
      STA TEMP? 
      SZA,RSS      COPY TO TEMP FILE? 
      JMP PHAS2    NO 
COPY  JSB INPUT    YES: GET OBJ RECORD
      SZA,RSS      END RECORD?
      ISZ CPEND    YES: SET FLAG
      LDA CODE+1   GET RECORD LENGTH
      ALF,ALF 
      STA CPLEN 
      JSB WRITF    COPY OBJ RECORD TO FILE
      DEF *+5 
      DEF DCB 
      DEF FMGR
      DEF CODE+1
      DEF CPLEN 
      SSA          FILE I/O ERROR?
      JMP CPERR    YES
      LDA CPEND    LAST RECORD? 
      SZA,RSS 
      JMP COPY     NO 
      LDA =D2      YES: REDIRECT OBJ INPUT TO DISC
      STA OBJLU 
      LDA OSTAT+1  RESET DEVICE STATE IN CASE WE
      STA OSTAT    SHARED PROM INPUT DEVICE 
      JSB REWND 
      JMP PHAS2 
CPERR LDA ERR15    FILE I/O ERROR 
      JSB FMERR 
      JSB TPURG    PURGE FILE 
* 
* 
********************
* 
*   P U N C H    P H A S E
* 
PHAS2 LDA MSGP     GET PUNCH RANGE
      CLB          DISALLOW "COMMENTS" OPTION 
      JSB RNGE
      JMP PHAS3    NULL INPUT: END PUNCH PHASE
      STA NUADR    SAVE REQUEST ADDR... 
      STA XADDR 
      STB XBIT     ...AND LEFT BIT# 
      SSA,RSS      "ALL" SPECIFIED? 
      JMP PH2.3    NO 
      JSB RESET    YES: REWIND OBJ & CLEAR PROM 
PH2.1 JSB INPUT    GET NEXT RECORD
      SZA,RSS      END RECORD?
      JMP PHAS2    YES: RANGE IS COMPLETE 
      LDA ORIGN    NORMALIZE ADDR (PROM BASE ADDR)
      CLB          =ADDR - (ADDR MOD WPP) 
      DIV WPP 
      CMB,INB 
      ADB ORIGN 
      STB NUADR    "REQUESTED ADDR" 
PH2.3 LDA XBIT     "ALL BITS" SPECIFIED?
      SSA 
      LDA =D23     YES: START WITH MSB
      STA BIT#
* 
PH2.4 JSB FILLP    FILL PROM BUFFER 
      SZA,RSS      RANGE FOUND? 
      JMP PH2ER    NO 
PH2.5 JSB PNTT     PUNCH PROM TAPE
      LDA XBIT     PUNCH ALL BITS?
      SSA,RSS 
      JMP PHAS2    NO: RANGE IS COMPLETE
      LDA BPW      YES: COMPUTE NEXT BIT# 
      CMA,INA      =BIT# - BPW
      ADA BIT#
      STA BIT#
      SSA,RSS      LAST FIELD?
      JMP PH2.5    NO: USE SAME PROM BUFFER 
      LDA XADDR    PUNCH ALL OBJ CODE?
      SSA,RSS 
      JMP PHAS2    NO: RANGE IS COMPLETE
      LDA OADDR    YES: NEXT PROM IN OBJ RECORD?
      STA NUADR 
      CPA OLAST 
      JMP PH2.1    NO: GET NEXT OBJ RECORD
      JMP PH2.3    YES: USE CURRENT RECORD
* 
PH2ER LDA ERR12    RANGE NOT FOUND
      JSB ERROR 
      JMP PHAS2 
* 
* 
********************
* 
*   V E R I F Y    P H A S E
* 
PHAS3 CCA          CLEAR "FORCED RELOAD" STATE? 
      LDB PSTAT,I 
      CPB =D-2
      STA PSTAT,I  YES
      LDA MSGV     GET VERIFY RANGE 
      CLB,INB      ALLOW "COMMENTS" OPTION
      JSB RNGE
      JMP FINI     NULL INPUT: TERMINATE
      STA NUADR    SAVE REQUESTED ADDR... 
      STA XADDR 
      STB XBIT     ...AND LEFT BIT# 
      SOC C        "COMMENTS" PRESENT?
      CLB,INB,RSS  YES: SET VERIFY FLAG & SKIP
      CLB          NO: RESET FLAG 
      STB VRCOM 
      SSA,RSS      "ALL" SPECIFIED
      JMP PH3.3    NO 
      JSB RESET    YES: REWIND OBJ & CLEAR PROM 
PH3.1 JSB INPUT    GET NEXT OBJ RECORD
      SZA,RSS      END RECORD?
      JMP PHAS3    YES: RANGE IS COMPLETE 
      LDA ORIGN    NORMALIZE ADDR (PROM BASE ADDR)
      CLB          =ADDR - (ADDR MOD WPP) 
      DIV WPP 
      CMB,INB 
      ADB ORIGN 
      STB NUADR    "REQUESTED ADDR" 
PH3.3 LDA XBIT     "ALL BITS" SPECIFIED?
      SSA 
      LDA =D23     YES: START WITH MSB
      STA BIT#
* 
PH3.4 JSB FILLP    FILL PROM BUFFER 
      SZA,RSS      RANGE FOUND? 
      JMP PH3ER    NO 
PH3.5 JSB VRTT     VERIFY PROM TAPE 
      SZA,RSS      VERIFY ERRORS? 
      JSB PNTT     YES: REPUNCH PROM TAPE 
      LDA XBIT     VERIFY ALL BITS? 
      SSA,RSS 
      JMP PHAS3    NO: RANGE IS COMPLETE
      LDA =D-2     SET "FORCED RELOAD" STATE
      STA PSTAT,I 
      LDA BPW      COMPUTE NEXT LEFT BIT# 
      CMA,INA      =BIT# - BPW
      ADA BIT#
      STA BIT#
      SSA,RSS      LAST FIELD?
      JMP PH3.5    NO: USE CURRENT PROM BUFFER
      LDA XADDR    VERIFY ALL OBJ CODE? 
      SSA,RSS 
      JMP PHAS3    NO: RANGE IS COMPLETE
      LDA OADDR    NEXT PROM IN OBJ RECORD? 
      STA NUADR 
      CPA OLAST 
      JMP PH3.1    NO: GET NEXT OBJ RECORD
      JMP PH3.3    YES: START WITH CURRENT OBJ RECORD 
* 
PH3ER LDA ERR12    RANGE NOT FOUND
      JSB ERROR 
      JMP PHAS3 
* 
* 
********************* 
* 
*   T E R M I N A T I O N 
* 
FINI  LDA =D6      PRINT END MESSAGE
      JSB LIST
      DEF ENMSG 
STOP  LDA OBJLU    OBJECT CODE FILE OPEN? 
      CPA =D2 
      JMP *+2 
      JMP STOP2 
      LDA TEMP?    YES: TEMPORARY?
      SZA,RSS 
      JMP STOP1 
      JSB TPURG    YES: PURGE IT
      JMP STOP2 
STOP1 JSB CLOSE    NO: JUST CLOSE IT
      DEF *+3 
      DEF DCB 
      DEF FMGR
STOP2 JSB EXEC     TERMINATE
      DEF *+2 
      DEF .6
* 
ABORT LDA =D8      PRINT ABORT MESSAGE
      JSB LIST
      DEF ABMSG 
      JMP STOP
      HED PROM TAPE GENERATOR  --  SUBROUTINES
* 
* 
********************
* 
*   A L L ? 
* 
*   ENTRY:
*     LDB <BPTR TO NEXT CHARACTER>
*     JSB ALL?
* 
*   EXIT: 
*     A= 0 IF NO CHARACTERS MATCH 
*        BPTR TO FOLLOWING CHARACTER IF PARTIAL MATCH 
* 
*   MATCHES ANY SUBSTRING OF "ALL", RECOGNIZED WHEN 
*   SPECIFYING RANGES IN PUNCH AND VERIFY PHASES. 
* 
ALL?  NOP 
      STB A?PTR 
      LDA "ALL" 
      JSB CMPB
      DEC 3 
      SZB          SOME CHARS MATCH?
      ADB A?PTR    YES: RETURN BPTR TO NEXT CHAR
      JMP ALL?,I
A?PTR BSS 1        BPTR TO STRING 
"ALL" DBL *+1 
      ASC 2,ALL 
* 
* 
********************
* 
*   A L L O C 
* 
*   ENTRY:
*     LDA <#WORDS PER BUFFER> 
*     LDB <#BUFFERS>
*     JSB ALLOC 
* 
*   EXIT: 
*     A= PTR TO FIRST BUFFER
*     B= #BUFFERS ALLOCATED 
* 
*   DYNAMICALLY ALLOCATES SPACE IN THE AREA BETWEEN FWA AND 
*   LWM ABOVE THE PROGRAM.  NOTE THAT WE DON'T ALLOW FWA TO 
*   BECOME LWM+1, ALTHO THIS WOULD NOT CONSTITUTE MEMORY
*   OVERFLOW.  THIS IS TO PREVENT FWA<0 IN THE CASE OF LWM
*   EQUALS 77777B.
* 
ALLOC NOP 
      STA BSIZE 
      STB BREQ
      CMB,INB      B=LOOP COUNTER 
      LDA FWA      PTR TO FIRST BUFFER
      STA BBASE 
* 
ALLC1 ADA BSIZE    SUFFICIENT MEMORY? 
      CMA,INA      FWA + BUFFER SIZE <= LWM?
      ADA LWM 
      SSA 
      JMP ALLC2    NO: OUT OF MEMORY
      LDA FWA      ADVANCE FWA
      ADA BSIZE 
      STA FWA 
      INB,SZB 
      JMP ALLC1 
* 
ALLC2 LDA BBASE    RETURN PARAMETERS
      ADB BREQ     BREQ - COUNTER = #ALLOCATED
      JMP ALLOC,I 
BBASE BSS 1        INITIAL FWA & BASE OF ALLOCATED SPACE
BREQ  BSS 1        #REQUESTED BUFFERS 
BSIZE BSS 1        #WORDS PER BUFFER
* 
* 
********************
* 
*   A L T E R 
* 
*   ENTRY:
*     JSB ALTER 
* 
*   THIS IS THE "REPLACE COMMENT" SEQUENCE PERMITTED IN 
*   THE PUNCH AND VERIFY PHASES.  HERE WE SIMPLY PROMPT 
*   FOR INPUT AND REPLACE SELECTED COMMENT BUFFERS. 
*   PUNCHING OF THE COMMENTS IS DONE ELSEWHERE. 
* 
ALTER NOP 
      JSB TAPID 
      DBR MSGR+18 
      LDA MSGR     REPLACE COMMENTS?
      JSB YESNO 
      SZA,RSS 
      JMP ALTER,I  NO 
      LDA #REM     YES: SET UP TO CYCLE THRU COMMENTS 
      CMA,INA 
      STA ALCNT 
      LDA REM      PTR TO 1ST COMMENT BUFFER
      STA ALPTR 
      CLA,INA      COMMENT LINE#
      STA ALINE 
* 
ALOOP LDA ALINE    DISPLAY COMMENT LINE#
      LDB ALLN# 
      JSB DECML 
      DEC 2 
      LDA =D-16 
      JSB LIST
      DEF ALLN
      LDA ALPTR    DISPLAY CURRENT COMMENT
      INA          PTR TO COMMENT ITSELF
      STA AL.1
                                                                