/* */
/* */
/* */
-/* (C) 1998-2001 llrich von Bassewitz */
-/* Wacholderweg 14 */
-/* D-70597 Stuttgart */
-/* EMail: uz@musoftware.de */
+/* (C) 1998-2004 Ullrich von Bassewitz */
+/* Römerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
-/*****************************************************************************/
-/* Forwards */
-/*****************************************************************************/
-
-
+/* common */
+#include "coll.h"
-struct CodeSeg;
-struct DataSeg;
+/* cc65 */
+#include "segments.h"
#define CF_INT 0x0001 /* Operation on ints */
#define CF_PTR CF_INT /* Alias for readability */
#define CF_LONG 0x0000 /* Operation on longs */
+#define CF_FLOAT 0x0004 /* Operation on a float */
#define CF_NOKEEP 0x0008 /* Value may get destroyed when storing */
-/* Compiler relative stackpointer */
-extern int oursp;
+/* Forward */
+struct StrBuf;
/*****************************************************************************/
-/* Pre- and postamble */
+/* Files, pre- and postamble */
/*****************************************************************************/
void g_preamble (void);
/* Generate the assembler code preamble */
+void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime);
+/* If debug info is enabled, place a file info into the source */
+
/*****************************************************************************/
-void g_pushseg (struct CodeSeg** CS, struct DataSeg** DS, const char* FuncName);
-/* Push the current segments and generate new ones for the given function */
-
-void g_popseg (void);
-/* Restore the old segments */
-
void g_userodata (void);
/* Switch to the read only data segment */
void g_usebss (void);
/* Switch to the bss segment */
-void g_codename (const char* Name);
-/* Set the name of the CODE segment */
-
-void g_rodataname (const char* Name);
-/* Set the name of the RODATA segment */
-
-void g_dataname (const char* Name);
-/* Set the name of the DATA segment */
-
-void g_bssname (const char* Name);
-/* Set the name of the BSS segment */
+void g_segname (segment_t Seg);
+/* Emit the name of a segment if necessary */
/*****************************************************************************/
-/* Functions handling local labels */
+/* Functions handling local labels */
/*****************************************************************************/
void g_defimport (const char* Name, int ZP);
/* Import the given label */
+void g_importmainargs (void);
+/* Forced import of a special symbol that handles arguments to main */
+
/*****************************************************************************/
void g_tosint (unsigned flags);
/* Make sure, the value on TOS is an int. Convert if necessary */
-void g_reglong (unsigned flags);
+void g_regint (unsigned Flags);
+/* Make sure, the value in the primary register an int. Convert if necessary */
+
+void g_reglong (unsigned Flags);
/* Make sure, the value in the primary register a long. Convert if necessary */
unsigned g_typeadjust (unsigned lhs, unsigned rhs);
void g_enter (unsigned flags, unsigned argsize);
/* Function prologue */
-void g_leave (int flags, int val);
+void g_leave (void);
/* Function epilogue */
+void g_swap_regvars (int StackOffs, int RegOffs, unsigned Bytes);
+/* Swap a register variable with a location on the stack */
+
void g_save_regvars (int RegOffs, unsigned Bytes);
/* Save register variables */
-void g_getimmed (unsigned Flags, unsigned long Val, unsigned Offs);
+void g_getimmed (unsigned Flags, unsigned long Val, long Offs);
/* Load a constant into the primary register */
-void g_getstatic (unsigned Flags, unsigned long Label, unsigned Offs);
+void g_getstatic (unsigned Flags, unsigned long Label, long Offs);
/* Fetch an static memory cell into the primary register */
void g_getlocal (unsigned Flags, int Offs);
-void g_putstatic (unsigned flags, unsigned long label, unsigned offs);
+void g_putstatic (unsigned flags, unsigned long label, long offs);
/* Store the primary register into the specified static memory cell */
void g_putlocal (unsigned Flags, int Offs, long Val);
void g_addlocal (unsigned flags, int offs);
/* Add a local variable to ax */
-void g_addstatic (unsigned flags, unsigned long label, unsigned offs);
+void g_addstatic (unsigned flags, unsigned long label, long offs);
/* Add a static variable to ax */
-/*****************************************************************************/
-/* Compares of ax with a variable with fixed address */
-/*****************************************************************************/
-
-
-
-void g_cmplocal (unsigned flags, int offs);
-/* Compare a local variable to ax */
-
-void g_cmpstatic (unsigned flags, unsigned label, unsigned offs);
-/* Compare a static variable to ax */
-
-
-
/*****************************************************************************/
/* Special op= functions */
/*****************************************************************************/
-void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
+void g_addeqstatic (unsigned flags, unsigned long label, long offs,
unsigned long val);
/* Emit += for a static variable */
void g_addeqind (unsigned flags, unsigned offs, unsigned long val);
/* Emit += for the location with address in ax */
-void g_subeqstatic (unsigned flags, unsigned long label, unsigned offs,
+void g_subeqstatic (unsigned flags, unsigned long label, long offs,
unsigned long val);
/* Emit -= for a static variable */
/*****************************************************************************/
-/* Add a variable address to the value in ax */
+/* Add a variable address to the value in ax */
/*****************************************************************************/
void g_addaddr_local (unsigned flags, int offs);
/* Add the address of a local variable to ax */
-void g_addaddr_static (unsigned flags, unsigned long label, unsigned offs);
+void g_addaddr_static (unsigned flags, unsigned long label, long offs);
/* Add the address of a static variable to ax */
void g_call (unsigned Flags, const char* Label, unsigned ArgSize);
/* Call the specified subroutine name */
-void g_callind (unsigned Flags, unsigned ArgSize);
-/* Call subroutine with address in AX */
+void g_callind (unsigned Flags, unsigned ArgSize, int Offs);
+/* Call subroutine indirect */
void g_jump (unsigned Label);
/* Jump to specified internal label number */
-void g_switch (unsigned Flags);
-/* Output switch statement preamble */
-
-void g_case (unsigned flags, unsigned label, unsigned long val);
-/* Create table code for one case selector */
-
void g_truejump (unsigned flags, unsigned label);
/* Jump to label if zero flag clear */
void g_res (unsigned n);
/* Reserve static storage, n bytes */
-void g_defdata (unsigned flags, unsigned long val, unsigned offs);
+void g_defdata (unsigned flags, unsigned long val, long offs);
/* Define data with the size given in flags */
void g_defbytes (const void* bytes, unsigned count);
/* Output a row of bytes as a constant */
-void g_zerobytes (unsigned n);
-/* Output n bytes of data initialized with zero */
+void g_zerobytes (unsigned Count);
+/* Output Count bytes of data initialized with zero */
+
+void g_initregister (unsigned Label, unsigned Reg, unsigned Size);
+/* Initialize a register variable from static initialization data */
+
+void g_initauto (unsigned Label, unsigned Size);
+/* Initialize a local variable at stack offset zero from static data */
+
+void g_initstatic (unsigned InitLabel, unsigned VarLabel, unsigned Size);
+/* Initialize a static local variable from static initialization data */
/*****************************************************************************/
-/* User supplied assembler code */
+/* Switch statement */
/*****************************************************************************/
-void g_asmcode (const char* Line, int Len);
-/* Output one line of assembler code. If Len is greater than zero, it is used
- * as the maximum number of characters to use from Line.
- */
+void g_switch (Collection* Nodes, unsigned DefaultLabel, unsigned Depth);
+/* Generate code for a switch statement */
/*****************************************************************************/
-/* Inlined known functions */
+/* User supplied assembler code */
/*****************************************************************************/
-void g_strlen (unsigned flags, unsigned long val, unsigned offs);
-/* Inline the strlen() function */
+void g_asmcode (struct StrBuf* B);
+/* Output one line of assembler code. */