### A.2 crt0.S - The startup file

    /*
     * crt0.S -- startup file for m68k-coff
     *
     */

    	.title "crt0.S for m68k-coff"

    /* These are predefined by new versions of GNU cpp.  */

    #ifndef __USER_LABEL_PREFIX__
    #define __USER_LABEL_PREFIX__ _
    #endif

    #ifndef __REGISTER_PREFIX__
    #define __REGISTER_PREFIX__
    #endif

    /* ANSI concatenation macros.  */

    #define CONCAT1(a, b) CONCAT2(a, b)
    #define CONCAT2(a, b) a ## b

    /* Use the right prefix for global labels.  */

    #define SYM(x) CONCAT1 (__USER_LABEL_PREFIX__, x)

    /* Use the right prefix for registers.  */

    #define REG(x) CONCAT1 (__REGISTER_PREFIX__, x)

    #define d0 REG (d0)
    #define d1 REG (d1)
    #define d2 REG (d2)
    #define d3 REG (d3)
    #define d4 REG (d4)
    #define d5 REG (d5)
    #define d6 REG (d6)
    #define d7 REG (d7)
    #define a0 REG (a0)
    #define a1 REG (a1)
    #define a2 REG (a2)
    #define a3 REG (a3)
    #define a4 REG (a4)
    #define a5 REG (a5)
    #define a6 REG (a6)
    #define fp REG (fp)
    #define sp REG (sp)

    /*
     * Set up some room for a stack. We just grab a chunk of memory.
     */
    	.set	stack_size, 0x2000
    	.comm	SYM (stack), stack_size

    /*
     * Define an empty environment.
     */
            .data
            .align 2
    SYM (environ):
            .long 0

     	.align	2
    	.text
    	.global SYM (stack)

    	.global SYM (main)
    	.global SYM (exit)
    /*
     * This really should be __bss_start, not SYM (__bss_start).
     */
    	.global __bss_start

    /*
     * start -- set things up so the application will run.
     */
    SYM (start):
    	link	a6, #-8
    	moveal	#SYM (stack) + stack_size, sp

    /*
     * zerobss -- zero out the bss section
     */
    	moveal	#__bss_start, a0
    	moveal	#SYM (end), a1
    1:
    	movel	#0, (a0)
    	leal	4(a0), a0
    	cmpal	a0, a1
    	bne	1b

    /*
     * Call the main routine from the application to get it going.
     * main (argc, argv, environ)
     * We pass argv as a pointer to NULL.
     */
            pea     0
            pea     SYM (environ)
            pea     sp@(4)
            pea     0
    	jsr	SYM (main)
    	movel	d0, sp@-

    /*
     * _exit -- Exit from the application. Normally we cause a user trap
     *          to return to the ROM monitor for another run.
     */
    SYM (exit):
    	trap	#0