home *** CD-ROM | disk | FTP | other *** search
- NAME c0
- PAGE 60,132
- LOCALS
- ;[]------------------------------------------------------------[]
- ;| C0.ASM -- Start Up Code |
- ;| |
- ;| Turbo C++ Run Time Library |
- ;| |
- ;| Copyright (c) 1987, 1990 by Borland International Inc. |
- ;| All Rights Reserved. |
- ;[]------------------------------------------------------------[]
-
- INCLUDE RULES.ASI
-
- ; Segment- und Group-Deklarationen
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- ENDS
- _FARDATA SEGMENT PARA PUBLIC 'FAR_DATA'
- ENDS
- IFNDEF __TINY__
- _OVERLAY_ SEGMENT PARA PUBLIC 'OVRINFO'
- ENDS
- ENDIF
- _INIT_ SEGMENT WORD PUBLIC 'INITDATA'
- InitStart label byte
- ENDS
- _INITEND_ SEGMENT BYTE PUBLIC 'INITDATA'
- InitEnd label byte
- ENDS
- _EXIT_ SEGMENT WORD PUBLIC 'EXITDATA'
- ExitStart label byte
- ENDS
- _EXITEND_ SEGMENT BYTE PUBLIC 'EXITDATA'
- ExitEnd label byte
- ENDS
- IFNDEF __TINY__
- _1STUB_ SEGMENT PARA PUBLIC 'STUBSEG'
- ENDS
- ENDIF
- _DATA SEGMENT PARA PUBLIC 'DATA'
- ENDS
- _CVTSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
- _SCNSEG SEGMENT WORD PUBLIC 'DATA'
- ENDS
- IFNDEF __HUGE__
- _BSS SEGMENT WORD PUBLIC 'BSS'
- ENDS
- _BSSEND SEGMENT BYTE PUBLIC 'ENDBSS'
- ENDS
- ENDIF
- IFNDEF __TINY__
- _STACK SEGMENT STACK 'STACK'
- ENDS
- ENDIF
-
- IFNDEF __NOFLOAT__
- IF LDATA
- IFDEF __HUGE__
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG
- ELSE
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- ENDIF
- IGROUP GROUP _INIT_,_INITEND_
- EGROUP GROUP _EXIT_,_EXITEND_
- ELSE
- IFDEF __TINY__
- DGROUP GROUP _TEXT,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- ELSE
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- IGROUP GROUP _INIT_,_INITEND_
- EGROUP GROUP _EXIT_,_EXITEND_
- ENDIF
- ENDIF
- ELSE
- IF LDATA
- IFDEF __HUGE__
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG
- ELSE
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- ENDIF
- IGROUP GROUP _INIT_,_INITEND_
- EGROUP GROUP _EXIT_,_EXITEND_
- ELSE
- IFDEF __TINY__
- DGROUP GROUP _TEXT,_INIT_,_INITEND_,_EXIT_,_EXITEND_,_DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- ELSE
- DGROUP GROUP _DATA,_CVTSEG,_SCNSEG,_BSS,_BSSEND
- IGROUP GROUP _INIT_,_INITEND_
- EGROUP GROUP _EXIT_,_EXITEND_
- ENDIF
- ENDIF
- ENDIF
-
- ASSUME CS:_TEXT, DS:DGROUP
-
- ; Externe Referenzen
-
- extrn _main:DIST
- extrn _exit:DIST
- extrn __exitbuf:DIST
- extrn __exitfopen:DIST
- extrn __exitopen:DIST
- extrn __setupio:near ; wird unbedingt benötigt !
- extrn __stklen:word
- IF LDATA EQ false
- extrn __heaplen:word
- ENDIF
-
- SUBTTL Start Up Code
- PAGE
- ;/* */
- ;/*-----------------------------------------------------*/
- ;/* */
- ;/* Start Up Code */
- ;/* ------------- */
- ;/* */
- ;/*-----------------------------------------------------*/
- ;/* */
- PSPHigh equ 00002h
- PSPEnv equ 0002ch
- PSPCmd equ 00080h
-
- public __AHINCR
- __AHINCR equ 1000h
- public __AHSHIFT
- __AHSHIFT equ 12
-
- IFDEF __NOFLOAT__
- MINSTACK equ 128 ; minimale Stackgröße in Worten
- ELSE
- MINSTACK equ 256 ; minimale Stackgröße in Worten
- ENDIF
- ;
- ; Am Programmanfang zeigen sowohl DS als auch ES auf den
- ; Segment-Prefix (PSP). SS zeigt auf das Stack-Segment,
- ; außer im Model TINY, in dem SS den gleichen Wert wie CS hat.
- ;
- _TEXT SEGMENT
- IFDEF __TINY__
- ORG 100h
- ENDIF
- STARTX PROC NEAR
- ; Sichern von allgemeinen Informationen wie z. B.
- ; DGROUP Segmentadresse
- ; DOS Versions-Nr.
- ; Program Segment Prefix (PSP)-Adresse
- ; Adresse des Environments
- ; Anfang des "Far-Heaps"
-
- IFDEF __TINY__
- mov dx, cs ; DX = GROUP Segmentadresse
- ELSE
- mov dx, DGROUP ; DX = GROUP Segmentadresse
- ENDIF
- mov cs:DGROUP@@, dx
- mov ah, 30h
- int 21h ; DOS Versions-Nr. ermitteln
- mov bp, ds:[PSPHigh]; BP = Größte Speichersegmentadresse
- mov bx, ds:[PSPEnv] ; BX = Adresse des Environment-Segments
- mov ds, dx
- mov _version@, ax ; DOS-Versions-Nr. speichern
- mov _psp@, es ; Program Segment Prefix (PSP)-Adresse speichern
- mov _envseg@, bx ; Environment-Segmentadresse speichern
- mov word ptr _heaptop@ + 2, bp
- ;
- ; Sichern von einigen Interrupt-Vektoren und Installieren eines
- ; Standard-Handlers zur Behandlung von "Division durch 0"
-
- call SaveVectors
-
- ; Ermitteln de Anzahl der Environment-Variablen und Brechnen der
- ; Größe. Jede Variable endet mit 0 und eine Variable mit Länge 0
- ; beendet das Environment. Das Environment kann unter keinen
- ; Umständen größer als 32 kB werden.
-
- les di, dword ptr _envLng@
- mov ax, di
- mov bx, ax
- mov cx, 07FFFh ; Environment kann nicht größer als 32 kB werden
- cld
- @@EnvLoop:
- repnz scasb
- jcxz InitFailed ; Ungültiges Environment !!!
- inc bx ; BX = Anzahl der Environment-Variablen
- cmp es:[di], al
- jne @@EnvLoop ; nächste Variable ...
- or ch, 10000000b
- neg cx
- mov _envLng@, cx ; Größe des Envrionments sichern
- mov cx, dPtrSize / 2
- shl bx, cl
- add bx, dPtrSize * 4
- and bx, not ((dPtrSize * 4) - 1)
- mov _envSize@, bx ; Anzahl der Environment-Variablen sichern
-
- ; Ermitteln des benötigten Speichers
-
- IF LDATA
- mov dx, ss
- sub bp, dx ; BP = verbleibende Größe in Paragraphen
- IFDEF __HUGE__
- mov di, seg __stklen
- mov es, di
- mov di, es:__stklen ; DI = Angeforderte Stackgröße
- ELSE
- mov di, __stklen ; DI = Angeforderte Stackgröße
- ENDIF
- ;
- ; Überprüfung, ob der angeforderte Stack mindestens MINSTACK Wörter groß ist
- ;
- cmp di, 2*MINSTACK ; ist der angeforderte Stack groß genug ?
- jae AskedStackOK
- mov di, 2*MINSTACK ; nein --> minimalen Wert benutzen
- IFDEF __HUGE__
- mov es:__stklen, di ; angeforderte Stackgröße überschreiben
- ELSE
- mov __stklen, di ; angeforderte Stackgröße überschreiben
- ENDIF
- AskedStackOK label near
- mov cl, 4
- shr di, cl ; $$$ CL darf nicht zerstört werden $$$
- inc di
- cmp bp, di ; DI = Stack-Größe in Paragraphen
- jnb ExcessOfMemory ; Speicher reicht locker aus ...
- ELSE
- mov dx, ds
- sub bp, dx ; BP = verbleibende Größe in Paragraphen
- mov di, __stklen ; DI = angeforderte Stack-Größe
- ;
- ;
- ; Überprüfung, ob der angeforderte Stack mindestens MINSTACK Wörter groß ist
- ;
- cmp di, 2*MINSTACK ; ist der angeforderte Stack groß genug ?
- jae AskedStackOK
- mov di, 2*MINSTACK ; nein --> minimalen Wert benutzen
- mov __stklen, di ; angeforderte Stackgröße überschreiben
- AskedStackOK label near
- add di, offset DGROUP: edata@
- jb InitFailed ; Datensegment darf nicht > 64 kB werden
- add di, __heaplen
- jb InitFailed ; Datensegment darf nicht > 64 kB werden
- mov cl, 4
- shr di, cl ; $$$ CL darf nicht zerstört werden $$$
- inc di ; DI = DS Größe in Paragraphen
- cmp bp, di
- jb InitFailed ; Nicht genügend Speicher
- cmp __stklen, 0
- je ExpandDS ; DS bis auf 64 kB erweitern
- cmp __heaplen, 0
- jne ExcessOfMemory ; Speicher reicht locker aus ...
- ExpandDS label near
- mov di, 1000h
- cmp bp, di
- ja ExcessOfMemory ;Genügend Speicher, um das Programm ablaufen zu lassen
- mov di, bp
- jmp short ExcessOfMemory ; Genügend Speicher, um das Programm ablaufen zu lassen
- ENDIF
-
- ; Alle Initialisierungsfehler kommen hier an
-
- InitFailed label near
- jmp near ptr _abort
-
-
- ; Rückgabe des überflüssigen Speichers an DOS
- ; Startadresse des Far Heaps und Zeiger setzen
-
- ExcessOfMemory label near
- mov bx, di
- add bx, dx
- mov word ptr _heapbase@ + 2, bx
- mov word ptr _brklvl@ + 2, bx
- mov ax, _psp@
- sub bx, ax ; BX = Anzahl der Paragraphen die behaltenw erden sollen
- mov es, ax ; ES = Adresse des Program Segment Prefix(PSP)
- mov ah, 04Ah
- push di ; DI sichern
- int 021h ; dieser Aufruf zerstört SI,DI,BP !!!!!!
- pop di ; DI restaurieren
-
- shl di, cl ; $$$ CX besitzt immer noch den Wert 4 $$$
-
- cli ; erforderlich für 8086/88-CPU'S
- ; die vor 1983 hergestellt wurden
- mov ss, dx ; Programm-Stack einrichten
- mov sp, di
- IF LDATA
- mov __stklen, di ; Stack-Größe sichern
- ENDIF
- sti
-
- IFNDEF __HUGE__
-
- ; Den nicht-initialisierten Datenbereich mit 0 vorbelegen
-
- xor ax, ax
- mov es, cs:DGROUP@@
- mov di, offset DGROUP: bdata@
- mov cx, offset DGROUP: edata@
- sub cx, di
- cld
- rep stosb
- ENDIF
-
- ; Kommandozeilen-Parameter vorbereiten
-
- mov ah, 0
- int 1ah ; aktuelle BIOS-Zeit in "Ticks" ermitteln
- mov word ptr _StartTime@,dx ; für die Funktion clock() sichern
- mov word ptr _StartTime@+2,cx
-
- xor bp,bp ; BP für den Overlay Manager auf 0 setzen
-
- IFNDEF __TINY__
- mov ax,IGROUP
- mov ds,ax
- mov si,offset IGROUP:InitStart ;si = Anfang der Tabelle
- mov di,offset IGROUP:InitEnd ;di = Ende der Tabelle
- ELSE
- mov si,offset DGROUP:InitStart ;si = Anfang der Tabelle
- mov di,offset DGROUP:InitEnd ;di = Ende der Tabelle
- ENDIF
- call StartExit
- mov ds, cs:DGROUP@@
-
- ; ExitCode = main(argc,argv,envp);
-
- IF LDATA
- push word ptr __C0environ+2
- push word ptr __C0environ
- push word ptr __C0argv+2
- push word ptr __C0argv
- ELSE
- push word ptr __C0environ
- push word ptr __C0argv
- ENDIF
- push __C0argc
- call _main
-
- ; Um Platz zu sparen, benutzen wir hier selbstmodifizierenden Code
- ; Die JA-Anweisungen der Startup-/Exit-Logik werden durch die JB-Anweisung
- ; ersetzt. Dies erlaubt uns, die Tabelle der auszuführenden Funktionen
- ; in der umgekehrten Reihenfolge zu durchsuchen. Außerdem wird die
- ; Konstante, die bei der ersten Anweisung in ah gespeichert wird,
- ; auf 0 geändert.
-
- mov byte ptr cs:JA_JB,72h
- mov byte ptr cs:StartExit+1,0
-
- ; Puffer aller Streams und Dateien leeren und schließen
-
- push ax
- call _exit
-
- ;---------------------------------------------------------------------------
- ; _exit()
- ;
- ; Restaurieren der Interrupt-Vektore, die während des Startup-Codes
- ; gesichert wurden. signal()-Funktionen könnten die Interrupt-
- ; Vektoren 0, 4, 5 oder sechs geändert haben.
- ;
- ; Überprüfung auf NULL pointer-Fehler.
- ;
- ; Rückkehr nach DOS.
- ;
- ; Hinweis: _exit schließt keine Dateien und führt auch keinerlei
- ; benutzerdefinierte exit-Funktionen aus. Dies ist lediglich
- ; ein minimaler Ausstieg (Aufräumen und Beenden).
-
- ;---------------------------------------------------------------------------
- __exitclean PROC NEAR
- PUBLIC __exitclean
- IFNDEF __TINY__
- mov ax,EGROUP
- mov ds,ax
- mov si,offset EGROUP:ExitStart
- mov di,offset EGROUP:ExitEnd
- ELSE
- mov si,offset DGROUP:ExitStart
- mov di,offset DGROUP:ExitEnd
- ENDIF
- call StartExit
-
- mov ds, cs:DGROUP@@
- IF LPROG
- call dword ptr [__exitbuf]
- call dword ptr [__exitfopen]
- call dword ptr [__exitopen]
- push ax ;Stack bereinigen, so daß der Rückgabewert
- ;für DOS an der "richtigen" Stelle steht
- ELSE
- call word ptr [__exitbuf]
- call word ptr [__exitfopen]
- call word ptr [__exitopen]
- ENDIF
- ENDP
-
- __exit PROC DIST
- PUBLIC __exit
- mov ds, cs:DGROUP@@
-
- call DIST ptr __restorezero ; Interrupt-Vektoren restaurieren
-
- IF LDATA EQ false
- IFNDEF __TINY__
-
- ; Vor dem Beenden auf NULL-Pointer überprüfen
-
- xor ax, ax
- mov si, ax
- mov cx, lgth_CopyRight
- ComputeChecksum label near
- add al, [si]
- adc ah, 0
- inc si
- loop ComputeChecksum
- sub ax, CheckSum
- jz ExitToDOS
- mov cx, lgth_NullCheck
- mov dx, offset DGROUP: NullCheck
- call ErrorDisplay
- ENDIF
- ENDIF
-
- ; Rückkehr nach DOS
-
- ExitToDOS label near
- mov bp,sp
- mov ah,4Ch
- mov al,[bp+cPtrSize]
- int 21h ; Rückkehr nach DOS
- ENDP
- STARTX ENDP
-
- SUBTTL Sichern/Restaurieren der Vektoren und Handler für "Division durch 0"
- PAGE
- ;[]------------------------------------------------------------[]
- ;| |
- ;| Sichern/Restaurieren der Interruptvektoren und Handler für |
- ;| die Division durch 0 |
- ;| |
- ;[]------------------------------------------------------------[]
-
- ZeroDivision PROC FAR
- mov cx, lgth_ZeroDivMSG
- mov dx, offset DGROUP: ZeroDivMSG
- jmp MsgExit3
- ZeroDivision ENDP
-
- ;--------------------------------------------------------------------------
- ; savevectors()
- ;
- ; Sichern der Interrupt-Vektoren 0, 4, 5 & 6. Dies wird benötigt,
- ; da die Funktion signal() diese Vektoren während der Laufzeit
- ; verändern kann.
- ;--------------------------------------------------------------------------
- SaveVectors PROC NEAR
- push ds
- ; INT 0 sichern
- mov ax, 3500h
- int 021h
- mov word ptr _Int0Vector@, bx
- mov word ptr _Int0Vector@+2, es
- ; INT 4 sichern
- mov ax, 3504h
- int 021h
- mov word ptr _Int4Vector@, bx
- mov word ptr _Int4Vector@+2, es
- ; INT 5 sichern
- mov ax, 3505h
- int 021h
- mov word ptr _Int5Vector@, bx
- mov word ptr _Int5Vector@+2, es
- ; INT 6 sichern
- mov ax, 3506h
- int 021h
- mov word ptr _Int6Vector@, bx
- mov word ptr _Int6Vector@+2, es
- ;
- ; Default-Handler für "Division durch 0" installieren.
- ;
- mov ax, 2500h
- mov dx, cs
- mov ds, dx
- mov dx, offset ZeroDivision
- int 21h
-
- pop ds
- ret
- SaveVectors ENDP
-
- ;--------------------------------------------------------------------------
- ; restorezero() restauriert alle Interrupt-Vektoren, die
- ; SaveVectors gesichert hat.
- ;
- ; Achtung : Bei speicherresidenten Programmen (TSR) muß beachtet werden, daß
- ; signal()-Funkionen abgeschaltet werden, falls die Funktion keep()
- ; aufgerufen wird.
-
- ; Falls ein TSR-Programm diese Funktionen benutzen will, wenn es
- ; aktiviert ist, dann muß es diese Interrupt-Vektoren bei Aktivierung und
- ; Deaktivierung selbst sichern bzw. restaurieren
-
- ;--------------------------------------------------------------------------
- __restorezero PROC DIST
- PUBLIC __restorezero
- IFDEF __HUGE__
- push ds
- mov ds, cs: DGROUP@@
- ENDIF
- push ds
- mov ax, 2500h
- lds dx, _Int0Vector@
- int 21h
- pop ds
-
- push ds
- mov ax, 2504h
- lds dx, _Int4Vector@
- int 21h
- pop ds
-
- push ds
- mov ax, 2505h
- lds dx, _Int5Vector@
- int 21h
- pop ds
-
- IFNDEF __HUGE__
- push ds
- ENDIF
- mov ax, 2506h
- lds dx, _Int6Vector@
- int 21h
- pop ds
-
- ret
- ENDP
-
- ;------------------------------------------------------------------
- ; Schleife durch eine Startup-/Exit-Tabelle (SE-Tabelle), die
- ; die Funktionen in der Reihenfolge ihrer Priorität aufruft.
-
- ; DS:SI muß auf den Beginn der SE-Tabelle zeigen
- ; DS:DI muß auf das Ende der SE-Tabelle zeigen
- ; Die ersten 64 Prioritäten sind von Borland reserviert
- ;------------------------------------------------------------------
- PNEAR EQU 0
- PFAR EQU 1
- NOTUSED EQU 0ffh
-
- SE STRUC
- calltype db ? ; 0=near,1=far,ff=unbenutzt
- priority db ? ; 0=höchste,ff=niedrigste
- addrlow dw ?
- addrhigh dw ?
- SE ENDS
-
- StartExit PROC NEAR
- @@Start: mov ah,0ffh ; beginnen wir mit der niedrigsten Priorität
- mov dx,di ; dx auf Ende der Tabelle setzen
- mov bx,si ; bx = Anfang der Tabelle
-
- @@TopOfTable: cmp bx,di ; Tabellenende erreicht ?
- je @@EndOfTable ; ja, Schleife beenden
- cmp [bx.calltype],NOTUSED ; Aufruftyp überprüfen
- je @@Next
- cmp [bx.priority],ah ; Priorität überprüfen
- JA_JB: ja @@Next ; zu hoch ? überspringen
- mov ah,[bx.priority] ; Priorität beibehalten
- mov dx,bx ; Index in dx beibehalten
- @@Next: add bx,SIZE SE ; bx = nächster Tabelleneintrag
- jmp @@TopOfTable
-
- @@EndOfTable: cmp dx,di ; Tabellenende erreicht ?
- je @@Done ; Ja, Beenden
- mov bx,dx ; bx = höchste Priorität
- push ds ; ds sichern
- pop es
- push es ; es = ds
- cmp [bx.calltype],PNEAR ; near oder far ?
- mov [bx.calltype],NOTUSED ; Aufruftyp überschreiben
- mov ds, cs:DGROUP@@
- je @@NearCall
-
- @@FarCall: call DWORD PTR es:[bx.addrlow]
- pop ds ; ds restaurieren
- jmp @@Start
-
- @@NearCall: call WORD PTR es:[bx.addrlow]
- pop ds ; ds restaurieren
- jmp @@Start
-
- @@Done: ret
- StartExit ENDP
-
- ErrorDisplay PROC NEAR
- mov ah, 040h
- mov bx, 2
- int 021h
- ret
- ErrorDisplay ENDP
-
- _abort PROC DIST
- PUBLIC _abort
- mov cx, lgth_abortMSG
- mov dx, offset DGROUP: abortMSG
- MsgExit3 label near
- mov ds, cs: DGROUP@@
- call ErrorDisplay
- CallExit3 label near
- mov ax, 3
- push ax
- call __exit ; _exit(3);
- ENDP
-
- ; die DGROUP@-Variable wird benutzt, um DS mit DGROUP zu laden
-
- PubSym@ DGROUP@, <dw ?>, __PASCAL__
-
- ; __MMODEL wird benutzt, um das Speichermodell oder den voreingestellten
- ; Zeigertyp zur Laufzeit zu ermitteln
-
- public __MMODEL
- __MMODEL dw MMODEL
-
- ENDS
-
- SUBTTL Start Up Datenbereich
- PAGE
- ;[]------------------------------------------------------------[]
- ;| Start Up Datenbereich |
- ;| |
- ;| WARNUNG Verschieben Sie keine Variablen im |
- ;| Datensegment, wenn Sie nicht völlig |
- ;| sicher sind, daß dies ungefährlich ist. |
- ;[]------------------------------------------------------------[]
-
- _DATA SEGMENT
-
- ; "Magisches" Symbol, das von den Debug-Infos benutzt wird, um das
- ; Datensegment zu lokalisieren
- public DATASEG@
- DATASEG@ label byte
-
- ; Der CopyRight-String darf unter keinen Umständen geändert oder
- ; verschoben werden, ohne gleichzeitig die Überprüfungs-Routine
- ; für NULL-Pointer zu verändern
-
- CopyRight db 4 dup(0)
- db 'Turbo C++ - Copyright 1990 Borland Intl.',0
- lgth_CopyRight equ $ - CopyRight
-
- IF LDATA EQ false
- IFNDEF __TINY__
- CheckSum equ 00CA5h
- NullCheck db 'Null pointer assignment', 13, 10
- lgth_NullCheck equ $ - NullCheck
- ENDIF
- ENDIF
-
- ZeroDivMSG db 'Divide error', 13, 10
- lgth_ZeroDivMSG equ $ - ZeroDivMSG
-
- abortMSG db 'Abnormal program termination', 13, 10
- lgth_abortMSG equ $ - abortMSG
-
- ;
- ; Hier werden die Interrupt-Vektoren gesichert
- ;
- ; Die Interrupt-Vektoren 0,4,5 & 6 werden beim Programmstart gesichert
- ; und restauriert, wenn das Programm beendet wird. Die Funktion
- ; signal() könnte diese Vektoren während des Programmlaufes verändern
- ;
- ; Hinweis : Dieser Speicherbereich für die Interrupt-Vektoren darf
- ; nicht verändert werden, wenn nicht gleichzeitig die
- ; Sicherungs-/Restaurierungs-Logik geändert wird.
-
- PubSym@ _Int0Vector <dd 0>, __CDECL__
- PubSym@ _Int4Vector <dd 0>, __CDECL__
- PubSym@ _Int5Vector <dd 0>, __CDECL__
- PubSym@ _Int6Vector <dd 0>, __CDECL__
- ;
- ; Verschiedene Variablen
- ;
- PubSym@ _C0argc, <dw 0>, __CDECL__
- dPtrPub@ _C0argv, 0, __CDECL__
- dPtrPub@ _C0environ, 0, __CDECL__
- PubSym@ _envLng, <dw 0>, __CDECL__
- PubSym@ _envseg, <dw 0>, __CDECL__
- PubSym@ _envSize, <dw 0>, __CDECL__
- PubSym@ _psp, <dw 0>, __CDECL__
- PubSym@ _version, <label word>, __CDECL__
- PubSym@ _osmajor, <db 0>, __CDECL__
- PubSym@ _osminor, <db 0>, __CDECL__
- PubSym@ errno, <dw 0>, __CDECL__
- PubSym@ _StartTime, <dw 0,0>, __CDECL__
-
-
- ; Variable zur Speicherverwaltung
-
- IF LDATA EQ false
- PubSym@ __heapbase, <dw DGROUP:edata@>, __CDECL__
- PubSym@ __brklvl, <dw DGROUP:edata@>, __CDECL__
- ENDIF
- PubSym@ _heapbase, <dd 0>, __CDECL__
- PubSym@ _brklvl, <dd 0>, __CDECL__
- PubSym@ _heaptop, <dd 0>, __CDECL__
-
- ENDS
-
- _CVTSEG SEGMENT
- PubSym@ _RealCvtVector, <label word>, __CDECL__
- ENDS
-
- _SCNSEG SEGMENT
- PubSym@ _ScanTodVector, <label word>, __CDECL__
- ENDS
-
- IFNDEF __HUGE__
- _BSS SEGMENT
- bdata@ label byte
- ENDS
-
- _BSSEND SEGMENT
- edata@ label byte
- ENDS
- ENDIF
-
- IFNDEF __TINY__
- _STACK SEGMENT
- db 128 dup(?) ;minimale Stack-Größe
- ENDS
- ENDIF
- END STARTX