Personal checkpoint - now should parse some MRI stuff

This commit is contained in:
Steve Chamberlain
1992-04-15 22:23:33 +00:00
parent b7311408af
commit 3d2b83ea49
8 changed files with 383 additions and 78 deletions

2
ld/config/st2000.mt Normal file
View File

@ -0,0 +1,2 @@
EMUL=st2000

View File

@ -114,10 +114,19 @@ static char *script =
; ;
static char *script_reloc =
#include "gld960.xr"
;
static char * static char *
gld960_get_script() gld960_get_script()
{ {
return script; extern ld_config_type config;
if (config.relocateable_output)
return script_reloc;
return script;
} }
struct ld_emulation_xfer_struct ld_gld960_emulation = struct ld_emulation_xfer_struct ld_gld960_emulation =

View File

@ -34,7 +34,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "ldemul.h" #include "ldemul.h"
#include "ldfile.h" #include "ldfile.h"
#include "ldmisc.h" #include "ldmisc.h"
#include "mri.h"
#define YYDEBUG 1 #define YYDEBUG 1
@ -78,8 +78,11 @@ boolean ldgram_had_equals = false;
/* LOCALS */ /* LOCALS */
#define ERROR_NAME_MAX 20
static char *error_names[ERROR_NAME_MAX];
static int error_index;
#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
#define POP_ERROR() error_index--;
%} %}
%union { %union {
bfd_vma integer; bfd_vma integer;
@ -148,6 +151,9 @@ struct sec *section;
%type <name> filename %type <name> filename
%token CHIP LIST SECT ABSOLUTE LOAD
%{ %{
ld_config_type config; ld_config_type config;
%} %}
@ -292,11 +298,11 @@ command_line_option:
{ lang_add_input_file($1,lang_input_file_is_file_enum, { lang_add_input_file($1,lang_input_file_is_file_enum,
(char *)NULL); } (char *)NULL); }
| OPTION_c filename | OPTION_c filename
{ ldfile_open_command_file($2); } script_file END { ldlex_command()}; { ldfile_open_command_file($2); } mri_script_file END { ldlex_command()};
| OPTION_Tfile | OPTION_Tfile
{ ldfile_open_command_file($1); } script_file { ldfile_open_command_file($1); } script_file
END { ldlex_command();} END { ldlex_command();}
| OPTION_T filename | OPTION_T filename
{ ldfile_open_command_file($2); } script_file { ldfile_open_command_file($2); } script_file
@ -327,11 +333,55 @@ END { ldlex_command();}
; ;
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
mri_script_file:
{ ldlex_mri_script();
PUSH_ERROR("MRI style script");
}
mri_script_lines
{ ldlex_popstate();
POP_ERROR();
}
;
mri_script_lines:
mri_script_lines mri_script_line
|
;
mri_script_line:
CHIP exp
| CHIP exp ',' exp
| NAME {
einfo("%P%F: unrecognised keyword in MRI style script '%s'\n",
$1);
}
| LIST {
write_map = true;
config.map_filename = "-";
}
| SECT NAME ',' exp
{ mri_output_section($2, $4);}
| SECT NAME exp
{ mri_output_section($2, $3);}
| SECT NAME '=' exp
{ mri_output_section($2, $4);}
| ABSOLUTE mri_abs_name_list
| LOAD mri_load_name_list
;
mri_load_name_list:
NAME
{ mri_load($1); }
| mri_load_name_list ',' NAME { mri_load($3); }
;
mri_abs_name_list:
NAME
{ mri_only_load($1); }
| mri_abs_name_list ',' NAME
{ mri_only_load($3); }
;
script_file: script_file:
{ {
@ -366,9 +416,9 @@ ifile_p1:
{ ldfile_add_library_path($3); } { ldfile_add_library_path($3); }
| OUTPUT '(' filename ')' | OUTPUT '(' filename ')'
{ lang_add_output($3); } { lang_add_output($3); }
| OUTPUT_FORMAT '(' NAME ')' | OUTPUT_FORMAT '(' NAME ')'
{ lang_add_output_format($3); } { lang_add_output_format($3); }
| OUTPUT_ARCH '(' NAME ')' | OUTPUT_ARCH '(' NAME ')'
{ ldfile_set_output_arch($3); } { ldfile_set_output_arch($3); }
| FORCE_COMMON_ALLOCATION | FORCE_COMMON_ALLOCATION
{ command_line.force_common_definition = true ; } { command_line.force_common_definition = true ; }
@ -384,13 +434,14 @@ input_list:
| input_list ',' NAME | input_list ',' NAME
{ lang_add_input_file($3,lang_input_file_is_file_enum, { lang_add_input_file($3,lang_input_file_is_file_enum,
(char *)NULL); } (char *)NULL); }
| input_list NAME | input_list NAME
{ lang_add_input_file($2, lang_input_file_is_file_enum, { lang_add_input_file($2,
lang_input_file_is_file_enum,
(char *)NULL); } (char *)NULL); }
; ;
sections: sections:
SECTIONS '{' sec_or_group_p1 '}' SECTIONS '{' sec_or_group_p1 '}'
; ;
sec_or_group_p1: sec_or_group_p1:
@ -425,7 +476,7 @@ input_section_spec:
']' ']'
| NAME | NAME
{ {
current_file =$1; current_file =$1;
} }
'(' file_NAME_list ')' '(' file_NAME_list ')'
| '*' | '*'
@ -439,14 +490,16 @@ statement:
statement assignment end statement assignment end
| statement CREATE_OBJECT_SYMBOLS | statement CREATE_OBJECT_SYMBOLS
{ {
lang_add_attribute(lang_object_symbols_statement_enum); }
lang_add_attribute(lang_object_symbols_statement_enum); }
| statement ';' | statement ';'
| statement CONSTRUCTORS | statement CONSTRUCTORS
{ {
lang_add_attribute(lang_constructors_statement_enum); }
lang_add_attribute(lang_constructors_statement_enum); }
| statement input_section_spec | statement input_section_spec
| statement length '(' exp ')' | statement length '(' exp ')'
{ {
lang_add_data($2,$4); lang_add_data($2,$4);
} }
@ -457,7 +510,8 @@ statement:
(exp_get_value_int($4, (exp_get_value_int($4,
0, 0,
"fill value", "fill value",
lang_first_phase_enum));
lang_first_phase_enum));
} }
| |
; ;
@ -479,7 +533,7 @@ fill_opt:
"fill value", "fill value",
lang_first_phase_enum); lang_first_phase_enum);
} }
| { $$ = 0; } | { $$ = 0; }
; ;
@ -515,7 +569,8 @@ assignment:
} }
| NAME assign_op mustbe_exp | NAME assign_op mustbe_exp
{ {
lang_add_assignment(exp_assop('=',$1,exp_binop($2,exp_nameop(NAME,$1),$3)));
lang_add_assignment(exp_assop('=',$1,exp_binop($2,exp_nameop(NAME,$1),$3)));
} }
; ;
@ -526,7 +581,7 @@ opt_comma:
memory: memory:
MEMORY '{' memory_spec memory_spec_list '}' MEMORY '{' memory_spec memory_spec_list '}'
; ;
memory_spec_list: memory_spec_list:
@ -536,22 +591,20 @@ memory_spec_list:
; ;
memory_spec: memory_spec: NAME
NAME
{ region = lang_memory_region_lookup($1); } { region = lang_memory_region_lookup($1); }
attributes_opt ':' attributes_opt ':'
origin_spec opt_comma length_spec origin_spec opt_comma length_spec
; ; origin_spec:
origin_spec:
ORIGIN '=' mustbe_exp ORIGIN '=' mustbe_exp
{ region->current = { region->current =
region->origin = region->origin =
exp_get_vma($3, 0L,"origin", lang_first_phase_enum); } exp_get_vma($3, 0L,"origin", lang_first_phase_enum);
; }
length_spec: ; length_spec:
LENGTH '=' mustbe_exp LENGTH '=' mustbe_exp
{ region->length = exp_get_vma($3, { region->length = exp_get_vma($3,
~((bfd_vma)0), ~((bfd_vma)0),
"length", "length",
lang_first_phase_enum); lang_first_phase_enum);
@ -573,13 +626,13 @@ startup:
; ;
high_level_library: high_level_library:
HLL '(' high_level_library_NAME_list ')' HLL '(' high_level_library_NAME_list ')'
| HLL '(' ')' | HLL '(' ')'
{ ldemul_hll((char *)NULL); } { ldemul_hll((char *)NULL); }
; ;
high_level_library_NAME_list: high_level_library_NAME_list:
high_level_library_NAME_list opt_comma filename high_level_library_NAME_list opt_comma filename
{ ldemul_hll($3); } { ldemul_hll($3); }
| filename | filename
{ ldemul_hll($1); } { ldemul_hll($1); }
@ -588,8 +641,7 @@ high_level_library_NAME_list:
low_level_library: low_level_library:
SYSLIB '(' low_level_library_NAME_list ')' SYSLIB '(' low_level_library_NAME_list ')'
; ; low_level_library_NAME_list:
low_level_library_NAME_list:
low_level_library_NAME_list opt_comma filename low_level_library_NAME_list opt_comma filename
{ ldemul_syslib($3); } { ldemul_syslib($3); }
| |
@ -603,23 +655,23 @@ floating_point_support:
; ;
mustbe_exp: { ldlex_expression(); } mustbe_exp: { ldlex_expression(); }
exp exp
{ ldlex_popstate(); $$=$2;} { ldlex_popstate(); $$=$2;}
; ;
exp : exp :
'-' exp %prec UNARY '-' exp %prec UNARY
{ $$ = exp_unop('-', $2); } { $$ = exp_unop('-', $2); }
| '(' exp ')' | '(' exp ')'
{ $$ = $2; } { $$ = $2; }
| NEXT '(' exp ')' %prec UNARY | NEXT '(' exp ')' %prec UNARY
{ $$ = exp_unop($1,$3); } { $$ = exp_unop($1,$3); }
| '!' exp %prec UNARY | '!' exp %prec UNARY
{ $$ = exp_unop('!', $2); } { $$ = exp_unop('!', $2); }
| '+' exp %prec UNARY | '+' exp %prec UNARY
{ $$ = $2; } { $$ = $2; }
| '~' exp %prec UNARY | '~' exp %prec UNARY
{ $$ = exp_unop('~', $2);} { $$ = exp_unop('~', $2);}
| exp '*' exp | exp '*' exp
@ -642,7 +694,7 @@ exp :
{ $$ = exp_binop(NE , $1, $3); } { $$ = exp_binop(NE , $1, $3); }
| exp LE exp | exp LE exp
{ $$ = exp_binop(LE , $1, $3); } { $$ = exp_binop(LE , $1, $3); }
| exp GE exp | exp GE exp
{ $$ = exp_binop(GE , $1, $3); } { $$ = exp_binop(GE , $1, $3); }
| exp '<' exp | exp '<' exp
{ $$ = exp_binop('<' , $1, $3); } { $$ = exp_binop('<' , $1, $3); }
@ -667,7 +719,7 @@ exp :
| SIZEOF_HEADERS | SIZEOF_HEADERS
{ $$ = exp_nameop(SIZEOF_HEADERS,0); } { $$ = exp_nameop(SIZEOF_HEADERS,0); }
| SIZEOF '(' NAME ')' | SIZEOF '(' NAME ')'
{ $$ = exp_nameop(SIZEOF,$3); } { $$ = exp_nameop(SIZEOF,$3); }
| ADDR '(' NAME ')' | ADDR '(' NAME ')'
{ $$ = exp_nameop(ADDR,$3); } { $$ = exp_nameop(ADDR,$3); }
@ -680,7 +732,7 @@ exp :
section: NAME { ldlex_expression(); } section: NAME { ldlex_expression(); }
opt_exp { ldlex_popstate(); } opt_exp { ldlex_popstate(); }
opt_type opt_block ':' opt_things'{' opt_type opt_block ':' opt_things'{'
{ {
@ -699,7 +751,7 @@ opt_type:
| '(' COPY ')' { $$ = 0; } | '(' COPY ')' { $$ = 0; }
| '(' INFO ')' { $$ = 0; } | '(' INFO ')' { $$ = 0; }
| '(' OVERLAY ')' { $$ = 0; } | '(' OVERLAY ')' { $$ = 0; }
| { $$ = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; } | { $$ = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS; }
; ;
opt_things: opt_things:
@ -728,4 +780,13 @@ memspec_opt:
{ $$ = $2; } { $$ = $2; }
| { $$ = "*default*"; } | { $$ = "*default*"; }
; ;
%%
void
yyerror(arg)
char *arg;
{
if (error_index> 0 && error_index < ERROR_NAME_MAX)
einfo("%P%F: %S syntax error in %s\n",error_names[error_index-1]);
else
einfo("%P%F: %S syntax error\n");
}

View File

@ -51,12 +51,13 @@ YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
unsigned int include_stack_ptr = 0; unsigned int include_stack_ptr = 0;
/* FOUR STATES /* STATES
COMMAND on command line COMMAND on command line
COMMENT in a C comment COMMENT in a C comment
EXPRESSION definiatelyt in an expression EXPRESSION definiatelyt in an expression
SCRIPT definately in a script SCRIPT definately in a script
SOMEWHERE either EXPRESSION or SCRIPT SOMEWHERE either EXPRESSION or SCRIPT
MRI in an MRI script
*/ */
#define RTOKEN(x) { yylval.token = x; return x; } #define RTOKEN(x) { yylval.token = x; return x; }
%} %}
@ -73,6 +74,7 @@ WHITE [ \t\n]+
%x EXPRESSION %x EXPRESSION
%x COMMENT %x COMMENT
%x BOTH %x BOTH
%x MRI
%% %%
<COMMAND>"-defsym" { return OPTION_defsym; } <COMMAND>"-defsym" { return OPTION_defsym; }
@ -153,7 +155,33 @@ WHITE [ \t\n]+
yylval.name = buystring(yytext+2); yylval.name = buystring(yytext+2);
return OPTION_Aarch; return OPTION_Aarch;
} }
<BOTH,EXPRESSION>"0x"?([0-9A-Fa-f])+(M|K|m|k)? {
<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
yylval.integer = strtol(yytext+1, 0,16);
return INT;
}
<MRI,EXPRESSION>([0-9A-Fa-f])+(H|X|B|O|D)
{
int base ;
switch (yytext[yyleng-1]) {
case 'X':
case 'H':
base = 16;
break;
case 'O':
base = 8;
break;
case 'B':
base = 2;
break;
default:
base = 10;
}
yylval.integer = strtol(yytext+1, 0, base);
return INT;
}
<MRI,BOTH,EXPRESSION>"$"?"0x"?([0-9A-Fa-f])+(M|K|m|k)? {
yylval.integer = strtol(yytext,0,hex_mode); yylval.integer = strtol(yytext,0,hex_mode);
if (yytext[yyleng-1]=='M' if (yytext[yyleng-1]=='M'
|| yytext[yyleng-1] == 'm') { || yytext[yyleng-1] == 'm') {
@ -184,7 +212,7 @@ WHITE [ \t\n]+
<BOTH,SCRIPT,EXPRESSION>"|=" { RTOKEN(OREQ);} <BOTH,SCRIPT,EXPRESSION>"|=" { RTOKEN(OREQ);}
<BOTH,SCRIPT,EXPRESSION>"&&" { RTOKEN(ANDAND);} <BOTH,SCRIPT,EXPRESSION>"&&" { RTOKEN(ANDAND);}
<BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');} <BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');}
<BOTH,SCRIPT,EXPRESSION>"," { RTOKEN(',');} <MRI,BOTH,SCRIPT,EXPRESSION>"," { RTOKEN(',');}
<BOTH,SCRIPT,EXPRESSION>"&" { RTOKEN('&');} <BOTH,SCRIPT,EXPRESSION>"&" { RTOKEN('&');}
<BOTH,SCRIPT,EXPRESSION>"|" { RTOKEN('|');} <BOTH,SCRIPT,EXPRESSION>"|" { RTOKEN('|');}
<BOTH,SCRIPT,EXPRESSION>"~" { RTOKEN('~');} <BOTH,SCRIPT,EXPRESSION>"~" { RTOKEN('~');}
@ -197,7 +225,7 @@ WHITE [ \t\n]+
<BOTH,SCRIPT,EXPRESSION>"%" { RTOKEN('%');} <BOTH,SCRIPT,EXPRESSION>"%" { RTOKEN('%');}
<BOTH,SCRIPT,EXPRESSION>"<" { RTOKEN('<');} <BOTH,SCRIPT,EXPRESSION>"<" { RTOKEN('<');}
<BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');} <BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');}
<BOTH,SCRIPT,EXPRESSION>"=" { RTOKEN('=');} <MRI,BOTH,SCRIPT,EXPRESSION>"=" { RTOKEN('=');}
<BOTH,SCRIPT,EXPRESSION>"}" { RTOKEN('}') ; } <BOTH,SCRIPT,EXPRESSION>"}" { RTOKEN('}') ; }
<BOTH,SCRIPT,EXPRESSION>"{" { RTOKEN('{'); } <BOTH,SCRIPT,EXPRESSION>"{" { RTOKEN('{'); }
<BOTH,SCRIPT,EXPRESSION>")" { RTOKEN(')');} <BOTH,SCRIPT,EXPRESSION>")" { RTOKEN(')');}
@ -250,7 +278,15 @@ WHITE [ \t\n]+
<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);} <BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);} <BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
<BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* { <MRI>^"*".* { /* Mri comment line */ }
<MRI>\n { ++ lineno; }
<MRI>"CHIP" { RTOKEN(CHIP); }
<MRI>"LOAD" { RTOKEN(LOAD); }
<MRI>"LIST".*\n { RTOKEN(LIST); /* LIST and ignore to end of line */ }
<MRI>"SECT" { RTOKEN(SECT); }
<MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
<MRI,BOTH,EXPRESSION>{FILENAMECHAR1}{FILENAMECHAR}* {
yylval.name = buystring(yytext); yylval.name = buystring(yytext);
return NAME; return NAME;
} }
@ -266,7 +302,7 @@ WHITE [ \t\n]+
return NAME; return NAME;
} }
<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;} <BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
<COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t] <MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t]
"/*" { old = INITIAL; BEGIN(COMMENT); } "/*" { old = INITIAL; BEGIN(COMMENT); }
<COMMAND>"/*" { old = COMMAND; BEGIN(COMMENT); } <COMMAND>"/*" { old = COMMAND; BEGIN(COMMENT); }
@ -279,6 +315,7 @@ WHITE [ \t\n]+
<COMMENT>\\n { ++lineno;} <COMMENT>\\n { ++lineno;}
<COMMENT>"*"+"/" { BEGIN(old); } <COMMENT>"*"+"/" { BEGIN(old); }
<<EOF>> { <<EOF>> {
include_stack_ptr--; include_stack_ptr--;
@ -389,6 +426,13 @@ BEGIN(SCRIPT);
} }
void
DEFUN_VOID(ldlex_mri_script)
{
*(state_stack_p)++ = yy_start;
BEGIN(MRI);
}
void void
DEFUN_VOID(ldlex_expression) DEFUN_VOID(ldlex_expression)
{ {

69
ld/mri.c Normal file
View File

@ -0,0 +1,69 @@
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
GLD is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GLD is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GLD; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/* This bit does the tree decoration when MRI style link scripts are parsed */
/*
contributed by Steve Chamberlain
sac@cygnus.com
*/
#include "bfd.h"
#include "sysdep.h"
#include "ldlang.h"
#include "mri.h"
#include "ldexp.h"
void
DEFUN(mri_output_section, (name, vma),
CONST char *name AND
etree_type *vma)
{
lang_output_section_statement_type *os;
os = lang_output_section_statement_lookup(name);
if (os->addr_tree == (etree_type *)NULL) {
os->addr_tree = vma;
}
os->flags = 0;
os->block_value = 0;
}
/* if any ABSOLUTE <name> are in the script, only load those files
marked thus */
void DEFUN(mri_only_load,(name), CONST char *name)
{
}
void
DEFUN(mri_load,(name),
CONST char *name)
{
lang_add_input_file(name, lang_input_file_is_file_enum, (char *)NULL);
}

86
ld/st2000.em Normal file
View File

@ -0,0 +1,86 @@
cat >ld__${EMULATION_NAME}.c <<EOF
/* Copyright (C) 1991 Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
GLD is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
GLD is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GLD; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
/*
Written by Steve Chamberlain steve@cygnus.com
*/
#include "bfd.h"
#include "sysdep.h"
#include "ld.h"
#include "config.h"
#include "ldemul.h"
#include "ldfile.h"
#include "ldmisc.h"
extern boolean lang_float_flag;
extern enum bfd_architecture ldfile_output_architecture;
extern unsigned long ldfile_output_machine;
extern char *ldfile_output_machine_name;
extern bfd *output_bfd;
static void st2000_before_parse()
{
ldfile_output_architecture = bfd_arch_m68k;
}
static char *st2000_script =
#include "st2000.x"
;
static char *st2000_script_option_Ur =
#include "st2000.x"
;
static char *st2000_script_option_r =
#include "st2000.x"
;
static char *st2000_get_script()
{
extern ld_config_type config;
if (config.relocateable_output == true &&
config.build_constructors == true) {
return st2000_script_option_Ur;
}
if (config.relocateable_output) {
return st2000_script_option_r;
}
return st2000_script;
}
struct ld_emulation_xfer_struct ld_st2000_emulation =
{
st2000_before_parse,
syslib_default,
hll_default,
after_parse_default,
after_allocation_default,
set_output_arch_default,
ldemul_default_target,
before_allocation_default,
st2000_get_script,
"st2000"
};
EOF

26
ld/st2000.sc-sh Executable file
View File

@ -0,0 +1,26 @@
cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}")
OUTPUT_ARCH(${ARCH})
SECTIONS
{
.text :
{
*(.text)
*(.strings)
_etext = .;
*(.data)
_edata = .;
*(.bss)
*(COMMON)
_end = .;
}
}
EOF

8
ld/st2000.sh Executable file
View File

@ -0,0 +1,8 @@
EMULATION_NAME=st2000
SCRIPT_NAME=st2000
OUTPUT_FORMAT="coff-m68k"
TEXT_START_ADDR=0x0
PAGE_SIZE=128
ARCH=m68k
TEMPLATE_NAME=st2000