home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / WRITESTR.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  5KB  |  351 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996 Borland International    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.     INCLUDE    FILEIO.ASM
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    Output:DWORD, _RewritText:NEAR, _Flush:NEAR, SetInOutRes:NEAR
  17.         EXTRN   _GetTLS:NEAR, InOutRes:DWORD
  18.     PUBLIC    _WriteString, _Write0String, _WriteBytes, _WriteSpaces
  19.     PUBLIC    _WriteCString, _Write0CString, _WriteChar, _Write0Char, _WriteLn
  20.  
  21.     .CODE
  22.  
  23. ;    PROCEDURE _WriteBytes( VAR t: Text; VAR b; cnt : Longint );
  24.  
  25. _WriteBytes PROC
  26.  
  27. ; ->    EAX    Pointer to file record
  28. ;    EDX    Pointer to buffer
  29. ;    ECX    Number of bytes to write
  30. ; <-    EAX    Pointer to file record
  31.  
  32.     PUSH    ESI
  33.     PUSH    EDI
  34.  
  35.     MOV    ESI,EDX
  36.  
  37.     CMP    [EAX].Mode,fmOutput
  38.     JNE    @@fileNotOutput
  39.  
  40. @@loop:
  41.     MOV    EDI,[EAX].BufPtr
  42.     ADD    EDI,[EAX].BufPos
  43.  
  44. ;    remainingBytes = t.bufSize - t.bufPos
  45.  
  46.     MOV    EDX,[EAX].BufSize
  47.     SUB    EDX,[EAX].BufPos
  48.  
  49. ;    if (remainingBytes <= cnt)
  50.  
  51.     CMP    EDX,ECX
  52.     JG    @@1
  53.  
  54. ;    t.BufPos += remainingBytes, cnt -= remainingBytes
  55.  
  56.     ADD    [EAX].BufPos,EDX
  57.     SUB    ECX,EDX
  58.  
  59. ;    copy remainingBytes, advancing ESI
  60.  
  61.     PUSH    EAX
  62.     PUSH    ECX
  63.     MOV    ECX,EDX
  64.     REP    MOVSB
  65.  
  66.     CALL    [EAX].InOutFunc
  67.     TEST    EAX,EAX
  68.     JNZ    @@error
  69.  
  70.     POP    ECX
  71.     POP    EAX
  72.     JMP    @@loop
  73.  
  74. @@1:
  75.     ADD    [EAX].BufPos,ECX
  76.     REP    MOVSB
  77. @@exit:
  78.     POP    EDI
  79.     POP    ESI
  80.     RET
  81.  
  82. @@fileNotOutput:
  83.     CMP    EAX,offset Output
  84.     JNE    @@fileNotOutputError
  85.     PUSH    ECX
  86.     PUSH    EDX
  87.     PUSH    EAX
  88.     CALL    _RewritText
  89.     POP    EAX
  90.     POP    EDX
  91.     POP    ECX
  92.     CMP    [EAX].Mode,fmOutput
  93.     JE    @@loop
  94.  
  95. @@fileNotOutputError:
  96.     MOV    EAX,105
  97.         CALL    SetInOutRes
  98.     JMP    @@exit
  99.  
  100. @@error:
  101.         CALL    SetInOutRes
  102.     POP    ECX
  103.     POP    EAX
  104.     JMP    @@exit
  105.  
  106. _WriteBytes ENDP
  107.  
  108.  
  109.     .DATA
  110. spCnt    EQU    64
  111. spBuf    DB    spCnt DUP (' ')
  112.     .CODE
  113.  
  114. ;    PROCEDURE _WriteSpaces( VAR t: Text; cnt: Longint );
  115.  
  116. _WriteSpaces PROC
  117.  
  118. ; ->    EAX    Pointer to text record
  119. ;    EDX    Number of spaces (<= 0: None)
  120.  
  121.     MOV    ECX,EDX
  122. @loop:
  123.     MOV    EDX,offset spBuf
  124.  
  125.     CMP    ECX,spCnt
  126.     JLE    @@1
  127.  
  128.     SUB    ECX,spCnt
  129.     PUSH    EAX
  130.     PUSH    ECX
  131.     MOV    ECX,spCnt
  132.     CALL    _WriteBytes
  133.         CALL    _GetTLS
  134.     CMP    [EAX].InOutRes,0
  135.     JNE    @@error
  136.     POP    ECX
  137.     POP    EAX
  138.     JMP    @loop
  139.  
  140. @@1:
  141.     TEST    ECX,ECX
  142.     JG    _WriteBytes
  143.  
  144.     RET
  145.  
  146. @@error:
  147.     POP    ECX
  148.     POP    EAX
  149.     RET
  150.  
  151. _WriteSpaces ENDP
  152.  
  153.  
  154. ;    PROCEDURE _Write0String( VAR t: Text; s: String );
  155.  
  156. _Write0String PROC
  157.  
  158. ; ->    EAX    Pointer to text record
  159. ;    EDX    Pointer to string
  160.  
  161.     XOR    ECX,ECX
  162.     MOV    CL,[EDX]
  163.     INC    EDX
  164.     JMP    _WriteBytes
  165.  
  166. _Write0String ENDP
  167.  
  168.  
  169. ;    PROCEDURE _WriteString( VAR t: Text; s: String; width: Longint );
  170.  
  171. _WriteString PROC
  172.  
  173. ; ->    EAX    Pointer to text record
  174. ;    EDX    Pointer to string
  175. ;    ECX    Field width
  176.  
  177.     PUSH    EBX
  178.  
  179.     XOR    EBX,EBX
  180.     MOV    BL,[EDX]
  181.     SUB    ECX,EBX
  182.     JLE    @@1
  183.  
  184.     PUSH    EAX
  185.     PUSH    EDX
  186.  
  187.     MOV    EDX,ECX
  188.     CALL    _WriteSpaces
  189.  
  190.     POP    EDX
  191.     POP    EAX
  192. @@1:
  193.     MOV    ECX,EBX
  194.     POP    EBX
  195.     INC    EDX
  196.     JMP    _WriteBytes
  197.  
  198. _WriteString ENDP
  199.  
  200.     .DATA
  201. crlf    DB    0DH,0AH
  202.     .CODE
  203.  
  204. ;    PROCEDURE _WriteLn( VAR t: Text );
  205.  
  206. _WriteLn PROC
  207.  
  208. ; ->    EAX    Pointer to text record
  209.  
  210.     MOV    EDX,offset crlf
  211.     MOV    ECX,2
  212.     CALL    _WriteBytes
  213.     JMP    _Flush
  214.  
  215. _WriteLn ENDP
  216.  
  217. ;    PROCEDURE _Write0Char( VAR t: Text; c: Char );
  218.  
  219. _Write0Char PROC
  220.  
  221. ; ->    EAX    Pointer to text record
  222. ;    DL    Character
  223.  
  224.     CMP    [EAX].Mode,fmOutput
  225.     JNE    @@fileNotOutput
  226. @@loop:
  227.     MOV    ECX,[EAX].BufPos
  228.     CMP    ECX,[EAX].BufSize
  229.     JGE    @@flush
  230.  
  231.     ADD    ECX,[EAX].BufPtr
  232.     MOV    [ECX],DL
  233.  
  234.     INC    [EAX].BufPos
  235.  
  236.     RET
  237.  
  238. @@flush:
  239.     PUSH    EAX
  240.     PUSH    EDX
  241.     CALL    [EAX].InOutFunc
  242.     TEST    EAX,EAX
  243.     JNZ    @@error
  244.     POP    EDX
  245.     POP    EAX
  246.     JMP    @@loop
  247.  
  248. @@fileNotOutput:
  249.     CMP    EAX,offset Output
  250.     JNE    @@fileNotOutputError
  251.     PUSH    EDX
  252.     PUSH    EAX
  253.     CALL    _RewritText
  254.     POP    EAX
  255.     POP    EDX
  256.     CMP    [EAX].Mode,fmOutput
  257.     JE    @@loop
  258.  
  259. @@fileNotOutputError:
  260.     MOV    EAX,105
  261.         JMP    SetInOutRes
  262.  
  263. @@error:
  264.         CALL    SetInOutRes
  265.     POP    EDX
  266.     POP    EAX
  267.     RET
  268.  
  269. _Write0Char ENDP
  270.  
  271.  
  272. ;    PROCEDURE _WriteChar( VAR t: Text; c: Char; width: Integer );
  273.  
  274. _WriteChar PROC
  275.  
  276. ; ->    EAX    Pointer to text record
  277. ;    DL    Character
  278. ;    ECX    Field width
  279.  
  280.     PUSH    EDX
  281.  
  282.     LEA    EDX,[ECX-1]
  283.     CALL    _WriteSpaces
  284.  
  285.     MOV    EDX,ESP
  286.     MOV    ECX,1
  287.     CALL    _WriteBytes
  288.  
  289.     POP    EDX
  290.  
  291.     RET
  292.  
  293. _WriteChar ENDP
  294.  
  295.  
  296. ;    PROCEDURE _Write0CString( VAR t: Text; s: PChar );
  297.  
  298. _Write0CString PROC
  299.  
  300. ; ->    EAX    Pointer to text record
  301. ;    EDX    Pointer to string
  302.  
  303.     XOR    ECX,ECX
  304.     JMP    _WriteCString
  305.  
  306. _Write0CString ENDP
  307.  
  308. ;    PROCEDURE _WriteCString( VAR t: Text; s: PChar; width: Longint );
  309.  
  310. _WriteCString PROC
  311.  
  312. ; ->    EAX    Pointer to text record
  313. ;    EDX    Pointer to string
  314. ;    ECX    Field width
  315.  
  316.     PUSH    ESI
  317.     PUSH    EDI
  318.  
  319.     MOV    ESI,EAX
  320.     PUSH    ECX
  321.  
  322.     MOV    EDI,EDX
  323.     OR    ECX,-1
  324.     MOV    AL,0
  325.     REPNE    SCASB
  326.     NOT    ECX
  327.     DEC    ECX
  328.  
  329.     MOV    EDI,EDX
  330.  
  331.     POP    EDX
  332.  
  333.  
  334.     SUB    EDX,ECX
  335.     MOV    EAX,ESI
  336.     PUSH    ECX
  337.     CALL    _WriteSpaces
  338.     POP    ECX
  339.  
  340.     MOV    EAX,ESI
  341.     MOV    EDX,EDI
  342.  
  343.     POP    EDI
  344.     POP    ESI
  345.     JMP    _WriteBytes
  346.  
  347. _WriteCString ENDP
  348.  
  349.     END
  350.  
  351.