xref: /openbsd/sys/dev/microcode/siop/osiop.ss (revision 76d0caae)
1;	$OpenBSD: osiop.ss,v 1.2 2013/01/06 22:06:54 martynas Exp $
2;	$NetBSD: osiop.ss,v 1.1 2001/04/30 04:47:51 tsutsui Exp $
3
4;
5; Copyright (c) 1995 Michael L. Hitch
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; 2. Redistributions in binary form must reproduce the above copyright
14;    notice, this list of conditions and the following disclaimer in the
15;    documentation and/or other materials provided with the distribution.
16; 3. All advertising materials mentioning features or use of this software
17;    must display the following acknowledgement:
18;      This product includes software developed by Michael L. Hitch.
19; 4. The name of the author may not be used to endorse or promote products
20;    derived from this software without specific prior written permission
21;
22; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32;
33
34; NCR 53c710 script
35;
36ARCH 710
37;
38ABSOLUTE ds_Device	= 0
39ABSOLUTE ds_MsgOut 	= ds_Device + 8
40ABSOLUTE ds_Cmd		= ds_MsgOut + 8
41ABSOLUTE ds_Status	= ds_Cmd + 8
42ABSOLUTE ds_Msg		= ds_Status + 8
43ABSOLUTE ds_MsgIn	= ds_Msg + 8
44ABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
45ABSOLUTE ds_SyncMsg	= ds_ExtMsg + 8
46ABSOLUTE ds_Data1	= ds_SyncMsg + 8
47ABSOLUTE ds_Data2	= ds_Data1 + 8
48ABSOLUTE ds_Data3	= ds_Data2 + 8
49ABSOLUTE ds_Data4	= ds_Data3 + 8
50ABSOLUTE ds_Data5	= ds_Data4 + 8
51ABSOLUTE ds_Data6	= ds_Data5 + 8
52ABSOLUTE ds_Data7	= ds_Data6 + 8
53ABSOLUTE ds_Data8	= ds_Data7 + 8
54ABSOLUTE ds_Data9	= ds_Data8 + 8
55ABSOLUTE ds_Data10	= ds_Data9 + 8
56ABSOLUTE ds_Data11	= ds_Data10 + 8
57ABSOLUTE ds_Data12	= ds_Data11 + 8
58ABSOLUTE ds_Data13	= ds_Data12 + 8
59ABSOLUTE ds_Data14	= ds_Data13 + 8
60ABSOLUTE ds_Data15	= ds_Data14 + 8
61ABSOLUTE ds_Data16	= ds_Data15 + 8
62ABSOLUTE ds_Data17	= ds_Data16 + 8
63
64
65ABSOLUTE ok		= 0xff00
66ABSOLUTE int_disc	= 0xff01
67ABSOLUTE int_disc_wodp	= 0xff02
68ABSOLUTE int_reconnect	= 0xff03
69ABSOLUTE int_connect	= 0xff04
70ABSOLUTE int_phase	= 0xff05
71ABSOLUTE int_msgin	= 0xff06
72ABSOLUTE int_extmsg	= 0xff07
73ABSOLUTE int_msgsdp	= 0xff08
74ABSOLUTE int_identify	= 0xff09
75ABSOLUTE int_status	= 0xff0a
76ABSOLUTE int_syncmsg	= 0xff0b
77
78ENTRY	scripts
79ENTRY	switch
80ENTRY	wait_reselect
81ENTRY	dataout
82ENTRY	datain
83ENTRY	clear_ack
84
85PROC	osiop_script:
86
87scripts:
88
89	SELECT ATN FROM ds_Device, REL(reselect)
90;
91switch:
92	JUMP REL(msgin), WHEN MSG_IN
93	JUMP REL(msgout), IF MSG_OUT
94	JUMP REL(command_phase), IF CMD
95	JUMP REL(dataout), IF DATA_OUT
96	JUMP REL(datain), IF DATA_IN
97	JUMP REL(end), IF STATUS
98
99	INT int_phase			; Unrecognized phase
100
101msgin:
102	MOVE FROM ds_MsgIn, WHEN MSG_IN
103	JUMP REL(ext_msg), IF 0x01	; extended message
104	JUMP REL(disc), IF 0x04		; disconnect message
105	JUMP REL(msg_sdp), IF 0x02	; save data pointers
106	JUMP REL(msg_rej), IF 0x07	; message reject
107	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
108	INT int_msgin			; unrecognized message
109
110msg_rej:
111; Do we need to interrupt host here to let it handle the reject?
112msg_rdp:
113clear_ack:
114	CLEAR ACK
115	CLEAR ATN
116	JUMP REL(switch)
117
118ext_msg:
119	CLEAR ACK
120	MOVE FROM ds_ExtMsg, WHEN MSG_IN
121	JUMP REL(sync_msg), IF 0x03
122	int int_extmsg			; extended message not SDTR
123
124sync_msg:
125	CLEAR ACK
126	MOVE FROM ds_SyncMsg, WHEN MSG_IN
127	int int_syncmsg			; Let host handle the message
128; If we continue from the interrupt, the host has set up a response
129; message to be sent.  Set ATN, clear ACK, and continue.
130	SET ATN
131	CLEAR ACK
132	JUMP REL(switch)
133
134disc:
135	CLEAR ACK
136	WAIT DISCONNECT
137
138	int int_disc_wodp		; signal disconnect w/o save DP
139
140msg_sdp:
141	CLEAR ACK			; acknowledge message
142	JUMP REL(switch), WHEN NOT MSG_IN
143	MOVE FROM ds_ExtMsg, WHEN MSG_IN
144	INT int_msgsdp, IF NOT 0x04	; interrupt if not disconnect
145	CLEAR ACK
146	WAIT DISCONNECT
147
148	INT int_disc			; signal disconnect
149
150reselect:
151wait_reselect:
152	WAIT RESELECT REL(select_adr)
153	MOVE LCRC to SFBR		; Save reselect ID
154	MOVE SFBR to SCRATCH0
155
156	INT int_identify, WHEN NOT MSG_IN
157	MOVE FROM ds_Msg, WHEN MSG_IN
158	INT int_reconnect		; let host know about reconnect
159	CLEAR ACK			; acknowledge the message
160	JUMP REL(switch)
161
162select_adr:
163	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
164	INT int_connect, IF 0x00	; tell host if not connected
165	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
166	JUMP REL(wait_reselect)		; and try reselect again
167
168msgout:
169	MOVE FROM ds_MsgOut, WHEN MSG_OUT
170	JUMP REL(switch)
171
172command_phase:
173	CLEAR ATN
174	MOVE FROM ds_Cmd, WHEN CMD
175	JUMP REL(switch)
176
177dataout:
178	MOVE FROM ds_Data1, WHEN DATA_OUT
179	CALL REL(switch), WHEN NOT DATA_OUT
180	MOVE FROM ds_Data2, WHEN DATA_OUT
181	CALL REL(switch), WHEN NOT DATA_OUT
182	MOVE FROM ds_Data3, WHEN DATA_OUT
183	CALL REL(switch), WHEN NOT DATA_OUT
184	MOVE FROM ds_Data4, WHEN DATA_OUT
185	CALL REL(switch), WHEN NOT DATA_OUT
186	MOVE FROM ds_Data5, WHEN DATA_OUT
187	CALL REL(switch), WHEN NOT DATA_OUT
188	MOVE FROM ds_Data6, WHEN DATA_OUT
189	CALL REL(switch), WHEN NOT DATA_OUT
190	MOVE FROM ds_Data7, WHEN DATA_OUT
191	CALL REL(switch), WHEN NOT DATA_OUT
192	MOVE FROM ds_Data8, WHEN DATA_OUT
193	CALL REL(switch), WHEN NOT DATA_OUT
194	MOVE FROM ds_Data9, WHEN DATA_OUT
195	CALL REL(switch), WHEN NOT DATA_OUT
196	MOVE FROM ds_Data10, WHEN DATA_OUT
197	CALL REL(switch), WHEN NOT DATA_OUT
198	MOVE FROM ds_Data11, WHEN DATA_OUT
199	CALL REL(switch), WHEN NOT DATA_OUT
200	MOVE FROM ds_Data12, WHEN DATA_OUT
201	CALL REL(switch), WHEN NOT DATA_OUT
202	MOVE FROM ds_Data13, WHEN DATA_OUT
203	CALL REL(switch), WHEN NOT DATA_OUT
204	MOVE FROM ds_Data14, WHEN DATA_OUT
205	CALL REL(switch), WHEN NOT DATA_OUT
206	MOVE FROM ds_Data15, WHEN DATA_OUT
207	CALL REL(switch), WHEN NOT DATA_OUT
208	MOVE FROM ds_Data16, WHEN DATA_OUT
209	CALL REL(switch), WHEN NOT DATA_OUT
210	MOVE FROM ds_Data17, WHEN DATA_OUT
211	CALL REL(switch)
212
213datain:
214	MOVE FROM ds_Data1, WHEN DATA_IN
215	CALL REL(switch), WHEN NOT DATA_IN
216	MOVE FROM ds_Data2, WHEN DATA_IN
217	CALL REL(switch), WHEN NOT DATA_IN
218	MOVE FROM ds_Data3, WHEN DATA_IN
219	CALL REL(switch), WHEN NOT DATA_IN
220	MOVE FROM ds_Data4, WHEN DATA_IN
221	CALL REL(switch), WHEN NOT DATA_IN
222	MOVE FROM ds_Data5, WHEN DATA_IN
223	CALL REL(switch), WHEN NOT DATA_IN
224	MOVE FROM ds_Data6, WHEN DATA_IN
225	CALL REL(switch), WHEN NOT DATA_IN
226	MOVE FROM ds_Data7, WHEN DATA_IN
227	CALL REL(switch), WHEN NOT DATA_IN
228	MOVE FROM ds_Data8, WHEN DATA_IN
229	CALL REL(switch), WHEN NOT DATA_IN
230	MOVE FROM ds_Data9, WHEN DATA_IN
231	CALL REL(switch), WHEN NOT DATA_IN
232	MOVE FROM ds_Data10, WHEN DATA_IN
233	CALL REL(switch), WHEN NOT DATA_IN
234	MOVE FROM ds_Data11, WHEN DATA_IN
235	CALL REL(switch), WHEN NOT DATA_IN
236	MOVE FROM ds_Data12, WHEN DATA_IN
237	CALL REL(switch), WHEN NOT DATA_IN
238	MOVE FROM ds_Data13, WHEN DATA_IN
239	CALL REL(switch), WHEN NOT DATA_IN
240	MOVE FROM ds_Data14, WHEN DATA_IN
241	CALL REL(switch), WHEN NOT DATA_IN
242	MOVE FROM ds_Data15, WHEN DATA_IN
243	CALL REL(switch), WHEN NOT DATA_IN
244	MOVE FROM ds_Data16, WHEN DATA_IN
245	CALL REL(switch), WHEN NOT DATA_IN
246	MOVE FROM ds_Data17, WHEN DATA_IN
247	CALL REL(switch)
248
249end:
250	MOVE FROM ds_Status, WHEN STATUS
251	int int_status, WHEN NOT MSG_IN	; status not followed by msg
252	MOVE FROM ds_Msg, WHEN MSG_IN
253	CLEAR ACK
254	WAIT DISCONNECT
255	INT ok				; signal completion
256	JUMP REL(wait_reselect)
257