ASMB,R,Q
      HED DEB$, DELETE LEADING AND TRAILING BLANKS SUBROUTINE 
      NAM DEB$,7  92101-16025  REV.1926  790409 
      ENT DEB$
      EXT .ENTR,EXEC
* 
*********************************************** 
* 
*     SOURCE: 92101-18025 
*     RELOC.: 92101-16025 
* 
*********************************************** 
* 
*     THIS SUBROUTINE DELETES LEADING AND 
*     TRAILING BLANKS IN A STRING AND RESETS
*     THE LOGICAL LENGTH TO THE STRING
*     LENGTH MINUS THE NUMBER OF LEADING
*     AND TRAILING BLANKS.THE FORMAT OF 
*     THIS CALL IS AS FOLLOWS:
* 
*       XXXX DEB$(A$) 
* 
*     WHERE: A$=ANY VALID STRING
* 
********************************************************************* 
* 
* 1926 PCO
* 
* 1) PROBLEM: WON'T DO TRAILING BLANKS WITH OUT 
*    CAUSING 'DM ERRORS'. COUNTS THEM RELIGIOUSLY BUT DOESN'T 
*    ADJUST THE STRING LENGTH. WILL ATTEMPT TO MOVE STRING IF NO
*    LEADING BLANKS ARE FOUND (?).
* 
* 2) PROBLEM: WON'T HANDLE LEADING BLANKS. AN EVEN NUMBER OF BLANKS 
*    CAUSED 'DM ERROR'. AN ODD NUMBER CAUSED EVERY OTHER BYTE TO
*    BE NULLED. 
* 
* 3) PROBLEM: ERROR HANDLER FOR BLANK STRING CAUSED 'DM ERROR'
* 
* 4) PROBLEM: ERROR HANDLER FOR NULL STRING OUTPUTS FUNNY MESSAGE.
* 
**********************************************************************
CPAR  DEF * 
DEB$  NOP 
      JSB .ENTR     RETRIEVE PARAMETERS 
      DEF CPAR
* 
* 
      LDA .0        LOAD ZERO 
      STA TBLKS     INITIALIZE # OF TRAILING BLANKS 
      STA LBLKS     AND LEADING BLANKS TO ZERO
* 
* 
* CHECK FIRST WORD OF STRING PASSED FOR NONZERO LENGTH
* IF LENGTH IS ZERO, STRING IS NOT INITIALIZED AND WE 
* WILL EXIT WITHOUT DOING ANYTHING TO IT. 
* 
* 
      LDA CPAR,I    LOAD FIRST WORD OF STRING 
      AND B177      MASK LOWER BYTE(LENGTH) 
      SZA,RSS       LENGTH=0? 
      JMP ERR1      YES,EXIT WITH MESSAGE 
      STA WLGTH     NO,SAVE WORKING STRING LENGTH 
      STA OLGTH     AND ORIGINAL STRING LENGTH
