ASMB,Q,C
*     NAME:   KHAR  
*     SOURCE: 92070-18265 
*     RELOC:  92070-1X265 
*     PGMR:   GAA,HLC 
* 
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  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 KHAR,7  92070-1X265  REV.1941  790606 
      EXT .ENTR,.DFER 
      ENT SETSB,SETDB,KHAR,CPUT,ZPUT
* 
*     THESE ROUTINES BUILD AND TEAR APART STRINGS FOR FORTRAN 
*     PROGRAMS
* 
* 
*     SETSB: SETS UP THE STRING SOURCE BUFFER AND ITS LIMITS
* 
*     CALL SETSB(IBUF,ISCH,ISLIM) 
* 
*          WHERE: IBUF IS THE BUFFER ADDRESS
*                 ISCH IS THE CURRENT CHARACTER POSITION (UPDATED BY KHAR)
*                      YOU SHOULD INITIALIZE IT TO 1 FOR THE FIRST
*                      CHARACTER IN IBUF (I.E. LEFT HALF OF FIRST WORD
*                      NOTE THAT THIS IS THE SAME CONVENTION USED IN 'NAMR' 
*                 ISLIM IS THE NUMBER OF CHARACTERS IN IBUF 
* 
*     SETDB: SETS UP THE DESTINATION BUFFER 
* 
*     CALL SETDB(IDBUF,IDCH)
* 
*          WHERE:  IDBUF IS THE DESTINATION BUFFER
*                  IDCH  IS THE DESTINATION CARACTER COUNT
*                        YOU SHOULD INITIALIZE IDCH TO ZERO BEFOR CALLING 
*                        CPUT OR ZPUT.  IDCH IS UPDATED BY CPUT AND ZPUT
*                        AND REFLECTS THE TRUE CHARACTER COUNT IN IDBUF 
*                        NO TEST ARE DONE FOR EXCEEDING IDBUF.
*                        IDCH MAY BE DECREMENTED TO DELETE CHARACTERS OR
*                        EVEN SET BACK TO ZERO TO CLEAR THE BUFFER
* 
*     KHAR  : GET THE NEXT SOURCE CHARACTER 
* 
*     IC=KHAR(IC2)
* 
*          WHERE:  IC AND IC2 ARE TO RECEIVE THE CHARACTER
*                  BOTH WILL BE ZERO IF THERE ARE NO MORE CHARACTERS
*                  THE CHARACTER WILL BE IN THE HIGH HALF OF THE WORD 
*                  WITH A BLANK PAD IN THE LOW HALF (FORTRAN 1H CONVENTION).
* 
*     CPUT : PUTS THE CHARACTER IN THE DESTINATION BUFFER 
* 
*     CALL CPUT(ICR2) 
* 
*          WHERE:  ICR2 IS THE CHARACTER TO BE PUT OUT (IN HIGH HALF OF WORD) 
* 
*     ZPUT : PUTS A STRING IN THE DESTINATION BUFFER
* 
*     CALL ZPUT(I2BUF,IFRST,NO) 
* 
*          WHERE:  I2BUF  IS THE STRING BASE ADDRESS
*                  IFRST  IS THE FIRST CHARACTER TO BE PUT
*                  NO     IS THE NUMBER OF CHARACTERS TO BE PUT 
* 
*     NOTE SETSB AND SETDB TAKE ADDRESSES ONLY.  THIS MEANS THAT YOU
*     MAY RESET THE POINTERS ( ISCH AND IDCH) AND EVEN THE SOURCE LIMIT 
*     (ISLIM) WITHOUT CALLING SETSB OR SETDB. 
* 
*     ANY QUESTIONS SEE : GEORGE ANZINGER 
* 
ISB   NOP 
ISCH  NOP 
ISLM  NOP 
SETSB NOP 
      JSB .ENTR 
      DEF ISB 
      JMP SETSB,I   SIMPLE ISN'T
* 
IDB   NOP 
IDCH  NOP 
SETDB NOP 
      JSB .ENTR 
      DEF IDB 
      JMP SETDB,I   EVEN SIMPLER
* 
KHAR  NOP           GET CHAR FORM SOURCE
      LDB KHAR,I    GET RETURN ADDRESS
      STB RTN       AND SAVE IT 
      ISZ KHAR      STEP TO THE RETURN CHAR. ADDRESS
      CLA           PRESET A FOR END OF LINE
      LDB ISCH,I    GET THE CHARACTER POSITION
      CMB,INB,SZB,RSS IF ZERO THEN
      JMP KEX       HE DIDN'T CALL THE SET ADDRESS ROUTINE YET
* 
      ADB ISLM,I    CHECK IF BEYOND THE LIMIT 
      SSB           WELL? 
      JMP KEX       YES RETURN ZERO 
* 
      LDB ISB       GET THE BUFFER ADDRESS
      CLE,ELB       CHANGE TO CHAR
      ADB ISCH,I    ADD THE POSITION
      ADB N1        SUBTRACT FOR 1=1'ST CHAR. 
      CLE,ERB       SHIFT BACK TO FORM ACTUAL ADDRESS 
      LDA B,I       GET THE CHAR
      SEZ           IF IN LOW HALF
      ALF,ALF       ROLL IT UP
      AND C377      ISOLATE IT
      IOR B40       PAD IT
      ISZ ISCH,I    STEP THE CHARACTER COUNT
KEX   LDB KHAR,I    GET THE ADDRESS OF THE PLACE TO STORE IT
      STA B,I       SET THE RETURN CHAR.
      JMP RTN,I     AND RETURN
* 
N1    DEC -1
C377  BYT 377 
B40   OCT 40
* 
CPUT  NOP 
      LDA CPUT,I    PUT A CHAR. 
      STA RTN       SAVE THE RETURN ADDRESS 
      ISZ CPUT      STEP TO THE CHAR ADDRESS
      LDB IDB       GET THE ADDRESS 
      CLE,ELB       SHIFT IT
      ADB IDCH,I    ADD THE OFFSET (SHOULD START AT ZERO) 
      CLE,ERB       MAKE WORD ADDRESS 
      LDA CPUT,I    GET THE CHAR TO BE PUTR 
      LDA A,I 
      SEZ           PUT IN THE CORRECT HALF 
      ALF,ALF 
      XOR B,I       MERGE IT
      SEZ 
      AND B377      ISOLATE THE CORRECT 
      SEZ,RSS       HALF
      AND C377      AND 
      XOR B,I       FINISH THE MERGE
      STA B,I       SET THE NEW CHAR
      ISZ IDCH,I    STEP THE COUNT
      JMP RTN,I     AND RETURN
* 
B377  OCT 377 
RTN   NOP 
* 
ISBUF NOP 
ISPO  NOP 
ISCO  NOP 
ZPUT  NOP 
      JSB .ENTR     USE .ENTR WHERE IT ISN'T CALLED MUCH
      DEF ISBUF 
      CCA           CONVERT 
      ADA ISCO,I    THE COUNT AND POSITION
      ADA ISPO,I    INTO A LIMIT
      STA ISCO      AND SAVE IT 
      JSB .DFER     SAVE THE CURRENT SOURCE 
      DEF ISBS      BUFFER
      DEF ISB       POINTERS
      LDA ISBUF     SET UP NEW TEMPS
      STA ISB 
      LDA ISPO,I
      STA ISPO      DON'T WIPE HIS NUMBERS
      LDA DISPO     SET ADDRESS 
      STA ISCH      FOR KHAR
      LDA DISCO 
      STA ISLM
LOOP  JSB KHAR
      DEF *+2 
      DEF SETDB 
      SZA,RSS       END OF BUFFER?
      JMP EX3       YES 
* 
      JSB CPUT      PUT THE CHAR
      DEF *+2 
      DEF SETDB 
      JMP LOOP
* 
EX3   JSB .DFER     RESTORE THE SOURCE BUFFERS
      DEF ISB 
      DEF ISBS
      JMP ZPUT,I    AND RETURN
* 
ISBS  BSS 3 
DISCO DEF ISCO
DISPO DEF ISPO
A     EQU 0 
B     EQU 1 
      END 
                                                                                                                            