home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 April / Chip_1997-04_cd.bin / prezent / cb / data.z / HALT.ASM < prev    next >
Assembly Source File  |  1997-01-16  |  4KB  |  180 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   ExitProcess:NEAR, ExitProc:DWORD, ErrorAddr:DWORD, _Close:NEAR
  17.         EXTRN   _Write0CString:NEAR, _WriteLn:NEAR, MessageBoxA:NEAR
  18.         EXTRN   UninitAllocator:NEAR, UnsetExceptionHandler:NEAR
  19.         EXTRN   DLLSaveEBX:DWORD, DLLSaveEBP:DWORD, DLLSaveESI:DWORD
  20.         EXTRN   DLLSaveEDI:DWORD, DLLInitState:BYTE, IsLibrary:BYTE, IsConsole:BYTE
  21.         EXTRN   ExitCode:DWORD
  22.         EXTRN   Input, Output, TextStart
  23.  
  24.         PUBLIC  _Halt, _Halt0, _RunError, _Run0Error
  25.  
  26.         .DATA
  27.  
  28. runErrMsg       DB      'Runtime error     at 00000000',0
  29. ;       columns:         0123456789012345678901234567890
  30. errCaption      DB      'Error',0
  31.  
  32.         .CODE
  33.  
  34. ;       PROCEDURE Terminate( exitCode: Longint );
  35.  
  36. Terminate PROC
  37.  
  38. ; ->    EAX     Exitcode
  39.  
  40.         MOV     ExitCode,EAX
  41.         CMP     IsLibrary,0
  42.         JE      @@DoExitProcs
  43.         CMP     DLLInitState,1
  44.         JB      @@ProgExit
  45.         JE      @@DoExitProcs
  46.         OR      EAX,EAX
  47.         JE      @@LibExit
  48.  
  49. @@DoExitProcs:
  50.         MOV     EAX,ExitProc            ;Run exit procedures
  51.         OR      EAX,EAX
  52.         JE      @@CheckError
  53.         XOR     EDX,EDX
  54.         MOV     ExitProc,EDX
  55.         CALL    EAX
  56.         JMP     @@DoExitProcs
  57.  
  58. @@CheckError:
  59.         CMP     ErrorAddr,0
  60.         JE      @@CloseInOut
  61.  
  62.         MOV     EAX,ExitCode
  63.         MOV     EBX,offset runErrMsg + 16
  64.         MOV     ECX,10
  65.  
  66. @@digLoop:
  67.         XOR     EDX,EDX
  68.         DIV     ECX
  69.         ADD     DL,'0'
  70.         MOV     [EBX],DL
  71.         DEC     EBX
  72.         TEST    EAX,EAX
  73.         JNZ     @@digLoop
  74.  
  75.         MOV     EBX,offset runErrMsg + 28
  76.         MOV     EAX,ErrorAddr
  77.         SUB     EAX,offset TextStart
  78.  
  79. @@hdigLoop:
  80.         MOV     EDX,EAX
  81.         AND     EDX,0FH
  82.         MOV     DL,dig[EDX]
  83.         MOV     [EBX],DL
  84.         DEC     EBX
  85.         SHR     EAX,4
  86.         JNE     @@hdigLoop
  87.  
  88.         CMP     IsConsole,0
  89.         JNE     @@IsConsole
  90.  
  91.         PUSH    0
  92.         PUSH    offset errCaption
  93.         PUSH    offset runErrMsg
  94.         PUSH    0
  95.         CALL    MessageBoxA
  96.         JMP     SHORT @@CloseInOut
  97.  
  98. @@IsConsole:
  99.         MOV     EAX,OFFSET Output
  100.         MOV     EDX,OFFSET runErrMsg
  101.         CALL    _Write0CString
  102.         CALL    _WriteLn
  103.  
  104. @@CloseInOut:
  105.         MOV     EAX,OFFSET Input
  106.         CALL    _Close
  107.         MOV     EAX,OFFSET Output
  108.         CALL    _Close
  109.         CALL    UninitAllocator
  110.         CMP     DLLInitState,0
  111.         JNE     @@LibExit
  112.         CALL    UnsetExceptionHandler
  113.  
  114. @@ProgExit:
  115.         PUSH    ExitCode
  116.         CALL    ExitProcess
  117.  
  118. @@LibExit:
  119.         CALL    UnsetExceptionHandler
  120.         MOV     DLLInitState,0
  121.         MOV     EAX,ExitCode    ; Return True if ExitCode = 0
  122.         NEG     EAX
  123.         SBB     EAX,EAX
  124.         INC     EAX
  125.         MOV     EDI,DLLSaveEDI
  126.         MOV     ESI,DLLSaveESI
  127.         MOV     EBX,DLLSaveEBX
  128.         MOV     EBP,DLLSaveEBP
  129.         LEAVE
  130.         RET     12
  131.  
  132. dig     DB      '0123456789ABCDEF'
  133.  
  134. Terminate ENDP
  135.  
  136.  
  137. ;       PROCEDURE _Halt0;
  138.  
  139. _Halt0  PROC
  140.  
  141.         XOR     EAX,EAX
  142.         JMP     _Halt
  143.  
  144. _Halt0  ENDP
  145.  
  146.  
  147. ;       PROCEDURE _Halt( exitCode: Longint );
  148.  
  149. _Halt   PROC
  150.  
  151.         XOR     EDX,EDX
  152.         MOV     ErrorAddr,EDX
  153.         JMP     Terminate
  154.  
  155. _Halt   ENDP
  156.  
  157.  
  158. ;       PROCEDURE _Run0Error;
  159.  
  160. _Run0Error PROC
  161.  
  162.         XOR     EAX,EAX
  163.         JMP     _RunError
  164.  
  165. _Run0Error ENDP
  166.  
  167.  
  168. ;       PROCEDURE _RunError( ErrorCode: Longint );
  169.  
  170. _RunError PROC
  171.  
  172. ; ->    EAX     ErrorCode
  173.  
  174.         POP     ErrorAddr
  175.         JMP     Terminate
  176.  
  177. _RunError ENDP
  178.  
  179.         END
  180.