ASMB,R,L,C
*     NAME:   OUTAB 
*     SOURCE: 92070-18114 
*     RELOC:  92070-16114 
*     PGMR:   D.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 OUTAB,7  92070-1X114  REV.1941  800108
* 
* 
*     THE OUTAB ROUTINE IS CALLED TO OUTPUT A WORD TO THE OUTPUT
*     FILE.  IF THE WORD IS A BASE PAGE FIXUP, THE VALUE IS OUTPUT TO 
*     DUMMY BASE PAGE AREA, NOT TO THE FILE.  IF THE ADDRESS IS A -1
*     THEN OUTAB JUST POSTS THE CURRENT RECORD IN MEMORY TO THE DISC
*     FILE. 
* 
*     IF THE CALLER ATTEMPTS TO OUTPUT A WORD BEYOND THE MEMORY 
*     BOUNDRIES  OUTAB TRANSFERS DIRECTLY TO E.RRR IN LOAD2 SO
*     THAT ERROR PROCESSING MAY BE DONE.
* 
*     IF AN FMP ERROR RESULTS FROM AN FMP CALL, PRCSS OUTPUTS THE 
*     ERROR TO THE LIST DEVICE AND RETURNS CONTROL TO AB.RT IN THE
*     LOADER MAIN.
* 
* 
*     CALLING SEQUENCE:  JSB OUTAB
*                        DEF RETURN 
*                        DEF ABADD     ABSOLUTE ADDRESS, B-REG
*                        DEF ABWRD     ABSOLUTE WORD,  A-REG
* 
*     ON RETURN:         A-REG = FMP ERROR CODE 
* 
      ENT ABOUT,AFWA,ARECD,CFWA,CRECD,CUREC 
      ENT OUTAB,OUTBP 
      EXT .MVW,AB.RT,E.RRR,FMPER,I.ERR,MXREC
      EXT  ODCB,OFFBP,ONAMR,OUTBF,PGLWA,READF 
      EXT TH2.L,WRITF 
* 
A     EQU 0 
B     EQU 1 
* 
ABADD NOP           ABSOLUTE ADDRESS
ABWRD NOP           ABSOLUTE VALUE
* 
OUTAB NOP 
      STB ABADD     SAVE ADDRESS
      STA ABWRD       AND VALUE 
      LDA OUTAB,I   GET RETURN ADDRESS
      STA OUTAB       AND SET ASIDE 
      SSB           IS THIS A POST ?
      JMP PSTRC     YES 
      CMB           IS THE ADDRESS
      STB A              (SAVE NEGATIVE VALUE)
      ADB CFWA      BELOW CURRENT MODULE? 
      SSB,RSS       WELL??
      JMP OUTA3     YES, COULD BE BP OR MAIN FIXUP
* 
      STA B         IS THIS LARGER THAN THE LAST WORD AVAIL ? 
      ADB PGLWA 
      SSB 
      JMP OVMEM     YES, MEMORY OVERFLOW ERROR
* 
      ADA TH2.L     BEYOND LAST WORD PUT OUT? 
      INA 
      SSA,RSS       WELL??
      JMP OUTA2     NO, JUST PUT THE WORD TO AAOUT
* 
*     ZERO ANY BSS 'S FOUND IN PROGRAM
* 
OUTA1 CLA           ZERO'S
      LDB TH2.L     NEXT ADDRESS
      CPB ABADD     THIS THE ADDRESS TO WRITE?
      JMP OUTA2     YES GO DO IT
* 
      JSB AAOUT     ELSE SEND A ZERO
      JMP OUTA1     NO, CHECK IF ANOTHER NEEDED 
* 
*     DO NORMAL OUTPUT OF A NORMAL INSTRUCTION
* 
OUTA2 LDA ABWRD     GET THE WORD
      LDB ABADD     AND THE ADDRESS 
      JSB AAOUT     AND SEND IT 
      JMP OUTAB,I    RETURN TO CALLER WITH OR WITHOUT ERROR 
* 
OVMEM LDA N3
      JMP E.RRR 
* 
N3    DEC -3
* 
*     BP ADDRESS OR MAIN FIXUP
* 
OUTA3 STA B         ADDRESS NOT IN CURRENT MAIN 
      ADA M2000     IN BP?
      SSA,RSS       WELL??
      JMP OUTA6     YES GO DO BASE PAGE FIX 
