1 /*****************************************************************************/
5 /* 6502 code generator */
9 /* (C) 1998-2004 Ullrich von Bassewitz */
10 /* Römerstrasse 52 */
11 /* D-70794 Filderstadt */
12 /* EMail: uz@cc65.org */
15 /* This software is provided 'as-is', without any expressed or implied */
16 /* warranty. In no event will the authors be held liable for any damages */
17 /* arising from the use of this software. */
19 /* Permission is granted to anyone to use this software for any purpose, */
20 /* including commercial applications, and to alter it and redistribute it */
21 /* freely, subject to the following restrictions: */
23 /* 1. The origin of this software must not be misrepresented; you must not */
24 /* claim that you wrote the original software. If you use this software */
25 /* in a product, an acknowledgment in the product documentation would be */
26 /* appreciated but is not required. */
27 /* 2. Altered source versions must be plainly marked as such, and must not */
28 /* be misrepresented as being the original software. */
29 /* 3. This notice may not be removed or altered from any source */
32 /*****************************************************************************/
49 /*****************************************************************************/
51 /*****************************************************************************/
55 /* Code generator flags.
56 * Note: The type flags are designed so that a smaller type may override a
57 * larger one by or'ing it into the existing one.
59 #define CF_NONE 0x0000 /* No special flags */
61 #define CF_TYPE 0x0007 /* Mask for operand type */
62 #define CF_CHAR 0x0003 /* Operation on characters */
63 #define CF_INT 0x0001 /* Operation on ints */
64 #define CF_PTR CF_INT /* Alias for readability */
65 #define CF_LONG 0x0000 /* Operation on longs */
66 #define CF_FLOAT 0x0004 /* Operation on a float */
68 #define CF_NOKEEP 0x0008 /* Value may get destroyed when storing */
70 #define CF_UNSIGNED 0x0010 /* Value is unsigned */
71 #define CF_CONST 0x0020 /* Constant value available */
72 #define CF_CONSTADDR 0x0040 /* Constant address value available */
73 #define CF_TEST 0x0080 /* Test value */
74 #define CF_FIXARGC 0x0100 /* Function has fixed arg count */
75 #define CF_FORCECHAR 0x0200 /* Handle chars as chars, not ints */
76 #define CF_REG 0x0800 /* Value is in primary register */
78 /* Type of static address */
79 #define CF_ADDRMASK 0xF000 /* Type of address */
80 #define CF_STATIC 0x0000 /* Static local */
81 #define CF_EXTERNAL 0x1000 /* Static external */
82 #define CF_ABSOLUTE 0x2000 /* Numeric absolute address */
83 #define CF_LOCAL 0x4000 /* Auto variable */
84 #define CF_REGVAR 0x8000 /* Register variable */
93 /*****************************************************************************/
94 /* Files, pre- and postamble */
95 /*****************************************************************************/
99 void g_preamble (void);
100 /* Generate the assembler code preamble */
102 void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime);
103 /* If debug info is enabled, place a file info into the source */
107 /*****************************************************************************/
108 /* Segment support */
109 /*****************************************************************************/
113 void g_userodata (void);
114 /* Switch to the read only data segment */
116 void g_usedata (void);
117 /* Switch to the data segment */
119 void g_usebss (void);
120 /* Switch to the bss segment */
122 void g_segname (segment_t Seg);
123 /* Emit the name of a segment if necessary */
127 /*****************************************************************************/
128 /* Functions handling local labels */
129 /*****************************************************************************/
133 void g_defcodelabel (unsigned label);
134 /* Define a local code label */
136 void g_defdatalabel (unsigned label);
137 /* Define a local data label */
141 /*****************************************************************************/
142 /* Functions handling global labels */
143 /*****************************************************************************/
147 void g_defgloblabel (const char* Name);
148 /* Define a global label with the given name */
150 void g_defexport (const char* Name, int ZP);
151 /* Export the given label */
153 void g_defimport (const char* Name, int ZP);
154 /* Import the given label */
156 void g_importmainargs (void);
157 /* Forced import of a special symbol that handles arguments to main */
161 /*****************************************************************************/
163 /*****************************************************************************/
167 int pop (unsigned flags);
168 /* Pop an argument of the given size */
170 int push (unsigned flags);
171 /* Push an argument of the given size */
173 unsigned sizeofarg (unsigned flags);
174 /* Return the size of a function argument type that is encoded in flags */
178 /*****************************************************************************/
179 /* type conversion and similiar stuff */
180 /*****************************************************************************/
184 void g_toslong (unsigned flags);
185 /* Make sure, the value on TOS is a long. Convert if necessary */
187 void g_tosint (unsigned flags);
188 /* Make sure, the value on TOS is an int. Convert if necessary */
190 void g_regint (unsigned Flags);
191 /* Make sure, the value in the primary register an int. Convert if necessary */
193 void g_reglong (unsigned Flags);
194 /* Make sure, the value in the primary register a long. Convert if necessary */
196 unsigned g_typeadjust (unsigned lhs, unsigned rhs);
197 /* Adjust the integer operands before doing a binary operation. lhs is a flags
198 * value, that corresponds to the value on TOS, rhs corresponds to the value
199 * in (e)ax. The return value is the the flags value for the resulting type.
202 unsigned g_typecast (unsigned lhs, unsigned rhs);
203 /* Cast the value in the primary register to the operand size that is flagged
204 * by the lhs value. Return the result value.
207 void g_scale (unsigned flags, long val);
208 /* Scale the value in the primary register by the given value. If val is positive,
209 * scale up, is val is negative, scale down. This function is used to scale
210 * the operands or results of pointer arithmetic by the size of the type, the
216 /*****************************************************************************/
217 /* Function entry and exit */
218 /*****************************************************************************/
222 void g_enter (unsigned flags, unsigned argsize);
223 /* Function prologue */
226 /* Function epilogue */
230 /*****************************************************************************/
231 /* Register variables */
232 /*****************************************************************************/
236 void g_swap_regvars (int StackOffs, int RegOffs, unsigned Bytes);
237 /* Swap a register variable with a location on the stack */
239 void g_save_regvars (int RegOffs, unsigned Bytes);
240 /* Save register variables */
242 void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes);
243 /* Restore register variables */
247 /*****************************************************************************/
248 /* Fetching memory cells */
249 /*****************************************************************************/
253 void g_getimmed (unsigned Flags, unsigned long Val, long Offs);
254 /* Load a constant into the primary register */
256 void g_getstatic (unsigned Flags, unsigned long Label, long Offs);
257 /* Fetch an static memory cell into the primary register */
259 void g_getlocal (unsigned Flags, int Offs);
260 /* Fetch specified local object (local var). */
262 void g_getind (unsigned Flags, unsigned Offs);
263 /* Fetch the specified object type indirect through the primary register
264 * into the primary register
267 void g_leasp (int Offs);
268 /* Fetch the address of the specified symbol into the primary register */
270 void g_leavariadic (int Offs);
271 /* Fetch the address of a parameter in a variadic function into the primary
277 /*****************************************************************************/
278 /* Store into memory */
279 /*****************************************************************************/
283 void g_putstatic (unsigned flags, unsigned long label, long offs);
284 /* Store the primary register into the specified static memory cell */
286 void g_putlocal (unsigned Flags, int Offs, long Val);
287 /* Put data into local object. */
289 void g_putind (unsigned flags, unsigned offs);
290 /* Store the specified object type in the primary register at the address
291 * on the top of the stack
296 /*****************************************************************************/
297 /* Adds and subs of variables fix a fixed address */
298 /*****************************************************************************/
302 void g_addlocal (unsigned flags, int offs);
303 /* Add a local variable to ax */
305 void g_addstatic (unsigned flags, unsigned long label, long offs);
306 /* Add a static variable to ax */
310 /*****************************************************************************/
311 /* Special op= functions */
312 /*****************************************************************************/
316 void g_addeqstatic (unsigned flags, unsigned long label, long offs,
318 /* Emit += for a static variable */
320 void g_addeqlocal (unsigned flags, int offs, unsigned long val);
321 /* Emit += for a local variable */
323 void g_addeqind (unsigned flags, unsigned offs, unsigned long val);
324 /* Emit += for the location with address in ax */
326 void g_subeqstatic (unsigned flags, unsigned long label, long offs,
328 /* Emit -= for a static variable */
330 void g_subeqlocal (unsigned flags, int offs, unsigned long val);
331 /* Emit -= for a local variable */
333 void g_subeqind (unsigned flags, unsigned offs, unsigned long val);
334 /* Emit -= for the location with address in ax */
338 /*****************************************************************************/
339 /* Add a variable address to the value in ax */
340 /*****************************************************************************/
344 void g_addaddr_local (unsigned flags, int offs);
345 /* Add the address of a local variable to ax */
347 void g_addaddr_static (unsigned flags, unsigned long label, long offs);
348 /* Add the address of a static variable to ax */
352 /*****************************************************************************/
354 /*****************************************************************************/
358 void g_save (unsigned flags);
359 /* Copy primary register to hold register. */
361 void g_restore (unsigned flags);
362 /* Copy hold register to primary. */
364 void g_cmp (unsigned flags, unsigned long val);
365 /* Immidiate compare. The primary register will not be changed, Z flag
369 void g_test (unsigned flags);
370 /* Test the value in the primary and set the condition codes */
372 void g_push (unsigned flags, unsigned long val);
373 /* Push the primary register or a constant value onto the stack */
375 void g_swap (unsigned flags);
376 /* Swap the primary register and the top of the stack. flags give the type
377 * of *both* values (must have same size).
380 void g_call (unsigned Flags, const char* Label, unsigned ArgSize);
381 /* Call the specified subroutine name */
383 void g_callind (unsigned Flags, unsigned ArgSize, int Offs);
384 /* Call subroutine indirect */
386 void g_jump (unsigned Label);
387 /* Jump to specified internal label number */
389 void g_truejump (unsigned flags, unsigned label);
390 /* Jump to label if zero flag clear */
392 void g_falsejump (unsigned flags, unsigned label);
393 /* Jump to label if zero flag set */
395 void g_space (int space);
396 /* Create or drop space on the stack */
398 void g_cstackcheck (void);
399 /* Check for a C stack overflow */
401 void g_stackcheck (void);
402 /* Check for a stack overflow */
404 void g_add (unsigned flags, unsigned long val);
405 void g_sub (unsigned flags, unsigned long val);
406 void g_rsub (unsigned flags, unsigned long val);
407 void g_mul (unsigned flags, unsigned long val);
408 void g_div (unsigned flags, unsigned long val);
409 void g_mod (unsigned flags, unsigned long val);
410 void g_or (unsigned flags, unsigned long val);
411 void g_xor (unsigned flags, unsigned long val);
412 void g_and (unsigned flags, unsigned long val);
413 void g_asr (unsigned flags, unsigned long val);
414 void g_asl (unsigned flags, unsigned long val);
415 void g_neg (unsigned flags);
416 void g_bneg (unsigned flags);
417 void g_com (unsigned flags);
418 void g_inc (unsigned flags, unsigned long n);
419 void g_dec (unsigned flags, unsigned long n);
420 void g_eq (unsigned flags, unsigned long val);
421 void g_ne (unsigned flags, unsigned long val);
422 void g_lt (unsigned flags, unsigned long val);
423 void g_le (unsigned flags, unsigned long val);
424 void g_gt (unsigned flags, unsigned long val);
425 void g_ge (unsigned flags, unsigned long val);
427 void g_res (unsigned n);
428 /* Reserve static storage, n bytes */
430 void g_defdata (unsigned flags, unsigned long val, long offs);
431 /* Define data with the size given in flags */
433 void g_defbytes (const void* bytes, unsigned count);
434 /* Output a row of bytes as a constant */
436 void g_zerobytes (unsigned Count);
437 /* Output Count bytes of data initialized with zero */
439 void g_initregister (unsigned Label, unsigned Reg, unsigned Size);
440 /* Initialize a register variable from static initialization data */
442 void g_initauto (unsigned Label, unsigned Size);
443 /* Initialize a local variable at stack offset zero from static data */
445 void g_initstatic (unsigned InitLabel, unsigned VarLabel, unsigned Size);
446 /* Initialize a static local variable from static initialization data */
450 /*****************************************************************************/
451 /* Switch statement */
452 /*****************************************************************************/
456 void g_switch (Collection* Nodes, unsigned DefaultLabel, unsigned Depth);
457 /* Generate code for a switch statement */
461 /*****************************************************************************/
462 /* User supplied assembler code */
463 /*****************************************************************************/
467 void g_asmcode (struct StrBuf* B);
468 /* Output one line of assembler code. */
472 /* End of codegen.h */