|
|
1.1 root 1: #ifndef _AS68K_H
2: #define _AS68K_H
3:
4: #ifdef WIN32
5: typedef unsigned int uint;
6: #endif /* WIN32 */
7:
8: #define LAB_LEN 64
9: /* atari .prg binaries have header then code at 0x1c */
10: #define BASE 0x1c
11:
12: /* ea modes as encoded in the 68k instructions */
13: #define MODE_DREG 0
14:
15: /* and ea modes as flags, used in various assembler funcs */
16: #define F_DREG (1<<0)
17: #define F_AREG (1<<1)
18: #define F_IND (1<<2)
19: #define F_POST (1<<3)
20: #define F_PRE (1<<4)
21: #define F_OFFSET (1<<5)
22: #define F_INDEX (1<<6)
23: #define F_MEM_W (1<<7)
24: #define F_MEM_L (1<<8)
25: #define F_IMM (1<<9)
26: #define F_PC_OFFSET (1<<10)
27: #define F_PC_INDEX (1<<11)
28:
29: #define F_NOLABELS (1<<12)
30:
31: #define F_NOIMM_NOPC_NOAREG (F_DREG | F_IND | F_POST | F_PRE | \
32: F_OFFSET | F_INDEX | F_MEM_W | F_MEM_L)
33: #define F_ALL (0xffffffff & (~(F_NOLABELS)))
34: #define F_ALL_NOAREG (F_ALL & (~F_AREG))
35:
36: enum SIZE { BYTE, WORD, LONG, LONG_FIXUP, C_ADDR, C_FUNC };
37: extern const int size2len[];
38:
39: struct ImmVal {
40: int has_label;
41: char label[LAB_LEN];
42: int val;
43: };
44:
45: typedef struct ea_t {
46: int mode;
47: int reg;
48: int op_size;
49: struct ImmVal imm;
50: union Ext {
51: short ext;
52: struct {
53: int displacement : 8;
54: int ZERO : 3;
55: uint size : 1;
56: uint reg : 3;
57: uint d_or_a : 1;
58: } _;
59: } ext;
60: /* used by the ->i386 compiler. set by x_readea, and will
61: * be (for example) eax, or some immediate value in string
62: * form */
63: char identifier[32];
64: int x86_reg;
65: /* used to keep the writeback address for complex addressing
66: * modes. reused at the end of the instruction... */
67: int x86_reg_writeback;
68: int do_writeback;
69: } ea_t;
70:
71: typedef union Opcode {
72: unsigned short code;
73: struct move {
74: uint src_reg : 3;
75: uint src_mode : 3;
76: uint dest_mode : 3;
77: uint dest_reg : 3;
78: uint size : 2;
79: uint op : 2;
80: } move;
81: struct adr_index {
82: int displacement : 8;
83: uint zeros : 3;
84: uint ind_size : 1;
85: uint reg : 3;
86: uint reg_type : 1;
87: } adr_index;
88: struct addq {
89: uint dest_reg : 3;
90: uint dest_mode : 3;
91: uint size : 2;
92: uint issub : 1;
93: uint data : 3;
94: uint op : 4;
95: } addq;
96: struct jmp {
97: uint dest_reg : 3;
98: uint dest_mode : 3;
99: uint op : 10;
100: } jmp;
101: struct addi {
102: uint dest_reg : 3;
103: uint dest_mode : 3;
104: uint size : 2;
105: uint OP6 : 8;
106: } addi;
107: /* size and effective address */
108: struct type1 {
109: uint ea_reg : 3;
110: uint ea_mode : 3;
111: uint size : 2;
112: uint op : 8;
113: } type1;
114: /* reg, opmode, ea */
115: struct type2 {
116: uint ea_reg : 3;
117: uint ea_mode : 3;
118: uint op_mode : 3;
119: uint reg : 3;
120: uint op : 4;
121: } type2;
122: struct MemShift {
123: uint ea_reg : 3;
124: uint ea_mode : 3;
125: uint OP3 : 2;
126: uint dr : 1;
127: uint type : 2;
128: uint OP0x1c : 5;
129: } MemShift;
130: struct ASx {
131: uint reg : 3;
132: uint OP0 : 2;
133: uint ir : 1;
134: uint size : 2;
135: uint dr : 1;
136: uint count_reg : 3;
137: uint OP0xe : 4;
138: } ASx;
139: struct abcd {
140: uint src_reg : 3;
141: uint rm : 1;
142: uint OP16 : 5;
143: uint dest_reg : 3;
144: uint OP12 : 4;
145: } abcd;
146: struct addx {
147: uint src_reg : 3;
148: uint rm : 1;
149: uint OP0 : 2;
150: uint size : 2;
151: uint OP1 : 1;
152: uint dest_reg : 3;
153: uint op : 4;
154: } addx;
155: struct cmpm {
156: uint src_reg : 3;
157: uint OP1_1 : 3;
158: uint size : 2;
159: uint OP2_1 : 1;
160: uint dest_reg : 3;
161: uint OP0xb : 4;
162: } cmpm;
163: /* branches */
164: struct DBcc {
165: uint reg : 3;
166: uint OP25 : 5;
167: uint cond : 4;
168: uint OP5 : 4;
169: } DBcc;
170: struct Bcc {
171: int displacement : 8;
172: uint cond : 4;
173: uint op : 4;
174: } Bcc;
175: struct bra {
176: int displacement : 8;
177: uint op : 8;
178: } bra;
179: struct movem {
180: uint dest_reg : 3;
181: uint dest_mode : 3;
182: uint sz : 1;
183: uint ONE : 3;
184: uint dr : 1;
185: uint NINE : 5;
186: } movem;
187: struct lea {
188: uint dest_reg : 3;
189: uint dest_mode : 3;
190: uint SEVEN : 3;
191: uint reg : 3;
192: uint FOUR : 4;
193: } lea;
194: struct moveq {
195: int data : 8;
196: uint ZERO : 1;
197: uint reg : 3;
198: uint SEVEN : 4;
199: } moveq;
200: struct exg {
201: uint dest_reg : 3;
202: uint op_mode : 5;
203: uint OP1 : 1;
204: uint src_reg : 3;
205: uint OP0xc : 4;
206: } exg;
207: } Opcode;
208:
209: struct Fixup {
210: int rel_to;
211: int line_no;
212: int size;
213: int adr;
214: char label[LAB_LEN];
215: struct Fixup *next;
216: };
217:
218: struct Label {
219: const char *name;
220: int val;
221: enum LAB_TYPE {
222: L_ADDR,
223: L_CONST
224: } type;
225: };
226:
227: /* label lookup */
228: struct Label *get_label (const char *name);
229: void add_label (const char *name, int type, int val);
230: void add_fixup (int adr, int size, const char *label);
231: void error (const char *format, ...);
232: void bug_error (const char *format, ...);
233: int get_bitpos ();
234:
235: /* fixups linked list */
236: extern struct Fixup *fix_first;
237: extern struct Fixup *fix_last;
238: extern int line_no;
239:
240: #endif /* _AS68K_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.