home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / Runimage / Delphi50 / Source / Rtl / Sys / ASSIGN.ASM < prev    next >
Encoding:
Assembly Source File  |  1999-08-11  |  7.1 KB  |  449 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Delphi Runtime Library                          *
  5. ; *                            *
  6. ; *    Copyright (c) 1996,98 Inprise Corporation    *
  7. ; *                            *
  8. ; *******************************************************
  9.  
  10.     INCLUDE    SE.ASM
  11.     INCLUDE    FILEIO.ASM
  12.  
  13.     .386
  14.     .MODEL    FLAT
  15.  
  16.     EXTRN    CreateFileA:NEAR, ReadFile:NEAR, WriteFile:NEAR
  17.     EXTRN    CloseHandle:NEAR, GetStdHandle:NEAR, GetLastError:NEAR
  18.     EXTRN    SetFilePointer:NEAR, GetFileSize:NEAR, SetEndOfFile:NEAR
  19.     EXTRN    GetFileType:NEAR, SetInOutRes:NEAR
  20.     PUBLIC    _Assign, __Flush, _Flush
  21.  
  22.     .CODE
  23.  
  24. ;    FUNCTION TextIn( VAR t: Text ) : Integer;
  25.  
  26. TextIn    PROC
  27.  
  28. ; ->    EAX    Pointer to text record
  29.  
  30. ;    Make buffer empty
  31.  
  32.     XOR    EDX,EDX
  33.     MOV    [EAX].BufEnd,EDX
  34.     MOV    [EAX].BufPos,EDX
  35.  
  36. ;    ReadFile(t.Handle, t.BufPtr, t.BufSize, @t.BufEnd, Nil);
  37.  
  38.     PUSH    EDX            ; pass lpOverLapped
  39.     LEA    EDX,[EAX].BufEnd    ; pass lpNumberOfBytesRead
  40.     PUSH    EDX
  41.     PUSH    [EAX].BufSize        ; pass nNumberOfBytestoRead
  42.     PUSH    [EAX].BufPtr        ; pass lpBuffer
  43.     PUSH    [EAX].Handle        ; pass hFile
  44.     CALL    ReadFile
  45.     TEST    EAX,EAX            ; result FALSE means error
  46.     JZ    @@error
  47. @@noerror:
  48.     XOR    EAX,EAX
  49.  
  50.     RET
  51.  
  52. @@error:                ; return extended error code
  53.     CALL    GetLastError
  54.         CMP     EAX,109                 ; NT quirk: got "broken pipe"? it's really eof
  55.         JE      @@noerror
  56.     RET
  57.  
  58. TextIn    ENDP
  59.  
  60.  
  61. ;    PROCEDURE TextNullProc( VAR t: Text );
  62.  
  63. TextNullProc PROC
  64.  
  65. ; ->    EAX    Pointer to text record
  66.  
  67.     XOR    EAX,EAX            ; signal success
  68.  
  69.     RET
  70.  
  71. TextNullProc ENDP
  72.  
  73.  
  74. ;    PROCEDURE TextOut( VAR t: Text );
  75.  
  76. TextOut    PROC
  77.  
  78. ; ->    EAX    Pointer to text record
  79.  
  80. ;       WriteFile(t.Handle, t.BufPtr, t.BufPos, @dummy, Nil);
  81.  
  82.     PUSH    ECX            ; VAR dummy: Longint;
  83.  
  84.     MOV    EDX,[EAX].BufPos
  85.     TEST    EDX,EDX
  86.     JLE    @@skip
  87.  
  88.     XOR    ECX,ECX
  89.     MOV    [EAX].BufPos,ECX
  90.  
  91.     PUSH    ECX            ; pass lpOverLapped
  92.     LEA     ECX,[ESP+4]        ; pass lpNumberOfBytes written
  93.     PUSH    ECX
  94.     PUSH    EDX            ; pass nNumberOfBytesToWrite
  95.     PUSH    [EAX].BufPtr        ; pass lpBuffer
  96.     PUSH    [EAX].Handle        ; pass hFile
  97.     CALL    WriteFile
  98.     TEST    EAX,EAX
  99.     JZ    @@error
  100.  
  101. @@skip:
  102.     XOR    EAX,EAX
  103.  
  104. @@exit:
  105.     POP    ECX            ; deallocate dummy
  106.     RET
  107.  
  108. @@error:                ; return dos error code or 0
  109.     Call    GetLastError
  110.     JMP    @@exit
  111.  
  112. TextOut    ENDP
  113.  
  114.  
  115. ;    PROCEDURE TextClose( VAR t: Text );
  116.  
  117. TextClose PROC
  118.  
  119. ; ->    EAX    Pointer to text record
  120.  
  121. ;    CloseHandle( t.Handle );
  122.  
  123.     PUSH    [EAX].Handle
  124.     MOV    [EAX].Mode,fmClosed
  125.     CALL    CloseHandle
  126.     DEC    EAX
  127.     JNZ    @@error
  128.     RET
  129. @@error:
  130.     CALL    GetLastError
  131.     RET
  132.  
  133. TextClose ENDP
  134.  
  135.  
  136. ;    PROCEDURE TextOpen( VAR t: Text );
  137.  
  138. TextOpen PROC
  139.  
  140. ; ->    EAX    Pointer to text record
  141.  
  142. ;
  143.     PUSH    ESI
  144.  
  145.     MOV    ESI,EAX
  146.  
  147.     XOR    EAX,EAX
  148.     MOV    [ESI].BufPos,EAX
  149.     MOV    [ESI].BufEnd,EAX
  150.     MOV    EAX,[ESI].Mode
  151.  
  152.     SUB    EAX,fmInput
  153.     JE    @@calledByReset
  154.  
  155.     DEC    EAX
  156.     JE    @@calledByRewrite
  157.  
  158.     DEC    EAX
  159.     JE    @@calledByAppend
  160.  
  161.     JMP    @@exit
  162.  
  163. @@calledByReset:
  164.  
  165.     MOV    EAX,GENERIC_READ            ; open for read
  166.     MOV    EDX,FILE_SHARE_READ
  167.     MOV    ECX,OPEN_EXISTING
  168.  
  169.     MOV    [ESI].InOutFunc,offset TextIn
  170.  
  171.     JMP    @@common
  172.  
  173. @@calledByRewrite:
  174.  
  175.     MOV    EAX,GENERIC_WRITE            ; open for write
  176.     MOV    EDX,FILE_SHARE_READ
  177.     MOV    ECX,CREATE_ALWAYS
  178.     JMP    @@commonOut
  179.  
  180. @@calledByAppend:
  181.  
  182.     MOV    EAX,GENERIC_READ OR GENERIC_WRITE    ; open for read/write
  183.     MOV    EDX,FILE_SHARE_READ
  184.     MOV    ECX,OPEN_EXISTING
  185.  
  186. @@commonOut:
  187.  
  188.     MOV    [ESI].InOutFunc,offset TextOut
  189.  
  190. @@common:
  191.  
  192.     MOV    [ESI].CloseFunc,offset TextClose
  193.     MOV    [ESI].FlushFunc,offset TextNullProc
  194.     CMP    byte ptr [ESI].FileName,0
  195.     JE    @@isCon
  196.  
  197. ;    CreateFile(t.FileName, EAX, EDX, Nil, ECX, FILE_ATTRIBUTE_NORMAL, 0);
  198.  
  199.     PUSH    0
  200.     PUSH    FILE_ATTRIBUTE_NORMAL
  201.     PUSH    ECX
  202.     PUSH    0
  203.     PUSH    EDX
  204.     PUSH    EAX
  205.     LEA    EAX,[ESI].FileName
  206.     PUSH    EAX
  207.     CALL    CreateFileA
  208.  
  209.     CMP    EAX,-1
  210.     JZ    @@error
  211.  
  212.     MOV    [ESI].Handle,EAX
  213.     CMP    [ESI].Mode,fmInOut
  214.     JNE    @@success
  215.  
  216.     DEC    [ESI].Mode            ; fmInOut -> fmOutput
  217.  
  218. ;    ???  we really have to look for the first eof byte in the
  219. ;    ???  last record and truncate the file there.
  220. ;    Not very nice and clean...
  221. ;
  222. ;    lastRecPos = Max( GetFileSize(...) - 128, 0);
  223.  
  224.     PUSH    0
  225.     PUSH    [ESI].Handle
  226.     CALL    GetFileSize
  227.  
  228.     INC    EAX
  229.     JZ    @@error
  230.     SUB    EAX,129
  231.     JNC    @@3
  232.     XOR    EAX,EAX
  233. @@3:
  234. ;    lseek(f.Handle, SEEK_SET, lastRecPos);
  235.  
  236.     PUSH    FILE_BEGIN
  237.     PUSH    0
  238.     PUSH    EAX
  239.     PUSH    [ESI].Handle
  240.     CALL    SetFilePointer
  241.  
  242.     INC    EAX
  243.     JE    @@error
  244.  
  245. ;    bytesRead = read(f.Handle, f.Buffer, 128);
  246.  
  247.     PUSH    0
  248.     MOV    EDX,ESP
  249.     PUSH    0
  250.     PUSH    EDX
  251.     PUSH    128
  252.     LEA    EDX,[ESI].Buffer
  253.     PUSH    EDX
  254.     PUSH    [ESI].Handle
  255.     CALL    ReadFile
  256.     POP    EDX
  257.     DEC    EAX
  258.     JNZ    @@error
  259.  
  260. ;    for    (i = 0; i < bytesRead; i++)
  261.  
  262.     XOR    EAX,EAX
  263. @@loop:
  264.     CMP    EAX,EDX
  265.     JAE    @@success
  266.  
  267. ;        if    (f.Buffer[i] == eof)
  268.  
  269.     CMP    byte ptr [ESI].Buffer[EAX],eof
  270.     JE    @@truncate
  271.     INC    EAX
  272.     JMP    @@loop
  273.  
  274. @@truncate:
  275.  
  276. ;    lseek( f.Handle, SEEK_END, i - bytesRead );
  277.  
  278.     PUSH    FILE_END
  279.     PUSH    0
  280.     SUB    EAX,EDX
  281.     PUSH    EAX
  282.     PUSH    [ESI].Handle
  283.     CALL    SetFilePointer
  284.     INC    EAX
  285.     JE    @@error
  286.  
  287. ;    SetEndOfFile( f.Handle );
  288.  
  289.     PUSH    [ESI].Handle
  290.     CALL    SetEndOfFile
  291.     DEC    EAX
  292.     JNE    @@error
  293.  
  294.     JMP    @@success
  295.  
  296. @@isCon:
  297.     MOV    [ESI].CloseFunc,offset TextNullProc
  298.     CMP    [ESI].Mode,fmOutput
  299.     JE    @@output
  300.     PUSH    STD_INPUT_HANDLE
  301.     JMP    @@1
  302. @@output:
  303.     PUSH    STD_OUTPUT_HANDLE
  304. @@1:
  305.     CALL    GetStdHandle
  306.     CMP    EAX,-1
  307.     JE    @@error
  308.     MOV    [ESI].Handle,EAX
  309.  
  310. @@success:
  311.     CMP    [ESI].Mode,fmInput
  312.     JE    @@2
  313.     PUSH    [ESI].Handle
  314.     CALL    GetFileType
  315.         TEST    EAX,EAX
  316.         JE      @@badFileType
  317.     CMP    EAX,2
  318.     JNE    @@2
  319.     MOV    [ESI].FlushFunc,offset TextOut
  320. @@2:
  321.     XOR    EAX,EAX
  322. @@exit:
  323.     POP    ESI
  324.     RET
  325.  
  326. @@badFileType:
  327.         PUSH    [ESI].Handle
  328.         CALL    CloseHandle
  329.     MOV    [ESI].Mode,fmClosed
  330.         MOV     EAX,105
  331.         JMP     @@exit
  332.  
  333. @@error:
  334.     MOV    [ESI].Mode,fmClosed
  335.     CALL    GetLastError
  336.     JMP    @@exit
  337.  
  338. TextOpen ENDP
  339.  
  340.  
  341. ;    PROCEDURE _Assign( VAR t: Text; s: PChar );
  342.  
  343. _Assign    PROC
  344.  
  345. ; ->    EAX    Pointer to text record
  346. ;    EDX    Pointer to file name
  347.  
  348. ;    we just initialize the various fields
  349.  
  350.     LEA    ECX,[EAX].Buffer
  351.     MOV    [EAX].BufPtr,ECX
  352.     XOR    ECX,ECX
  353.     MOV    [EAX].Handle,ECX
  354.     MOV    [EAX].Mode,fmClosed
  355.     MOV    [EAX].BufSize,128
  356.     MOV    [EAX].BufPos,ECX
  357.     MOV    [EAX].BufEnd,ECX
  358.     MOV    [EAX].OpenFunc,offset TextOpen
  359.     MOV    [EAX].InOutFunc,ECX
  360.     MOV    [EAX].FlushFunc,ECX
  361.     MOV    [EAX].CloseFunc,ECX
  362.  
  363. ;    and copy the file name, truncating it to fNameLen-1 chars
  364.  
  365.     LEA    EAX,[EAX].FileName
  366.  
  367.     TEST    EDX,EDX
  368.     JE    @@term
  369.  
  370.     MOV    CH,fNameLen / 2
  371.  
  372. @@loop:
  373.     MOV    CL,[EDX]
  374.     INC    EDX
  375.     MOV    [EAX],CL
  376.     INC    EAX
  377.     TEST    CL,CL
  378.     JE    @@exit
  379.  
  380.     MOV    CL,[EDX]
  381.     INC    EDX
  382.     MOV    [EAX],CL
  383.     INC    EAX
  384.     TEST    CL,CL
  385.     JE    @@exit
  386.  
  387.     DEC    CH
  388.     JNE    @@loop
  389.     DEC    EAX
  390. @@term:
  391.     MOV    [EAX],CH
  392. @@exit:
  393.     RET
  394.  
  395. _Assign    ENDP
  396.  
  397.  
  398. ;    PROCEDURE Flush( VAR f: Text );
  399.  
  400. __Flush    PROC
  401.  
  402. ; ->    EAX    Pointer to text record
  403.  
  404.     MOV    EDX,[EAX].Mode
  405.     CMP    EDX,fmOutput
  406.     JNE    @@fileNotOutput
  407.     CALL    [EAX].InOutFunc
  408.     TEST    EAX,EAX
  409.     JNE    @@error
  410. @@exit:
  411.     RET
  412.  
  413. @@fileNotOutput:
  414.     CMP    EDX,fmInput
  415.     JE    @@exit
  416.     MOV    EAX,103
  417. @@error:
  418.     JMP    SetInOutRes
  419.  
  420.  
  421. __Flush    ENDP
  422.  
  423. ;    PROCEDURE _Flush( VAR f: Text );
  424.  
  425. _Flush    PROC
  426.  
  427. ; ->    EAX    Pointer to text record
  428.  
  429.     MOV    EDX,[EAX].Mode
  430.     CMP    EDX,fmOutput
  431.     JNE    @@fileNotOutput
  432.     CALL    [EAX].FlushFunc
  433.     TEST    EAX,EAX
  434.     JNE    @@error
  435. @@exit:
  436.     RET
  437.  
  438. @@fileNotOutput:
  439.     CMP    EDX,fmInput
  440.     JE    @@exit
  441.     MOV    EAX,103
  442. @@error:
  443.     JMP    SetInOutRes
  444.  
  445. _Flush    ENDP
  446.  
  447.     END
  448.  
  449.