* 
* 
      CLB 
      DIV .2        DIVIDE LENGTH BY TWO
      SZB           REMAINDER=0?
      INA           NO(ODD #OF CHARS),ADD 1 TO WORD COUNT 
      STA WORDS     AND SAVE # OF WORDS IN STRING 
* 
* 
      LDA CPAR      LOAD ADDRESS OF FIRST WORD IN STRING
      ADA WORDS     INCREMENT TO ADDRESS OF LAST WORD IN STRING.
      STA WADDR     AND SAVE IN WORKING ADDRESS 
* 
* 
      LDA WADDR,I   LOAD LAST WORD IN STRING
      SZB,RSS       ODD # OF CHARACTERS IN STRING?
      JMP TBLK1     NO, EVEN # OF CHARACTERS
* 
* 
      AND B7740     YES,MASK UPPER BYTE 
      CPA SBLKU     UPPER BYTE=BLANK? 
      JMP TBLK4     YES 
      JMP LBLK1     NO TRAILING BLANKS,CHECK FOR LEADING BLANKS 
* 
* 
TBLK1 CPA DBLNK     IS WORD A DOUBLE BLANK? 
      JMP *+2       YES 
      JMP TBLK3     NO,CHECK FOR BLANK IN LOWER BYTE
* 
* 
      LDA WLGTH     LOAD CURRENT STRING LENGTH
      ADA M2        DECREMENT BY 2
      STA WLGTH     AND SAVE
* 
* 
      LDA TBLKS     LOAD CURRENT # OF TRAILING BLANKS 
      ADA .2        INCREMENT BY 2
      STA TBLKS     AND SAVE
* 
* 
TBLK2 LDA WADDR     LOAD CURRENT STRING WORD ADDRESS
      ADA M1        DECREMENT ADDRESS BY 1
      STA WADDR     AND SAVE
* 
* 
      LDA WADDR,I   LOAD NEXT WORD
      JMP TBLK1     CHECK FOR DOUBLE BLANKS 
* 
* 
TBLK3 AND B177      MASK LOWER BYTE 
      CPA SBLKL     LOWER BYTE=BLANK? 
      JMP TBLK4     YES 
      JMP TBLK5     NO MORE TRAILING BLANKS 
* 
* 
TBLK4 LDA WLGTH     LOAD CURRENT STRING LENGTH
      ADA M1        DECREMENT BY 1
      STA WLGTH     AND SAVE
* 
* 
      LDA TBLKS     LOAD CURRENT # OF TRAILING BLANKS 
      ADA .1        INCREMENT BY 1
      STA TBLKS     AND SAVE
* 
* 
      SZB,RSS       ODD # OF CHARACTERS FLAG=0? 
      JMP TBLK5     YES,NO MORE TRAILING BLANKS 
* 
* 
      CLB           NO,CLEAR ODD # OF CHARACTERS FLAG 
      JMP TBLK2     CHECK NEXT WORD FOR BLANKS
* 
* 
* IF STRING IS ALL BLANKS,THEN EXIT WITH MESSAGE AND
* DON'T DO ANYTHING TO STRING.
* 
* 
TBLK5 LDA TBLKS     LOAD TOTAL # OF TRAILING BLANKS 
      CMA,INA       MAKE NEGATIVE 
      STA 1         SAVE IN B REGISTER. 
      ADA OLGTH     ADD TO ORIGINAL STRING LENGTH 
      SZA,RSS       IS IT ZER0? 
      JMP ERR2      YES,STRING IS ALL BLANKS,EXIT 
* 
*                   FIX STRING LENGTH, DROP BLANKS. 
* 
      ADB CPAR,I    ADJUST BYTE COUNT 
      STB CPAR,I     FOR RETURN AND 
      STB OLGTH      LEADING CHECK. 
* 
* 
* 
* THIS PART OF THE SUBROUTINE 
* CHECKS FOR LEADING BLANKS 
* 
* 
* 
LBLK1 LDB CPAR      LOAD ADDRESS OF FIRST WORD OF STRING
      INB           INCREMENT TO SECOND WORD
      LDA 1,I       LOAD SECOND WORD IN STRING
* 
* 
LBLK2 CPA DBLNK     IS WORD A DOUBLE BLANK? 
      JMP *+2       YES 
      JMP LBLK3     NO,CHECK FOR BLANK IN UPPER BYTE
* 
* 
      LDA WLGTH     LOAD CURRENT STRING LENGTH
      ADA M2        DECREMENT LENGTH BY 2 
      STA WLGTH     AND SAVE
* 
* 
      LDA LBLKS     LOAD CURRENT # OF LEADING BLANKS
      ADA .2        ADD 2 
      STA LBLKS     AND SAVE
* 
* 
      INB           INCREMENT WORKING ADDRESS BY 1
* 
* 
      LDA 1,I       LOAD NEXT WORD
      JMP LBLK2     CHECK NEXT WORD FOR BLANKS
* 
* 
LBLK3 AND B7740     MASK UPPER BYTE 
      CPA SBLKU     UPPER BYTE=BLANK? 
      JMP LBLK4     YES 
      LDA LBLKS     PICK UP COUNT.
      SZA,RSS       DON'T BOTHER IF = 0 
      JMP EXIT
      JMP RFMT      NO MORE LEADING BLANKS
* 
* 
LBLK4 LDA WLGTH     LOAD CURRENT STRING LENGTH
      ADA M1        DECREMENT BY 1
      STA WLGTH     AND SAVE
* 
* 
      LDA LBLKS     LOAD CURRENT # OF LEADING BLANKS
      INA           ADD 1 
      STA LBLKS     AND SAVE
* 
* 
* 
* THIS SECTION OF THE SUBROUTINE RESETS THE STRING
* LENGTH IN THE FIRST WORD AND DELETES LEADING
* BLANKS BY SHIFTING THE STRING TO THE LEFT 
* 
* (A)=# OF LEADING BLANKS 
* (B)=CURRENT WORKING ADDRESS OF STRING 
*    =FIRST WORD WITH A NON-BLANK CHARACTER IN IT 
* 
* 
RFMT  CMA,INA       MAKE # OF LEADING BLANKS NEGATIVE 
      ADA OLGTH      ADD TO ORIGINAL STRING LENGTH
      STA CPAR,I     SAVE NEW LENGTH IN FIRST WORD OF STRING
      STA WLGTH      AND IN STRING WORKING LENGTH 
* 
* 
      LDA CPAR       LOAD ADDRESS OF FIRST WORD IN STRING 
      INA            INCREMENT TO SECOND WORD 
      STA SADDR      AND SAVE IN NEW STRING ADDRESS 
* 
* 
      LDA LBLKS      LOAD # OF LEADING BLANKS 
      SLA,RSS        # OF LEADING BLANKS ODD? 
      JMP RFMT2      NO,EVEN
* 
* 
RFMT1 LDA 1,I        LOAD NON-BLANK WORD FROM STRING
      AND B177       MASK LOWER BYTE
      ALF,ALF        ROTATE TO UPPER BYTE 
      STA SADDR,I    STORE IN NEW STRING LOCATION 
* 
* 
      LDA WLGTH      LOAD NEW STRING LENGTH COUNTER 
      ADA M1         DECREMENT BY 1 
      STA WLGTH      AND SAVE 
* 
* 
      SZA,RSS        LENGTH COUNTER=0?
      JMP EXIT       YES,EXIT 
* 
* 
      INB            INCREMENT WORKING ADDRESS OF STRING
* 
* 
      LDA 1,I        LOAD NEXT NON-BLANK WORD 
      AND B7740      MASK UPPER BYTE
      ALF,ALF        ROTATE TO LOWER BYTE 
      ADA SADDR,I    PUT BYTE IN LOWER PART OF WORD.
      STA SADDR,I    STORE IN NEW STRING LOCATION 
* 
* 
      LDA WLGTH      LOAD NEW STRING LENGTH COUNTER 
      ADA M1         DECREMENT LENGTH BY 1
      STA WLGTH      AND SAVE 
* 
* 
      SZA,RSS        LENGTH COUNTER=0?
      JMP EXIT       YES,EXIT 
* 
* 
      LDA SADDR      NO,LOAD NEW STRING LOCATION
      INA            INCREMENT BY 1 
      STA SADDR      AND SAVE 
* 
* 
      JMP RFMT1      GET NEXT CHARACTER 
* 
* 
RFMT2 LDA 1,I        LOAD NEXT WORD 
      AND B7740      MASK UPPER BYTE
      STA SADDR,I    STORE IN NEW STRING LOCATION 
* 
* 
      LDA WLGTH      LOAD NEW STRING LENGTH COUNTER 
      ADA M1         DECREMENT BY 1 
      STA WLGTH      AND SAVE 
* 
* 
      SZA,RSS        NEW STRING LENGTH COUNTER=0? 
      JMP EXIT       YES, EXIT
* 
* 
      LDA 1,I        LOAD CURRENT WORKING WORD
      AND B177       MASK LOWER BYTE
      ADA SADDR,I    PUT IN UPPER BYTE. 
      STA SADDR,I    STORE IN NEW STRING LOCATION 
* 
* 
      LDA WLGTH      LOAD NEW STRING LENGTH COUNTER 
      ADA M1         DECREMENT BY 1 
      STA WLGTH      AND SAVE 
* 
* 
      SZA,RSS        NEW STRING LENGTH COUNTER=0? 
      JMP EXIT       YES,EXIT 
* 
* 
      LDA SADDR      NO,LOAD NEW STRING ADDRESS 
      INA            INCREMENT BY 1 
      STA SADDR      AND SAVE 
* 
* 
      INB            INCREMENT STRING WORKING ADDRESS 
      JMP RFMT2      GET NEXT NON-BLANK WORD
* 
* 
* MESSAGES
* 
* 
ERR1  LDA MSG1       LOAD MESSAGE BUFFER ADDRESS
      STA MSGX       AND SAVE 
      LDA MSGL1      LOAD MESSAGE BUFFER LENGTH ADDRESS 
      STA IBUFL      AND SAVE 
      JMP OUTPT      OUTPUT MESSAGE 
* 
* 
ERR2  LDA MSG2       LOAD MESSAGE BUFFER ADDRESS
      STA MSGX       AND SAVE 
      LDA MSGL2      LOAD MESSAGE BUFFER LENGTH ADDRESS 
      STA IBUFL      AND SAVE 
* 
* 
OUTPT JSB EXEC       OUTPUT MESSAGE TO SYSTEM CONSOLE 
      DEF *+5 
      DEF .2
      DEF .1
MSGX  DEF IBUFR 
      DEF IBUFL 
* 
* 
EXIT  JMP DEB$,I     EXIT 
* 
* 
* 
* CONSTANTS 
* 
.0    DEC 0 
TBLKS BSS 1 
LBLKS BSS 1 
B177  OCT 177 
WLGTH BSS 1 
OLGTH BSS 1 
.2    DEC 2 
WORDS BSS 1 
M1    DEC -1
WADDR BSS 1 
B7740 OCT 77400 
SBLKU OCT 20000 
DBLNK OCT 20040 
M2    DEC -2
SBLKL OCT 40
.1    DEC 1 
SADDR BSS 1 
IBUFR BSS 1 
IBUFL BSS 1 
MSG1  DEF *+1 
      ASC 14,STRING NOT INITIALIZED-DEB$
MSGL1 DEC 14
MSG2  DEF *+1 
      ASC 11,STRING ALL BLANKS-DEB$ 
MSGL2 DEC 11
* 
* 
      END 
                                                                                                                                                                                                