xref: /netbsd-src/sys/dev/microcode/siop/osiop.ss (revision 21cc7f1b6b3ceba58353c4989891a751a88d9588)
1*21cc7f1bSmaya;	$NetBSD: osiop.ss,v 1.3 2016/12/12 15:58:44 maya Exp $
2613923b4Stsutsui
3613923b4Stsutsui;
4613923b4Stsutsui; Copyright (c) 1995 Michael L. Hitch
5613923b4Stsutsui; All rights reserved.
6613923b4Stsutsui;
7613923b4Stsutsui; Redistribution and use in source and binary forms, with or without
8613923b4Stsutsui; modification, are permitted provided that the following conditions
9613923b4Stsutsui; are met:
10613923b4Stsutsui; 1. Redistributions of source code must retain the above copyright
11613923b4Stsutsui;    notice, this list of conditions and the following disclaimer.
12613923b4Stsutsui; 2. Redistributions in binary form must reproduce the above copyright
13613923b4Stsutsui;    notice, this list of conditions and the following disclaimer in the
14613923b4Stsutsui;    documentation and/or other materials provided with the distribution.
15613923b4Stsutsui;
16613923b4Stsutsui; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17613923b4Stsutsui; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18613923b4Stsutsui; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19613923b4Stsutsui; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20613923b4Stsutsui; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21613923b4Stsutsui; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22613923b4Stsutsui; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23613923b4Stsutsui; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24613923b4Stsutsui; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25613923b4Stsutsui; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26613923b4Stsutsui;
27613923b4Stsutsui
28613923b4Stsutsui; NCR 53c710 script
29613923b4Stsutsui;
30613923b4StsutsuiARCH 710
31613923b4Stsutsui;
32613923b4StsutsuiABSOLUTE ds_Device	= 0
33613923b4StsutsuiABSOLUTE ds_MsgOut 	= ds_Device + 8
34613923b4StsutsuiABSOLUTE ds_Cmd		= ds_MsgOut + 8
35613923b4StsutsuiABSOLUTE ds_Status	= ds_Cmd + 8
36613923b4StsutsuiABSOLUTE ds_Msg		= ds_Status + 8
37613923b4StsutsuiABSOLUTE ds_MsgIn	= ds_Msg + 8
38613923b4StsutsuiABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
39613923b4StsutsuiABSOLUTE ds_SyncMsg	= ds_ExtMsg + 8
40613923b4StsutsuiABSOLUTE ds_Data1	= ds_SyncMsg + 8
41613923b4StsutsuiABSOLUTE ds_Data2	= ds_Data1 + 8
42613923b4StsutsuiABSOLUTE ds_Data3	= ds_Data2 + 8
43613923b4StsutsuiABSOLUTE ds_Data4	= ds_Data3 + 8
44613923b4StsutsuiABSOLUTE ds_Data5	= ds_Data4 + 8
45613923b4StsutsuiABSOLUTE ds_Data6	= ds_Data5 + 8
46613923b4StsutsuiABSOLUTE ds_Data7	= ds_Data6 + 8
47613923b4StsutsuiABSOLUTE ds_Data8	= ds_Data7 + 8
48613923b4StsutsuiABSOLUTE ds_Data9	= ds_Data8 + 8
49613923b4StsutsuiABSOLUTE ds_Data10	= ds_Data9 + 8
50613923b4StsutsuiABSOLUTE ds_Data11	= ds_Data10 + 8
51613923b4StsutsuiABSOLUTE ds_Data12	= ds_Data11 + 8
52613923b4StsutsuiABSOLUTE ds_Data13	= ds_Data12 + 8
53613923b4StsutsuiABSOLUTE ds_Data14	= ds_Data13 + 8
54613923b4StsutsuiABSOLUTE ds_Data15	= ds_Data14 + 8
55613923b4StsutsuiABSOLUTE ds_Data16	= ds_Data15 + 8
56613923b4StsutsuiABSOLUTE ds_Data17	= ds_Data16 + 8
57613923b4Stsutsui
58613923b4Stsutsui
59613923b4StsutsuiABSOLUTE ok		= 0xff00
60613923b4StsutsuiABSOLUTE int_disc	= 0xff01
61613923b4StsutsuiABSOLUTE int_disc_wodp	= 0xff02
62613923b4StsutsuiABSOLUTE int_reconnect	= 0xff03
63613923b4StsutsuiABSOLUTE int_connect	= 0xff04
64613923b4StsutsuiABSOLUTE int_phase	= 0xff05
65613923b4StsutsuiABSOLUTE int_msgin	= 0xff06
66613923b4StsutsuiABSOLUTE int_extmsg	= 0xff07
67613923b4StsutsuiABSOLUTE int_msgsdp	= 0xff08
68613923b4StsutsuiABSOLUTE int_identify	= 0xff09
69613923b4StsutsuiABSOLUTE int_status	= 0xff0a
70613923b4StsutsuiABSOLUTE int_syncmsg	= 0xff0b
71613923b4Stsutsui
72613923b4StsutsuiENTRY	scripts
73613923b4StsutsuiENTRY	switch
74613923b4StsutsuiENTRY	wait_reselect
75613923b4StsutsuiENTRY	dataout
76613923b4StsutsuiENTRY	datain
77613923b4StsutsuiENTRY	clear_ack
78613923b4Stsutsui
79613923b4StsutsuiPROC	osiop_script:
80613923b4Stsutsui
81613923b4Stsutsuiscripts:
82613923b4Stsutsui
83613923b4Stsutsui	SELECT ATN FROM ds_Device, REL(reselect)
84613923b4Stsutsui;
85613923b4Stsutsuiswitch:
86613923b4Stsutsui	JUMP REL(msgin), WHEN MSG_IN
87613923b4Stsutsui	JUMP REL(msgout), IF MSG_OUT
88613923b4Stsutsui	JUMP REL(command_phase), IF CMD
89613923b4Stsutsui	JUMP REL(dataout), IF DATA_OUT
90613923b4Stsutsui	JUMP REL(datain), IF DATA_IN
91613923b4Stsutsui	JUMP REL(end), IF STATUS
92613923b4Stsutsui
93613923b4Stsutsui	INT int_phase			; Unrecognized phase
94613923b4Stsutsui
95613923b4Stsutsuimsgin:
96613923b4Stsutsui	MOVE FROM ds_MsgIn, WHEN MSG_IN
97613923b4Stsutsui	JUMP REL(ext_msg), IF 0x01	; extended message
98613923b4Stsutsui	JUMP REL(disc), IF 0x04		; disconnect message
99613923b4Stsutsui	JUMP REL(msg_sdp), IF 0x02	; save data pointers
100613923b4Stsutsui	JUMP REL(msg_rej), IF 0x07	; message reject
101613923b4Stsutsui	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
102613923b4Stsutsui	INT int_msgin			; unrecognized message
103613923b4Stsutsui
104613923b4Stsutsuimsg_rej:
105613923b4Stsutsui; Do we need to interrupt host here to let it handle the reject?
106613923b4Stsutsuimsg_rdp:
107613923b4Stsutsuiclear_ack:
108613923b4Stsutsui	CLEAR ACK
109613923b4Stsutsui	CLEAR ATN
110613923b4Stsutsui	JUMP REL(switch)
111613923b4Stsutsui
112613923b4Stsutsuiext_msg:
113613923b4Stsutsui	CLEAR ACK
114613923b4Stsutsui	MOVE FROM ds_ExtMsg, WHEN MSG_IN
115613923b4Stsutsui	JUMP REL(sync_msg), IF 0x03
116613923b4Stsutsui	int int_extmsg			; extended message not SDTR
117613923b4Stsutsui
118613923b4Stsutsuisync_msg:
119613923b4Stsutsui	CLEAR ACK
120613923b4Stsutsui	MOVE FROM ds_SyncMsg, WHEN MSG_IN
121613923b4Stsutsui	int int_syncmsg			; Let host handle the message
122613923b4Stsutsui; If we continue from the interrupt, the host has set up a response
123613923b4Stsutsui; message to be sent.  Set ATN, clear ACK, and continue.
124613923b4Stsutsui	SET ATN
125613923b4Stsutsui	CLEAR ACK
126613923b4Stsutsui	JUMP REL(switch)
127613923b4Stsutsui
128613923b4Stsutsuidisc:
129613923b4Stsutsui	CLEAR ACK
130613923b4Stsutsui	WAIT DISCONNECT
131613923b4Stsutsui
132613923b4Stsutsui	int int_disc_wodp		; signal disconnect w/o save DP
133613923b4Stsutsui
134613923b4Stsutsuimsg_sdp:
135613923b4Stsutsui	CLEAR ACK			; acknowledge message
136613923b4Stsutsui	JUMP REL(switch), WHEN NOT MSG_IN
137613923b4Stsutsui	MOVE FROM ds_ExtMsg, WHEN MSG_IN
138613923b4Stsutsui	INT int_msgsdp, IF NOT 0x04	; interrupt if not disconnect
139613923b4Stsutsui	CLEAR ACK
140613923b4Stsutsui	WAIT DISCONNECT
141613923b4Stsutsui
142613923b4Stsutsui	INT int_disc			; signal disconnect
143613923b4Stsutsui
144613923b4Stsutsuireselect:
145613923b4Stsutsuiwait_reselect:
146613923b4Stsutsui	WAIT RESELECT REL(select_adr)
147613923b4Stsutsui	MOVE LCRC to SFBR		; Save reselect ID
148613923b4Stsutsui	MOVE SFBR to SCRATCH0
149613923b4Stsutsui
150613923b4Stsutsui	INT int_identify, WHEN NOT MSG_IN
151613923b4Stsutsui	MOVE FROM ds_Msg, WHEN MSG_IN
152613923b4Stsutsui	INT int_reconnect		; let host know about reconnect
153*21cc7f1bSmaya	CLEAR ACK			; acknowledge the message
154613923b4Stsutsui	JUMP REL(switch)
155613923b4Stsutsui
156613923b4Stsutsuiselect_adr:
157613923b4Stsutsui	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
158613923b4Stsutsui	INT int_connect, IF 0x00	; tell host if not connected
159613923b4Stsutsui	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
160613923b4Stsutsui	JUMP REL(wait_reselect)		; and try reselect again
161613923b4Stsutsui
162613923b4Stsutsuimsgout:
163613923b4Stsutsui	MOVE FROM ds_MsgOut, WHEN MSG_OUT
164613923b4Stsutsui	JUMP REL(switch)
165613923b4Stsutsui
166613923b4Stsutsuicommand_phase:
167613923b4Stsutsui	CLEAR ATN
168613923b4Stsutsui	MOVE FROM ds_Cmd, WHEN CMD
169613923b4Stsutsui	JUMP REL(switch)
170613923b4Stsutsui
171613923b4Stsutsuidataout:
172613923b4Stsutsui	MOVE FROM ds_Data1, WHEN DATA_OUT
173613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
174613923b4Stsutsui	MOVE FROM ds_Data2, WHEN DATA_OUT
175613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
176613923b4Stsutsui	MOVE FROM ds_Data3, WHEN DATA_OUT
177613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
178613923b4Stsutsui	MOVE FROM ds_Data4, WHEN DATA_OUT
179613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
180613923b4Stsutsui	MOVE FROM ds_Data5, WHEN DATA_OUT
181613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
182613923b4Stsutsui	MOVE FROM ds_Data6, WHEN DATA_OUT
183613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
184613923b4Stsutsui	MOVE FROM ds_Data7, WHEN DATA_OUT
185613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
186613923b4Stsutsui	MOVE FROM ds_Data8, WHEN DATA_OUT
187613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
188613923b4Stsutsui	MOVE FROM ds_Data9, WHEN DATA_OUT
189613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
190613923b4Stsutsui	MOVE FROM ds_Data10, WHEN DATA_OUT
191613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
192613923b4Stsutsui	MOVE FROM ds_Data11, WHEN DATA_OUT
193613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
194613923b4Stsutsui	MOVE FROM ds_Data12, WHEN DATA_OUT
195613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
196613923b4Stsutsui	MOVE FROM ds_Data13, WHEN DATA_OUT
197613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
198613923b4Stsutsui	MOVE FROM ds_Data14, WHEN DATA_OUT
199613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
200613923b4Stsutsui	MOVE FROM ds_Data15, WHEN DATA_OUT
201613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
202613923b4Stsutsui	MOVE FROM ds_Data16, WHEN DATA_OUT
203613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_OUT
204613923b4Stsutsui	MOVE FROM ds_Data17, WHEN DATA_OUT
205613923b4Stsutsui	CALL REL(switch)
206613923b4Stsutsui
207613923b4Stsutsuidatain:
208613923b4Stsutsui	MOVE FROM ds_Data1, WHEN DATA_IN
209613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
210613923b4Stsutsui	MOVE FROM ds_Data2, WHEN DATA_IN
211613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
212613923b4Stsutsui	MOVE FROM ds_Data3, WHEN DATA_IN
213613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
214613923b4Stsutsui	MOVE FROM ds_Data4, WHEN DATA_IN
215613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
216613923b4Stsutsui	MOVE FROM ds_Data5, WHEN DATA_IN
217613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
218613923b4Stsutsui	MOVE FROM ds_Data6, WHEN DATA_IN
219613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
220613923b4Stsutsui	MOVE FROM ds_Data7, WHEN DATA_IN
221613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
222613923b4Stsutsui	MOVE FROM ds_Data8, WHEN DATA_IN
223613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
224613923b4Stsutsui	MOVE FROM ds_Data9, WHEN DATA_IN
225613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
226613923b4Stsutsui	MOVE FROM ds_Data10, WHEN DATA_IN
227613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
228613923b4Stsutsui	MOVE FROM ds_Data11, WHEN DATA_IN
229613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
230613923b4Stsutsui	MOVE FROM ds_Data12, WHEN DATA_IN
231613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
232613923b4Stsutsui	MOVE FROM ds_Data13, WHEN DATA_IN
233613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
234613923b4Stsutsui	MOVE FROM ds_Data14, WHEN DATA_IN
235613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
236613923b4Stsutsui	MOVE FROM ds_Data15, WHEN DATA_IN
237613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
238613923b4Stsutsui	MOVE FROM ds_Data16, WHEN DATA_IN
239613923b4Stsutsui	CALL REL(switch), WHEN NOT DATA_IN
240613923b4Stsutsui	MOVE FROM ds_Data17, WHEN DATA_IN
241613923b4Stsutsui	CALL REL(switch)
242613923b4Stsutsui
243613923b4Stsutsuiend:
244613923b4Stsutsui	MOVE FROM ds_Status, WHEN STATUS
245613923b4Stsutsui	int int_status, WHEN NOT MSG_IN	; status not followed by msg
246613923b4Stsutsui	MOVE FROM ds_Msg, WHEN MSG_IN
247613923b4Stsutsui	CLEAR ACK
248613923b4Stsutsui	WAIT DISCONNECT
249613923b4Stsutsui	INT ok				; signal completion
250613923b4Stsutsui	JUMP REL(wait_reselect)
251