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 * 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