home *** CD-ROM | disk | FTP | other *** search
- page 60, 132
- name startup
- title ROM System Startup Code for Turbo C 2.0
-
- ;
- ; ROM System Startup Code for Turbo C 2.0
- ; Copyright (C) 1987, 1988, 1989 by Paradigm Systems.
- ; All rights reserved.
- ;
- ; Assemble with MASM as follows:
- ;
- ; masm tc /mx /d__MODEL__ ;
- ;
- ; where
- ; __MODEL__ is one of the following:
- ;
- ; __SMALL__ Small memory model
- ; __COMPACT__ Compact memory model
- ; __MEDIUM__ Medium memory model
- ; __LARGE__ Large memory model
- ;
- ; If no memory model is specified, the small memory
- ; model is assumed and a warning is issued.
- ;
-
- ;
- ; Segment and group declarations. The order of these
- ; declarations is used to control the order of
- ; segments in the .EXE file since the Microsoft and
- ; Borland linkers copy segments in the same order
- ; they are encountered in the object files.
- ;
- ; The default Borland model is to have the stack
- ; after the heap in the small and medium memory
- ; models. This startup assumes that the stack
- ; will follow immediately after the BSS area.
- ;
- ; Make sure that this startup module is specified
- ; first when linking the application. Requires
- ; MASM 5.10 to assemble.
- ;
-
-
- _text segment byte public 'CODE'
- _text ends
- _etext segment para public 'CODEEND'
- _etext ends
- _data segment para public 'DATA'
- _data ends
- _bss segment para public 'BSS'
- _bss ends
- _bssend segment byte public 'BSSEND'
- _bssend ends
- _stack segment para stack 'STACK'
- _stack ends
- romdata segment para public 'ROMDATA'
- romdata ends
-
- IFDEF __SMALL__
- dgroup group _data, _bss, _bssend, _stack
- assume cs:_text, ds:dgroup, es:nothing, ss:dgroup
- ELSEIFDEF __COMPACT__
- dgroup group _data, _bss, _bssend
- assume cs:_text, ds:dgroup, es:nothing, ss:_stack
- ELSEIFDEF __MEDIUM__
- dgroup group _data, _bss, _bssend, _stack
- assume cs:_text, ds:dgroup, es:nothing, ss:dgroup
- ELSEIFDEF __LARGE__
- dgroup group _data, _bss, _bssend
- assume cs:_text, ds:dgroup, es:nothing, ss:_stack
- ELSE
- dgroup group _data, _bss, _bssend, _stack
- assume cs:_text, ds:dgroup, es:nothing, ss:dgroup
- ENDIF
-
- ;
- ; Make up the correct external references that
- ; depend on the memory model
- ;
-
- .xlist
- IF1 ; Only expand these
- IFDEF __SMALL__ ; on pass 1
- extrn _main : near
- %out Assembling for small memory model
- ELSEIFDEF __COMPACT__
- extrn _main : near
- %out Assembling for compact memory model
- ELSEIFDEF __MEDIUM__
- extrn _main : far
- %out Assembling for medium memory model
- ELSEIFDEF __LARGE__
- extrn _main : far
- %out Assembling for large memory model
- ELSE
- %out Warning: No model - small model assumed
- extrn _main : near
- ENDIF
- ENDIF
- .list
-
- subttl Startup code for Turbo C V2.0
- page
- _text segment
-
- public start
-
- start proc far
-
- cli ; Disable interrupts
- cld
-
- ;
- ; Set up the stack according to the memory model.
- ;
- IFDEF __SMALL__
- mov ax, dgroup
- mov ss, ax
- mov sp, offset DGROUP:tos
- ELSEIFDEF __MEDIUM__
- mov ax, dgroup
- mov ss, ax
- mov sp, offset DGROUP:tos
- ELSEIFDEF __COMPACT__
- mov ax, _stack
- mov ss, ax
- mov sp, offset tos
- ELSEIFDEF __LARGE__
- mov ax, _stack
- mov ss, ax
- mov sp, offset tos
- ELSE
- mov ax, dgroup
- mov ss, ax
- mov sp, offset DGROUP:tos
- ENDIF
-
- ;
- ; Prepare the segment registers for initialization.
- ;
- mov ax, dgroup ; Get the target segment
- mov es, ax ; for DGROUP
-
- mov ax, romdata ; Get the segment for the
- mov ds, ax ; copy of DGROUP
-
- ;
- ; Copy DGROUP from its position in ROM (just after
- ; the code class) to the target address in RAM
- ;
- mov si, offset DGROUP:idata
- mov di, si
- mov cx, offset DGROUP:bdata
- sub cx, di
- rep movsb
-
- push es
- pop ds
-
- ;
- ; Zero out the BSS area
- ;
- xor al, al
- mov di, offset DGROUP:bdata
- mov cx, offset DGROUP:edata
- sub cx, di
- rep stosb
-
- ;
- ; Call the C language entry point
- ;
- sti
- call _main ; Call the Turbo C main()
-
- ;
- ; Restart the process should main() return
- ;
- jmp start
-
- start endp
-
- ;
- ; These routines are defined to satisfy any error
- ; handling routines that might need to give up on
- ; an error. An example of this would be the
- ; stack checking routine calling abort if a stack
- ; overflow has been detected.
- ;
-
- public _exit, __exit, _abort
-
- _abort proc ; User customized
- jmp start
- _abort endp
-
- _exit proc ; User customized
- jmp start
- _exit endp
-
- __exit proc ; User customized
- jmp start
- __exit endp
-
- ;
- ; This is code given control when Turbo C detects
- ; a stack overflow. It simply sets up a new stack
- ; (it assumes that BP contains the original value
- ; of the stack) and exits.
- ;
-
- public OVERFLOW@
-
- OVERFLOW@ proc
- jmp start
- OVERFLOW@ endp
-
- _text ends
-
- subttl Segment Declarations
- page
- _etext segment
- public tend
- tend label byte ; Mark the segment end
- db ?
- _etext ends
-
- romdata segment
- public rdata
- rdata label byte
- romdata ends
-
- _data segment
- public idata, _errno
- idata label byte
- _errno dw 0
-
- IFDEF __SMALL__
- public ___brklvl
- ___brklvl dw offset DGROUP:edata
- ELSEIFDEF __MEDIUM__
- public ___brklvl
- ___brklvl dw offset DGROUP:edata
- ELSEIFDEF __COMPACT__
- public __stklen
- __stklen dw offset tos
- ELSEIFDEF __LARGE__
- public __stklen
- __stklen dw offset tos
- ELSE
- public __brklvl
- __brklvl dw offset DGROUP:edata
- ENDIF
-
- _data ends
-
- _bss segment
- public bdata
- bdata label byte ; Mark the start of
- ; the _BSS (and the
- _bss ends ; end of _DATA
-
- _bssend segment
- public edata
- edata label byte ; Mark the end of
- IFDEF __COMPACT__ ; the BSS
- db ?
- ELSEIFDEF __LARGE__
- db ?
- ENDIF
- _bssend ends
-
- _stack segment
- public tos ; Make the TOS visible
- dw 256 dup (?) ; Declare the stack size
- tos label word ; Define the top of stack
- _stack ends
-
- end start
-