home *** CD-ROM | disk | FTP | other *** search
/ Prima Shareware 3 / DuCom_Prima-Shareware-3_cd1.bin / PROGRAMO / PASCAL / STRINGS / STRINGS.ASM < prev    next >
Encoding:
Assembly Source File  |  1991-04-28  |  21.9 KB  |  506 lines

  1.            PAGE    55,132
  2. CODE       SEGMENT BYTE PUBLIC
  3.            ASSUME  CS:CODE
  4.            PUBLIC  UPPERCASE
  5.            PUBLIC  STRINGOF
  6.            PUBLIC  TRANSLATE
  7.            PUBLIC  EXTRACTTOCHAR
  8.            PUBLIC  EXTRACTFORCOUNT
  9.            PUBLIC  PADLEFT
  10.            PUBLIC  PADRIGHT
  11.  
  12.             PAGE
  13. ;----------------------------------------------------------------------
  14. ; VZOR:   STRING := UPPERCASE(STRING1);
  15. ;
  16. ;    STRING     === JAKAKOLI PROMENNA TYPU STRING V TP4
  17. ;    STRING1    === JAKAKOLI PROMENNA TYPU STRING V TP4
  18. ;----------------------------------------------------------------------
  19. ; EFEKT TETO RUTINY JE STEJNY JAKO KDYZ NAPISETE;
  20. ;
  21. ;    FOR I := 1 TO LENGTH(STRING1) DO
  22. ;      STRING[I] := UPCASE(STRING1[I]);
  23. ;
  24. ;---------------------------------------------------------------------
  25. UCRESULT   EQU     DWORD PTR [BP+10]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  26. UCSTRING   EQU     DWORD PTR [BP+6]     ;UKAZ NA RETEZEC V ZASOBNIKU
  27.  
  28. UPPERCASE  PROC    FAR
  29.            PUSH    BP                   ;ULOZ BP
  30.            MOV     BP,SP                ;NASTAV ZASOBNIK
  31.            PUSH    DS                   ;ULOZ UKAZ NA DATA SEGMENT
  32.            LDS     SI,UCSTRING          ;CTI ZDROJ ADRESU
  33.            LES     DI,UCRESULT          ;CTI VYSL ADRESU
  34.            CLD                          ;NASTAV DOPREDNY SMER
  35.            LODSB                        ;PRENES DELKU RETEZCE
  36.            STOSB                        ;
  37. ;
  38. ; VLOZ DELKU DO CX A PRESVEC SE ZDA JE CO DELAT
  39. ;
  40.            MOV     CL,AL                ;KOPIRUJ DELKU DO CX
  41.            XOR     CH,CH                ;VYMAZ VYSSI CAST SLOVA
  42.            JCXZ    UCEXIT               ;ODCHOD KDYZ LENGTH = ZERO
  43. ;
  44. ; KONTROLA KAZDEHO BAJTU A KONVERZE TAM KDE JE TREBA
  45. ;
  46. UCLOOP:
  47.             LODSB                       ;CTI DALSI ZNAK
  48.             CMP    AL,'a'               ;Q. MENSI NEZ 'A'
  49.             JB     UCSTORE              ;A. ANO--TO NECHCEME
  50.             CMP    AL,'z'               ;Q. VETSI NEZ Z 'Z'
  51.             JA     UCSTORE              ;A. ANO--TO CHCEME
  52.             SUB    AL,'a'-'A'           ;A. NE--ZMEN NA VELKE PISMENO
  53. UCSTORE:
  54.             STOSB                       ;ZAPIS BAJTU DO VYSL RETEZCE
  55.             LOOP   UCLOOP               ;DALSI BAJTU
  56. ;
  57. ; ALL DONE SO RESTORE THE STUFF WE SAVED AND RETURN TO CALLER
  58. ;
  59. UCEXIT:
  60.             POP    DS                   ;OBNOV UKAZ NA SEGMENT
  61.             POP    BP                   ;OBNOV BASE POINTER
  62.             RET    4                    ;ODSTRAN PARAM A NAVRAT
  63. UPPERCASE   ENDP
  64.  
  65.             PAGE
  66. ;----------------------------------------------------------------------
  67. ; VZOR:   STRING := STRINGOF(CHARACTER, LENGTH);
  68. ;
  69. ;    STRING     === JAKAKOLI PROMENNA TYPU STRING V TP4
  70. ;    CHARACTER  === JAKAKOLI PROMENNA TYPU STRING V TP4
  71. ;    LENGTH     === POCET BAJTU PRO VYPLNENI ZNAKEM
  72. ;----------------------------------------------------------------------
  73. ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
  74. ;
  75. ;    FOR I := 1 TO LENGTH DO
  76. ;      STRING[I] := CHARACTER;
  77. ;
  78. ; JE NA UZIVATELI ABY ZAJISTIL ZE STRING JE DOSTATECNE VELKY
  79. ; PRO VYPLNENI DELKOU LENGTH.
  80. ;---------------------------------------------------------------------
  81. SORESULT    EQU    DWORD PTR [BP+10]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  82. SOCHAR      EQU    BYTE  PTR [BP+8]     ;ZNAK PRO VYPLNOVANI
  83. SOCOUNT     EQU    BYTE  PTR [BP+6]     ;UKAZ DO ZAS NA LENGTH
  84.  
  85. STRINGOF    PROC   FAR
  86.             PUSH   BP                   ;USCHOVEJ BASE POINTER
  87.             MOV    BP,SP                ;NASTAV ZASOBNIK
  88. ;
  89. ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON 1 BAJT
  90. ;
  91.             LES    DI,SORESULT          ;CTI ADRESU VYSLEDKU
  92.             MOV    AL,SOCOUNT           ;CTI LENGTH VYPLNE
  93.             OR     AL,AL                ;Q.  LENGTH JE NULA
  94.             JZ     SOEXIT               ;A. ANO--NENI CO DELAT
  95.             CLD                         ;NASTAV DOPREDNY SMER
  96.             STOSB                       ;NASTAV DELKU VYSLEDKU
  97.             MOV    CL,AL                ;KOPIRUJ LENGTH DO CX
  98.             XOR    CH,CH                ;VYMAZ VYSSI BAJT
  99.             MOV    AL,SOCHAR            ;CTI ZNAK VYPLNE
  100.             REP    STOSB                ;VYPLN STRING ZNAKEM VYPLNE
  101. ;
  102. ; VSE UDELANO NASLEDUJE OBNOVENI PROSTREDI A NAVRAT
  103. ;
  104. SOEXIT:
  105.             POP    BP                   ;OBNOV BASE POINTER
  106.             RET    4                    ;ODSTRANENI A NAVRAT
  107. STRINGOF    ENDP
  108.  
  109.             PAGE
  110. ;----------------------------------------------------------------------
  111. ; VZOR:   TRANSLATE(STRING_NAME,TRANSLATE_TABLE);
  112. ;
  113. ;    STRING_NAME === JMENO PLATNE PROMENNE TYPU STRING V TP4
  114. ;
  115. ;    TRANSLATE_TABLE === JMENO 256-BAJTOVE PREKLADOVE TABULKY.
  116. ;----------------------------------------------------------------------
  117. ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
  118. ;
  119. ;    STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
  120. ;
  121. ; JE NA UZIVATELI ABY ZAJISTIL ZE PREKLADOVA TABULKA JE DLOUHA
  122. ; ALESPON 256 BAJTU.
  123. ;---------------------------------------------------------------------
  124. TSSTRING    EQU    DWORD PTR [BP+10]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  125. TSTABLE     EQU    DWORD PTR [BP+6]     ;POZICE DELKY V ZASOBNIKU
  126.  
  127. TRANSLATE   PROC   FAR
  128.             PUSH   BP                   ;USCHOVEJ BASE POINTER
  129.             MOV    BP,SP                ;NASTAV ZASOBNIK
  130.             PUSH   DS                   ;USCHOVEJ UKAZ NA DATA SEGMENT
  131. ;
  132. ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON JEDEN BAJT
  133. ;
  134.             LES    DI,TSSTRING          ;CTI ADRESU RETEZCE
  135.             LDS    BX,TSTABLE           ;CTI ADRESU PREKLADOVE TABULKY
  136.             MOV    SI,DI                ;NASTAV ZDROJ = CIL
  137. ;
  138. ; VEZMI DELKU RETEZCE A ZJISTI ZDALI NENI NULA
  139. ;
  140.             LODSB                       ;CTI DELKU RETEZCE
  141.             MOV    CL,AL                ;KOPIRUJ DO CX A
  142.             SUB    CH,CH                ;VYMAZ VYSSI BAJT
  143.             JCXZ   TSEXIT               ;Q. DELKA JE NULA
  144.             INC    DI                   ;A. NE--SROVNEJ DI S SI
  145.             CLD                         ;NASTAV DOPREDNY SMER
  146. ;
  147. ; ZDE JE HLAVNI PREKLADOVA SMYCKA
  148. ;
  149. TSLOOP:
  150.             LODSB                       ;CTI ZDROJOVY BAJT
  151.             XLAT                        ;PRELOZ BAJT
  152.             STOSB                       ;ULOZ ZPET DO RETEZCE
  153.             LOOP   TSLOOP               ;DALSI BAJT
  154. ;
  155. ; VSECHNO HOTOVO A NESLEDUJE OBNOVENI STAVU A ODCHOD
  156. ;
  157. TSEXIT:
  158.             POP    DS                   ;OBNOV DATA SEGMENT
  159.             POP    BP                   ;OBNOV BASE POINTER
  160.             RET    8                    ;ODSTRANENI A NAVRAT
  161. TRANSLATE   ENDP
  162.  
  163.             PAGE
  164. ;----------------------------------------------------------------------
  165. ; TARGET := EXTRACTTOCHAR(SOURCE,SIZEOF(TARGET),BOUNDARY_CHAR);
  166. ;
  167. ;    TARGET        === JMENO PROMENNE TYPU STRING V TP4
  168. ;    SOURCE        === JMENO PROMENNE TYPU STRING V TP4
  169. ;    SIZEOF(X)     === HODNOTA VRACENA SIZEOF PRO TARGET
  170. ;    BOUNDARY_CHAR === JAKYKOLI PLATNY ZNAK
  171. ;----------------------------------------------------------------------
  172. ; JE NA UZIVATELI ABY ZAJISTIL ZDA CILOVY RETEZEC BUDE MIT
  173. ; DOSTATECNOU DELKU.
  174. ;---------------------------------------------------------------------
  175. EXTARGET    EQU    DWORD PTR [BP+14]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  176. EXSOURCE    EQU    DWORD PTR [BP+10]    ;POZICE UKAZ NA VYSLEDEK V ZAS
  177. EXTRGLEN    EQU    WORD  PTR [BP+8]     ;POZICE LENGTH V ZASOBNIKU
  178. EXCHAR      EQU    BYTE  PTR [BP+6]     ;POZICE MEZNIHO ZNAKU V ZAS
  179.  
  180. EXTRACTTOCHAR     PROC   FAR
  181.             PUSH   BP                   ;USCHOVEJ BASE POINTER
  182.             MOV    BP,SP                ;NASTAV ZASOBNIK
  183.             PUSH   DS                   ;USCHOVEJ UKAZ NA DATA SEGMENT
  184. ;
  185. ; VEZMI PARAMETRY A ZJISTI ZDA SE VYPLNUJE ALESPON JEDEN 1 BAJT
  186. ;
  187.             LES    DI,EXTARGET          ;CTI ADRESU CILOVEHO RETEZCE
  188.             LDS    SI,EXSOURCE          ;CTI ADRESU ZDROJOVEHO RETEZCE
  189.             MOV    AH,EXCHAR            ;CTI MEZNI ZNAK
  190. ;
  191. ; NASTAV DELKU ZDROJOVEHO RETEZCE NA NULU, POKUD NENI CO DELAT
  192. ;
  193.             SUB    AL,AL                ;VYMAZ AL
  194.             STOSB                       ;NASTAV DELKU CIL.RETEZCE NA NULU
  195. ;
  196. ; VEZMI DELKU RETEZCE A PRESVEC SE ZDA NENI NULA
  197. ;
  198.             LODSB                       ;NACTI DELKU RETEZCE
  199.             MOV    CL,AL                ;KOPIRUJ DO CX A
  200.             SUB    CH,CH                ;VYMAZ VYSSI BAJT
  201.             JCXZ   EXEXIT               ;Q. DELKA JE NULA
  202.             SUB    BL,BL                ;A. NE--VYMAZ EXTRACTED LENGTH
  203.             MOV    DX,EXTRGLEN          ;CTI MAX DELKU CILOVEHO RETEZCE
  204.             CLD                         ;NASTAV DOPREDNY SMER
  205. ;
  206. ; ZDE JE HLAVNI PREKLADOVY CYKLUS
  207. ;
  208. EXLOOP:
  209.             LODSB                       ;CTI ZDROJOVY BAJT
  210.             CMP    AH,AL                ;Q. JE TO MEZNI ZNAK
  211.             JE     EXBOUND              ;A. ANO--VYMAZ
  212.             STOSB                       ;A. NE--ULOZ ZNAK DO CIL.RETEZCE
  213.             INC    BL                   ;ZVYS POCITADLO PRO EXTRACTED CHAR
  214.             DEC    DX                   ;Q. PROSTOR VLEVO V CILOVEM RETEZCI
  215.             JZ     EXBOUND              ;A. NE--ZASTAV PRENOS
  216.             LOOP   EXLOOP               ;DALSI BAJT
  217. ;
  218. ; NALEZLI JSME MEZNI ZNAK TAK JSME NASTAVILI DELKU CILOVEHO RETEZCE
  219. ; A VYMAZALI DANE ZNAKY ZE ZDROJOVEHO RETEZCE
  220. ;
  221. EXBOUND:
  222.             LES    DI,EXTARGET          ;ZNOVU CTI ADRESU CILOVEHO RETEZCE
  223.             MOV    AL,BL                ;KOPIRUJ EXTRACTED LENGTH DO AL
  224.             STOSB                       ;NASTAV DELKU CIL.RETEZCE
  225. ;
  226. ; NYNI MUSIME VYMAZAT DANE ZNAKY Z CILOVEHO RETEZCE
  227. ;
  228.             LES    DI,EXSOURCE          ;ZNOVU CTI ADRESU ZDROJ RETEZCE
  229.             LDS    SI,EXSOURCE          ;A JESTE JEDNOU PRO PRENOS
  230.             LODSB                       ;AL = DELKA ZDROJ.RETEZCE
  231.             SUB    BH,BH                ;VYMAZ VYSSI BAJT BX
  232.             ADD    SI,BX                ;OFFSET PRO MEZNI VYSKYT
  233.             SUB    AL,BL                ;LENGTH = LENGTH - EXTRACT_CNT
  234.             STOSB                       ;ULOZ NOVOU DELKU ZDROJ.RETEZCE
  235.             MOV    CL,AL                ;NASTAV PRENOS
  236.             SUB    CH,CH                ;
  237.             REP    MOVSB                ;LEVE ZAROVNANI ZBYLEHO ZDROJ.RETEZCE
  238. ;
  239. ; VSECHNO HOTOVO TAK OBNOVIME STAV A PROVEDEME NAVRAT
  240. ;
  241. EXEXIT:
  242.             POP    DS                   ;OBNOV DATA SEGMENT
  243.             POP    BP                   ;OBNOV BASE POINTER
  244.             RET    8                    ;ODSTRANENI A NAVRAT
  245. EXTRACTTOCHAR     ENDP
  246.  
  247.             PAGE
  248. ;----------------------------------------------------------------------
  249. ; TARGET := EXTRACTFORCOUNT(SOURCE,SIZEOF(TARGET),COUNT);
  250. ;
  251. ;    TARGET        === JMENO PROMENNE TYPU STRING V TP4
  252. ;    SOURCE        === JMENO PROMENNE TYPU STRING V TP4
  253. ;    SIZEOF(X)     === HODNOTA VRACENA SIZEOF
  254. ;    COUNT         === POCET ZNAKU PRO EXTRAKCI
  255. ;----------------------------------------------------------------------
  256. ; EFEKT TETO RUTINY JE JAKO KDYZ V TP NAPISETE;
  257. ;
  258. ;    STRING := COPY(STRING,1,COUNT);
  259. ;    DELETE(STRINGT,1,COUNT);
  260. ;
  261. ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BUDE
  262. ; DOSTATECNE DLOUHY.
  263. ;---------------------------------------------------------------------
  264. ECTARGET    EQU    DWORD PTR [BP+14]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  265. ECSOURCE    EQU    DWORD PTR [BP+10]    ;UKAZ NA SOURCE V ZASOBNIKU
  266. ECTRGLEN    EQU    WORD  PTR [BP+8]     ;POZICE VYSLEDNE DELKY V ZAS
  267. ECCOUNT     EQU    BYTE  PTR [BP+6]     ;POZICE COUNT V ZASOBNIKU
  268.  
  269. EXTRACTFORCOUNT    PROC   FAR
  270.             PUSH   BP                   ;ULOZ BASE POINTER
  271.             MOV    BP,SP                ;NASTAV ZASOBNIK
  272.             PUSH   DS                   ;ULOZ UKAZATEL NA DATA SEGMENT
  273. ;
  274. ; CTI ADRESU CILOVEHO RETEZCE A NASTAV DELKU NA NULA
  275. ;
  276.             LES    DI,ECTARGET          ;CTI ADRESU CILOVEHO RETEZCE
  277.             SUB    AL,AL                ;VYMAZ AL
  278.             STOSB                       ;NASTAV DELKU TARGET NA NULU
  279.             DEC    DI                   ;ULOZ DO DELKY BAJTU
  280. ;
  281. ; CTI ADRESU ZDROJOVEHO RETEZCE A OVER LENGTH A COUNT
  282. ;
  283. ECCHKSRC:
  284.             LDS    SI,ECSOURCE          ;CTI ADRESU ZDROJOVEHO RETEZCE
  285.             LODSB                       ;CTI DELKU ZDROJ.RETEZCE
  286.             CMP    AL,0                 ;Q. JE DELKA NULA
  287.             JE     ECEXIT               ;A. ANO--NEDELEJ NIC
  288. ;
  289. ; SOURCE_LEN NENI NULA...ALE JE TO => COUNT ?
  290. ;
  291.             MOV    AH,ECCOUNT           ;CTI EXTRACT COUNT
  292.             CMP    AL,AH                ;Q. SOURCE_LEN => COUNT
  293.             JAE    ECSETLEN             ;A. ANO--VSE V PORADKU
  294.             MOV    AH,AL                ;A. NE--COUNT = SOURCE_LEN
  295. ;
  296. ; SOURCE_LEN BYL < COUNT...NASTAV COUNT = SOURCE_LEN
  297. ;
  298. ECSETLEN:
  299.             MOV    CL,AH                ;PRENES KONECNOU DELKU DO CX
  300.             SUB    CH,CH                ;
  301.             MOV    BX,CX                ;ULOZ DELKU PRENOSU
  302. ;
  303. ; OVER ZDA JE TARGET DOSTATECNE DLOUHY
  304. ;
  305.             MOV    DX,EXTRGLEN          ;CTI MAX VELIKOST TARGET
  306.             DEC    DX                   ;NASTAV NA DELKU BAJTU
  307.             CMP    DX,CX                ;Q. TARGET JE DOST VELKY
  308.             JAE    ECMOVE               ;A. ANO--PROVED PRENOS
  309.             MOV    BX,DX                ;A. NE--TARGET_LEN = MOVE LEN
  310.             MOV    CX,DX                ;MOVE_LEN = TARGET_LEN
  311. ;
  312. ; TARGET BYL DOSTATECNE VELKY..NASTAV TARGET_LEN NA EXTRACTED_STRING_LEN
  313. ;
  314. ECMOVE:
  315.             MOV    AL,CL                ;PRENES KONECNOU DELKU DO AL
  316.             STOSB                       ;NASTAV DELKU TARGET NA NULU
  317. ;
  318. ; NYNI MUZEME PRENEST BAJTY ZE SOURCE DO TARGET
  319. ;
  320.             CLD                         ;NASTAV DOPREDNY SMER
  321.             REP    MOVSB                ;KPIRUJ ZE SOURCE DO TARGET
  322. ;
  323. ; NYNI MUSIME ODSTRANIT PRISLUSNE ZNAKY ZE ZDROJOVEHO RETEZCE
  324. ;
  325.             LES    DI,ECSOURCE          ;ZNOVU CTI ADRESU SOURCE
  326.             LDS    SI,ECSOURCE          ;A JESTE JEDNOU PRO PRENOS
  327.             LODSB                       ;AL = DELKA ZDROJOVEHO RETEZCE
  328.             SUB    AH,AH                ;VYMAZ VYSSI BAJT
  329.             MOV    CX,BX                ;OBNOV EXTRAHOVANOU DELKU
  330. ;
  331. ; NENI VYPOCTEME NOVOU DELKU ZDROJOVEHO RETEZCE A NASTAVIME ZDROJ.RETEZEC
  332. ;
  333.             ADD    SI,CX                ;OFFSET NA 1 BAJT NEPRENESTD
  334.             SUB    AX,CX                ;NEW_LEN = SRC_LEN - XTRCT_LEN
  335.             STOSB                       ;NASTAV SRC_LEN = NEW_LEN
  336.             JZ     ECEXIT               ;ODCHOD JESTLIZE CURR_LEN = 0
  337.             MOV    CX,AX                ;PRENES LENGTH = NEW_LENGTH
  338.             CLD                         ;NASTAV DOPREDNY SMER
  339.             REP    MOVSB                ;LEVE ZAROVNANI ZBYLEHO SOURCE
  340. ;
  341. ; VSECHNO HOTOVO OBNOVTENI PUVODNIHO STAVU A NAVRAT
  342. ;
  343. ECEXIT:
  344.             POP    DS                   ;OBNOV DATA SEGMENT
  345.             POP    BP                   ;OBNOV BASE POINTER
  346.             RET    8                    ;ODSTRANENI A NAVRAT
  347. EXTRACTFORCOUNT    ENDP
  348.  
  349.             PAGE
  350. ;----------------------------------------------------------------------
  351. ; PADLEFT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
  352. ;
  353. ;    STRING        === JMENO PROMENNE TYPU STRING V TP4
  354. ;    SIZEOF(X)     === HODNOTA VRACENA SIZEOF
  355. ;    TARGET_LEN    === POZADOVANA DELKA PO VYPLNENI
  356. ;    PAD_CHAR      === LIBOVOLNY PLATNY ZNAK
  357. ;----------------------------------------------------------------------
  358. ; EFEKT TETO RUTINY JE NASLEDOVNY;
  359. ;
  360. ;    STRING[I] := TRANSLATE_TABLE[ORD(STRING[I])];
  361. ;
  362. ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BYL
  363. ; DOSTATECNE VELKY.
  364. ;---------------------------------------------------------------------
  365. PLSTRING    EQU    DWORD PTR [BP+12]    ;UKAZ NA VYSLEDEK V ZASOBNIKU
  366. PLMAXLEN    EQU    WORD  PTR [BP+10]    ;POZICE MAX DELKY V ZASOBNIKU
  367. PLTRGLEN    EQU    WORD  PTR [BP+8]     ;POZICE POZADOVANE DELKY V ZAS
  368. PLCHAR      EQU    BYTE  PTR [BP+6]     ;POZICE VYPLNOVACIHO ZNAKU V ZAS
  369.  
  370. PADLEFT     PROC   FAR
  371.             PUSH   BP                   ;ULOZ BASE POINTER
  372.             MOV    BP,SP                ;NASTAV ZASOBNIK
  373.             PUSH   DS                   ;ULOZ UKAZATEL NA DATA SEGMENT
  374. ;
  375. ; VEZMI PARAMETRY
  376. ;
  377.             CLD                         ;SMER = DOPREDU
  378.             LDS    SI,PLSTRING          ;CTI ADRESU ZDROJOVEHO RETEZCE
  379.             LES    DI,PLSTRING          ;CTI UKAZ NA STRING
  380.             MOV    BX,PLMAXLEN          ;CTI MAX DELKU RETEZCE
  381.             MOV    CX,PLTRGLEN          ;CTI POZADOVANOU DELKU
  382.             MOV    AH,PLCHAR            ;CTI VYPLNOVACI ZNAK
  383. ;
  384. ;
  385.             DEC    BX                   ;DEKREMENTUJ DELKU
  386.             LODSB                       ;CTI AKTUALNI DELKU RETEZCE
  387.             SUB    AH,AH                ;VYMAZ VYSSI BAJT
  388.             CMP    AX,BX                ;Q. CUR_LEN => MAX_LEN
  389.             JAE    PLEXIT               ;A. ANO--ODCHOD
  390.             CMP    AX,CX                ;Q. CURR_LEN > DESIRED_LEN
  391.             JAE    PLEXIT               ;A. ANO--NENI CO DELAT
  392.             CMP    CX,BX                ;Q. DESIRED_LEN > MAX_LEN
  393.             JBE    PLSIZEOK             ;A. NE--DELKY JSOU V PORADKU
  394.             MOV    CX,BX                ;A. ANO--DESIRED_LEN = MAX_LEN
  395. PLSIZEOK:
  396.             SUB    CX,AX                ;PAD_LEN = DESIRED_LEN - CUR_LEN
  397.             MOV    BX,CX                ;ULOZ PAD_LEN DO BX
  398. ;
  399. ; VSE JE V PRADKU, TAK PRENESEME RETEZEC DOPRAVA, ABYCHOM UDELALI MISTO
  400. ;
  401.             MOV    SI,DI                ;SI = DI = PRVNI BAJT RETEZCE
  402.             ADD    DI,PLTRGLEN          ;DI ==> VYPOCTENY KONEC RETEZCE
  403.             ADD    SI,AX                ;SI ==> POSLEDNI DATOVY BAJT RETEZCE
  404.             MOV    CX,AX                ;PRENES BAJTY OLD_LEN
  405.             STD                         ;SMER = VZAD
  406.             REP    MOVSB                ;PRESUN RETEZEC DOPRAVA O 'N' BAJTU
  407. ;
  408. ; VYPLN NALEVO VYTVORENY PROSTOR
  409. ;
  410.             CLD                         ;SMER = VPRED
  411.             LES    DI,PLSTRING          ;CTI ZNOVU ADRESU RETEZCE
  412.             MOV    AX,PLTRGLEN          ;CTI DELKU PAD
  413.             STOSB                       ;NASTAV NOVOU DELKU RETEZCE
  414.             MOV    AL,PLCHAR            ;CTI VYPLNOVACI ZNAK
  415.             MOV    CX,BX                ;OBNOV PAD_LEN
  416.             CLD                         ;NASTAV DOPREDNY SMER
  417.             REP    STOSB                ;VYPLN RETEZEC
  418. ;
  419. ; VSE JE HOTOVO TAK OBNOV PUVODNI STAV A PROVED NAVRAT
  420. ;
  421. PLEXIT:
  422.             POP    DS                   ;OBNOV DATA SEGMENT
  423.             POP    BP                   ;OBNOV BASE POINTER
  424.             RET    8                    ;ODSTRANENI A NAVRAT
  425. PADLEFT     ENDP
  426.  
  427.             PAGE
  428. ;----------------------------------------------------------------------
  429. ; PADRIGHT(STRING,SIZEOF(TARGET),TARGET_LEN,PAD_CHAR);
  430. ;
  431. ;    STRING        === JMENO PROMENNE TYPU STRING V TP4
  432. ;    SIZEOF(X)     === HODNOTA VRACENA SIZEOF
  433. ;    TARGET_LEN    === POZADOVANA DELKA PO VYPLNENI
  434. ;    PAD_CHAR      === JAKYKOLI PLATNY ZNAK
  435. ;----------------------------------------------------------------------
  436. ; EFEKT TETO RUTINY JE NASLEDOVNY;
  437. ;
  438. ;    FOR I := 1 TO (TARGET_LEN - LENGTH(STRING)) DO
  439. ;      STRING := STRING + PAD_CHAR;
  440. ;
  441. ; JE NA UZIVATELI ABY ZAJISTIL ZE CILOVY RETEZEC BUDE
  442. ; DOSTATECNE VELKY.
  443. ;---------------------------------------------------------------------
  444. PRSTRING    EQU    DWORD PTR [BP+12]    ;POZICE UKAZ NA RETEZEC V ZAS.
  445. PRMAXLEN    EQU    WORD  PTR [BP+10]    ;POZICE MAX DELKY V ZASOBNIKU
  446. PRTRGLEN    EQU    WORD  PTR [BP+8]     ;POZICE POZADOVANE DELKY V ZAS
  447. PRCHAR      EQU    BYTE  PTR [BP+6]     ;POZICE VYPLN ZNAKU V ZASOBNIKU
  448.  
  449. PADRIGHT    PROC   FAR
  450.             PUSH   BP                   ;ULOZ BASE POINTER
  451.             MOV    BP,SP                ;NASTAV ZASOBNIK
  452.             PUSH   DS                   ;ULOZ UKAZATEL NA DATA SEGMENT
  453. ;PRDEBUG:    JMP    PRDEBUG
  454. ;
  455. ; VEZMI PARAMETRY
  456. ;
  457.             CLD                         ;SMER = VPRED
  458.             LDS    SI,PRSTRING          ;CTI ADRESU ZDROJOVEHO RETEZCE
  459.             LES    DI,PRSTRING          ;CTI UKAZ NA RETEZEC
  460.             MOV    BX,PRMAXLEN          ;CTI MAX DELKU RETEZCE
  461.             MOV    CX,PRTRGLEN          ;CTI POZADOVANOU DELKU
  462. ;
  463. ;
  464.             DEC    BX                   ;DEKREMENTUJ DELKU
  465.             LODSB                       ;CTI AKTUALNI DELKU RETEZCE
  466.             SUB    AH,AH                ;VYMAZ VYSSI BAJT
  467.             CMP    AX,BX                ;Q. CUR_LEN => MAX_LEN
  468.             JAE    PREXIT               ;A. ANO--ODCHOD
  469.             CMP    AX,CX                ;Q. CURR_LEN > DESIRED_LEN
  470.             JAE    PREXIT               ;A. ANO--NENI CO DELAT
  471.             CMP    CX,BX                ;Q. DESIRED_LEN > MAX_LEN
  472.             JBE    PRSIZEOK             ;A. NE--DELKY JSOU V PORADKU
  473.             MOV    CX,BX                ;A. ANO--DESIRED_LEN = MAX_LEN
  474. PRSIZEOK:
  475.             SUB    CX,AX                ;PAD_LEN = DESIRED_LEN - CUR_LEN
  476.             MOV    BX,CX                ;ULOZ PAD_LEN DO BX
  477. ;
  478. ; VYPLN PROSTOR NALEVO
  479. ;
  480.             CLD                         ;SMER = VPRED
  481.             LES    DI,PRSTRING          ;CTI ZNOVU ADRESU RETEZCE
  482.             INC    DI                   ;UKAZ NA PRVNI DATOVY BAJT
  483.             ADD    DI,AX                ;DI ==> PRVNI PRAZDNY BAJT
  484.             MOV    AL,PRCHAR            ;CTI VYPLNOVACI ZNAK
  485.             MOV    CX,BX                ;OBNOV PAD_LEN
  486.             CLD                         ;NASTAV DOPREDNY SMER
  487.             REP    STOSB                ;VYPLN RETEZEC
  488. ;
  489. ; NENI NASTAVIME NOVOU DELKU RETEZCE
  490. ;
  491.             LDS    SI,PRSTRING          ;CTI ADRESU RETEZCE
  492.             MOV    CL,[SI]              ;CTI CURR_LEN
  493.             SUB    CH,CH                ;VYMAZ VYSSI BAJT
  494.             ADD    CX,BX                ;NEW_LEN = CURR_LEN + PAD_LEN
  495.             MOV    [SI],CL              ;NASTAV NOVOU DELKU RETEZCE
  496. ;
  497. ; VSECHNO JE HOTOVO TAK OBNOVIME PUVODNI STAV A PROVEDEME NAVRAT
  498. ;
  499. PREXIT:
  500.             POP    DS                   ;OBNOV DATA SEGMENT
  501.             POP    BP                   ;OBNOV BASE POINTER
  502.             RET    8                    ;ODSTRANENI A NAVRAT
  503. PADRIGHT    ENDP
  504. CODE        ENDS
  505.             END
  506.