1 /*
2 ** Starscream 680x0 emulation library
3 ** Copyright 1997, 1998, 1999 Neill Corlett
4 **
5 ** Refer to STARDOC.TXT for terms of use, API reference, and directions on
6 ** how to compile.
7 */
8 
9 #ifndef __STARCPU_H__
10 #define __STARCPU_H__
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 /* Remember to byte-swap these regions. (read STARDOC.TXT for details) */
17 struct STARSCREAM_PROGRAMREGION {
18 	unsigned lowaddr;
19 	unsigned highaddr;
20 	unsigned offset;
21 };
22 
23 struct STARSCREAM_DATAREGION {
24 	unsigned lowaddr;
25 	unsigned highaddr;
26 	unsigned (*memorycall)(unsigned, unsigned);
27 	void    *userdata;
28 };
29 
30 /* Memory structures for 16-bit data path */
31 #define STARSCREAM_CONTEXTINFO_MEM16                          \
32 	struct STARSCREAM_PROGRAMREGION *fetch;               \
33 	struct STARSCREAM_DATAREGION    *readbyte;            \
34 	struct STARSCREAM_DATAREGION    *readword;            \
35 	struct STARSCREAM_DATAREGION    *writebyte;           \
36 	struct STARSCREAM_DATAREGION    *writeword;           \
37 	struct STARSCREAM_PROGRAMREGION *s_fetch;             \
38 	struct STARSCREAM_DATAREGION    *s_readbyte;          \
39 	struct STARSCREAM_DATAREGION    *s_readword;          \
40 	struct STARSCREAM_DATAREGION    *s_writebyte;         \
41 	struct STARSCREAM_DATAREGION    *s_writeword;         \
42 	struct STARSCREAM_PROGRAMREGION *u_fetch;             \
43 	struct STARSCREAM_DATAREGION    *u_readbyte;          \
44 	struct STARSCREAM_DATAREGION    *u_readword;          \
45 	struct STARSCREAM_DATAREGION    *u_writebyte;         \
46 	struct STARSCREAM_DATAREGION    *u_writeword;         \
47 
48 /* Memory structures for 16-bit data path with function code support */
49 #define STARSCREAM_CONTEXTINFO_MEM16FC                        \
50 	unsigned     (*f_readbyte) (unsigned f, unsigned a);  \
51 	unsigned     (*f_readword) (unsigned f, unsigned a);  \
52 	unsigned     (*f_writebyte)(unsigned f, unsigned a);  \
53 	unsigned     (*f_writeword)(unsigned f, unsigned a);  \
54 
55 /* Memory structures for 32-bit sizable data path */
56 #define STARSCREAM_CONTEXTINFO_MEM32                          \
57 	struct STARSCREAM_PROGRAMREGION *fetch;               \
58 	struct STARSCREAM_DATAREGION    *readbus;             \
59 	struct STARSCREAM_DATAREGION    *writebus;            \
60 	struct STARSCREAM_PROGRAMREGION *s_fetch;             \
61 	struct STARSCREAM_DATAREGION    *s_readbus;           \
62 	struct STARSCREAM_DATAREGION    *s_writebus;          \
63 	struct STARSCREAM_PROGRAMREGION *u_fetch;             \
64 	struct STARSCREAM_DATAREGION    *u_readbus;           \
65 	struct STARSCREAM_DATAREGION    *u_writebus;          \
66 	unsigned     (*f_readbus) (unsigned f, unsigned a);   \
67 	unsigned     (*f_writebus)(unsigned f, unsigned a);   \
68 
69 /* Common context info for all 680x0 types */
70 #define STARSCREAM_CONTEXTINFO_COMMON                         \
71 	void         (*resethandler)(void);                   \
72 	void         (*inthandler)(void);                     \
73 	unsigned       dreg[8];                               \
74 	unsigned       areg[8];                               \
75 	unsigned       asp;                                   \
76 	unsigned       pc;                                    \
77 	unsigned       odometer;                              \
78 	unsigned char  interrupts[8];                         \
79 	unsigned short sr;                                    \
80 
81 /* 68000-specific context info */
82 #define STARSCREAM_CONTEXTINFO_68000SPECIFIC                  \
83 	unsigned short contextfiller00;                       \
84 
85 /* Context info for 68010 and higher */
86 #define STARSCREAM_CONTEXTINFO_68010                          \
87 	unsigned char  sfc;                                   \
88 	unsigned char  dfc;                                   \
89 	unsigned       vbr;                                   \
90 	void         (*bkpthandler)(void);                    \
91 
92 /* 68010-specific context info */
93 #define STARSCREAM_CONTEXTINFO_68010SPECIFIC                  \
94 	unsigned char  loopmode;                              \
95 	unsigned char  contextfiller10[3];                    \
96 
97 /* Context info for 68020 and higher */
98 #define STARSCREAM_CONTEXTINFO_68020                          \
99 	unsigned       asp2;                                  \
100 
101 struct S68000CONTEXT {
102 	STARSCREAM_CONTEXTINFO_MEM16
103 	STARSCREAM_CONTEXTINFO_COMMON
104 	STARSCREAM_CONTEXTINFO_68000SPECIFIC
105 };
106 
107 struct S68010CONTEXT {
108 	STARSCREAM_CONTEXTINFO_MEM16
109 	STARSCREAM_CONTEXTINFO_MEM16FC
110 	STARSCREAM_CONTEXTINFO_COMMON
111 	STARSCREAM_CONTEXTINFO_68010
112 	STARSCREAM_CONTEXTINFO_68010SPECIFIC
113 };
114 
115 struct S68020CONTEXT {
116 	STARSCREAM_CONTEXTINFO_MEM32
117 	STARSCREAM_CONTEXTINFO_COMMON
118 	STARSCREAM_CONTEXTINFO_68010
119 	STARSCREAM_CONTEXTINFO_68020
120 };
121 
122 #define STARSCREAM_IDENTIFIERS(SNC,SN)                        \
123                                                               \
124 extern struct SNC##CONTEXT SN##context;                       \
125                                                               \
126 int      SN##init             (void);                         \
127 unsigned SN##reset            (void);                         \
128 unsigned SN##exec             (int n);                        \
129 int      SN##interrupt        (int level, int vector);        \
130 void     SN##flushInterrupts  (void);                         \
131 int      SN##GetContextSize   (void);                         \
132 void     SN##GetContext       (void *context);                \
133 void     SN##SetContext       (void *context);                \
134 int      SN##fetch            (unsigned address);             \
135 unsigned SN##readOdometer     (void);                         \
136 unsigned SN##tripOdometer     (void);                         \
137 unsigned SN##controlOdometer  (int n);                        \
138 void     SN##releaseTimeslice (void);                         \
139 unsigned SN##readPC           (void);                         \
140 
141 STARSCREAM_IDENTIFIERS(S68000,s68000)
142 STARSCREAM_IDENTIFIERS(S68010,s68010)
143 STARSCREAM_IDENTIFIERS(S68020,s68020)
144 
145 #ifdef __cplusplus
146 }
147 #endif
148 
149 #endif
150