// 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
//
// Platform specific stuff (in this case, for RISC OS)
#ifndef platform_H
#define platform_H

#include "config.h"


// symbolic constants and macros

// called once on program startup (could register exit handler, if needed)
#define PLATFORM_INIT			RISCOS_entry()

// convert UNIX-style pathname to RISC OS-style pathname
#define PLATFORM_CONVERTPATH(path)	RISCOS_convert_path(path)

// directory separator for include paths
#define DIRECTORY_SEPARATOR	'\0'	// actually '.', but paths ending on ':' are ok, so auto-adding '.' is bad)

// string containing the prefix for accessing files from the library tree
#define PLATFORM_LIBPREFIX	"ACME_Lib:"
#define NO_NEED_FOR_ENV_VAR

// setting file types of created files
#define PLATFORM_SETFILETYPE_APPLE(a)	RISCOS_set_filetype(a, 0xffd)	// FIXME - wrong value!
#define PLATFORM_SETFILETYPE_CBM(a)	RISCOS_set_filetype(a, 0x064)
#define PLATFORM_SETFILETYPE_PLAIN(a)	RISCOS_set_filetype(a, 0xffd)
#define PLATFORM_SETFILETYPE_TEXT(a)	RISCOS_set_filetype(a, 0xfff)

// platform specific message output
#define PLATFORM_WARNING(a)		RISCOS_throwback(a, 0)
#define PLATFORM_ERROR(a)		RISCOS_throwback(a, 1)
#define PLATFORM_SERIOUS(a)		RISCOS_throwback(a, 2)

// integer-to-character conversion
#define PLATFORM_UINT2CHAR(x)	\
do {				\
	x ^= x >> 16;		\
	x ^= x >>  8;		\
	x &= 255;		\
} while (0)

// output of platform-specific command line switches
#define PLATFORM_OPTION_HELP	\
"  -t, --throwback        use the DDEUtils module's \"throwback\" protocol\n"

// processing of platform-specific command line switches
#define PLATFORM_SHORTOPTION_CODE			\
	case 't':					\
		RISCOS_flags |= RISCOSFLAG_THROWBACK;	\
		break;
#define PLATFORM_LONGOPTION_CODE			\
	else if (strcmp(string, "throwback") == 0)	\
		RISCOS_flags |= RISCOSFLAG_THROWBACK;


// variables
extern bits	RISCOS_flags;	// Holds platform-specific flags
#define RISCOSFLAG_THROWBACK	(1u << 0)	// use throwback protocol
#define RISCOSFLAG_THROWN	(1u << 1)	// throwback is active


// used as PLATFORM_INIT: registers exit handler
extern void RISCOS_entry(void);
// convert UNIX-style pathname to RISC OS-style pathname
extern void RISCOS_convert_path(char *path);
// setting the created files' types
extern void RISCOS_set_filetype(const char *filename, int type);
// use DDEUtils module's "Throwback" protocol
extern void RISCOS_throwback(const char *msg, int type);


#endif
