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
- ;----------------------------------------------------------------------
- ; VZOR: STRING := UPPERCASE(STRING1);
- ;
- ; STRING === JAKAKOLI PROMENNA TYPU STRING V TP4
- ; STRING1 === JAKAKOLI PROMENNA TYPU STRING V TP4
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE STEJNY JAKO KDYZ NAPISETE;
- ;
- ; FOR I := 1 TO LENGTH(STRING1) DO
- ; STRING[I] := UPCASE(STRING1[I]);
- ;
- ;---------------------------------------------------------------------
- UCRESULT EQU DWORD PTR [BP+10] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- UCSTRING EQU DWORD PTR [BP+6] ;UKAZ NA RETEZEC V ZASOBNIKU
-
- UPPERCASE PROC FAR
- PUSH BP ;ULOZ BP
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;ULOZ UKAZ NA DATA SEGMENT
- LDS SI,UCSTRING ;CTI ZDROJ ADRESU
- LES DI,UCRESULT ;CTI VYSL ADRESU
- CLD ;NASTAV DOPREDNY SMER
- LODSB ;PRENES DELKU RETEZCE
- STOSB ;
- ;
- ; VLOZ DELKU DO CX A PRESVEC SE ZDA JE CO DELAT
- ;
- MOV CL,AL ;KOPIRUJ DELKU DO CX
- XOR CH,CH ;VYMAZ VYSSI CAST SLOVA
- JCXZ UCEXIT ;ODCHOD KDYZ LENGTH = ZERO
- ;
- ; KONTROLA KAZDEHO BAJTU A KONVERZE TAM KDE JE TREBA
- ;
- UCLOOP:
- LODSB ;CTI DALSI ZNAK
- CMP AL,'a' ;Q. MENSI NEZ 'A'
- JB UCSTORE ;A. ANO--TO NECHCEME
- CMP AL,'z' ;Q. VETSI NEZ Z 'Z'
- JA UCSTORE ;A. ANO--TO CHCEME
- SUB AL,'a'-'A' ;A. NE--ZMEN NA VELKE PISMENO
- UCSTORE:
- STOSB ;ZAPIS BAJTU DO VYSL RETEZCE
- LOOP UCLOOP ;DALSI BAJTU
- ;
- ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO CALLER
- ;
- UCEXIT:
- POP DS ;OBNOV UKAZ NA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 4 ;ODSTRAN PARAM A NAVRAT
- UPPERCASE ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; VZOR: STRING := STRINGOF(CHARACTER, LENGTH);
- ;
- ; STRING === JAKAKOLI PROMENNA TYPU STRING V TP4
- ; CHARACTER === JAKAKOLI PROMENNA TYPU STRING V TP4
- ; LENGTH === POCET BAJTU PRO VYPLNENI ZNAKEM
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
- ;
- ; FOR I := 1 TO LENGTH DO
- ; STRING[I] := CHARACTER;
- ;
- ; JE NA UZIVATELI ABY ZAJISTIL ZE STRING JE DOSTATECNE VELKY
- ; PRO VYPLNENI DELKOU LENGTH.
- ;---------------------------------------------------------------------
- SORESULT EQU DWORD PTR [BP+10] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- SOCHAR EQU BYTE PTR [BP+8] ;ZNAK PRO VYPLNOVANI
- SOCOUNT EQU BYTE PTR [BP+6] ;UKAZ DO ZAS NA LENGTH
-
- STRINGOF PROC FAR
- PUSH BP ;USCHOVEJ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- ;
- ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON 1 BAJT
- ;
- LES DI,SORESULT ;CTI ADRESU VYSLEDKU
- MOV AL,SOCOUNT ;CTI LENGTH VYPLNE
- OR AL,AL ;Q. LENGTH JE NULA
- JZ SOEXIT ;A. ANO--NENI CO DELAT
- CLD ;NASTAV DOPREDNY SMER
- STOSB ;NASTAV DELKU VYSLEDKU
- MOV CL,AL ;KOPIRUJ LENGTH DO CX
- XOR CH,CH ;VYMAZ VYSSI BAJT
- MOV AL,SOCHAR ;CTI ZNAK VYPLNE
- REP STOSB ;VYPLN STRING ZNAKEM VYPLNE
- ;
- ; VSE UDELANO NASLEDUJE OBNOVENI PROSTREDI A NAVRAT
- ;
- SOEXIT:
- POP BP ;OBNOV BASE POINTER
- RET 4 ;ODSTRANENI A NAVRAT
- STRINGOF ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; VZOR: TRANSLATE(STRING_NAME,TRANSLATE_TABLE);
- ;
- ; STRING_NAME === JMENO PLATNE PROMENNE TYPU STRING V TP4
- ;
- ; TRANSLATE_TABLE === JMENO 256-BAJTOVE PREKLADOVE TABULKY.
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
- ;
- ; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
- ;
- ; JE NA UZIVATELI ABY ZAJISTIL ZE PREKLADOVA TABULKA JE DLOUHA
- ; ALESPON 256 BAJTU.
- ;---------------------------------------------------------------------
- TSSTRING EQU DWORD PTR [BP+10] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- TSTABLE EQU DWORD PTR [BP+6] ;POZICE DELKY V ZASOBNIKU
-
- TRANSLATE PROC FAR
- PUSH BP ;USCHOVEJ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;USCHOVEJ UKAZ NA DATA SEGMENT
- ;
- ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON JEDEN BAJT
- ;
- LES DI,TSSTRING ;CTI ADRESU RETEZCE
- LDS BX,TSTABLE ;CTI ADRESU PREKLADOVE TABULKY
- MOV SI,DI ;NASTAV ZDROJ = CIL
- ;
- ; VEZMI DELKU RETEZCE A ZJISTI ZDALI NENI NULA
- ;
- LODSB ;CTI DELKU RETEZCE
- MOV CL,AL ;KOPIRUJ DO CX A
- SUB CH,CH ;VYMAZ VYSSI BAJT
- JCXZ TSEXIT ;Q. DELKA JE NULA
- INC DI ;A. NE--SROVNEJ DI S SI
- CLD ;NASTAV DOPREDNY SMER
- ;
- ; ZDE JE HLAVNI PREKLADOVA SMYCKA
- ;
- TSLOOP:
- LODSB ;CTI ZDROJOVY BAJT
- XLAT ;PRELOZ BAJT
- STOSB ;ULOZ ZPET DO RETEZCE
- LOOP TSLOOP ;DALSI BAJT
- ;
- ; VSECHNO HOTOVO A NESLEDUJE OBNOVENI STAVU A ODCHOD
- ;
- TSEXIT:
- POP DS ;OBNOV DATA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 8 ;ODSTRANENI A NAVRAT
- TRANSLATE ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; TARGET := EXTRACTTOCHAR(SOURCE,SIZEOF(TARGET),BOUNDARY_CHAR);
- ;
- ; TARGET === JMENO PROMENNE TYPU STRING V TP4
- ; SOURCE === JMENO PROMENNE TYPU STRING V TP4
- ; SIZEOF(X) === HODNOTA VRACENA SIZEOF PRO TARGET
- ; BOUNDARY_CHAR === JAKYKOLI PLATNY ZNAK
- ;----------------------------------------------------------------------
- ; JE NA UZIVATELI ABY ZAJISTIL ZDA CILOVY RETEZEC BUDE MIT
- ; DOSTATECNOU DELKU.
- ;---------------------------------------------------------------------
- EXTARGET EQU DWORD PTR [BP+14] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- EXSOURCE EQU DWORD PTR [BP+10] ;POZICE UKAZ NA VYSLEDEK V ZAS
- EXTRGLEN EQU WORD PTR [BP+8] ;POZICE LENGTH V ZASOBNIKU
- EXCHAR EQU BYTE PTR [BP+6] ;POZICE MEZNIHO ZNAKU V ZAS
-
- EXTRACTTOCHAR PROC FAR
- PUSH BP ;USCHOVEJ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;USCHOVEJ UKAZ NA DATA SEGMENT
- ;
- ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON JEDEN 1 BAJT
- ;
- LES DI,EXTARGET ;CTI ADRESU CILOVEHO RETEZCE
- LDS SI,EXSOURCE ;CTI ADRESU ZDROJOVEHO RETEZCE
- MOV AH,EXCHAR ;CTI MEZNI ZNAK
- ;
- ; NASTAV DELKU ZDROJOVEHO RETEZCE NA NULU, POKUD NENI CO DELAT
- ;
- SUB AL,AL ;VYMAZ AL
- STOSB ;NASTAV DELKU CIL.RETEZCE NA NULU
- ;
- ; VEZMI DELKU RETEZCE A PRESVEC SE ZDA NENI NULA
- ;
- LODSB ;NACTI DELKU RETEZCE
- MOV CL,AL ;KOPIRUJ DO CX A
- SUB CH,CH ;VYMAZ VYSSI BAJT
- JCXZ EXEXIT ;Q. DELKA JE NULA
- SUB BL,BL ;A. NE--VYMAZ EXTRACTED LENGTH
- MOV DX,EXTRGLEN ;CTI MAX DELKU CILOVEHO RETEZCE
- CLD ;NASTAV DOPREDNY SMER
- ;
- ; ZDE JE HLAVNI PREKLADOVY CYKLUS
- ;
- EXLOOP:
- LODSB ;CTI ZDROJOVY BAJT
- CMP AH,AL ;Q. JE TO MEZNI ZNAK
- JE EXBOUND ;A. ANO--VYMAZ
- STOSB ;A. NE--ULOZ ZNAK DO CIL.RETEZCE
- INC BL ;ZVYS POCITADLO PRO EXTRACTED CHAR
- DEC DX ;Q. PROSTOR VLEVO V CILOVEM RETEZCI
- JZ EXBOUND ;A. NE--ZASTAV PRENOS
- LOOP EXLOOP ;DALSI BAJT
- ;
- ; NALEZLI JSME MEZNI ZNAK TAK JSME NASTAVILI DELKU CILOVEHO RETEZCE
- ; A VYMAZALI DANE ZNAKY ZE ZDROJOVEHO RETEZCE
- ;
- EXBOUND:
- LES DI,EXTARGET ;ZNOVU CTI ADRESU CILOVEHO RETEZCE
- MOV AL,BL ;KOPIRUJ EXTRACTED LENGTH DO AL
- STOSB ;NASTAV DELKU CIL.RETEZCE
- ;
- ; NYNI MUSIME VYMAZAT DANE ZNAKY Z CILOVEHO RETEZCE
- ;
- LES DI,EXSOURCE ;ZNOVU CTI ADRESU ZDROJ RETEZCE
- LDS SI,EXSOURCE ;A JESTE JEDNOU PRO PRENOS
- LODSB ;AL = DELKA ZDROJ.RETEZCE
- SUB BH,BH ;VYMAZ VYSSI BAJT BX
- ADD SI,BX ;OFFSET PRO MEZNI VYSKYT
- SUB AL,BL ;LENGTH = LENGTH - EXTRACT_CNT
- STOSB ;ULOZ NOVOU DELKU ZDROJ.RETEZCE
- MOV CL,AL ;NASTAV PRENOS
- SUB CH,CH ;
- REP MOVSB ;LEVE ZAROVNANI ZBYLEHO ZDROJ.RETEZCE
- ;
- ; VSECHNO HOTOVO TAK OBNOVIME STAV A PROVEDEME NAVRAT
- ;
- EXEXIT:
- POP DS ;OBNOV DATA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 8 ;ODSTRANENI A NAVRAT
- EXTRACTTOCHAR ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; TARGET := EXTRACTFORCOUNT(SOURCE,SIZEOF(TARGET),COUNT);
- ;
- ; TARGET === JMENO PROMENNE TYPU STRING V TP4
- ; SOURCE === JMENO PROMENNE TYPU STRING V TP4
- ; SIZEOF(X) === HODNOTA VRACENA SIZEOF
- ; COUNT === POCET ZNAKU PRO EXTRAKCI
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
- ;
- ; STRING := COPY(STRING,1,COUNT);
- ; DELETE(STRINGT,1,COUNT);
- ;
- ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BUDE
- ; DOSTATECNE DLOUHY.
- ;---------------------------------------------------------------------
- ECTARGET EQU DWORD PTR [BP+14] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- ECSOURCE EQU DWORD PTR [BP+10] ;UKAZ NA SOURCE V ZASOBNIKU
- ECTRGLEN EQU WORD PTR [BP+8] ;POZICE VYSLEDNE DELKY V ZAS
- ECCOUNT EQU BYTE PTR [BP+6] ;POZICE COUNT V ZASOBNIKU
-
- EXTRACTFORCOUNT PROC FAR
- PUSH BP ;ULOZ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;ULOZ UKAZATEL NA DATA SEGMENT
- ;
- ; CTI ADRESU CILOVEHO RETEZCE A NASTAV DELKU NA NULA
- ;
- LES DI,ECTARGET ;CTI ADRESU CILOVEHO RETEZCE
- SUB AL,AL ;VYMAZ AL
- STOSB ;NASTAV DELKU TARGET NA NULU
- DEC DI ;ULOZ DO DELKY BAJTU
- ;
- ; CTI ADRESU ZDROJOVEHO RETEZCE A OVER LENGTH A COUNT
- ;
- ECCHKSRC:
- LDS SI,ECSOURCE ;CTI ADRESU ZDROJOVEHO RETEZCE
- LODSB ;CTI DELKU ZDROJ.RETEZCE
- CMP AL,0 ;Q. JE DELKA NULA
- JE ECEXIT ;A. ANO--NEDELEJ NIC
- ;
- ; SOURCE_LEN NENI NULA...ALE JE TO => COUNT ?
- ;
- MOV AH,ECCOUNT ;CTI EXTRACT COUNT
- CMP AL,AH ;Q. SOURCE_LEN => COUNT
- JAE ECSETLEN ;A. ANO--VSE V PORADKU
- MOV AH,AL ;A. NE--COUNT = SOURCE_LEN
- ;
- ; SOURCE_LEN BYL < COUNT...NASTAV COUNT = SOURCE_LEN
- ;
- ECSETLEN:
- MOV CL,AH ;PRENES KONECNOU DELKU DO CX
- SUB CH,CH ;
- MOV BX,CX ;ULOZ DELKU PRENOSU
- ;
- ; OVER ZDA JE TARGET DOSTATECNE DLOUHY
- ;
- MOV DX,EXTRGLEN ;CTI MAX VELIKOST TARGET
- DEC DX ;NASTAV NA DELKU BAJTU
- CMP DX,CX ;Q. TARGET JE DOST VELKY
- JAE ECMOVE ;A. ANO--PROVED PRENOS
- MOV BX,DX ;A. NE--TARGET_LEN = MOVE LEN
- MOV CX,DX ;MOVE_LEN = TARGET_LEN
- ;
- ; TARGET BYL DOSTATECNE VELKY..NASTAV TARGET_LEN NA EXTRACTED_STRING_LEN
- ;
- ECMOVE:
- MOV AL,CL ;PRENES KONECNOU DELKU DO AL
- STOSB ;NASTAV DELKU TARGET NA NULU
- ;
- ; NYNI MUZEME PRENEST BAJTY ZE SOURCE DO TARGET
- ;
- CLD ;NASTAV DOPREDNY SMER
- REP MOVSB ;KPIRUJ ZE SOURCE DO TARGET
- ;
- ; NYNI MUSIME ODSTRANIT PRISLUSNE ZNAKY ZE ZDROJOVEHO RETEZCE
- ;
- LES DI,ECSOURCE ;ZNOVU CTI ADRESU SOURCE
- LDS SI,ECSOURCE ;A JESTE JEDNOU PRO PRENOS
- LODSB ;AL = DELKA ZDROJOVEHO RETEZCE
- SUB AH,AH ;VYMAZ VYSSI BAJT
- MOV CX,BX ;OBNOV EXTRAHOVANOU DELKU
- ;
- ; NENI VYPOCTEME NOVOU DELKU ZDROJOVEHO RETEZCE A NASTAVIME ZDROJ.RETEZEC
- ;
- ADD SI,CX ;OFFSET NA 1 BAJT NEPRENESTD
- SUB AX,CX ;NEW_LEN = SRC_LEN - XTRCT_LEN
- STOSB ;NASTAV SRC_LEN = NEW_LEN
- JZ ECEXIT ;ODCHOD JESTLIZE CURR_LEN = 0
- MOV CX,AX ;PRENES LENGTH = NEW_LENGTH
- CLD ;NASTAV DOPREDNY SMER
- REP MOVSB ;LEVE ZAROVNANI ZBYLEHO SOURCE
- ;
- ; VSECHNO HOTOVO OBNOVTENI PUVODNIHO STAVU A NAVRAT
- ;
- ECEXIT:
- POP DS ;OBNOV DATA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 8 ;ODSTRANENI A NAVRAT
- EXTRACTFORCOUNT ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PADLEFT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
- ;
- ; STRING === JMENO PROMENNE TYPU STRING V TP4
- ; SIZEOF(X) === HODNOTA VRACENA SIZEOF
- ; TARGET_LEN === POZADOVANA DELKA PO VYPLNENI
- ; PAD_CHAR === LIBOVOLNY PLATNY ZNAK
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE NASLEDOVNY;
- ;
- ; STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
- ;
- ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BYL
- ; DOSTATECNE VELKY.
- ;---------------------------------------------------------------------
- PLSTRING EQU DWORD PTR [BP+12] ;UKAZ NA VYSLEDEK V ZASOBNIKU
- PLMAXLEN EQU WORD PTR [BP+10] ;POZICE MAX DELKY V ZASOBNIKU
- PLTRGLEN EQU WORD PTR [BP+8] ;POZICE POZADOVANE DELKY V ZAS
- PLCHAR EQU BYTE PTR [BP+6] ;POZICE VYPLNOVACIHO ZNAKU V ZAS
-
- PADLEFT PROC FAR
- PUSH BP ;ULOZ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;ULOZ UKAZATEL NA DATA SEGMENT
- ;
- ; VEZMI PARAMETRY
- ;
- CLD ;SMER = DOPREDU
- LDS SI,PLSTRING ;CTI ADRESU ZDROJOVEHO RETEZCE
- LES DI,PLSTRING ;CTI UKAZ NA STRING
- MOV BX,PLMAXLEN ;CTI MAX DELKU RETEZCE
- MOV CX,PLTRGLEN ;CTI POZADOVANOU DELKU
- MOV AH,PLCHAR ;CTI VYPLNOVACI ZNAK
- ;
- ;
- DEC BX ;DEKREMENTUJ DELKU
- LODSB ;CTI AKTUALNI DELKU RETEZCE
- SUB AH,AH ;VYMAZ VYSSI BAJT
- CMP AX,BX ;Q. CUR_LEN => MAX_LEN
- JAE PLEXIT ;A. ANO--ODCHOD
- CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
- JAE PLEXIT ;A. ANO--NENI CO DELAT
- CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
- JBE PLSIZEOK ;A. NE--DELKY JSOU V PORADKU
- MOV CX,BX ;A. ANO--DESIRED_LEN = MAX_LEN
- PLSIZEOK:
- SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
- MOV BX,CX ;ULOZ PAD_LEN DO BX
- ;
- ; VSE JE V PRADKU, TAK PRENESEME RETEZEC DOPRAVA, ABYCHOM UDELALI MISTO
- ;
- MOV SI,DI ;SI = DI = PRVNI BAJT RETEZCE
- ADD DI,PLTRGLEN ;DI ==> VYPOCTENY KONEC RETEZCE
- ADD SI,AX ;SI ==> POSLEDNI DATOVY BAJT RETEZCE
- MOV CX,AX ;PRENES BAJTY OLD_LEN
- STD ;SMER = VZAD
- REP MOVSB ;PRESUN RETEZEC DOPRAVA O 'N' BAJTU
- ;
- ; VYPLN NALEVO VYTVORENY PROSTOR
- ;
- CLD ;SMER = VPRED
- LES DI,PLSTRING ;CTI ZNOVU ADRESU RETEZCE
- MOV AX,PLTRGLEN ;CTI DELKU PAD
- STOSB ;NASTAV NOVOU DELKU RETEZCE
- MOV AL,PLCHAR ;CTI VYPLNOVACI ZNAK
- MOV CX,BX ;OBNOV PAD_LEN
- CLD ;NASTAV DOPREDNY SMER
- REP STOSB ;VYPLN RETEZEC
- ;
- ; VSE JE HOTOVO TAK OBNOV PUVODNI STAV A PROVED NAVRAT
- ;
- PLEXIT:
- POP DS ;OBNOV DATA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 8 ;ODSTRANENI A NAVRAT
- PADLEFT ENDP
-
- PAGE
- ;----------------------------------------------------------------------
- ; PADRIGHT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
- ;
- ; STRING === JMENO PROMENNE TYPU STRING V TP4
- ; SIZEOF(X) === HODNOTA VRACENA SIZEOF
- ; TARGET_LEN === POZADOVANA DELKA PO VYPLNENI
- ; PAD_CHAR === JAKYKOLI PLATNY ZNAK
- ;----------------------------------------------------------------------
- ; EFEKT TETO RUTINY JE NASLEDOVNY;
- ;
- ; FOR I := 1 TO (TARGET_LEN - LENGTH(STRING)) DO
- ; STRING := STRING + PAD_CHAR;
- ;
- ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BUDE
- ; DOSTATECNE VELKY.
- ;---------------------------------------------------------------------
- PRSTRING EQU DWORD PTR [BP+12] ;POZICE UKAZ NA RETEZEC V ZAS.
- PRMAXLEN EQU WORD PTR [BP+10] ;POZICE MAX DELKY V ZASOBNIKU
- PRTRGLEN EQU WORD PTR [BP+8] ;POZICE POZADOVANE DELKY V ZAS
- PRCHAR EQU BYTE PTR [BP+6] ;POZICE VYPLN ZNAKU V ZASOBNIKU
-
- PADRIGHT PROC FAR
- PUSH BP ;ULOZ BASE POINTER
- MOV BP,SP ;NASTAV ZASOBNIK
- PUSH DS ;ULOZ UKAZATEL NA DATA SEGMENT
- ;PRDEBUG: JMP PRDEBUG
- ;
- ; VEZMI PARAMETRY
- ;
- CLD ;SMER = VPRED
- LDS SI,PRSTRING ;CTI ADRESU ZDROJOVEHO RETEZCE
- LES DI,PRSTRING ;CTI UKAZ NA RETEZEC
- MOV BX,PRMAXLEN ;CTI MAX DELKU RETEZCE
- MOV CX,PRTRGLEN ;CTI POZADOVANOU DELKU
- ;
- ;
- DEC BX ;DEKREMENTUJ DELKU
- LODSB ;CTI AKTUALNI DELKU RETEZCE
- SUB AH,AH ;VYMAZ VYSSI BAJT
- CMP AX,BX ;Q. CUR_LEN => MAX_LEN
- JAE PREXIT ;A. ANO--ODCHOD
- CMP AX,CX ;Q. CURR_LEN > DESIRED_LEN
- JAE PREXIT ;A. ANO--NENI CO DELAT
- CMP CX,BX ;Q. DESIRED_LEN > MAX_LEN
- JBE PRSIZEOK ;A. NE--DELKY JSOU V PORADKU
- MOV CX,BX ;A. ANO--DESIRED_LEN = MAX_LEN
- PRSIZEOK:
- SUB CX,AX ;PAD_LEN = DESIRED_LEN - CUR_LEN
- MOV BX,CX ;ULOZ PAD_LEN DO BX
- ;
- ; VYPLN PROSTOR NALEVO
- ;
- CLD ;SMER = VPRED
- LES DI,PRSTRING ;CTI ZNOVU ADRESU RETEZCE
- INC DI ;UKAZ NA PRVNI DATOVY BAJT
- ADD DI,AX ;DI ==> PRVNI PRAZDNY BAJT
- MOV AL,PRCHAR ;CTI VYPLNOVACI ZNAK
- MOV CX,BX ;OBNOV PAD_LEN
- CLD ;NASTAV DOPREDNY SMER
- REP STOSB ;VYPLN RETEZEC
- ;
- ; NENI NASTAVIME NOVOU DELKU RETEZCE
- ;
- LDS SI,PRSTRING ;CTI ADRESU RETEZCE
- MOV CL,[SI] ;CTI CURR_LEN
- SUB CH,CH ;VYMAZ VYSSI BAJT
- ADD CX,BX ;NEW_LEN = CURR_LEN + PAD_LEN
- MOV [SI],CL ;NASTAV NOVOU DELKU RETEZCE
- ;
- ; VSECHNO JE HOTOVO TAK OBNOVIME PUVODNI STAV A PROVEDEME NAVRAT
- ;
- PREXIT:
- POP DS ;OBNOV DATA SEGMENT
- POP BP ;OBNOV BASE POINTER
- RET 8 ;ODSTRANENI A NAVRAT
- PADRIGHT ENDP
- CODE ENDS
- END
-