home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / tc20 / c0.asm < prev    next >
Assembly Source File  |  1988-10-13  |  22KB  |  679 lines

  1.         NAME    c0
  2.         PAGE    60,132
  3. ;[]------------------------------------------------------------[]
  4. ;|      C0.ASM -- Start Up Code                                 |
  5. ;|                                                              |
  6. ;|      Turbo-C Run Time Library        version 2.0             |
  7. ;|                                                              |
  8. ;|      Copyright (c) 1988 by Borland International Inc.        |
  9. ;|      All Rights Reserved.                                    |
  10. ;[]------------------------------------------------------------[]
  11.  
  12.         INCLUDE RULES.ASI
  13.  
  14. _Strict87_    equ    false        ; Der Emulator simuliert nicht
  15.                     ; alle Details des 8087
  16.  
  17. ;       Segment- und Group-Deklarationen
  18.  
  19. _TEXT   SEGMENT BYTE PUBLIC 'CODE'
  20. _TEXT   ENDS
  21. _DATA   SEGMENT PARA PUBLIC 'DATA'
  22. _DATA   ENDS
  23. IFNDEF  __NOFLOAT__
  24. _EMUSEG SEGMENT WORD COMMON 'DATA'
  25. _EMUSEG ENDS
  26. ENDIF
  27. _CRTSEG SEGMENT WORD COMMON 'DATA'
  28. _CRTSEG ENDS
  29. _CVTSEG SEGMENT WORD PUBLIC 'DATA'
  30. _CVTSEG ENDS
  31. _SCNSEG SEGMENT WORD PUBLIC 'DATA'
  32. _SCNSEG ENDS
  33. IFNDEF __HUGE__
  34. _BSS    SEGMENT WORD PUBLIC 'BSS'
  35. _BSS    ENDS
  36. _BSSEND SEGMENT BYTE PUBLIC 'STACK'
  37. _BSSEND ENDS
  38. ENDIF
  39. IFNDEF __TINY__
  40. _STACK  SEGMENT STACK 'STACK'
  41. _STACK  ENDS
  42. ENDIF
  43.  
  44. IFNDEF  __NOFLOAT__
  45.  
  46. IF      LDATA
  47. IFNDEF __HUGE__
  48. DGROUP  GROUP   _DATA, _EMUSEG, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  49. ELSE
  50. DGROUP  GROUP   _DATA, _EMUSEG, _CRTSEG, _CVTSEG, _SCNSEG
  51. ENDIF
  52. ELSE
  53. IFNDEF  __TINY__
  54. DGROUP  GROUP   _DATA, _EMUSEG, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  55. ELSE
  56. DGROUP  GROUP   _TEXT, _DATA, _EMUSEG, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  57. ENDIF
  58. ENDIF
  59.  
  60. ELSE
  61.  
  62. IF      LDATA
  63. IFNDEF __HUGE__
  64. DGROUP  GROUP   _DATA, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  65. ELSE
  66. DGROUP  GROUP   _DATA, _CRTSEG, _CVTSEG, _SCNSEG
  67. ENDIF
  68. ELSE
  69. IFNDEF  __TINY__
  70. DGROUP  GROUP   _DATA, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  71. ELSE
  72. DGROUP  GROUP   _TEXT, _DATA, _CRTSEG, _CVTSEG, _SCNSEG, _BSS, _BSSEND
  73. ENDIF
  74. ENDIF
  75.  
  76. ENDIF
  77.  
  78.         ASSUME  CS:_TEXT, DS:DGROUP
  79.  
  80. ;       Extern-Bezüge
  81.  
  82. ExtProc@        main,   __CDECL__
  83. ExtProc@        _setargv, __CDECL__
  84. ExtProc@        _setenvp, __CDECL__
  85. ExtProc@        exit,   __CDECL__
  86.  
  87. IF      LDATA EQ false
  88. ExtSym@ _heaplen, WORD,  __CDECL__
  89. ENDIF
  90. ExtSym@ _stklen,  WORD,  __CDECL__
  91.  
  92.         SUBTTL  Start Up Code
  93.         PAGE
  94. ;/*                                                     */
  95. ;/*-----------------------------------------------------*/
  96. ;/*                                                     */
  97. ;/*     Startcode                                       */
  98. ;/*     ---------                                       */
  99. ;/*                                                     */
  100. ;/*-----------------------------------------------------*/
  101. ;/*                                                     */
  102. PSPHigh         equ     00002h
  103. PSPEnv          equ     0002ch
  104. PSPCmd          equ     00080h
  105.  
  106. IFDEF    __NOFLOAT__
  107.     MINSTACK    equ    128    ; Minimal-Stackgröße 0x100 Bytes
  108. ELSE
  109.     MINSTACK    equ    256    ; Minimal-Stackgröße 0x200 Bytes
  110. ENDIF
  111. ;
  112. ;       Beim Start des Programms zeigen ES und DS auf das PSP.
  113. ;       SS zeigt auf das Stacksegment (außer im Modell TINY - dort
  114. ;       sind Stack- und Codesegment identisch)
  115. ;
  116. _TEXT   SEGMENT
  117. IFDEF   __TINY__
  118.         ORG     100h
  119. ENDIF
  120. STARTX          PROC    NEAR
  121. ;       Sichern allgemeiner Informationen, wie:
  122. ;               DGROUP-Segmentadresse
  123. ;               DOS-Versionsnummer
  124. ;               Programmsegment-Präfix
  125. ;               Environment-Startadresse
  126. ;               Obergrenze des Speichers
  127.  
  128. IFDEF   __TINY__
  129.         mov     dx, cs          ; DX = GROUP-Segmentadresse
  130. ELSE
  131.         mov     dx, DGROUP      ; DX = GROUP-Segmentadresse
  132. ENDIF
  133.         mov     cs:DGROUP@@, dx
  134.  
  135.         mov     ah, 30h         ; "Get Version Number"
  136.                 int     21h
  137.         mov     bp, ds:[PSPHigh]; RamTop -> BP
  138.         mov     bx, ds:[PSPEnv] ; Environment-Segmentadresse -> BX
  139.         mov     ds, dx          ; DS auf _DATA (bzw. CS für TINY)
  140.  
  141.         mov     _version@, ax   ; DOS-Version -> globale Variable
  142.         mov     _psp@, es       ; Programmsegment-Präfix
  143.         mov     _envseg@, bx    ; Environment-Segmentadresse
  144.                 mov     word ptr _heaptop@ + 2, bp
  145.                 mov     _8087@, -1
  146. ;
  147. ;       Speichern diverser Interrupt-Vektoren (incl. Division durch 0)
  148. ;
  149.         call    SaveVectors     ; INT-Vektoren 0, 4..6
  150.  
  151. ;       Suche nach einer Environment-Variablen '87'. In dieser Schleife
  152. ;       wird gleichzeitig die Anzahl der Einträge und der gesamte Platz-
  153. ;       bedarf des Environments bestimmt-
  154. ;       Jeder Eintrag wird mit einem NUL-Zeichen beendet; ein Eintrag
  155. ;       der Länge 0 markiert das Tabellenende. Die gesamte Tabelle kann
  156. ;       NICHT größer als 32 KByte sein.
  157.  
  158.         les     di, dword ptr _envLng@ ; _envseg:0000
  159.         mov     ax, di          ; = 00
  160.         mov     bx, ax          ; Eintragszähler = 0
  161.         mov     cx, 07FFFh      ; Maximalgröße: 32767 Bytes
  162. IsIt87Var       label   near
  163.         cmp     word ptr es:[di], '78' ; umgedreht: "87"
  164.         jne     GetVarLng       ; -> nächste Variable
  165.         mov     dx, es:[di+2]   ; "87" gefunden. Nächstes Zeichen '='?
  166.                 cmp     dl, '='
  167.         jne     GetVarLng
  168.         and     dh, not ' '     ; ja! -> Großbuchstaben
  169.         inc     _8087@          ; _8087 = 0
  170.         cmp     dh, 'Y'         ; folgt ein 'Y'?
  171.                 jne     GetVarLng
  172.         inc     _8087@          ; ja - _8087 = 1
  173. GetVarLng       label   near
  174.         repnz   scasb           ; Suche nach NUL-Zeichen
  175.         jcxz    InitFailed      ; Environment > 32 KByte -> Abbruch
  176.         inc     bx              ; Eintragzähler ++
  177.         cmp     es:[di], al     ; zweites NUL-Zeichen?
  178.         jne     IsIt87Var       ; nein, nächster Eintrag
  179.  
  180.         or      ch, 10000000b   ; = 32768 - CX
  181.                 neg     cx
  182.         mov     _envLng@, cx    ; Environment-Länge
  183.         mov     cx, dPtrSize / 2 ; Berechnung der Array-Größe:
  184.         shl     bx, cl          ; Eintragszahl * Zeigergröße
  185.         add     bx, dPtrSize * 4 ; < Aufrundung >
  186.                 and     bx, not ((dPtrSize * 4) - 1)
  187.         mov     _envSize@, bx   ; Anzahl Env.-Einträge
  188.  
  189. ;       Wieviel Paragraphs braucht das Programm tatsächlich von DOS?
  190.  
  191. IF      LDATA                           ; eigenes Stacksegment?
  192.         mov     dx, ss          ; ja: RamTop - Stacksegment
  193.         sub     bp, dx          ; = freier Platz
  194. IFDEF   __HUGE__
  195.                 mov     di, seg _stklen@
  196.                 mov     es, di
  197.         mov     di, es:_stklen@ ; _stklen -> DI
  198. ELSE
  199.         mov     di, _stklen@    ; dito für COMPACT & LARGE
  200. ENDIF
  201. ;
  202. ; LDATA: Stackgröße nach unten auf MINSTACK begrenzen
  203. ;
  204.         cmp     di, 2*MINSTACK  ; _stklen >= MINSTACK (0x200 Bytes)?
  205.                 jae     AskedStackOK
  206.         mov     di, 2*MINSTACK  ; nein, 0x0200 Bytes einsetzen
  207. IFDEF   __HUGE__
  208.         mov     es:_stklen@, di ; und _stklen neu setzen
  209. ELSE
  210.         mov        _stklen@, di ; dito für COMPACT & LARGE
  211. ENDIF
  212. AskedStackOK    label   near
  213.         mov     cl, 4
  214.         shr     di, cl          ; Stackgröße -> Paragraphs
  215.         inc     di              ; (Aufrundung)
  216.         cmp     bp, di          ; freier Platz > Stackgröße?
  217.         jnb     ExcessOfMemory  ; ja
  218.  
  219. ELSE                                    ; kein eigenes Stacksegment
  220.                 mov     dx, ds
  221.         sub     bp, dx          ; RamTop - DS -> freier Platz
  222.         mov     di, _stklen@    ; _stklen -> DI
  223. ;
  224. ; SMALL DATA: Stackgröße nach unten auf MINSTACK begrenzen
  225. ;
  226.         cmp     di, 2*MINSTACK  ; _stklen >= MINSTACK (0x0200 Bytes)?
  227.                 jae     AskedStackOK
  228.         mov     di, 2*MINSTACK  ; nein, 0x0200 Bytes einsetzen
  229.         mov     _stklen@, di    ; und neuer Wert für _stklen
  230.  
  231. AskedStackOK    label   near
  232.         add     di, offset DGROUP: edata@  ; DS-Ende (= _BSSEND)
  233.         jb      InitFailed      ; Oha! DSeg > 64 KBytes
  234.         add     di, _heaplen@   ; + Heapgröße
  235.         jb      InitFailed      ; -> 64 KBytes
  236.                 mov     cl, 4
  237.         shr     di, cl          ; Umrechnung in Paragraphs
  238.         inc     di              ; (Aufrundung)
  239.                 cmp     bp, di
  240.         jb      InitFailed      ; Nicht genug Speicher!
  241.  
  242.         cmp     _stklen@, 0     ; (?? ("never"))
  243.         je      ExpandDS
  244.         cmp     _heaplen@, 0    ; Standardvorgabe für _heaplen?
  245.         jne     ExcessOfMemory  ; nein - berechnete Größe setzen
  246.  
  247. ExpandDS        label   near
  248.         mov     di, 1000h       ; Vergrößerung DS auf 64 KByte
  249.         cmp     bp, di          ; immer noch genug Platz?
  250.         ja      ExcessOfMemory  ; -> ja
  251.         mov     di, bp          ; nein, Begrenzung
  252.         jmp     short ExcessOfMemory
  253. ENDIF
  254.  
  255. ;       Alle Initialisierungsfehler führen zu einem Sprung hierher
  256.  
  257. InitFailed      label   near
  258.                 jmp     near ptr abort@
  259.  
  260. ;       Rückgabe der nicht benötigten Segmente an DOS
  261. ;       Setzen des "Far Heap"-Beginns
  262.  
  263. ExcessOfMemory  label   near
  264.         mov     bx, di          ; Größe von Daten- bzw. Stacksegment
  265.         add     bx, dx          ; + Datensegment bzw. Stacksegment
  266.         mov     word ptr _heapbase@ + 2, bx   ; => Beginn des FAR HEAP
  267.         mov     word ptr _brklvl@ + 2, bx  ; => 1. freie Speicherzelle
  268.         mov     ax, _psp@       ; Programmstart
  269.         sub     bx, ax          ; Prog-Endadresse - PSP = Prog-Größe
  270.         mov     es, ax          ; PSP -> ES (Beginn des Speicherblocks)
  271.         mov     ah, 04Ah        ; "Modify allocated memory"
  272.         push    di              ;
  273.         int     021h       ; this call clobbers SI,DI,BP !!!!!!
  274.         pop     di
  275. ;
  276. ;    Setzen des Programmstacks. Falls wir hier in der Mitte unterbrochen
  277. ;       würden, wären die Ergebnisse katastrophal - deshalb werden Interrupts
  278. ;       zeitweilig unterdrückt.
  279. ;
  280.         shl     di, cl          ; CL enthält immer noch den Wert 4
  281.  
  282.         cli
  283.         mov     ss, dx          ; IF LDATA: DX=_STACK ELSE DX=_DATA
  284.         mov     sp, di          ; DI = Stack-Ende
  285.         sti
  286.  
  287. IFNDEF  __HUGE__
  288.  
  289. ;       Uninitialisierte Daten ("_BSS") auf 0
  290.  
  291.                 xor     ax, ax
  292.         mov     es, cs:DGROUP@@    ; Ziel-Segment: _DATA
  293.         mov     di, offset DGROUP: bdata@ ; Start: _BSS
  294.         mov     cx, offset DGROUP: edata@ ; Ende: _BSSEND
  295.                 sub     cx, di
  296.         rep     stosb              ; _BSS-Inhalt auf 0
  297. ENDIF
  298.  
  299. IFNDEF  __NOFLOAT__
  300.  
  301. ;       Initialisierung des Emulators
  302.  
  303.         push    cs              ; Routine _emu1st endet mit RETF
  304.                 call    ds:[__emu1st]
  305. ENDIF
  306.  
  307. ;       Vorbereitung der Argumente von main()
  308.  
  309.         call    _setargv@       ; PSP.CmdLine -> argv[]
  310.         call    _setenvp@       ; Environment -> envp[]
  311.  
  312.                 mov    ah, 0
  313.         int    1ah            ; "BIOS-Ticks"
  314.         mov    word ptr _StartTime@,dx    ; speichern für clock()
  315.                 mov    word ptr _StartTime@+2,cx
  316.  
  317. IFNDEF  __OLDCONIO__
  318. IF      LPROG
  319.         push    cs              ; in den Modellen MEDIUM, LARGE und
  320.                     ; HUGE endet _c0crtinit mit RETF
  321. ENDIF
  322.         call    ds:[__crt1st]   ; Initialisierung von conio
  323. ENDIF
  324.  
  325. ;       ExitCode = main(argc,argv,envp);
  326.  
  327. IF      LDATA
  328.         push    word ptr environ@+2  ; envp und argv als FAR-Zeiger
  329.                 push    word ptr environ@
  330.         push    word ptr _argv@+2    ; auf den Stack
  331.                 push    word ptr _argv@
  332. ELSE
  333.         push    word ptr environ@    ; sonst als NEAR-Zeiger
  334.                 push    word ptr _argv@
  335. ENDIF
  336.         push    _argc@               ; argc als letztes
  337.         call    main@
  338.  
  339. ;       Programmende
  340.  
  341.         push    ax                   ; Ergebnis von main()
  342.         call    exit@                ; "Aufruf" von exit()
  343.  
  344. ;---------------------------------------------------------------------------
  345. ;    _exit()
  346. ;
  347. ;       Zurücksetzen der INT-Vektoren 0, 4..6 (von signal())
  348. ;
  349. ;    Prüfung auf NULL-Zeiger
  350. ;
  351. ;    Rücksprung zu DOS
  352. ;
  353. ;HINWEIS: exit() schließt keine offenen Dateien!
  354. ;---------------------------------------------------------------------------
  355. PubProc@        _exit,  __CDECL__
  356.                 mov     ds, cs:DGROUP@@
  357.  
  358. IF      LPROG
  359.         call    far ptr _restorezero@    ; INT-Vektoren zurück
  360. ELSE
  361.         call    near ptr _restorezero@  ; dito für kleine Codemodelle
  362. ENDIF
  363.  
  364. IFNDEF  __NOFLOAT__
  365.  
  366. ;       Emulator-Vektoren zurück
  367.  
  368.         push    cs              ; _emuLast endet immer mit RETF
  369.                 call    ds:[__emuLast]
  370. ENDIF
  371.  
  372. IF      LDATA EQ false
  373. IFNDEF  __TINY__
  374.  
  375. ;       Prüfung auf NULL-Zeiger
  376.  
  377.                 xor     ax, ax
  378.                 mov     si, ax
  379.                 mov     cx, lgth_CopyRight
  380.                 cld
  381. ComputeChecksum label   near            ; Aufaddieren von
  382.         add     al, [si]        ; "Turbo-C Copyright Borland..."
  383.                 adc     ah, 0
  384.                 inc     si
  385.                 loop    ComputeChecksum
  386.                 sub     ax, CheckSum
  387.         jz      ExitToDOS       ; Copyright unverändert
  388.                 mov     cx, lgth_NullCheck
  389.                 mov     dx, offset DGROUP: NullCheck
  390.         call    ErrorDisplay    ; "Null pointer assignment"
  391. ENDIF
  392. ENDIF
  393.  
  394. ;       Rücksprung zu DOS
  395.  
  396. ExitToDOS       label   near
  397.         mov     bp,sp
  398.         mov     ah,4Ch           ; DOS-Funktionsnummer: Terminate
  399.         mov     al,[bp+cPtrSize] ; <- Ergebnis von main()
  400.         int     21h              ; "Terminate Process"
  401. EndProc@        _exit, __CDECL__
  402. STARTX          ENDP
  403.  
  404.         SUBTTL  Vector save/restore & default Zero divide routines
  405.         PAGE
  406. ;[]------------------------------------------------------------[]
  407. ;|                                                              |
  408. ;| Speichern/Zurücksetzen von Interrupt-vektoren und die        |
  409. ;| Standard-Behandlungsroutine für Divisionen durch Null        |
  410. ;|                                                              |
  411. ;[]------------------------------------------------------------[]
  412.  
  413. ZeroDivision    PROC    FAR
  414.                 mov     cx, lgth_ZeroDivMSG
  415.                 mov     dx, offset DGROUP: ZeroDivMSG
  416.                 jmp     MsgExit3
  417. ZeroDivision    ENDP
  418.  
  419. ;--------------------------------------------------------------------------
  420. ;    savevectors()
  421. ;
  422. ;    Speichert die Vektoren 0, 4, 5 und 6 für die erweiterten Versionen
  423. ;    signal() und raise(), die diese Vektoren zur Laufzeit belegen können.
  424. ;--------------------------------------------------------------------------
  425. SaveVectors    PROC    NEAR
  426.                 push    ds
  427. ; Save INT 0
  428.                 mov     ax, 3500h
  429.                 int     021h
  430.                 mov     word ptr _Int0Vector@, bx
  431.                 mov     word ptr _Int0Vector@+2, es
  432. ; Save INT 4
  433.                 mov     ax, 3504h
  434.                 int     021h
  435.                 mov     word ptr _Int4Vector@, bx
  436.                 mov     word ptr _Int4Vector@+2, es
  437. ; Save INT 5
  438.                 mov     ax, 3505h
  439.                 int     021h
  440.                 mov     word ptr _Int5Vector@, bx
  441.                 mov     word ptr _Int5Vector@+2, es
  442. ; Save INT 6
  443.                 mov     ax, 3506h
  444.                 int     021h
  445.                 mov     word ptr _Int6Vector@, bx
  446.                 mov     word ptr _Int6Vector@+2, es
  447. ;
  448. ;    Installation der Standardroutine für Divisionen durch Null
  449. ;
  450.                 mov     ax, 2500h
  451.                 mov     dx, cs
  452.                 mov     ds, dx
  453.                 mov     dx, offset ZeroDivision
  454.                 int     21h
  455.  
  456.                 pop     ds
  457.                 ret
  458. SaveVectors    ENDP
  459.  
  460. ;--------------------------------------------------------------------------
  461. ;    restorezero() setzt alle Interruptvektoren auf die Originale zurück
  462. ;
  463. ;HINWEIS: TSR-Programme müssen die Vektoren 4..6 selbst speichern, wenn
  464. ;      sie signal()/raise() verwenden wollen - die entsprechenden
  465. ;      Vektoren werden von exit bzw. keep zurückgesetzt!
  466. ;--------------------------------------------------------------------------
  467. PubProc@        _restorezero, __CDECL__
  468.  
  469. IFDEF   __HUGE__
  470.                 push    ds
  471.                 mov     ds, cs: DGROUP@@
  472. ENDIF
  473.                 push    ds
  474.                 mov     ax, 2500h
  475.                 lds     dx, _Int0Vector@
  476.                 int     21h
  477.         pop    ds
  478.  
  479.         push    ds
  480.                 mov     ax, 2504h
  481.                 lds     dx, _Int4Vector@
  482.                 int     21h
  483.         pop    ds
  484.  
  485.         push    ds
  486.                 mov     ax, 2505h
  487.                 lds     dx, _Int5Vector@
  488.                 int     21h
  489.         pop    ds
  490.  
  491. IFNDEF   __HUGE__
  492.         push    ds
  493. ENDIF
  494.                 mov     ax, 2506h
  495.                 lds     dx, _Int6Vector@
  496.                 int     21h
  497.                 pop     ds
  498.  
  499.                 ret
  500. EndProc@        _restorezero, __CDECL__
  501.  
  502.         SUBTTL  Miscellaneous
  503.         PAGE
  504. ;[]------------------------------------------------------------[]
  505. ;|                                                              |
  506. ;|      Diverses                                                |
  507. ;|                                                              |
  508. ;[]------------------------------------------------------------[]
  509.  
  510. IFNDEF  __NOFLOAT__
  511. NoEmulator      PROC    FAR
  512.                 mov     _8087@, 0
  513.                 ret
  514. NoEmulator      ENDP
  515. ENDIF
  516.  
  517. IFNDEF  __OLDCONIO__
  518. Proc@           NoConsole, __CDECL__
  519.                 ret
  520. EndProc@        NoConsole, __CDECL__
  521. ENDIF
  522.  
  523. ErrorDisplay    PROC    NEAR
  524.                 mov     ah, 040h
  525.                 mov     bx, 2
  526.                 int     021h
  527.                 ret
  528. ErrorDisplay    ENDP
  529.  
  530. PubProc@        abort,  __CDECL__
  531.                 mov     cx, lgth_abortMSG
  532.                 mov     dx, offset DGROUP: abortMSG
  533. MsgExit3        label   near
  534.                 mov     ds, cs: DGROUP@@
  535.                 call    ErrorDisplay
  536. CallExit3       label   near
  537.                 mov     ax, 3
  538.                 push    ax
  539.                 call    _exit@          ; _exit(3);
  540. EndProc@        abort, __CDECL__
  541.  
  542. ;       Die Variable DGROUP@ wird ausschließlich zum Setzen von DS
  543. ;       auf das Datensegment des Programms verwendet
  544.  
  545. PubSym@ DGROUP@, <dw    ?>, __PASCAL__
  546. _TEXT   ENDS
  547.  
  548.         SUBTTL  Start Up Data Area
  549.         PAGE
  550. ;[]------------------------------------------------------------[]
  551. ;|      Datendefinitionen des Startcodes                        |
  552. ;|                                                              |
  553. ;|      WARNUNG         Veränderungen und sogar Umstellungen    |
  554. ;|                      der Deklarations-Reihenfolge können     |
  555. ;|                      hier merkwürdige Effekte zeitigen       |
  556. ;|                                                              |
  557. ;[]------------------------------------------------------------[]
  558.  
  559. _DATA   SEGMENT
  560.  
  561. ;       CopyRight *muß* an dieser Stelle definiert sein und darf
  562. ;       nicht verändert werden - sonst klappt die Prüfung via
  563. ;       exit() nicht mehr.
  564.  
  565. CopyRight       db      4 dup(0)
  566.                 db      'Turbo-C - Copyright (c) 1988 Borland Intl.',0
  567. lgth_CopyRight  equ     $ - CopyRight
  568.  
  569. IF      LDATA EQ false
  570. IFNDEF  __TINY__
  571. CheckSum        equ     00D37h
  572. NullCheck       db      'Null pointer assignment', 13, 10
  573. lgth_NullCheck  equ     $ - NullCheck
  574. ENDIF
  575. ENDIF
  576.  
  577. ZeroDivMSG      db      'Divide error', 13, 10
  578. lgth_ZeroDivMSG equ     $ - ZeroDivMSG
  579.  
  580. abortMSG        db      'Abnormal program termination', 13, 10
  581. lgth_abortMSG   equ     $ - abortMSG
  582.  
  583. ;
  584. ;            Speicherbereiche für Interrupt-Vektoren
  585. ;
  586. ;    Die Vektoren 0,4,5 & 6 werden beim Programmstart hier gespeichert,
  587. ;       zur Laufzeit von signal()/raise() verändert bzw. benutzt und und
  588. ;       via exit() wieder gesetzt.
  589. ;
  590. PubSym@         _Int0Vector    <dd     0>,             __CDECL__
  591. PubSym@         _Int4Vector    <dd     0>,             __CDECL__
  592. PubSym@         _Int5Vector    <dd     0>,             __CDECL__
  593. PubSym@         _Int6Vector    <dd     0>,             __CDECL__
  594. ;
  595. ;            Diverse Variablen
  596. ;
  597. PubSym@         _argc,          <dw     0>,             __CDECL__
  598. dPtrPub@        _argv,          0,                      __CDECL__
  599. dPtrPub@        environ,        0,                      __CDECL__
  600. PubSym@         _envLng,        <dw     0>,             __CDECL__
  601. PubSym@         _envseg,        <dw    0>,              __CDECL__
  602. PubSym@         _envSize,       <dw    0>,              __CDECL__
  603. PubSym@         _psp,           <dw    0>,              __CDECL__
  604. PubSym@         _version,       <label word>,           __CDECL__
  605. PubSym@         _osmajor,       <db    0>,              __CDECL__
  606. PubSym@         _osminor,       <db    0>,              __CDECL__
  607. PubSym@         errno,          <dw    0>,              __CDECL__
  608. PubSym@         _8087,          <dw    0>,              __CDECL__
  609. PubSym@         _StartTime,     <dw    0,0>,            __CDECL__
  610.  
  611.  
  612. ;       Speicherlayout und -verwaltung
  613.  
  614. IF      LDATA EQ false
  615. PubSym@         __heapbase,     <dw   DGROUP:edata@>,   __CDECL__
  616. PubSym@         __brklvl,       <dw   DGROUP:edata@>,   __CDECL__
  617. PubSym@         __heaptop,      <dw   DGROUP:edata@>,   __CDECL__
  618. ENDIF
  619. PubSym@         _heapbase,      <dd   0>,       __CDECL__
  620. PubSym@         _brklvl,        <dd   0>,       __CDECL__
  621. PubSym@         _heaptop,       <dd   0>,       __CDECL__
  622.  
  623. IF    LDATA EQ false
  624.     IFNDEF    __NOFLOAT__
  625. ;        Emulator-Variablen
  626.         INCLUDE    emuvars.asi
  627.     ENDIF
  628. ENDIF
  629.  
  630. _DATA   ENDS
  631.  
  632. IFNDEF  __NOFLOAT__
  633. _EMUSEG SEGMENT
  634. __emu1st        dw      NoEmulator
  635. __emuLast       dw      NoEmulator
  636. _EMUSEG ENDS
  637. ENDIF
  638.  
  639. IFNDEF  __OLDCONIO__
  640. _CRTSEG SEGMENT
  641. __crt1st        dw      NoConsole@
  642. _CRTSEG ENDS
  643. ENDIF
  644.  
  645. _CVTSEG SEGMENT
  646. PubSym@ _RealCvtVector, <label  word>,  __CDECL__
  647. _CVTSEG ENDS
  648.  
  649. _SCNSEG SEGMENT
  650. PubSym@ _ScanTodVector,  <label word>,  __CDECL__
  651. _SCNSEG ENDS
  652.  
  653. IFNDEF __HUGE__
  654. _BSS    SEGMENT
  655. bdata@  label   byte
  656. _BSS    ENDS
  657.  
  658. _BSSEND SEGMENT
  659. edata@  label   byte
  660. _BSSEND ENDS
  661. ENDIF
  662.  
  663. IFNDEF  __TINY__
  664. _STACK  SEGMENT
  665.         dw      64 dup (?)
  666.     IF    LDATA
  667.         org    0
  668.         IFNDEF    __NOFLOAT__
  669. ;                        Emulator-Variablen
  670.             INCLUDE    emuvars.asi
  671.             even
  672.         ENDIF
  673. PUBLIC        emuTop@            ; für Stack-Unterlauf-Prüfung
  674.         emuTop@    label    byte
  675.     ENDIF
  676. _STACK  ENDS
  677. ENDIF
  678.         END     STARTX
  679.