home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l040 / 13.ddi / RTLTV.ZIP / FORMAT.ASM < prev    next >
Encoding:
Assembly Source File  |  1992-10-28  |  2.4 KB  |  203 lines

  1.     TITLE    FORMAT
  2.  
  3.     LOCALS    @@
  4.  
  5. FORMAT_TEXT    SEGMENT    BYTE PUBLIC 'CODE'
  6.  
  7.     ASSUME    CS:FORMAT_TEXT,DS:NOTHING
  8.  
  9.     PUBLIC    FormatStr
  10.  
  11. ; function FormatStr(var Result: String; Format: String; var Params)
  12.  
  13. FormatStr:
  14.  
  15. Result        EQU    (DWORD PTR [BP+14])
  16. Format        EQU    (DWORD PTR [BP+10])
  17. Params        EQU    (DWORD PTR [BP+6])
  18. ParOfs        EQU    (WORD PTR [BP-2])
  19. Buffer        EQU    (BYTE PTR [BP-14])
  20.  
  21.     PUSH    BP
  22.     MOV    BP,SP
  23.     PUSH    WORD PTR Params
  24.     SUB    SP,12
  25.     PUSH    DS
  26.     LDS    SI,Format
  27.     LES    DI,Result
  28.     INC    DI
  29.     CLD
  30.     LODSB
  31.     XOR    AH,AH
  32.     XCHG    AX,CX
  33. @@1:    JCXZ    @@9
  34.     LODSB
  35.     DEC    CX
  36.     CMP    AL,'%'
  37.     JE    @@3
  38. @@2:    STOSB
  39.     JMP    @@1
  40. @@3:    JCXZ    @@9
  41.     LODSB
  42.     DEC    CX
  43.     CMP    AL,'%'
  44.     JE    @@2
  45.     MOV    BX,' '
  46.     XOR    DX,DX
  47.     CMP    AL,'0'
  48.     JNE    @@4
  49.     MOV    BL,AL
  50. @@4:    CMP    AL,'-'
  51.     JNE    @@5
  52.     INC    BH
  53.     JCXZ    @@9
  54.     LODSB
  55.     DEC    CX
  56. @@5:    CMP    AL,'0'
  57.     JB    @@6
  58.     CMP    AL,'9'
  59.     JA    @@6
  60.     SUB    AL,'0'
  61.     XCHG    AX,DX
  62.     MOV    AH,10
  63.     MUL    AH
  64.     ADD    AL,DL
  65.     XCHG    AX,DX
  66.     JCXZ    @@9
  67.     LODSB
  68.     DEC    CX
  69.     JMP    @@5
  70. @@6:    CMP    AL,'#'
  71.     JNE    @@10
  72.     SHL    DX,1
  73.     SHL    DX,1
  74.     ADD    DX,ParOfs
  75.     MOV    WORD PTR Params,DX
  76.     JMP    @@1
  77. @@9:    XCHG    AX,DI
  78.     LES    DI,Result
  79.     SUB    AX,DI
  80.     DEC    AX
  81.     STOSB
  82.     POP    DS
  83.     MOV    SP,BP
  84.     POP    BP
  85.     RETF    12
  86. @@10:    PUSH    DS
  87.     PUSH    SI
  88.     PUSH    CX
  89.     PUSH    DX
  90.     PUSH    BX
  91.     CALL    Convert
  92.     POP    BX
  93.     POP    DX
  94.     OR    DX,DX
  95.     JE    @@12
  96.     SUB    DX,CX
  97.     JAE    @@12
  98.     OR    BH,BH
  99.     JNE    @@11
  100.     SUB    SI,DX
  101. @@11:    ADD    CX,DX
  102.     XOR    DX,DX
  103. @@12:    OR    BH,BH
  104.     JE    @@13
  105.     REP    MOVSB
  106. @@13:    XCHG    CX,DX
  107.     MOV    AL,BL
  108.     REP    STOSB
  109.     XCHG    CX,DX
  110.     REP    MOVSB
  111.     POP    CX
  112.     POP    SI
  113.     POP    DS
  114.     JMP    @@1
  115.  
  116. ; Convert next parameter to string
  117. ; In    AL    = Conversion character
  118. ; Out    DS:SI = Pointer to string
  119. ;    CX    = String length
  120.  
  121. Convert:
  122.  
  123.     XCHG    AX,DX
  124.     LDS    SI,Params
  125.     LODSW
  126.     XCHG    AX,BX
  127.     LODSW
  128.     XCHG    AX,BX
  129.     MOV    WORD PTR Params,SI
  130.     XOR    CX,CX
  131.     LEA    SI,Buffer[12]
  132.     PUSH    SS
  133.     POP    DS
  134.     AND    DL,0DFH
  135.     CMP    DL,'C'
  136.     JE    ConvertChar
  137.     CMP    DL,'S'
  138.     JE    ConvertStr
  139.     CMP    DL,'D'
  140.     JE    ConvertDec
  141.     CMP    DL,'X'
  142.     JE    ConvertHex
  143.     RET
  144.  
  145. ConvertStr:
  146.  
  147.     MOV    DX,AX
  148.     OR    DX,BX
  149.     JE    @@1
  150.     MOV    SI,AX
  151.     MOV    DS,BX
  152.     LODSB
  153.     MOV    CL,AL
  154. @@1:    RET
  155.  
  156. ConvertHex:
  157.  
  158.     MOV    CL,16
  159.     JMP    SHORT ConvertNum
  160.  
  161. ConvertDec:
  162.  
  163.     MOV    CL,10
  164.     OR    BX,BX
  165.     JNS    ConvertNum
  166.     NEG    BX
  167.     NEG    AX
  168.     SBB    BX,0
  169.     CALL    ConvertNum
  170.     MOV    AL,'-'
  171.  
  172. ConvertChar:
  173.  
  174.     INC    CX
  175.     DEC    SI
  176.     MOV    [SI],AL
  177.     RET
  178.  
  179. ConvertNum:
  180.  
  181.     PUSH    SI
  182. @@1:    XOR    DX,DX
  183.     XCHG    AX,BX
  184.     DIV    CX
  185.     XCHG    AX,BX
  186.     DIV    CX
  187.     ADD    DL,'0'
  188.     CMP    DL,'0'+10
  189.     JB    @@2
  190.     ADD    DL,'A'-'0'-10
  191. @@2:    DEC    SI
  192.     MOV    [SI],DL
  193.     MOV    DX,AX
  194.     OR    DX,BX
  195.     JNE    @@1
  196.     POP    CX
  197.     SUB    CX,SI
  198.     RET
  199.  
  200. FORMAT_TEXT    ENDS
  201.  
  202.     END
  203.