/* Linker script for MC689S12DP256 Flash 
   rom banks.
   
   Author Jefferson L Smith; Robotronics, Inc.  2006
 */
OUTPUT_FORMAT("elf32-m68hc12", "elf32-m68hc12",
	      "elf32-m68hc12")
OUTPUT_ARCH(m68hc12)
ENTRY(_start)

/* Get memory banks definition from some user configuration file.
   This file must be located in some linker directory (search path
   with -L<dir>). See fixed memory banks emulation script.  */
INCLUDE memory.x;

SECTIONS
{
  /* Concatenate .page0 sections.  Put them in the page0 memory bank
     unless we are creating a relocatable file.  */
  .page0 :
  {
    *(.page0)
  }  > page0
  
  /* PPAGE memory banks */

  .bank0 :
  {
    *(.bank0)
    . = ALIGN(2);
  } > bank0  =0xff
  .bank1 :
  {
    *(.bank1)
    . = ALIGN(2);
  } > bank1  =0xff
  .bank2 :
  {
    *(.bank2)
    . = ALIGN(2);
  } > bank2  =0xff
  .bank3 :
  {
    *(.bank3)
    . = ALIGN(2);
  } > bank3  =0xff
  .bank4 :
  {
    *(.bank4)
    . = ALIGN(2);
  } > bank4  =0xff
  .bank5 :
  {
    *(.bank5)
    . = ALIGN(2);
  } > bank5  =0xff
  .bank6 :
  {
    *(.bank6)
    . = ALIGN(2);
  } > bank6  =0xff
  .bank7 :
  {
    *(.bank7)
    . = ALIGN(2);
  } > bank7  =0xff
  .bank8 :
  {
    *(.bank8)
    . = ALIGN(2);
  } > bank8  =0xff
  .bank9 :
  {
    *(.bank9)
    . = ALIGN(2);
  } > bank9  =0xff
  .bank10 :
  {
    *(.bank10)
    . = ALIGN(2);
  } > bank10  =0xff
  .bank11 :
  {
    *(.bank11)
    . = ALIGN(2);
  } > bank11  =0xff
  .bank12 :
  {
    *(.bank12)
    . = ALIGN(2);
  } > bank12  =0xff
  .bank13 :
  {
    *(.bank13)
    . = ALIGN(2);
  } > bank13  =0xff
  
  /* Start of text section.  */
  .text : 
  {
    /* Put startup code at beginning so that _start keeps same address.  */
    /* Startup code.  */
    KEEP (*(.install0))	/* Section should setup the stack pointer.  */
    KEEP (*(.install1))	/* Place holder for applications.  */
    KEEP (*(.install2))	/* Optional installation of data sections in RAM.  */
    KEEP (*(.install3))	/* Place holder for applications.  */
    KEEP (*(.install4))	/* Section that calls the main.  */
    *(.init)
    *(.text)
    *(.text.*)
    *(.text_c)
    /* .gnu.warning sections are handled specially by elf32.em.  */
    *(.gnu.warning)
    *(.gnu.linkonce.t.*)
    *(.tramp)
    *(.tramp.*)
    /* Finish code.  */
    KEEP (*(.fini0))	/* Beginning of finish code (_exit symbol).  */
    KEEP (*(.fini1))	/* Place holder for applications.  */
    KEEP (*(.fini2))	/* C++ destructors.  */
    KEEP (*(.fini3))	/* Place holder for applications.  */
    KEEP (*(.fini4))	/* Runtime exit.  */
    _etext = .;
    PROVIDE (etext = .);
    . = ALIGN(2);
  }  > text AT>bank14  =0xff
  
  .text_h : 
  {
    *(.text_h)           /* Bootloader; high Flash area unbanked */
    . = ALIGN(2);
  }  > text_h AT>bank15  =0xff
  .rodata : 
  {
    *(.rodata)
    *(.rodata.*)
    *(.gnu.linkonce.r*)
    . = ALIGN(2);
  }  > text_h AT>bank15  =0xff
  .eh_frame : 
  {
    KEEP (*(.eh_frame))
    . = ALIGN(2);
  }  > text_h AT>bank15  =0xff
  
  /* Constructor and destructor tables are in ROM.  */
  .ctors : 
  {
     PROVIDE (__CTOR_LIST__ = .);
    KEEP (*(.ctors))
     PROVIDE(__CTOR_END__ = .);
     . = ALIGN(2);
  }  > text_h AT>bank15  =0xff
  .dtors : 
  {
     PROVIDE(__DTOR_LIST__ = .);
    KEEP (*(.dtors))
     PROVIDE(__DTOR_END__ = .);
     . = ALIGN(2);
  }  > text_h AT>bank15  =0xff
  
  /* Start of the data section image in ROM.  */
  __data_image = .;
  PROVIDE (__data_image = .);
  
  /* All read-only sections that normally go in PROM must be above.
     We construct the DATA image section in PROM at end of all these
     read-only sections.  The data image must be copied at init time.
     Refer to GNU ld, Section 3.6.8.2 Output Section LMA.  */
  .data :
  {
    __data_section_start = .;
    PROVIDE (__data_section_start = .);
    *(.sdata)
    *(.data)
    *(.data.*)
    *(.data1)
    *(.gnu.linkonce.d.*)
    CONSTRUCTORS
    _edata  =  .;
    PROVIDE (edata = .);
    . = ALIGN(2);
  }  > data AT>bank15  =0xff
  __data_section_size = SIZEOF(.data);
  __data_image_end = __data_image + __data_section_size;
  PROVIDE (__data_section_size = SIZEOF(.data));
  /* .install  :
  {
    . = _data_image_end;
  }  > text */
  /* Relocation for some bss and data sections.  */
  .softregs   :
  {
    __softregs_section_start = .;
    *(.softregs)
    __softregs_section_end = .;
  }  > data
  __softregs_section_size = SIZEOF(.softregs); 
  .bss   :
  {
    __bss_start = .;
    *(.sbss)
    *(.scommon)
    *(.dynbss)
    *(.bss)
    *(.bss.*)
    *(.gnu.linkonce.b.*)
    *(COMMON)
    PROVIDE (_end = .);
  }  > data
  __bss_size = SIZEOF(.bss);
  PROVIDE (__bss_size = SIZEOF(.bss));
  .eeprom   :
  {
    *(.eeprom)
    *(.eeprom.*)
    . = ALIGN(2);
  }  > eeprom  =0xff

  /* If the 'vectors_addr' symbol is defined, it indicates the start address
     of interrupt vectors.  This depends on the 9S12 operating mode:
		Addr
     Hardware location	LMA 0x10ff80, mirror 0xff80
     Called by dbug12	LMA 0x10ef80, mirror 0xef80
     Ram called by dbug12	0x3e00
     The default vectors address is (LMA) 0x10ff80.  This can be overriden
     with the '-defsym vectors_addr=0x...' ld option.
  */
  PROVIDE (_vectors_addr = DEFINED (vectors_addr) ? vectors_addr : 0x10ff80);
  .vectors DEFINED (vectors_addr) ? vectors_addr : 0x10ff80 :
  {
    KEEP (*(.vectors))
  }
  /* Stabs debugging sections.  */
  .stab		 0 : { *(.stab) }
  .stabstr	 0 : { *(.stabstr) }
  .stab.excl	 0 : { *(.stab.excl) }
  .stab.exclstr	 0 : { *(.stab.exclstr) }
  .stab.index	 0 : { *(.stab.index) }
  .stab.indexstr 0 : { *(.stab.indexstr) }
  .comment	 0 : { *(.comment) }
  /* DWARF debug sections.
     Symbols in the DWARF debugging sections are relative to the beginning
     of the section so we begin them at 0.
     Treatment of DWARF debug section must be at end of the linker
     script to avoid problems when there are undefined symbols. It's necessary
     to avoid that the DWARF section is relocated before such undefined
     symbols are found.  */
  /* DWARF 1 */
  .debug	 0 : { *(.debug) }
  .line		 0 : { *(.line) }
  /* GNU DWARF 1 extensions */
  .debug_srcinfo 0 : { *(.debug_srcinfo) }
  .debug_sfnames 0 : { *(.debug_sfnames) }
  /* DWARF 1.1 and DWARF 2 */
  .debug_aranges  0 : { *(.debug_aranges) }
  .debug_pubnames 0 : { *(.debug_pubnames) }
  /* DWARF 2 */
  .debug_info     0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
  .debug_abbrev   0 : { *(.debug_abbrev) }
  .debug_line     0 : { *(.debug_line) }
  .debug_frame    0 : { *(.debug_frame) }
  .debug_str      0 : { *(.debug_str) }
  .debug_loc      0 : { *(.debug_loc) }
  .debug_macinfo  0 : { *(.debug_macinfo) }
}
