home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / bp7os2 / os2rtl / sys / wend.asm < prev    next >
Assembly Source File  |  1993-08-16  |  8KB  |  163 lines

  1. ;//////////////////////////////////////////////////////
  2. ;/                                                    /
  3. ;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
  4. ;/ Beendigungs-Routine für OS/2-Programme.            /
  5. ;/                                                    /
  6. ;/ 1993 Matthias Withopf / c't                        /
  7. ;/ Originalversion (c) 1988,92 Borland International  /
  8. ;/                                                    /
  9. ;//////////////////////////////////////////////////////
  10.  
  11.                 .286p                                         
  12.  
  13.                 _NOMACROS_ = 1                  ; keine Macros definieren
  14.                 INCLUDE SE.ASM
  15.                 INCLUDE OS2.ASM
  16.  
  17. CONST           SEGMENT WORD PUBLIC
  18. ErrorStr        DB      'Runtime error '
  19.                 DB      '    0'
  20. ErrorCodeStrE   DB      ' at '
  21.                 DB      '0000'
  22. ErrorSegmStrE   DB      ':'
  23.                 DB      '0000'
  24. ErrorOffsStrE   DB      '.'
  25. ErrorStrLen     EQU     $ - ErrorStr
  26. CONST           ENDS
  27.  
  28. DATA            SEGMENT WORD PUBLIC
  29.                 EXTRN   ExitProc:DWORD,ExitCode:WORD,ErrorAddr:DWORD
  30.                 EXTRN   EnvironmentSeg:WORD,InOutRes:WORD
  31. DATA            ENDS
  32.  
  33. DGROUP          GROUP   CONST,DATA
  34.  
  35. CODE            SEGMENT BYTE PUBLIC
  36.                 ASSUME  CS:CODE,DS:DGROUP
  37.  
  38.                 ;
  39.                 ; Procedure RunError(ErrorCode : Byte);
  40.                 ;
  41.  
  42.                 PUBLIC  HaltError
  43. HaltError       PROC    FAR
  44.                 POP     CX                      ; hole Rücksprungadresse vom Stack
  45.                 POP     BX                      ; (an dieser Stelle ist Fehler aufgetreten)
  46.                 JMP     SHORT Terminate         ; -> beende Programm
  47. HaltError       ENDP
  48.  
  49.                 ;
  50.                 ; Procedure Halt(ExitCode : Word);
  51.                 ;
  52.  
  53.                 PUBLIC  HaltTurbo
  54. HaltTurbo       PROC    FAR
  55.                 XOR     CX,CX                   ; Programm wurde mit 'Halt' ordnungsgemäß
  56.                 XOR     BX,BX                   ; beendet, keine Fehleradresse verfügbar
  57. HaltTurbo       ENDP
  58.  
  59.                 ;
  60.                 ; Beende Programm. In AX wird der Exit-Code des
  61.                 ; Programms übergeben, in BX:CX die Fehleradresse
  62.                 ; oder Nil.
  63.                 ;
  64.  
  65.                 PUBLIC  Terminate
  66. Terminate       PROC    FAR
  67.                 PUSH    AX                      ; rette Exit-Code
  68.                 MOV     AX,SEG DATA             ; lade Datensegment
  69.                 MOV     DS,AX                   ; des Programms
  70.                 POP     AX                      ; hole Exit-Code zurück
  71.                 MOV     ExitCode,AX             ; speichere Exit-Code
  72.                 MOV     AX,CX                   ; ist es ein Runtime Error ?
  73.                 OR      AX,BX                   ; (Fehleradresse in BX:CX)
  74.                 JE      @@ExitAddrOk            ; nein -> weiter
  75.                 CMP     BX,-1                   ; unbekannte Fehleradresse ?
  76.                 JE      @@ExitAddrOk            ; ja -> nicht ändern
  77.                 MOV     ES,BX                   ; lese logische Segment-Nummer, die im 
  78.                 MOV     BX,WORD PTR ES:0        ; 1. Word jedes Code-Segments gespeichert ist
  79. @@ExitAddrOk:   MOV     ErrorAddr.offs,CX       ; speichere 
  80.                 MOV     ErrorAddr.segm,BX       ; Fehleradresse
  81.                 CMP     EnvironmentSeg,0        ; wird diese Routine von einer DLL aufgerufen ? Falls ja 
  82.                 JE      @@NoExitProcs           ; -> Exit-Prozeduren nicht ausführen, diese sind nur für Hauptprgm
  83.                 CALL    DoExitProcs             ; Exit-Prozeduren ausführen
  84. @@NoExitProcs:  MOV     AX,ErrorAddr.offs       ; ist es ein 
  85.                 OR      AX,ErrorAddr.segm       ; Runtime Error?
  86.                 JE      @@NoRTError             ; nein -> weiter
  87.                 MOV     AX,ExitCode             ; lese Exit-Code in AX
  88.                 MOV     BX,OFFSET ErrorCodeStrE ; wandle
  89.                 MOV     CX,10                   ; in 
  90.                 CALL    Num2Str                 ; Dezimal-String
  91.                 MOV     AX,ErrorAddr.segm       ; lese Selektor
  92.                 MOV     BX,OFFSET ErrorSegmStrE ; der Fehleradresse 
  93.                 MOV     CX,16                   ; und wandle
  94.                 CALL    Num2Str                 ; in Hexadezimal-String
  95.                 MOV     AX,ErrorAddr.offs       ; lese Offset der 
  96.                 MOV     BX,OFFSET ErrorOffsStrE ; Fehleradresse und wandle
  97.                 CALL    Num2Str                 ; in Hexadezimal-String
  98.                 PUSH    1                       ; übergebe Handle der Standard-Ausgabe
  99.                 PUSH    DS                      ; übergebe Adresse  
  100.                 PUSH    OFFSET ErrorStr         ; des Fehlertexts
  101.                 PUSH    ErrorStrLen             ; übergebe Textlänge
  102.                 PUSH    DS                      ; übergebe Adresse
  103.                 PUSH    OFFSET InOutRes         ; eines Dummy-Words
  104.                 CALL    DosWrite                ; gebe Fehlertext aus
  105. @@NoRTError:    PUSH    EXIT_PROCESS
  106.                 PUSH    ExitCode
  107.                 CALL    DosExit
  108. Terminate       ENDP
  109.  
  110.                 ;
  111.                 ; Führe Exit-Prozeduren aus.
  112.                 ;
  113.  
  114.                 PUBLIC  DoExitProcs
  115. DoExitProcs     PROC    NEAR
  116.                 LES     BX,ExitProc             ; lese Zeiger auf zuletzt eingehängte Exit-Prozedur
  117.                 MOV     AX,ES                   ; ist überhaupt eine
  118.                 OR      AX,BX                   ; Exit-Prozedur definiert ?
  119.                 JE      @@End                   ; nein -> Ende
  120.                 XOR     AX,AX                   ; lösche diese 
  121.                 MOV     ExitProc.offs,AX        ; Exit-Prozedur
  122.                 MOV     ExitProc.segm,AX        ; aus der Kette
  123.                 MOV     InOutRes,AX             ; setze I/O-Fehler zurück
  124.                 MOV     AX,OFFSET DoExitProcs   ; speichere Adresse dieser Routine 
  125.                 PUSH    CS                      ; auf dem Stack als Rücksprungadresse
  126.                 PUSH    AX                      ; nach der Exit-Prozedur
  127.                 PUSH    ES                      ; führe die
  128.                 PUSH    BX                      ; Exit-Prozedur aus
  129.                 RETF                            ; (JMP ES:BX)
  130.  
  131. @@End:          RET
  132. DoExitProcs     ENDP
  133.  
  134.                 ;
  135.                 ; Wandle die in AX übergebene Zahl in ASCII-String.
  136.                 ; Die Zahlenbasis ist in CX, das Buffer-Ende in DS:BX.
  137.                 ;
  138.  
  139. Num2Str         PROC    NEAR    
  140.                 XOR     DX,DX                   ; setze HiWord des Dividend auf 0
  141.                 DIV     CX                      ; spalte rechte Ziffer ab
  142.                 ADD     DL,'0'                  ; wandle Ziffer nach ASCII
  143.                 CMP     DL,'0'+10               ; falls > '9'
  144.                 JB      @@DigitOk               ; wandle
  145.                 ADD     DL,'A'-'0'-10           ; in Hex-Ziffer
  146. @@DigitOk:      DEC     BX                      ; speichere Ziffer
  147.                 MOV     [BX],DL                 ; in Buffer
  148.                 OR      AX,AX                   ; ist Zahl ganz gewandelt ?
  149.                 JNE     Num2Str                 ; nein -> zurück und weitermachen
  150.                 RET
  151. Num2Str         ENDP
  152.  
  153.                 ;
  154.                 ; Copyright.
  155.                 ;
  156.  
  157. Copyright       DB      'Portions Copyright (c) 1983,92 Borland',13,10
  158.                 DB      'Portions 1993 by Matthias Withopf / c''t',13,10,0
  159.  
  160. CODE            ENDS
  161.  
  162.                 END
  163.