* 
*     FIXUP OF A MAIN OF A SEGMENTED PROGRAM
* 
      ADB AFWA      ABSOLUTE BASE-CURRENT ADDRESS 
      SSB           IF ABOVE SEGMENT BASE 
      JMP OUTA4     NO,  ADDRESS GOOD 
      LDA ERR02     YES, ILLEGAL RECORD ERROR, IRRECOVERABLE. 
      JMP OUTAB,I    OUTPUT LOADER ERROR. 
* 
OUTA4 LDA ARTAB     SET ADDRESSES FOR AAOUT 
      STA RTAB+1
      INA 
      STA RTAB+2    SO IT CAN GET BACK TO THE MAIN
      LDA ABWRD     GET THE WORD
      LDB ABADD     AND THE ADDRESS 
      JSB AAOUT     PUT IT OUT
      LDB CRTAB     RESTOR ADDRESSES
      STB RTAB+1
      INB 
      STB RTAB+2
      CLA 
      JMP OUTAB,I 
* 
*     BP FIXUP (NOTE WE DON'T GO TO THE DISC YET )
* 
OUTA6 LDB ABADD 
      ADB OFFBP     GET OFFSET INTO PGM.
      LDA ABWRD     GET THE WORD
      STA B,I       STORE IT IN THE BP
      CLA 
      JMP OUTAB,I 
* 
PSTRC CCA           JUST POST THE CURRENT RECORD TO THE DISC
      JSB ABOUT 
      CLA 
      JMP OUTAB,I 
      HED OUTPUT DUMMY BASE PAGE TO THE FILE
* 
*  CALLING SEQUENCE:  JSB OUTBP 
*                     A-REG = LENGTH
*                     B-REG = ADDRESS DUMMY AREA
* 
*  ON RETURN:         P+1:  GOOD RETURN 
* 
BPADR BSS 1 
OVFLW BSS 1 
O200  OCT 200 
O177  OCT 177 
COUNT NOP 
* 
* 
OUTBP NOP 
      STB BPADR     SAVE STARTING ADDRESS 
      CLB           DETERMINE LENGTH TO BE OUTPUT 
      DIV O200
      CMA           SET NEGATIVE COUNT LENGTH IN BLOCKS 
      STA COUNT 
      STB OVFLW     SET OVERFLOW AMOUNT INTO LAST BLOCK 
      LDA CFWA      CALCULATE RECORD AT WHICH TO BEGIN
      CMA,INA 
      ADA TH2.L 
      ADA O177
      ALF,ALF 
      RAL 
      AND O377
      ADA CRECD     STARTING RECORD NUMBER
* 
LOOP  JSB ABOUT     GET CORRECT RECORD IN MEMORY
      ISZ COUNT 
      RSS 
      JMP LAST
      LDA BPADR 
      LDB AOUTB 
      JSB .MVW
      DEF O200
      NOP 
      LDA BPADR 
      ADA O200
      STA BPADR 
      LDA CUREC 
      INA 
      JMP LOOP
* 
LAST  LDB OVFLW 
      SZB,RSS 
      JMP OUTEX 
      STA TEMP
      LDA BPADR 
      LDB AOUTB 
      JSB .MVW
      DEF OVFLW 
      NOP 
      LDA TEMP
      INA 
OUTEX STA CRECD 
*     ISZ OUTBP 
      JMP OUTBP,I 
* 
M2000 OCT 2000
O377  OCT 377 
ERR02 DEC 2 
* 
ARTAB DEF *+1       ADDRESS OF MAIN TRIPLET 
AFWA  NOP           ABSOLUTE BASE 
ARECD NOP 
CRTAB DEF *+1       NORMAL LOADING BASE ADDRESSES 
CFWA  NOP 
CRECD NOP 
* 
RTAB  DEF *+1 
FWA   DEF CFWA      NORMAL SET UP OF
RECRD DEF CRECD     ABOUT LOAD ADDRESSES
      SKP 
* 
* 
*                                   CALCULATE RECORD AND WORD 
*                                   FOR PROGRAM ADDRESS 
* 
* 
*     CALLING SEQUENCE:  JSB AAOUT
*                        A REG = ABSOLUTE WORD
*                        B REG = CORRESPONDING ADDRESS
* 
AAOUT NOP 
      STA TEMPP     SAVE THE ABSOLUTE PROG WORD 
      STB TEMPQ     AND ITS PROGRAM ADDRESS 
      LDA FWA,I     SUBTRACT FWA OF 
      CMA,INA       AREA FROM CURRENT 
      ADA B         ADD CURRENT RELOCATION ADDRESS
      CLB 
      DIV O200
      ADA RECRD,I   STARTING RECORD NUMBER
* 
      JSB ABOUT     GET DESIRED RECORD IN MEMORY
      ADB AOUTB     GET ADDRESS OF WORD IN OUTPUT BUFFER
      LDA TEMPP 
      STA B,I 
      LDA TEMPQ     ABSOLUTE LOAD ADDRESS 
      INA 
      STA B         SAVE. 
      CMA,INA       -SUBTRACK THIS ADDRESS
      ADA TH2.L     FROM CURRENT UPPER BOUND, 
      SSA           IF CURRENT IS LARGER, 
* 
*     SET UP TH2.L HIGH LOAD + 1 !!!!!!!!!!!!!!!!!
* 
      STB TH2.L     SET NEW ADDRESS 
      JMP AAOUT,I 
* 
TEMPP NOP 
TEMPQ NOP 
      SKP 
* 
*                                   OUTPUT ABSOLUTE PROG WORD 
* 
* 
*  IF THE CURRENT PROGRAM WORD IS TO BE LOCATED IN A DIFFERENT
*  RECORD FROM THE CURRENT RECORD, THE CURRENT RECORD IS WRITTEN TO 
*  THE FILE AND THE APPROPRIATE RECORD READ.
* 
* 
*  CALLING SEQUENCE:
*    A-REG = RECORD TO BE UPDATED 
* 
* 
*  RETURN:  A CONTAINS THE NON-ZERO ERROR CODE, OR ZERO FOR GOOD RETURN 
*           B REG IS NOT CHANGED. 
* 
ABOUT NOP 
      CPA CUREC     IS THIS RECORD IN MEMORY NOW? 
      JMP ABOUT,I   YES, WE'RE IN LUCK! 
* 
*     RECORD CURRENTLY IN MEMORY IS NOT THE DESIRED RECORD
* 
      STA FLAG      CHECK FOR A POST ONLY 
      STA REC 
      STB TEMP
      JSB WRITF     NO,  NEED TO WRITE CURRENT ONE
      DEF *+6 
      DEF ODCB+0
      DEF I.ERR     FMP ERROR RETURN
AOUTB DEF OUTBF+0 
      DEF ILL 
      DEF CUREC 
* 
      SSA           IS THERE AN ERROR ? 
      JMP ERR       YES, TOO BAD
      ISZ FLAG      WAS THIS A POST ONLY ?
      RSS 
      JMP ABOUT,I    YES, RETURN TO CALLER
* 
      LDA REC       GET DESIRED RECORD
      STA CUREC     SET NEW CURRENT RECORD
      STA B 
      CMB,INB       IS THIS LARGER THAN ANY READ SO FAR ? 
      ADB MXREC 
      SSB,RSS 
      JMP READ      NO, SO READ OLD RECORD
      STA MXREC     YES, SO SET UP NEW MAXIMUM
      JMP NORED     AND SKIP THE FILE READ
* 
READ  JSB READF     NEED TO READ DESIRED RECORD FROM FILE 
      DEF *+7 
      DEF ODCB+0
      DEF I.ERR     FMP ERROR RETURN
      DEF OUTBF+0   OUTPUT BUFFER 
      DEF ILL       LENGTH OF BUFFER
      DEF LENG      LENGTH READ 
      DEF REC       RECORD TO BE READ 
* 
      SSA           FMP ERROR ? 
      JMP ERR       YES 
* 
NORED LDB TEMP
      JMP ABOUT,I 
* 
ERR   JSB FMPER 
      DEF ONAMR+0 
      JMP AB.RT 
* 
REC   NOP 
CUREC DEC 1 
FLAG  BSS 1 
TEMP  NOP           TEMPORARY STORAGE FOR B REGISTER
LENG  NOP           BUFFER LENGTH READ ON FMP CALL
ILL   OCT 200       LENGTH OF OUTBF 
      END 
                                                                                                                                                                                                                