Merge https://github.com/cc65/cc65 into c1p
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
/*****************************************************************************/
|
||||
/* */
|
||||
/* main.c */
|
||||
/* */
|
||||
@@ -204,6 +205,10 @@ static void SetSys (const char* Sys)
|
||||
AbEnd ("Cannot use `module' as a target for the assembler");
|
||||
break;
|
||||
|
||||
case TGT_ATARI5200:
|
||||
NewSymbol ("__ATARI5200__", 1);
|
||||
break;
|
||||
|
||||
case TGT_ATARI:
|
||||
NewSymbol ("__ATARI__", 1);
|
||||
break;
|
||||
@@ -518,8 +523,8 @@ static void OptListing (const char* Opt, const char* Arg)
|
||||
/* Create a listing file */
|
||||
{
|
||||
/* Since the meaning of -l and --listing has changed, print an error if
|
||||
* the filename is empty or begins with the option char.
|
||||
*/
|
||||
** the filename is empty or begins with the option char.
|
||||
*/
|
||||
if (Arg == 0 || *Arg == '\0' || *Arg == '-') {
|
||||
Fatal ("The meaning of `%s' has changed. It does now "
|
||||
"expect a file name as argument.", Opt);
|
||||
@@ -634,8 +639,8 @@ static void OneLine (void)
|
||||
int Instr = -1;
|
||||
|
||||
/* Initialize the new listing line if we are actually reading from file
|
||||
* and not from internally pushed input.
|
||||
*/
|
||||
** and not from internally pushed input.
|
||||
*/
|
||||
if (!HavePushedInput ()) {
|
||||
InitListingLine ();
|
||||
}
|
||||
@@ -647,25 +652,28 @@ static void OneLine (void)
|
||||
}
|
||||
|
||||
/* If the first token on the line is an identifier, check for a macro or
|
||||
* an instruction.
|
||||
*/
|
||||
** an instruction.
|
||||
*/
|
||||
if (CurTok.Tok == TOK_IDENT) {
|
||||
if (!UbiquitousIdents) {
|
||||
/* Macros and symbols cannot use instruction names */
|
||||
if (UbiquitousIdents) {
|
||||
/* Macros CAN be instructions, so check for them first */
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
if (Mac == 0) {
|
||||
Instr = FindInstruction (&CurTok.SVal);
|
||||
}
|
||||
} else {
|
||||
/* Macros and symbols may NOT use the names of instructions */
|
||||
Instr = FindInstruction (&CurTok.SVal);
|
||||
if (Instr < 0) {
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
}
|
||||
} else {
|
||||
/* Macros and symbols may use the names of instructions */
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle an identifier. This may be a cheap local symbol, or a fully
|
||||
* scoped identifier which may start with a namespace token (for global
|
||||
* namespace)
|
||||
*/
|
||||
** scoped identifier which may start with a namespace token (for global
|
||||
** namespace)
|
||||
*/
|
||||
if (CurTok.Tok == TOK_LOCAL_IDENT ||
|
||||
CurTok.Tok == TOK_NAMESPACE ||
|
||||
(CurTok.Tok == TOK_IDENT && Instr < 0 && Mac == 0)) {
|
||||
@@ -677,8 +685,8 @@ static void OneLine (void)
|
||||
Sym = ParseAnySymName (SYM_ALLOC_NEW);
|
||||
|
||||
/* If a colon follows, this is a label definition. If there
|
||||
* is no colon, it's an assignment.
|
||||
*/
|
||||
** is no colon, it's an assignment.
|
||||
*/
|
||||
if (CurTok.Tok == TOK_EQ || CurTok.Tok == TOK_ASSIGN) {
|
||||
|
||||
/* Determine the symbol flags from the assignment token */
|
||||
@@ -705,8 +713,8 @@ static void OneLine (void)
|
||||
Expr = GenLiteralExpr (ConstExpression ());
|
||||
|
||||
/* Define the symbol with the constant expression following
|
||||
* the '='
|
||||
*/
|
||||
** the '='
|
||||
*/
|
||||
SymDef (Sym, Expr, ADDR_SIZE_DEFAULT, SF_VAR);
|
||||
|
||||
/* Don't allow anything after a symbol definition */
|
||||
@@ -716,8 +724,8 @@ static void OneLine (void)
|
||||
} else {
|
||||
|
||||
/* A label. Remember the current segment, so we can later
|
||||
* determine the size of the data stored under the label.
|
||||
*/
|
||||
** determine the size of the data stored under the label.
|
||||
*/
|
||||
Seg = ActiveSeg;
|
||||
PC = GetPC ();
|
||||
|
||||
@@ -725,9 +733,9 @@ static void OneLine (void)
|
||||
SymDef (Sym, GenCurrentPC (), ADDR_SIZE_DEFAULT, SF_LABEL);
|
||||
|
||||
/* Skip the colon. If NoColonLabels is enabled, allow labels
|
||||
* without a colon if there is no whitespace before the
|
||||
* identifier.
|
||||
*/
|
||||
** without a colon if there is no whitespace before the
|
||||
** identifier.
|
||||
*/
|
||||
if (CurTok.Tok != TOK_COLON) {
|
||||
if (HadWS || !NoColonLabels) {
|
||||
Error ("`:' expected");
|
||||
@@ -742,18 +750,21 @@ static void OneLine (void)
|
||||
}
|
||||
|
||||
/* If we come here, a new identifier may be waiting, which may
|
||||
* be a macro or instruction.
|
||||
*/
|
||||
** be a macro or instruction.
|
||||
*/
|
||||
if (CurTok.Tok == TOK_IDENT) {
|
||||
if (!UbiquitousIdents) {
|
||||
/* Macros and symbols cannot use instruction names */
|
||||
if (UbiquitousIdents) {
|
||||
/* Macros CAN be instructions, so check for them first */
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
if (Mac == 0) {
|
||||
Instr = FindInstruction (&CurTok.SVal);
|
||||
}
|
||||
} else {
|
||||
/* Macros and symbols may NOT use the names of instructions */
|
||||
Instr = FindInstruction (&CurTok.SVal);
|
||||
if (Instr < 0) {
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
}
|
||||
} else {
|
||||
/* Macros and symbols may use the names of instructions */
|
||||
Mac = FindMacro (&CurTok.SVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -766,8 +777,7 @@ static void OneLine (void)
|
||||
} else if (Mac != 0) {
|
||||
/* A macro expansion */
|
||||
MacExpandStart (Mac);
|
||||
} else if (Instr >= 0 ||
|
||||
(UbiquitousIdents && ((Instr = FindInstruction (&CurTok.SVal)) >= 0))) {
|
||||
} else if (Instr >= 0) {
|
||||
/* A mnemonic - assemble one instruction */
|
||||
HandleInstruction (Instr);
|
||||
} else if (PCAssignment && (CurTok.Tok == TOK_STAR || CurTok.Tok == TOK_PC)) {
|
||||
@@ -784,9 +794,9 @@ static void OneLine (void)
|
||||
}
|
||||
|
||||
/* If we have defined a label, remember its size. Sym is also set by
|
||||
* a symbol assignment, but in this case Done is false, so we don't
|
||||
* come here.
|
||||
*/
|
||||
** a symbol assignment, but in this case Done is false, so we don't
|
||||
** come here.
|
||||
*/
|
||||
if (Sym) {
|
||||
unsigned long Size;
|
||||
if (Seg == ActiveSeg) {
|
||||
@@ -910,13 +920,13 @@ int main (int argc, char* argv [])
|
||||
SegInit ();
|
||||
|
||||
/* Enter the base lexical level. We must do that here, since we may
|
||||
* define symbols using -D.
|
||||
*/
|
||||
** define symbols using -D.
|
||||
*/
|
||||
SymEnterLevel (&GlobalNameSpace, SCOPE_FILE, ADDR_SIZE_DEFAULT, 0);
|
||||
|
||||
/* Initialize the line infos. Must be done here, since we need line infos
|
||||
* for symbol definitions.
|
||||
*/
|
||||
** for symbol definitions.
|
||||
*/
|
||||
InitLineInfo ();
|
||||
|
||||
/* Check the parameters */
|
||||
@@ -1098,8 +1108,8 @@ int main (int argc, char* argv [])
|
||||
DoneLineInfo ();
|
||||
|
||||
/* If we didn't have any errors, create the object, listing and
|
||||
* dependency files
|
||||
*/
|
||||
** dependency files
|
||||
*/
|
||||
if (ErrorCount == 0) {
|
||||
CreateObjFile ();
|
||||
if (SB_GetLen (&ListingName) > 0) {
|
||||
@@ -1114,6 +1124,3 @@ int main (int argc, char* argv [])
|
||||
/* Return an apropriate exit code */
|
||||
return (ErrorCount == 0)? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user