home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / STRH.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  5KB  |  365 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Runtime Library                    *
  5. ; *    String Support Routines                *
  6. ; *                            *
  7. ; *    Copyright (C) 1988,90 Borland International    *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    STRH
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CODE    SEGMENT    BYTE PUBLIC
  16.  
  17.     ASSUME    CS:CODE
  18.  
  19. ; Publics
  20.  
  21.     PUBLIC    SLoad,SStore,SCopy,SConcat,SPos,SCompare
  22.     PUBLIC    SChar,SPacked,SInsert,SDelete
  23.  
  24. ; Load string
  25. ; In    [SP+4] = Destination pointer
  26. ;    [SP]   = Source pointer
  27. ; Out    SP     = SP+4
  28.  
  29. SLoad:
  30.  
  31.     CLD
  32.     MOV    BX,SP
  33.     MOV    DX,DS
  34.     LES    DI,SS:[BX+8]
  35.     LDS    SI,SS:[BX+4]
  36.     LODSB
  37.     STOSB
  38.     MOV    CL,AL
  39.     XOR    CH,CH
  40.     REP    MOVSB
  41.     MOV    DS,DX
  42.     RETF    4
  43.  
  44. ; Store string
  45. ; In    [SP+6] = Source pointer
  46. ;    [SP+2] = Destination pointer
  47. ;    [SP]   = Maximum length
  48. ; Out    SP     = SP+10
  49.  
  50. SStore:
  51.  
  52.     CLD
  53.     MOV    BX,SP
  54.     MOV    DX,DS
  55.     LDS    SI,SS:[BX+10]
  56.     LES    DI,SS:[BX+6]
  57.     MOV    CX,SS:[BX+4]
  58.     LODSB
  59.     CMP    AL,CL
  60.     JBE    @@1
  61.     MOV    AL,CL
  62. @@1:    STOSB
  63.     MOV    CL,AL
  64.     XOR    CH,CH
  65.     REP    MOVSB
  66.     MOV    DS,DX
  67.     RETF    10
  68.  
  69. ; Copy standard function
  70. ; In    [SP+8] = Destination pointer
  71. ;    [SP+4] = Source pointer
  72. ;    [SP+2] = Index
  73. ;    [SP]   = Length
  74. ; Out    SP     = SP+8
  75.  
  76. SCopy:
  77.  
  78.     CLD
  79.     MOV    BX,SP
  80.     MOV    DX,DS
  81.     LES    DI,SS:[BX+12]
  82.     LDS    SI,SS:[BX+8]
  83.     MOV    AL,[SI]
  84.     XOR    AH,AH
  85.     MOV    CX,SS:[BX+6]
  86.     OR    CX,CX
  87.     JG    @@1
  88.     MOV    CX,1
  89. @@1:    ADD    SI,CX
  90.     SUB    AX,CX
  91.     JB    @@3
  92.     INC    AX
  93.     MOV    CX,SS:[BX+4]
  94.     OR    CX,CX
  95.     JGE    @@2
  96.     XOR    CX,CX
  97. @@2:    CMP    AX,CX
  98.     JBE    @@4
  99.     MOV    AX,CX
  100.     JMP    SHORT @@4
  101. @@3:    XOR    AX,AX
  102. @@4:    STOSB
  103.     MOV    CX,AX
  104.     REP    MOVSB
  105.     MOV    DS,DX
  106.     RETF    8
  107.  
  108. ; Concat standard function
  109. ; In    [SP+4] = Destination pointer
  110. ;    [SP]   = Source pointer
  111. ; Out    SP     = SP+4
  112.  
  113. SConcat:
  114.  
  115.     CLD
  116.     MOV    BX,SP
  117.     MOV    DX,DS
  118.     LES    DI,SS:[BX+8]
  119.     LDS    SI,SS:[BX+4]
  120.     MOV    CL,ES:[DI]
  121.     XOR    CH,CH
  122.     LODSB
  123.     ADD    ES:[DI],AL
  124.     JNC    @@1
  125.     MOV    BYTE PTR ES:[DI],255
  126.     MOV    AL,CL
  127.     NOT    AL
  128. @@1:    ADD    DI,CX
  129.     INC    DI
  130.     MOV    CL,AL
  131.     REP    MOVSB
  132.     MOV    DS,DX
  133.     RETF    4
  134.  
  135. ; Pos standard function
  136. ; In    [SP+4] = Source pointer
  137. ;    [SP]   = Destination pointer
  138. ; Out    AX     = Position
  139. ;    SP     = SP+8
  140.  
  141. SPos:
  142.  
  143.     ARG    SourceP,DWORD,1
  144.     ARG    DestP,DWORD,1
  145.  
  146.     ENTRY    FAR
  147.     PUSH    DS
  148.     LDS    SI,SourceP
  149.     CLD
  150.     LODSB
  151.     OR    AL,AL
  152.     JE    @@2
  153.     MOV    DL,AL
  154.     XOR    DH,DH
  155.     LES    DI,DestP
  156.     MOV    CL,ES:[DI]
  157.     XOR    CH,CH
  158.     SUB    CX,DX
  159.     JB    @@2
  160.     INC    CX
  161.     INC    DI
  162. @@1:    LODSB
  163.     REPNE    SCASB
  164.     JNE    @@2
  165.     MOV    AX,DI
  166.     MOV    BX,CX
  167.     MOV    CX,DX
  168.     DEC    CX
  169.     REPE    CMPSB
  170.     JE    @@3
  171.     MOV    DI,AX
  172.     MOV    CX,BX
  173.     MOV    SI,SourceP.ofs
  174.     INC    SI
  175.     JMP    @@1
  176. @@2:    XOR    AX,AX
  177.     JMP    SHORT @@4
  178. @@3:    DEC    AX
  179.     SUB    AX,DestP.ofs
  180. @@4:    POP    DS
  181.     EXIT
  182.  
  183. ; String compare
  184. ; In    [SP+4] = Source pointer
  185. ;    [SP]   = Destination pointer
  186. ; Out    ZF     = 1 if Source = Dest
  187. ;    CF     = 1 if Source < Dest
  188. ;    SP     = SP+8
  189.  
  190. SCompare:
  191.  
  192.     CLD
  193.     MOV    BX,SP
  194.     MOV    DX,DS
  195.     LDS    SI,SS:[BX+8]
  196.     LES    DI,SS:[BX+4]
  197.     LODSB
  198.     MOV    AH,ES:[DI]
  199.     INC    DI
  200.     MOV    CL,AL
  201.     CMP    CL,AH
  202.     JBE    @@1
  203.     MOV    CL,AH
  204. @@1:    OR    CL,CL
  205.     JE    @@2
  206.     XOR    CH,CH
  207.     REP    CMPSB
  208.     JNE    @@3
  209. @@2:    CMP    AL,AH
  210. @@3:    MOV    DS,DX
  211.     RETF    8
  212.  
  213. ; Convert character to string
  214. ; In    [SP+2] = Destination pointer
  215. ;    [SP]   = Character
  216. ; Out    SP     = SP+2
  217.  
  218. SChar:
  219.  
  220.     CLD
  221.     MOV    BX,SP
  222.     LES    DI,SS:[BX+6]
  223.     MOV    AL,1
  224.     STOSB
  225.     MOV    AL,SS:[BX+4]
  226.     STOSB
  227.     RETF    2
  228.  
  229. ; Convert packed string to string
  230. ; In    [SP+6] = Destination pointer
  231. ;    [SP+2] = Source pointer
  232. ;    [SP]   = Length
  233. ; Out    SP     = SP+6
  234.  
  235. SPacked:
  236.  
  237.     CLD
  238.     MOV    BX,SP
  239.     MOV    DX,DS
  240.     LES    DI,SS:[BX+10]
  241.     LDS    SI,SS:[BX+6]
  242.     MOV    AX,SS:[BX+4]
  243.     STOSB
  244.     MOV    CX,AX
  245.     REP    MOVSB
  246.     MOV    DS,DX
  247.     RETF    6
  248.  
  249. ; Insert standard procedure
  250. ; Insert(S,D,I) = Copy(D,1,I-1) + S + Copy(D,I,255)
  251.  
  252. SInsert:
  253.  
  254.     ARG    SourceP,DWORD,1
  255.     ARG    DestP,DWORD,1
  256.     ARG    DestLen,WORD,1
  257.     ARG    Index,WORD,1
  258.     LOC    Temp1,BYTE,256
  259.     LOC    Temp2,BYTE,256
  260.  
  261.     ENTRY    FAR
  262.     CMP    Index,1
  263.     JGE    @@1
  264.     MOV    Index,1
  265. @@1:    LEA    DI,Temp1
  266.     PUSH    SS
  267.     PUSH    DI
  268.     LES    DI,DestP
  269.     PUSH    ES
  270.     PUSH    DI
  271.     MOV    AX,1
  272.     PUSH    AX
  273.     MOV    AX,Index
  274.     DEC    AX
  275.     PUSH    AX
  276.     PUSH    CS
  277.     CALL    SCopy
  278.     LES    DI,SourceP
  279.     PUSH    ES
  280.     PUSH    DI
  281.     PUSH    CS
  282.     CALL    SConcat
  283.     LEA    DI,Temp2
  284.     PUSH    SS
  285.     PUSH    DI
  286.     LES    DI,DestP
  287.     PUSH    ES
  288.     PUSH    DI
  289.     PUSH    Index
  290.     MOV    AX,255
  291.     PUSH    AX
  292.     PUSH    CS
  293.     CALL    SCopy
  294.     PUSH    CS
  295.     CALL    SConcat
  296.     LES    DI,DestP
  297.     PUSH    ES
  298.     PUSH    DI
  299.     PUSH    DestLen
  300.     PUSH    CS
  301.     CALL    SStore
  302.     EXIT
  303.  
  304. ; Delete standard procedure
  305. ; Delete(S,I,N) = Copy(S,1,I-1) + Copy(S,I+N,255)
  306.  
  307. SDelete:
  308.  
  309.     ARG    StrP,DWORD,1
  310.     ARG    Index,WORD,1
  311.     ARG    Count,WORD,1
  312.     LOC    Temp1,BYTE,256
  313.     LOC    Temp2,BYTE,256
  314.  
  315.     ENTRY    FAR
  316.     CMP    Count,0
  317.     JLE    @@2
  318.     CMP    Index,0
  319.     JLE    @@2
  320.     CMP    Index,255
  321.     JG    @@2
  322.     CMP    Count,255
  323.     JLE    @@1
  324.     MOV    Count,255
  325. @@1:    LEA    DI,Temp1
  326.     PUSH    SS
  327.     PUSH    DI
  328.     LES    DI,StrP
  329.     PUSH    ES
  330.     PUSH    DI
  331.     MOV    AX,1
  332.     PUSH    AX
  333.     MOV    AX,Index
  334.     DEC    AX
  335.     PUSH    AX
  336.     PUSH    CS
  337.     CALL    SCopy
  338.     LEA    DI,Temp2
  339.     PUSH    SS
  340.     PUSH    DI
  341.     LES    DI,StrP
  342.     PUSH    ES
  343.     PUSH    DI
  344.     MOV    AX,Index
  345.     ADD    AX,Count
  346.     PUSH    AX
  347.     MOV    AX,255
  348.     PUSH    AX
  349.     PUSH    CS
  350.     CALL    SCopy
  351.     PUSH    CS
  352.     CALL    SConcat
  353.     LES    DI,StrP
  354.     PUSH    ES
  355.     PUSH    DI
  356.     MOV    AX,255
  357.     PUSH    AX
  358.     PUSH    CS
  359.     CALL    SStore
  360. @@2:    EXIT
  361.  
  362. CODE    ENDS
  363.  
  364.     END
  365.