home *** CD-ROM | disk | FTP | other *** search
- PAGE 55,132
- CODE SEGMENT BYTE PUBLIC
- ASSUME CS:CODE
- PUBLIC UPPERCASE
- PUBLIC STRINGOF
- PUBLIC TRANSLATE
- PUBLIC EXTRACTTOCHAR
- PUBLIC EXTRACTFORCOUNT
- PUBLIC PADLEFT
- PUBLIC PADRIGHT
-
- PAGE
- ;----------------------------------------------------------------------
- ; PROTOTYPE: STRING := UPPERCASE(STRING1);
- ;
- ; STRING === ANY VALID TP4 STRING VARIABLE
- ; STRING1 === ANY VALID TP4 STRING VARIABLE
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; FOR I := 1 TO LENGTH(STRING1) DO
- ; STRING[I] := UPCASE(STRING1[I]);
- ;
- ;---------------------------------------------------------------------
- UCRESULT EQU DWORD PTR [BP+10] ;POS OF RESULT PTR IN STACK
- UCSTRING EQU DWORD PTR [BP+6] ;POS OF STRING PTR IN STACK
-
- UPPERCASE PROC FAR
- PUSH BP ;SAVEBP
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- LDS SI,UCSTRING ;LOAD SOURCE ADDRESSES
- LES DI,UCRESULT ;LOAD RESULT ADDRESSES
- CLD ;SET DIRECTION TO FORWARD
- LODSB ;MOVE THE STRING LENGTH
- STOSB ;
- ;
- ; SETUP THE LENGTH IN CX AND MAKE SURE THERE IS SOMETHING TO DO
- ;
- MOV CL,AL ;COPY STRING LENGTH TO CX
- XOR CH,CH ;CLEAR HIGH ORDER WORD
- JCXZ UCEXIT ;EXIT IF LENGTH = ZERO
- ;
- ; NOW WE LOOP CHECKING EACH BYTE AND WHERE NEEDED CONVERTING THE CASE
- ;
- UCLOOP:
- LODSB ;LOAD NEXT STRING CHARACTER
- CMP AL,'a' ;Q. LESS THAN 'A'
- JB UCSTORE ;A. YES--THEN WE DONT WANT IT
- CMP AL,'z' ;Q. GREATER THAN 'Z'
- JA UCSTORE ;A. YES--THEN WE DONT WANT IT
- SUB AL,'a'-'A' ;A. NO--CHANGE IT TO UPPER CASE
- UCSTORE:
- STOSB ;STORE BYTE INTO RESULT STRING
- LOOP UCLOOP ;GO PROCESS NEXT BYTE
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO CALLER
- ;
- UCEXIT:
- POP DS ;RESTORE DATA SEGMENT PTR
- POP BP ;RESTORE BASE POINTER
- RET 4 ;REMOVE PARAM AND RETURN
- UPPERCASE ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PROTOTYPE: STRING := STRINGOF(CHARACTER, LENGTH);
- ;
- ; STRING === ANY VALID TP4 STRING VARIABLE
- ; CHARACTER === ANY VALID CHARACTER
- ; LENGTH === THE NUMBER OF BYTES TO FILL WITH CHARACTER
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; FOR I := 1 TO LENGTH DO
- ; STRING[I] := CHARACTER;
- ;
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE STRING IS LARGE
- ; ENOUGH TO CONTAIN 'LENGTH' REPITIONS OF CHARACTER.
- ;---------------------------------------------------------------------
- SORESULT EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
- SOCHAR EQU BYTE PTR [BP+8] ;STACK POS OF FILL CHARACTER
- SOCOUNT EQU BYTE PTR [BP+6] ;STACK POS OF FILL LENGTH
-
- STRINGOF PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- ;
- ; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
- ;
- LES DI,SORESULT ;LOAD ADDRESS OF RESULT
- MOV AL,SOCOUNT ;LOAD LENGTH OF FILL
- OR AL,AL ;Q. IS LENGTH ZERO
- JZ SOEXIT ;A. YES--THEN NOTHING TO DO
- CLD ;SET DIRECTION TO FORWARD
- STOSB ;SET LENGTH OF RESULT
- MOV CL,AL ;COPY LENGTH TO CX
- XOR CH,CH ;CLEAR HIGH ORDER BYTE
- MOV AL,SOCHAR ;LOAD THE FILL CHARACTER
- REP STOSB ;FILL STRING WITH CHARACTER
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- SOEXIT:
- POP BP ;RESTORE BASE POINTER
- RET 4 ;REMOVE AND RETURN
- STRINGOF ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PROTOTYPE: TRANSLATE(STRING_NAME,TRANSLATE_TABLE);
- ;
- ; STRING_NAME === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ;
- ; TRANSLATE_TABLE === THE NAME OF A 256 BYTE TRANSLATION TABLE.
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
- ;
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TRANSLATE TABLE
- ; IS AT LEAST 256 BYTES IN LENGTH.
- ;---------------------------------------------------------------------
- TSSTRING EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
- TSTABLE EQU DWORD PTR [BP+6] ;STACK POS OF FILL LENGTH
-
- TRANSLATE PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- ;
- ; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
- ;
- LES DI,TSSTRING ;LOAD ADDR OF STRING
- LDS BX,TSTABLE ;LOAD ADDR OF TRANSLATE TABLE
- MOV SI,DI ;SET SOURCE = DESTINATION
- ;
- ; NOW GET THE STRING LENGTH AND MAKE SURE IT IS NOT ZERO
- ;
- LODSB ;LOAD THE STRING LENGTH
- MOV CL,AL ;COPY INTO CX AND
- SUB CH,CH ;CLEAR HIGH ORDER BYTE
- JCXZ TSEXIT ;Q. IS LENGTH ZERO
- INC DI ;A. NO--MAKE DI MATCH SI
- CLD ;SET DIRECTION TO FORWARD
- ;
- ; HERE IS THE MAIN TRANSLATION LOOP
- ;
- TSLOOP:
- LODSB ;LOAD A SOURCE BYTE
- XLAT ;TRANSLATE THE BYTE
- STOSB ;STORE BACK INTO STRING
- LOOP TSLOOP ;GO PROCESS NEXT BYTE
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- TSEXIT:
- POP DS ;RESTORE DATA SEGMENT
- POP BP ;RESTORE BASE POINTER
- RET 8 ;REMOVE AND RETURN
- TRANSLATE ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; TARGET := EXTRACTTOCHAR(SOURCE,SIZEOF(TARGET),BOUNDARY_CHAR);
- ;
- ; TARGET === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SOURCE === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
- ; BOUNDARY_CHAR === ANY VALID CHARACTER
- ;----------------------------------------------------------------------
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
- ; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
- ;---------------------------------------------------------------------
- EXTARGET EQU DWORD PTR [BP+14] ;STACK POS OF RESULT PTR
- EXSOURCE EQU DWORD PTR [BP+10] ;STACK POS OF RESULT PTR
- EXTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF RESULT LENGTH
- EXCHAR EQU BYTE PTR [BP+6] ;STACK POS OF BOUNDARY CHAR
-
- EXTRACTTOCHAR PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- ;
- ; NOW PICK UP THE PARAMETERS AND MAKE SURE WE FILL AT LEAST 1 BYTE
- ;
- LES DI,EXTARGET ;LOAD ADDR OF TARGET STRING
- LDS SI,EXSOURCE ;LOAD ADDR OF SOURCE STRING
- MOV AH,EXCHAR ;LOAD THE BOUNDARY CHARACTER
- ;
- ; SET THE SOURCE LENGTH TO ZERO IN CASE THERE IS NOTHING TO DO
- ;
- SUB AL,AL ;CLEAR AL
- STOSB ;SET TARGET LENGTH TO ZERO
- ;
- ; NOW GET THE STRING LENGTH AND MAKE SURE IT IS NOT ZERO
- ;
- LODSB ;LOAD THE STRING LENGTH
- MOV CL,AL ;COPY INTO CX AND
- SUB CH,CH ;CLEAR HIGH ORDER BYTE
- JCXZ EXEXIT ;Q. IS LENGTH ZERO
- SUB BL,BL ;A. NO--CLEAR EXTRACTED LENGTH
- MOV DX,EXTRGLEN ;LOAD MAXIMUM LENGTH OF TARGET
- CLD ;SET DIRECTION TO FORWARD
- ;
- ; HERE IS THE MAIN TRANSLATION LOOP
- ;
- EXLOOP:
- LODSB ;LOAD A SOURCE BYTE
- CMP AH,AL ;Q. IS IT THE BOUNDARY CHAR
- JE EXBOUND ;A. YES--GO CLEAN UP THINGS
- STOSB ;A. NO--STORE CHAR INTO TARGET
- INC BL ;INCREMENT EXTRACTED CHAR COUNT
- DEC DX ;Q. ANY ROOM LEFT IN TARGET
- JZ EXBOUND ;A. NO--THEN STOP MOVING
- LOOP EXLOOP ;GO PROCESS NEXT BYTE
- ;
- ; WE HAVE FOUND THE BOUNDARY CHARACTER SO SET THE TARGET LENGTH
- ; AND DELETE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
- ;
- EXBOUND:
- LES DI,EXTARGET ;RELOAD ADDR OF TARGET
- MOV AL,BL ;COPY EXTRACTED LENGTH TO AL
- STOSB ;SET TARGET STRING LENGTH
- ;
- ; NOW WE MUST REMOVE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
- ;
- LES DI,EXSOURCE ;RELOAD ADDR OF SOURCE
- LDS SI,EXSOURCE ;AND ONCE MORE FOR MOVE
- LODSB ;AL = SOURCE STRING LENGTH
- SUB BH,BH ;CLEAR HIGH ORDER BX
- ADD SI,BX ;OFFSET TO BOUNDARY FOUND
- SUB AL,BL ;LENGTH = LENGTH - EXTRACT_CNT
- STOSB ;STORE NEW SOURCE LENGTH
- MOV CL,AL ;SETUP TO MOVE REST OF SOURCE
- SUB CH,CH ;
- REP MOVSB ;LEFT ALIGN REMAINING SOURCE
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- EXEXIT:
- POP DS ;RESTORE DATA SEGMENT
- POP BP ;RESTORE BASE POINTER
- RET 8 ;REMOVE AND RETURN
- EXTRACTTOCHAR ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; TARGET := EXTRACTFORCOUNT(SOURCE,SIZEOF(TARGET),COUNT);
- ;
- ; TARGET === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SOURCE === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
- ; COUNT === NUMBER OF CHARACTERS TO EXTRACT
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; STRING := COPY(STRING,1,COUNT);
- ; DELETE(STRINGT,1,COUNT);
- ;
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
- ; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
- ;---------------------------------------------------------------------
- ECTARGET EQU DWORD PTR [BP+14] ;STACK POS OF RESULT PTR
- ECSOURCE EQU DWORD PTR [BP+10] ;STACK POS OF SOURCE PTR
- ECTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF RESULT LENGTH
- ECCOUNT EQU BYTE PTR [BP+6] ;STACK POS OF COUNT
-
- EXTRACTFORCOUNT PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- ;
- ; LOAD ADDR OF TARGET AND SET LENGTH TO ZERO
- ;
- LES DI,ECTARGET ;LOAD ADDR OF TARGET STRING
- SUB AL,AL ;CLEAR AL
- STOSB ;SET TARGET LENGTH TO ZERO
- DEC DI ;BACKUP TO LENGTH BYTE
- ;
- ; LOAD ADDR OF SOURCE AND VALIDATE LENGTH AND COUNT
- ;
- ECCHKSRC:
- LDS SI,ECSOURCE ;LOAD ADDR OF SOURCE STRING
- LODSB ;GET THE SOURCE LENGTH
- CMP AL,0 ;Q. IS SOURCE LENGTH ZERO
- JE ECEXIT ;A. YES--THEN DO NOTHING
- ;
- ; SOURCE_LEN IS NOT ZERO...BUT IS IT => COUNT ?
- ;
- MOV AH,ECCOUNT ;LOAD THE EXTRACT COUNT
- CMP AL,AH ;Q. SOURCE_LEN => COUNT
- JAE ECSETLEN ;A. YES--ALL IS OKAY
- MOV AH,AL ;A. NO--COUNT = SOURCE_LEN
- ;
- ; SOURCE_LEN WAS < COUNT...SET COUNT = SOURCE_LEN
- ;
- ECSETLEN:
- MOV CL,AH ;MOVE FINAL LENGTH TO CX
- SUB CH,CH ;
- MOV BX,CX ;SAVE LENGTH OF MOVE
- ;
- ; SEE IF TARGET IS LARGE ENOUGH TO HOLD THE EXTRACTED STRING
- ;
- MOV DX,EXTRGLEN ;LOAD MAX SIZE OF TARGET
- DEC DX ;ADJUST FOR LENGTH BYTE
- CMP DX,CX ;Q. IS TARGET LARGE ENOUGH
- JAE ECMOVE ;A. YES--GO DO THE MOVE
- MOV BX,DX ;A. NO--TARGET_LEN = MOVE LEN
- MOV CX,DX ;MOVE_LEN = TARGET_LEN
- ;
- ; TARGET WAS LARGE ENOUGH...SET TARGET_LEN TO EXTRACTED_STRING_LEN
- ;
- ECMOVE:
- MOV AL,CL ;MOVE FINAL LENGTH TO AL
- STOSB ;SET TARGET LENGTH TO ZERO
- ;
- ; NOW WE CAN MOVE THE BYTES FROM SOURCE TO TARGET
- ;
- CLD ;SET DIRECTION TO FORWARD
- REP MOVSB ;COPY FROM SOURCE TO TARGET
- ;
- ; NOW WE MUST REMOVE THE EXTRACTED CHARACTERS FROM THE SOURCE STRING
- ;
- LES DI,ECSOURCE ;RELOAD ADDR OF SOURCE
- LDS SI,ECSOURCE ;AND ONCE MORE FOR MOVE
- LODSB ;AL = SOURCE STRING LENGTH
- SUB AH,AH ;CLEAR HIGH ORDER BYTE
- MOV CX,BX ;RESTORE EXTRACTED LENGTH
- ;
- ; NOW COMPUTE THE NEW SOURCE LENGTH AND ADJUST THE SOURCE STRING
- ;
- ADD SI,CX ;OFFSET TO 1ST BYTE NOT MOVED
- SUB AX,CX ;NEW_LEN = SRC_LEN - XTRCT_LEN
- STOSB ;SET SRC_LEN = NEW_LEN
- JZ ECEXIT ;EXIT IF CURR_LEN = 0
- MOV CX,AX ;MOVE LENGTH = NEW_LENGTH
- CLD ;SET DIRECTION TO FORWARD
- REP MOVSB ;LEFT ALIGN REMAINING SOURCE
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- ECEXIT:
- POP DS ;RESTORE DATA SEGMENT
- POP BP ;RESTORE BASE POINTER
- RET 8 ;REMOVE AND RETURN
- EXTRACTFORCOUNT ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PADLEFT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
- ;
- ; STRING === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
- ; TARGET_LEN === DESIRED LENGTH AFTER PADDING
- ; PAD_CHAR === ANY VALID CHARACTER
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
- ;
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
- ; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
- ;---------------------------------------------------------------------
- PLSTRING EQU DWORD PTR [BP+12] ;STACK POS OF STRING PTR
- PLMAXLEN EQU WORD PTR [BP+10] ;STACK POS OF MAX LENGTH
- PLTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF DESIRED LENGTH
- PLCHAR EQU BYTE PTR [BP+6] ;STACK POS OF PAD CHAR
-
- PADLEFT PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- ;
- ; PICK UP THE VARIOUS PARAMETERS
- ;
- CLD ;DIRECTION = FORWARD
- LDS SI,PLSTRING ;LOAD ADDR OF SOURCE STRING
- LES DI,PLSTRING ;LOAD STRING PTR AS DESTINATION
- MOV BX,PLMAXLEN ;LOAD THE MAXIMUM STRING LEN
- MOV CX,PLTRGLEN ;LOAD THE DESIRED LENGTH
- MOV AH,PLCHAR ;LOAD THE PAD CHARACTER
- ;
- ; SEE IF WHAT THE CALLER WANTS WILL FIT
- ;
- DEC BX ;DECREMENT FOR LENGTH BYTE
- LODSB ;LOAD THE CURRENT STRING LENGTH
- SUB AH,AH ;CLEAR HIGH ORDER BYTE
- CMP AX,BX ;Q. CUR_LEN => MAX_LEN
- JAE PLEXIT ;A. YES--THEN JUST QUIT
- CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
- JAE PLEXIT ;A. YES--THEN NOTHING TO DO
- CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
- JBE PLSIZEOK ;A. NO--LENGTHS ARE OKAY
- MOV CX,BX ;A. YES--DESIRED_LEN = MAX_LEN
- PLSIZEOK:
- SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
- MOV BX,CX ;SAVE PAD_LEN IN BX
- ;
- ; ALL IS OKAY, SO MOVE THE STRING RIGHT TO MAKE ROOMM FOR LEFT PAD
- ;
- MOV SI,DI ;SI = DI = 1ST BYTE OF STRING
- ADD DI,PLTRGLEN ;DI ==> COMPUTED STRING END
- ADD SI,AX ;SI ==> LAST STRING DATA BYTE
- MOV CX,AX ;MOVE OLD_LEN BYTES
- STD ;DIRECTION = BACKWARDS
- REP MOVSB ;MOVE STRING RIGHT 'N' BYTES
- ;
- ; FILL THE VACANT SPACE ON THE LEFT WILL 'PLCHAR'
- ;
- CLD ;DIRECTION = FORWARD
- LES DI,PLSTRING ;LOAD ADDR OF STRING AGAIN
- MOV AX,PLTRGLEN ;LOAD LENGTH OF PAD
- STOSB ;SET NEW LENGTH OF STRING
- MOV AL,PLCHAR ;LOAD THE PAD CHARACTER
- MOV CX,BX ;RESTORE PAD_LEN
- CLD ;SET DIRECTION TO FORWARD
- REP STOSB ;PAD THE STRING
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- PLEXIT:
- POP DS ;RESTORE DATA SEGMENT
- POP BP ;RESTORE BASE POINTER
- RET 8 ;REMOVE AND RETURN
- PADLEFT ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PADRIGHT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
- ;
- ; STRING === THE NAME OF ANY VALID TP4 STRING VARIABLE
- ; SIZEOF(X) === THE VALUE RETURN BY SIZEOF FOR TAGET
- ; TARGET_LEN === DESIRED LENGTH AFTER PADDING
- ; PAD_CHAR === ANY VALID CHARACTER
- ;----------------------------------------------------------------------
- ; THE EFFECT OF THIS ROUTINE IS AS IF YOU HAD CODED THE FOLLOWING;
- ;
- ; FOR I := 1 TO (TARGET_LEN - LENGTH(STRING)) DO
- ; STRING := STRING + PAD_CHAR;
- ;
- ; IT IS THE USERS RESPONSIBILITY TO INSURE THAT THE TARGET STRING IS
- ; LARGE ENOUGH TO CONTAIN THE EXTRACTED STRING.
- ;---------------------------------------------------------------------
- PRSTRING EQU DWORD PTR [BP+12] ;STACK POS OF STRING PTR
- PRMAXLEN EQU WORD PTR [BP+10] ;STACK POS OF MAX LENGTH
- PRTRGLEN EQU WORD PTR [BP+8] ;STACK POS OF DESIRED LENGTH
- PRCHAR EQU BYTE PTR [BP+6] ;STACK POS OF PAD CHAR
-
- PADRIGHT PROC FAR
- PUSH BP ;SAVE BASE POINTER
- MOV BP,SP ;SETUP STACK FRAME
- PUSH DS ;SAVE DATA SEGMENT POINTER
- ;PRDEBUG: JMP PRDEBUG
- ;
- ; PICK UP THE VARIOUS PARAMETERS
- ;
- CLD ;DIRECTION = FORWARD
- LDS SI,PRSTRING ;LOAD ADDR OF SOURCE STRING
- LES DI,PRSTRING ;LOAD STRING PTR AS DESTINATION
- MOV BX,PRMAXLEN ;LOAD THE MAXIMUM STRING LEN
- MOV CX,PRTRGLEN ;LOAD THE DESIRED LENGTH
- ;
- ; SEE IF WHAT THE CALLER WANTS WILL FIT
- ;
- DEC BX ;DECREMENT FOR LENGTH BYTE
- LODSB ;LOAD THE CURRENT STRING LENGTH
- SUB AH,AH ;CLEAR HIGH ORDER BYTE
- CMP AX,BX ;Q. CUR_LEN => MAX_LEN
- JAE PREXIT ;A. YES--THEN JUST QUIT
- CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
- JAE PREXIT ;A. YES--THEN NOTHING TO DO
- CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
- JBE PRSIZEOK ;A. NO--LENGTHS ARE OKAY
- MOV CX,BX ;A. YES--DESIRED_LEN = MAX_LEN
- PRSIZEOK:
- SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
- MOV BX,CX ;SAVE PAD_LEN IN BX
- ;
- ; FILL THE VACANT SPACE ON THE LEFT WILL 'PRCHAR'
- ;
- CLD ;DIRECTION = FORWARD
- LES DI,PRSTRING ;LOAD ADDR OF STRING AGAIN
- INC DI ;POINT TO 1ST DATA BYTE
- ADD DI,AX ;DI ==> 1ST EMPTY BYTE
- MOV AL,PRCHAR ;LOAD THE PAD CHARACTER
- MOV CX,BX ;RESTORE PAD_LEN
- CLD ;SET DIRECTION TO FORWARD
- REP STOSB ;PAD THE STRING
- ;
- ; NOW SET THE NEW LENGTH OF THE STRING
- ;
- LDS SI,PRSTRING ;LOAD ADDR OF STRING
- MOV CL,[SI] ;LOAD CURR_LEN
- SUB CH,CH ;CLEAR HIGH BYTE
- ADD CX,BX ;NEW_LEN = CURR_LEN + PAD_LEN
- MOV [SI],CL ;SET NEW LENGTH OF STRING
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO THE CALLER
- ;
- PREXIT:
- POP DS ;RESTORE DATA SEGMENT
- POP BP ;RESTORE BASE POINTER
- RET 8 ;REMOVE AND RETURN
- PADRIGHT ENDP
- CODE ENDS
- END