home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TP_ADV.ZIP / LIST0420.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-07-31  |  3.8 KB  |  196 lines

  1.           INCLUDE MACROS.ASM
  2.  
  3.  
  4. CODE      SEGMENT BYTE PUBLIC
  5.           ASSUME CS:CODE
  6.  
  7.           PUBLIC ParseWord
  8.  
  9.  
  10. R_N_FunctionRes  EQU DWORD PTR [BP+0Ah]
  11. R_N_S            EQU DWORD PTR [BP+06h]
  12. R_N_Number       EQU [BP+04h]
  13.  
  14. RightStr_N       PROC NEAR
  15.        StandEntry
  16.        MOV       DX,DS
  17.  
  18.        StringOps R_N_S,R_N_FunctionRes,FORWARD
  19.  
  20.        MOV       CX,R_N_Number    ; Number to
  21.        XOR       CH,CH
  22.        JCXZ      R_N_ReturnNullStr
  23.  
  24.        LODSB
  25.        CMP       AL,CL
  26.        JB        R_N_ReturnNullStr
  27.  
  28.        SUB       AL,CL           ; adjust CL accordingly
  29.  
  30.        XOR       AH,AH
  31.        MOV       BX,CX
  32.        DEC       BX
  33.  
  34.        ADD       SI,BX
  35.  
  36.        INC       AL
  37.  
  38.        MOV       CL,AL           ; copy length to CL
  39.  
  40.        STOSB                     ; store length of result
  41.  
  42.        REP       MOVSB           ; copy CL chars
  43.        JMP       SHORT R_N_ExitCode
  44.                                  ; all done
  45.  
  46. R_N_ReturnNullStr:
  47.        XOR       AL,AL
  48.        STOSB
  49.  
  50. R_N_ExitCode:
  51.        MOV       DS,DX
  52.        StandExit 06h
  53. RightStr_N       ENDP
  54.  
  55.  
  56. L_N_FunctionRes  EQU DWORD PTR [BP+08h]
  57. L_N_S            EQU DWORD PTR [BP+04h]
  58. L_N_Number       EQU [BP+02h]
  59.  
  60.  
  61. LeftStr_N        PROC NEAR
  62.        MOV       DX,BP           ; save BP in DX
  63.        MOV       BP,SP           ; stack frame with BP
  64.        MOV       BX,DS
  65.  
  66.        StringOps L_N_S,L_N_FunctionRes,FORWARD
  67.  
  68.        MOV       CX,L_N_Number       ; Number to
  69.        XOR       CH,CH
  70.  
  71.        LODSB                     ; length of _S in AL
  72.        CMP       AL,CL           ; check to see if length of _S
  73.        JAE       StrOK           ; >= length of number
  74.        MOV       CL,AL           ; no, so adjust number
  75.  
  76. StrOK:
  77.  
  78.        MOV       AL,CL           ; put adjusted length in AL
  79.  
  80.        STOSB                     ; copy it to FunctionRes
  81.  
  82.        JCXZ      L_N_ExitCode    ; if length is 0 then all done
  83.  
  84.        REP       MOVSB           ; copy Number chars
  85.  
  86. L_N_ExitCode:
  87.        MOV       DS,BX
  88.        MOV       BP,DX
  89.        RET       06h
  90. LeftStr_N        ENDP
  91.  
  92. ;function ParseWord(var _S : String; DelimChar : Char) : String;
  93.  
  94. FunctionRes      EQU DWORD PTR [BP+0Eh]
  95. _S               EQU DWORD PTR [BP+0Ah]
  96. DelimChar        EQU [BP+08h]
  97. TempStr          EQU [BP-100h]
  98.  
  99. ParseWord        PROC FAR
  100.        PUSH      BP
  101.        PUSH      DS
  102.        MOV       BP,SP
  103.        LocalVar  100h
  104.  
  105.        CLD
  106.  
  107.        LDS       SI,_S
  108.  
  109.        LODSB
  110.        OR        AL,AL
  111.        JZ        ReturnNullStr
  112.  
  113.        MOV       BL,AL
  114.  
  115.        MOV       CL,AL
  116.        XOR       CH,CH
  117.  
  118.  
  119.        LES       DI,_S
  120.        MOV       AL,DelimChar
  121.        INC       DI
  122.  
  123.        REPNE     SCASB
  124.        JNZ       ReturnWholeStr
  125.  
  126.        XOR       BH,BH
  127.        SUB       BL,CL
  128.  
  129.        PUSH      BX
  130.  
  131.        DEC       BX
  132.  
  133.        PushPtr   FunctionRes
  134.        PushPtr   _S
  135.  
  136.        PUSH      BX
  137.  
  138.        CALL      LeftStr_N
  139.        POP       AX
  140.        POP       AX
  141.  
  142.        POP       BX
  143.        INC       BX
  144.  
  145.        PushSPtr  TempStr
  146.        PushPtr   _S
  147.  
  148.        PUSH      BX
  149.  
  150.        CALL      RightStr_N
  151.        POP       AX
  152.        POP       AX
  153.  
  154.        CLD
  155.        MOV       AX,SS
  156.        MOV       DS,AX
  157.        LEA       SI,TempStr
  158.        LES       DI,_S
  159.  
  160.        LODSB
  161.        MOV       CL,AL
  162.        XOR       CH,CH
  163.        STOSB
  164.  
  165.        REP       MOVSB
  166.  
  167.        JMP       SHORT ExitCode
  168.  
  169. ReturnWholeStr:
  170.        StringOps _S,FunctionRes,FORWARD
  171.        LODSB
  172.        MOV       CL,AL
  173.        XOR       CH,CH
  174.        STOSB
  175.        REP       MOVSB
  176.  
  177.        LES       DI,_S
  178.        XOR       AL,AL
  179.        STOSB
  180.        JMP       SHORT ExitCode
  181.  
  182. ReturnNullStr:
  183.        LES       DI,FunctionRes
  184.        STOSB
  185.  
  186. ExitCode:
  187.        UndoLocals
  188.        POP       DS
  189.        StandExit 06h
  190. ParseWord        ENDP
  191.  
  192.  
  193. CODE   ENDS
  194.  
  195.        END
  196.