mirror of https://github.com/uffejakobsen/acme.git
67 lines
1.5 KiB
C
67 lines
1.5 KiB
C
// ACME - a crossassembler for producing 6502/65c02/65816/65ce02 code.
|
|
// Copyright (C) 1998-2020 Marco Baye
|
|
// Have a look at "acme.c" for further info
|
|
//
|
|
// type system stuff
|
|
#include "typesystem.h"
|
|
#include "config.h"
|
|
#include "alu.h"
|
|
#include "global.h"
|
|
|
|
|
|
static boolean in_address_block = FALSE;
|
|
static boolean in_address_statement = FALSE;
|
|
|
|
// Functions
|
|
|
|
// return whether explicit symbol definitions should force "address" mode
|
|
boolean typesystem_says_address(void)
|
|
{
|
|
return in_address_block || in_address_statement;
|
|
}
|
|
|
|
// parse a block while forcing address mode
|
|
void typesystem_force_address_block(void)
|
|
{
|
|
boolean buffer = in_address_block;
|
|
|
|
in_address_block = TRUE;
|
|
Parse_optional_block();
|
|
in_address_block = buffer;
|
|
}
|
|
|
|
// force address mode on or off for the next statement
|
|
void typesystem_force_address_statement(boolean value)
|
|
{
|
|
in_address_statement = value;
|
|
}
|
|
|
|
// warn if result is not integer
|
|
void typesystem_want_nonaddr(struct number *result)
|
|
{
|
|
if (!config.warn_on_type_mismatch)
|
|
return;
|
|
|
|
if (result->ntype == NUMTYPE_UNDEFINED)
|
|
return;
|
|
|
|
if (result->addr_refs != 0) {
|
|
Throw_warning("Wrong type - expected integer.");
|
|
//printf("refcount should be 0, but is %d\n", result->addr_refs);
|
|
}
|
|
}
|
|
// warn if result is not address
|
|
void typesystem_want_addr(struct number *result)
|
|
{
|
|
if (!config.warn_on_type_mismatch)
|
|
return;
|
|
|
|
if (result->ntype == NUMTYPE_UNDEFINED)
|
|
return;
|
|
|
|
if (result->addr_refs != 1) {
|
|
Throw_warning("Wrong type - expected address.");
|
|
//printf("refcount should be 1, but is %d\n", result->addr_refs);
|
|
}
|
|
}
|