home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
pascal
/
bp7os2
/
os2rtl
/
sys
/
wend.asm
< prev
next >
Wrap
Assembly Source File
|
1993-08-16
|
8KB
|
163 lines
;//////////////////////////////////////////////////////
;/ /
;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
;/ Beendigungs-Routine für OS/2-Programme. /
;/ /
;/ 1993 Matthias Withopf / c't /
;/ Originalversion (c) 1988,92 Borland International /
;/ /
;//////////////////////////////////////////////////////
.286p
_NOMACROS_ = 1 ; keine Macros definieren
INCLUDE SE.ASM
INCLUDE OS2.ASM
CONST SEGMENT WORD PUBLIC
ErrorStr DB 'Runtime error '
DB ' 0'
ErrorCodeStrE DB ' at '
DB '0000'
ErrorSegmStrE DB ':'
DB '0000'
ErrorOffsStrE DB '.'
ErrorStrLen EQU $ - ErrorStr
CONST ENDS
DATA SEGMENT WORD PUBLIC
EXTRN ExitProc:DWORD,ExitCode:WORD,ErrorAddr:DWORD
EXTRN EnvironmentSeg:WORD,InOutRes:WORD
DATA ENDS
DGROUP GROUP CONST,DATA
CODE SEGMENT BYTE PUBLIC
ASSUME CS:CODE,DS:DGROUP
;
; Procedure RunError(ErrorCode : Byte);
;
PUBLIC HaltError
HaltError PROC FAR
POP CX ; hole Rücksprungadresse vom Stack
POP BX ; (an dieser Stelle ist Fehler aufgetreten)
JMP SHORT Terminate ; -> beende Programm
HaltError ENDP
;
; Procedure Halt(ExitCode : Word);
;
PUBLIC HaltTurbo
HaltTurbo PROC FAR
XOR CX,CX ; Programm wurde mit 'Halt' ordnungsgemäß
XOR BX,BX ; beendet, keine Fehleradresse verfügbar
HaltTurbo ENDP
;
; Beende Programm. In AX wird der Exit-Code des
; Programms übergeben, in BX:CX die Fehleradresse
; oder Nil.
;
PUBLIC Terminate
Terminate PROC FAR
PUSH AX ; rette Exit-Code
MOV AX,SEG DATA ; lade Datensegment
MOV DS,AX ; des Programms
POP AX ; hole Exit-Code zurück
MOV ExitCode,AX ; speichere Exit-Code
MOV AX,CX ; ist es ein Runtime Error ?
OR AX,BX ; (Fehleradresse in BX:CX)
JE @@ExitAddrOk ; nein -> weiter
CMP BX,-1 ; unbekannte Fehleradresse ?
JE @@ExitAddrOk ; ja -> nicht ändern
MOV ES,BX ; lese logische Segment-Nummer, die im
MOV BX,WORD PTR ES:0 ; 1. Word jedes Code-Segments gespeichert ist
@@ExitAddrOk: MOV ErrorAddr.offs,CX ; speichere
MOV ErrorAddr.segm,BX ; Fehleradresse
CMP EnvironmentSeg,0 ; wird diese Routine von einer DLL aufgerufen ? Falls ja
JE @@NoExitProcs ; -> Exit-Prozeduren nicht ausführen, diese sind nur für Hauptprgm
CALL DoExitProcs ; Exit-Prozeduren ausführen
@@NoExitProcs: MOV AX,ErrorAddr.offs ; ist es ein
OR AX,ErrorAddr.segm ; Runtime Error?
JE @@NoRTError ; nein -> weiter
MOV AX,ExitCode ; lese Exit-Code in AX
MOV BX,OFFSET ErrorCodeStrE ; wandle
MOV CX,10 ; in
CALL Num2Str ; Dezimal-String
MOV AX,ErrorAddr.segm ; lese Selektor
MOV BX,OFFSET ErrorSegmStrE ; der Fehleradresse
MOV CX,16 ; und wandle
CALL Num2Str ; in Hexadezimal-String
MOV AX,ErrorAddr.offs ; lese Offset der
MOV BX,OFFSET ErrorOffsStrE ; Fehleradresse und wandle
CALL Num2Str ; in Hexadezimal-String
PUSH 1 ; übergebe Handle der Standard-Ausgabe
PUSH DS ; übergebe Adresse
PUSH OFFSET ErrorStr ; des Fehlertexts
PUSH ErrorStrLen ; übergebe Textlänge
PUSH DS ; übergebe Adresse
PUSH OFFSET InOutRes ; eines Dummy-Words
CALL DosWrite ; gebe Fehlertext aus
@@NoRTError: PUSH EXIT_PROCESS
PUSH ExitCode
CALL DosExit
Terminate ENDP
;
; Führe Exit-Prozeduren aus.
;
PUBLIC DoExitProcs
DoExitProcs PROC NEAR
LES BX,ExitProc ; lese Zeiger auf zuletzt eingehängte Exit-Prozedur
MOV AX,ES ; ist überhaupt eine
OR AX,BX ; Exit-Prozedur definiert ?
JE @@End ; nein -> Ende
XOR AX,AX ; lösche diese
MOV ExitProc.offs,AX ; Exit-Prozedur
MOV ExitProc.segm,AX ; aus der Kette
MOV InOutRes,AX ; setze I/O-Fehler zurück
MOV AX,OFFSET DoExitProcs ; speichere Adresse dieser Routine
PUSH CS ; auf dem Stack als Rücksprungadresse
PUSH AX ; nach der Exit-Prozedur
PUSH ES ; führe die
PUSH BX ; Exit-Prozedur aus
RETF ; (JMP ES:BX)
@@End: RET
DoExitProcs ENDP
;
; Wandle die in AX übergebene Zahl in ASCII-String.
; Die Zahlenbasis ist in CX, das Buffer-Ende in DS:BX.
;
Num2Str PROC NEAR
XOR DX,DX ; setze HiWord des Dividend auf 0
DIV CX ; spalte rechte Ziffer ab
ADD DL,'0' ; wandle Ziffer nach ASCII
CMP DL,'0'+10 ; falls > '9'
JB @@DigitOk ; wandle
ADD DL,'A'-'0'-10 ; in Hex-Ziffer
@@DigitOk: DEC BX ; speichere Ziffer
MOV [BX],DL ; in Buffer
OR AX,AX ; ist Zahl ganz gewandelt ?
JNE Num2Str ; nein -> zurück und weitermachen
RET
Num2Str ENDP
;
; Copyright.
;
Copyright DB 'Portions Copyright (c) 1983,92 Borland',13,10
DB 'Portions 1993 by Matthias Withopf / c''t',13,10,0
CODE ENDS
END