1/*****************************************************************************/
2/* */
3/* reginfo.h */
4/* */
5/* 6502 register tracking info */
6/* */
7/* */
8/* */
9/* (C) 2001-2003 Ullrich von Bassewitz */
10/* Roemerstrasse 52 */
11/* D-70794 Filderstadt */
12/* EMail: uz@cc65.org */
13/* */
14/* */
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. */
18/* */
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: */
22/* */
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 */
30/* distribution. */
31/* */
32/*****************************************************************************/
33
34
35
36#ifndef REGINFO_H
37#define REGINFO_H
38
39
40
41#include <stdio.h> /* ### */
42
43/* common */
44#include "inline.h"
45
46
47
48/*****************************************************************************/
49/* Data */
50/*****************************************************************************/
51
52
53
54/* Encoding for an unknown register value */
55#define UNKNOWN_REGVAL -1
56
57/* Register contents */
58typedef struct RegContents RegContents;
59struct RegContents {
60 short RegA;
61 short RegX;
62 short RegY;
63 short SRegLo;
64 short SRegHi;
65 short Ptr1Lo;
66 short Ptr1Hi;
67 short Tmp1;
68};
69
70/* Register change info */
71typedef struct RegInfo RegInfo;
72struct RegInfo {
73 RegContents In; /* Incoming register values */
74 RegContents Out; /* Outgoing register values */
75 RegContents Out2; /* Alternative outgoing reg values for branches */
76};
77
78
79
80/*****************************************************************************/
81/* Code */
82/*****************************************************************************/
83
84
85
86void RC_Invalidate (RegContents* C);
87/* Invalidate all registers */
88
89void RC_InvalidateZP (RegContents* C);
90/* Invalidate all ZP registers */
91
92void RC_Dump (FILE* F, const RegContents* RC);
93/* Dump the contents of the given RegContents struct */
94
95#if defined(HAVE_INLINE)
96INLINE int RegValIsKnown (short Val)
97/* Return true if the register value is known */
98{
99 return (Val >= 0);
100}
101#else
102# define RegValIsKnown(S) ((S) >= 0)
103#endif
104
105#if defined(HAVE_INLINE)
106INLINE int RegValIsUnknown (short Val)
107/* Return true if the register value is not known */
108{
109 return (Val < 0);
110}
111#else
112# define RegValIsUnknown(S) ((S) < 0)
113#endif
114
115RegInfo* NewRegInfo (const RegContents* RC);
116/* Allocate a new register info, initialize and return it. If RC is not
117** a NULL pointer, it is used to initialize both, the input and output
118** registers. If the pointer is NULL, all registers are set to unknown.
119*/
120
121void FreeRegInfo (RegInfo* RI);
122/* Free a RegInfo struct */
123
124void DumpRegInfo (const char* Desc, const RegInfo* RI);
125/* Dump the register info for debugging */
126
127
128
129/* End of reginfo.h */
130
131#endif
132