siop.ss revision 1.3 1 ; $NetBSD: siop.ss,v 1.3 2000/04/27 14:08:09 bouyer Exp $
2
3 ;
4 ; Copyright (c) 2000 Manuel Bouyer.
5 ;
6 ; Redistribution and use in source and binary forms, with or without
7 ; modification, are permitted provided that the following conditions
8 ; are met:
9 ; 1. Redistributions of source code must retain the above copyright
10 ; notice, this list of conditions and the following disclaimer.
11 ; 2. Redistributions in binary form must reproduce the above copyright
12 ; notice, this list of conditions and the following disclaimer in the
13 ; documentation and/or other materials provided with the distribution.
14 ; 3. All advertising materials mentioning features or use of this software
15 ; must display the following acknowledgement:
16 ; This product includes software developed by Manuel Bouyer
17 ; 4. The name of the author may not be used to endorse or promote products
18 ; derived from this software without specific prior written permission.
19 ;
20 ; THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
21 ; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
22 ; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23 ; AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
24 ; OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 ; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 ; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 ; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 ; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 ; POSSIBILITY OF SUCH DAMAGE.
30 ;
31
32 ARCH 720
33
34 ; offsets in sym_xfer
35 ABSOLUTE t_id = 20;
36 ABSOLUTE t_msg_in = 28;
37 ABSOLUTE t_ext_msg_in = 36;
38 ABSOLUTE t_ext_msg_data = 44;
39 ABSOLUTE t_ext_msg_tag = 52;
40 ABSOLUTE t_msg_out = 60;
41 ABSOLUTE t_cmd = 68;
42 ABSOLUTE t_status = 76;
43 ABSOLUTE t_data = 84;
44
45 ;; interrupt codes
46 ABSOLUTE int_done = 0xff00;
47 ABSOLUTE int_msgin = 0xff01;
48 ABSOLUTE int_extmsgin = 0xff02;
49 ABSOLUTE int_extmsgdata = 0xff03;
50 ABSOLUTE int_resel = 0xff04;
51 ABSOLUTE int_reseltag = 0xff05;
52 ABSOLUTE int_resfail = 0xff06;
53 ABSOLUTE int_disc = 0xff07;
54 ABSOLUTE int_err = 0xffff;
55
56 ; flags for scratcha0
57 ABSOLUTE flag_sdp = 0x01 ; got save data pointer
58
59 ENTRY waitphase;
60 ENTRY send_msgout;
61 ENTRY msgout;
62 ENTRY msgin;
63 ENTRY msgin_ack;
64 ENTRY dataout;
65 ENTRY datain;
66 ENTRY cmdout;
67 ENTRY status;
68 ENTRY disconnect;
69 ENTRY reselect;
70 ENTRY selected;
71 ENTRY get_extmsgdata;
72 ENTRY sheduler;
73 ENTRY slot;
74 ENTRY idsa0;
75 ENTRY idsa1;
76 ENTRY idsa2;
77 ENTRY idsa3;
78 ENTRY slotdata;
79 ENTRY nextslot;
80 ENTRY endslot;
81
82 EXTERN slot_nextp;
83 EXTERN slot_shed_addrsrc;
84 EXTERN slot_abs_reselect;
85 EXTERN slot_abs_selected;
86
87 EXTERN endslot_abs_reselect;
88
89 PROC siop_script:
90
91 selected:
92 ; starting a new session, init 'local variables'
93 MOVE 0 to SCRATCHA0 ; flags
94 MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer)
95 waitphase:
96 JUMP REL(msgout), WHEN MSG_OUT;
97 JUMP REL(msgin), WHEN MSG_IN;
98 JUMP REL(dataout), WHEN DATA_OUT;
99 JUMP REL(datain), WHEN DATA_IN;
100 JUMP REL(cmdout), WHEN CMD;
101 JUMP REL(status), WHEN STATUS;
102 err:
103 INT int_err;
104
105 reselect:
106 WAIT RESELECT REL(reselect_fail)
107 MOVE SSID & 0x8f to SFBR
108 MOVE SFBR to SCRATCHA0 ; save reselect ID
109 INT int_err, WHEN NOT MSG_IN;
110 MOVE FROM t_msg_in, WHEN MSG_IN;
111 CLEAR ACK;
112 INT int_resel;
113
114 reselect_fail:
115 ; check that host asserted SIGP, this'll clear SIGP in ISTAT
116 MOVE CTEST2 & 0x40 TO SFBR;
117 INT int_resfail, IF 0x00;
118 JUMP REL(sheduler);
119
120 msgin:
121 CLEAR ATN
122 MOVE FROM t_msg_in, WHEN MSG_IN;
123 JUMP REL(handle_dis), IF 0x04 ; disconnect message
124 JUMP REL(handle_cmpl), IF 0x00 ; command complete message
125 JUMP REL(handle_sdp), IF 0x02 ; save data pointer message
126 JUMP REL(handle_extin), IF 0x01 ; extended message
127 INT int_msgin;
128 msgin_ack:
129 CLEAR ACK;
130 JUMP REL(waitphase);
131
132 ; entry point for msgout after a msgin or status phase
133 send_msgout:
134 SET ATN;
135 CLEAR ACK;
136 msgout:
137 MOVE FROM t_msg_out, WHEN MSG_OUT;
138 CLEAR ATN;
139 JUMP REL(waitphase);
140 cmdout:
141 MOVE FROM t_cmd, WHEN CMD;
142 JUMP REL(waitphase);
143 status:
144 MOVE FROM t_status, WHEN STATUS;
145 JUMP REL(waitphase);
146 datain:
147 CALL REL(savedsa);
148 datain_loop:
149 MOVE FROM t_data, WHEN DATA_IN;
150 MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
151 MOVE DSA0 + 8 to DSA0;
152 MOVE DSA1 + 0 to DSA1 WITH CARRY;
153 MOVE DSA2 + 0 to DSA2 WITH CARRY;
154 MOVE DSA3 + 0 to DSA3 WITH CARRY;
155 JUMP REL(datain_loop), WHEN DATA_IN;
156 CALL REL(restoredsa);
157 JUMP REL(waitphase);
158
159 dataout:
160 CALL REL(savedsa);
161 dataout_loop:
162 MOVE FROM t_data, WHEN DATA_OUT;
163 MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
164 MOVE DSA0 + 8 to DSA0;
165 MOVE DSA1 + 0 to DSA1 WITH CARRY;
166 MOVE DSA2 + 0 to DSA2 WITH CARRY;
167 MOVE DSA3 + 0 to DSA3 WITH CARRY;
168 JUMP REL(dataout_loop), WHEN DATA_OUT;
169 CALL REL(restoredsa);
170 JUMP REL(waitphase);
171
172 savedsa:
173 MOVE DSA0 to SFBR;
174 MOVE SFBR to SCRATCHB0;
175 MOVE DSA1 to SFBR;
176 MOVE SFBR to SCRATCHB1;
177 MOVE DSA2 to SFBR;
178 MOVE SFBR to SCRATCHB2;
179 MOVE DSA3 to SFBR;
180 MOVE SFBR to SCRATCHB3;
181 RETURN;
182
183 restoredsa:
184 MOVE SCRATCHB0 TO SFBR;
185 MOVE SFBR TO DSA0;
186 MOVE SCRATCHB1 TO SFBR;
187 MOVE SFBR TO DSA1;
188 MOVE SCRATCHB2 TO SFBR;
189 MOVE SFBR TO DSA2;
190 MOVE SCRATCHB3 TO SFBR;
191 MOVE SFBR TO DSA3;
192 RETURN;
193
194 disconnect:
195 MOVE SCNTL2 & 0x7f TO SCNTL2;
196 CLEAR ATN;
197 CLEAR ACK;
198 WAIT DISCONNECT;
199 RETURN;
200
201 handle_dis:
202 CALL REL(disconnect);
203 ; if we didn't get sdp, or if offset is 0, no need to interrupt
204 MOVE SCRATCHA0 & flag_sdp TO SFBR;
205 JUMP REL(sheduler), if 0x00;
206 MOVE SCRATCHA1 TO SFBR;
207 JUMP REL(sheduler), if 0x00;
208 ; Ok, we need to save data pointers
209 INT int_disc;
210
211 handle_cmpl:
212 CALL REL(disconnect);
213 INT int_done;
214 handle_sdp:
215 CLEAR ACK;
216 MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
217 JUMP REL(msgin) ; should get a disconnect message now
218
219 handle_extin:
220 CLEAR ACK;
221 INT int_err, IF NOT MSG_IN;
222 MOVE FROM t_ext_msg_in, WHEN MSG_IN;
223 INT int_extmsgin; /* let host fill in t_ext_msg_data */
224 get_extmsgdata:
225 CLEAR ACK;
226 INT int_err, IF NOT MSG_IN;
227 MOVE FROM t_ext_msg_data, WHEN MSG_IN;
228 INT int_extmsgdata;
229
230 sheduler:
231 NOP; /* will be changed by the slot scripts */
232
233 ; script used for the sheduler: when a slot is free the JUMP points to
234 ; the next slot so that instructions for this slot are not run.
235 ; once the CPU has set up the slot variables (DSA address) it changes
236 ; the JUMP address to 0 (so that it'll jump to the next instruction) and
237 ; this command will be processed next time the sheduler is executed.
238 ; When the target has been successfully selected the script changes the jump
239 ; addr back to the next slot, so that it's ignored the next time.
240 ;
241
242 PROC slot_script:
243 slot:
244 JUMP REL(nextslot);
245 idsa0:
246 MOVE 0x00 to dsa0;
247 idsa1:
248 MOVE 0x01 to dsa1;
249 idsa2:
250 MOVE 0x02 to dsa2;
251 idsa3:
252 MOVE 0x03 to dsa3;
253 SELECT ATN FROM t_id, slot_abs_reselect;
254 MOVE MEMORY 4, slot_shed_addrsrc, slot_nextp;
255 JUMP slot_abs_selected;
256 slotdata:
257 NOP; slot variables: dsa & jumppatchp
258 nextslot: NOP; /* will be changed to the next slot entry
259
260 PROC endslot_script:
261 JUMP endslot_abs_reselect;
262