1/*
2 * Instruction formats for the sequencer program downloaded to
3 * Aic7xxx SCSI host adapters
4 *
5 * Copyright (c) 1997, 1998, 2000 Justin T. Gibbs.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions, and the following disclaimer,
13 *    without modification.
14 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15 *    substantially similar to the "NO WARRANTY" disclaimer below
16 *    ("Disclaimer") and any redistribution must be conditioned upon
17 *    including a substantially similar Disclaimer requirement for further
18 *    binary redistribution.
19 * 3. Neither the names of the above-listed copyright holders nor the names
20 *    of any contributors may be used to endorse or promote products derived
21 *    from this software without specific prior written permission.
22 *
23 * Alternatively, this software may be distributed under the terms of the
24 * GNU General Public License ("GPL") version 2 as published by the Free
25 * Software Foundation.
26 *
27 * NO WARRANTY
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
37 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38 * POSSIBILITY OF SUCH DAMAGES.
39 *
40 * $Id: //depot/aic7xxx/aic7xxx/aicasm/aicasm_insformat.h#12 $
41 *
42 * $FreeBSD$
43 */
44
45#include <asm/byteorder.h>
46
47/* 8bit ALU logic operations */
48struct ins_format1 {
49#ifdef __LITTLE_ENDIAN
50	uint32_t	immediate	: 8,
51			source		: 9,
52			destination	: 9,
53			ret		: 1,
54			opcode		: 4,
55			parity		: 1;
56#else
57	uint32_t	parity		: 1,
58			opcode		: 4,
59			ret		: 1,
60			destination	: 9,
61			source		: 9,
62			immediate	: 8;
63#endif
64};
65
66/* 8bit ALU shift/rotate operations */
67struct ins_format2 {
68#ifdef __LITTLE_ENDIAN
69	uint32_t	shift_control	: 8,
70			source		: 9,
71			destination	: 9,
72			ret		: 1,
73			opcode		: 4,
74			parity		: 1;
75#else
76	uint32_t	parity		: 1,
77			opcode		: 4,
78			ret		: 1,
79			destination	: 9,
80			source		: 9,
81			shift_control	: 8;
82#endif
83};
84
85/* 8bit branch control operations */
86struct ins_format3 {
87#ifdef __LITTLE_ENDIAN
88	uint32_t	immediate	: 8,
89			source		: 9,
90			address		: 10,
91			opcode		: 4,
92			parity		: 1;
93#else
94	uint32_t	parity		: 1,
95			opcode		: 4,
96			address		: 10,
97			source		: 9,
98			immediate	: 8;
99#endif
100};
101
102/* 16bit ALU logic operations */
103struct ins_format4 {
104#ifdef __LITTLE_ENDIAN
105	uint32_t	opcode_ext	: 8,
106			source		: 9,
107			destination	: 9,
108			ret		: 1,
109			opcode		: 4,
110			parity		: 1;
111#else
112	uint32_t	parity		: 1,
113			opcode		: 4,
114			ret		: 1,
115			destination	: 9,
116			source		: 9,
117			opcode_ext	: 8;
118#endif
119};
120
121/* 16bit branch control operations */
122struct ins_format5 {
123#ifdef __LITTLE_ENDIAN
124	uint32_t	opcode_ext	: 8,
125			source		: 9,
126			address		: 10,
127			opcode		: 4,
128			parity		: 1;
129#else
130	uint32_t	parity		: 1,
131			opcode		: 4,
132			address		: 10,
133			source		: 9,
134			opcode_ext	: 8;
135#endif
136};
137
138/*  Far branch operations */
139struct ins_format6 {
140#ifdef __LITTLE_ENDIAN
141	uint32_t	page		: 3,
142			opcode_ext	: 5,
143			source		: 9,
144			address		: 10,
145			opcode		: 4,
146			parity		: 1;
147#else
148	uint32_t	parity		: 1,
149			opcode		: 4,
150			address		: 10,
151			source		: 9,
152			opcode_ext	: 5,
153			page		: 3;
154#endif
155};
156
157union ins_formats {
158		struct ins_format1 format1;
159		struct ins_format2 format2;
160		struct ins_format3 format3;
161		struct ins_format4 format4;
162		struct ins_format5 format5;
163		struct ins_format6 format6;
164		uint8_t		   bytes[4];
165		uint32_t	   integer;
166};
167struct instruction {
168	union	ins_formats format;
169	u_int	srcline;
170	struct symbol *patch_label;
171	STAILQ_ENTRY(instruction) links;
172};
173
174#define	AIC_OP_OR	0x0
175#define	AIC_OP_AND	0x1
176#define AIC_OP_XOR	0x2
177#define	AIC_OP_ADD	0x3
178#define	AIC_OP_ADC	0x4
179#define	AIC_OP_ROL	0x5
180#define	AIC_OP_BMOV	0x6
181
182#define	AIC_OP_MVI16	0x7
183
184#define	AIC_OP_JMP	0x8
185#define AIC_OP_JC	0x9
186#define AIC_OP_JNC	0xa
187#define AIC_OP_CALL	0xb
188#define	AIC_OP_JNE	0xc
189#define	AIC_OP_JNZ	0xd
190#define	AIC_OP_JE	0xe
191#define	AIC_OP_JZ	0xf
192
193/* Pseudo Ops */
194#define	AIC_OP_SHL	0x10
195#define	AIC_OP_SHR	0x20
196#define	AIC_OP_ROR	0x30
197
198/* 16bit Ops. Low byte main opcode.  High byte extended opcode. */
199#define	AIC_OP_OR16	0x8005
200#define	AIC_OP_AND16	0x8105
201#define	AIC_OP_XOR16	0x8205
202#define	AIC_OP_ADD16	0x8305
203#define	AIC_OP_ADC16	0x8405
204#define AIC_OP_JNE16	0x8805
205#define AIC_OP_JNZ16	0x8905
206#define AIC_OP_JE16	0x8C05
207#define AIC_OP_JZ16	0x8B05
208#define AIC_OP_JMP16	0x9005
209#define AIC_OP_JC16	0x9105
210#define AIC_OP_JNC16	0x9205
211#define AIC_OP_CALL16	0x9305
212
213/* Page extension is low three bits of second opcode byte. */
214#define AIC_OP_JMPF	0xA005
215#define AIC_OP_CALLF	0xB005
216#define AIC_OP_JCF	0xC005
217#define AIC_OP_JNCF	0xD005
218#define AIC_OP_CMPXCHG	0xE005
219