siop.ss revision 1.4 1 ; $NetBSD: siop.ss,v 1.4 2000/05/04 15:42:42 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 = 24;
36 ABSOLUTE t_msg_in = 32;
37 ABSOLUTE t_ext_msg_in = 40;
38 ABSOLUTE t_ext_msg_data = 48;
39 ABSOLUTE t_ext_msg_tag = 56;
40 ABSOLUTE t_msg_out = 64;
41 ABSOLUTE t_cmd = 72;
42 ABSOLUTE t_status = 80;
43 ABSOLUTE t_data = 88;
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 ABSOLUTE flag_data = 0x02 ; we're in data phase
59 ABSOLUTE flag_data_mask = 0xfd ; ~flag_data
60
61 ENTRY waitphase;
62 ENTRY send_msgout;
63 ENTRY msgout;
64 ENTRY msgin;
65 ENTRY msgin_ack;
66 ENTRY dataout;
67 ENTRY datain;
68 ENTRY cmdout;
69 ENTRY status;
70 ENTRY disconnect;
71 ENTRY reselect;
72 ENTRY selected;
73 ENTRY get_extmsgdata;
74 ENTRY sheduler;
75 ENTRY slot;
76 ENTRY idsa0;
77 ENTRY idsa1;
78 ENTRY idsa2;
79 ENTRY idsa3;
80 ENTRY slotdata;
81 ENTRY nextslot;
82 ENTRY endslot;
83
84 EXTERN slot_nextp;
85 EXTERN slot_shed_addrsrc;
86 EXTERN slot_abs_reselect;
87 EXTERN slot_abs_selected;
88
89 EXTERN endslot_abs_reselect;
90
91 PROC siop_script:
92
93 selected:
94 ; starting a new session, init 'local variables'
95 MOVE 0 to SCRATCHA0 ; flags
96 MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer)
97 waitphase:
98 JUMP REL(msgout), WHEN MSG_OUT;
99 JUMP REL(msgin), WHEN MSG_IN;
100 JUMP REL(dataout), WHEN DATA_OUT;
101 JUMP REL(datain), WHEN DATA_IN;
102 JUMP REL(cmdout), WHEN CMD;
103 JUMP REL(status), WHEN STATUS;
104 err:
105 INT int_err;
106
107 reselect:
108 WAIT RESELECT REL(reselect_fail)
109 MOVE SSID & 0x8f to SFBR
110 MOVE SFBR to SCRATCHA0 ; save reselect ID
111 INT int_err, WHEN NOT MSG_IN;
112 MOVE FROM t_msg_in, WHEN MSG_IN;
113 CLEAR ACK;
114 INT int_resel;
115
116 reselect_fail:
117 ; check that host asserted SIGP, this'll clear SIGP in ISTAT
118 MOVE CTEST2 & 0x40 TO SFBR;
119 INT int_resfail, IF 0x00;
120 JUMP REL(sheduler);
121
122 msgin:
123 CLEAR ATN
124 MOVE FROM t_msg_in, WHEN MSG_IN;
125 JUMP REL(handle_dis), IF 0x04 ; disconnect message
126 JUMP REL(handle_cmpl), IF 0x00 ; command complete message
127 JUMP REL(handle_sdp), IF 0x02 ; save data pointer message
128 JUMP REL(handle_extin), IF 0x01 ; extended message
129 INT int_msgin;
130 msgin_ack:
131 CLEAR ACK;
132 JUMP REL(waitphase);
133
134 ; entry point for msgout after a msgin or status phase
135 send_msgout:
136 SET ATN;
137 CLEAR ACK;
138 msgout:
139 MOVE FROM t_msg_out, WHEN MSG_OUT;
140 CLEAR ATN;
141 JUMP REL(waitphase);
142 cmdout:
143 MOVE FROM t_cmd, WHEN CMD;
144 JUMP REL(waitphase);
145 status:
146 MOVE FROM t_status, WHEN STATUS;
147 JUMP REL(waitphase);
148 datain:
149 CALL REL(savedsa);
150 MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
151 datain_loop:
152 MOVE FROM t_data, WHEN DATA_IN;
153 MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
154 MOVE DSA0 + 8 to DSA0;
155 MOVE DSA1 + 0 to DSA1 WITH CARRY;
156 MOVE DSA2 + 0 to DSA2 WITH CARRY;
157 MOVE DSA3 + 0 to DSA3 WITH CARRY;
158 JUMP REL(datain_loop), WHEN DATA_IN;
159 CALL REL(restoredsa);
160 MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
161 JUMP REL(waitphase);
162
163 dataout:
164 CALL REL(savedsa);
165 MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
166 dataout_loop:
167 MOVE FROM t_data, WHEN DATA_OUT;
168 MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
169 MOVE DSA0 + 8 to DSA0;
170 MOVE DSA1 + 0 to DSA1 WITH CARRY;
171 MOVE DSA2 + 0 to DSA2 WITH CARRY;
172 MOVE DSA3 + 0 to DSA3 WITH CARRY;
173 JUMP REL(dataout_loop), WHEN DATA_OUT;
174 CALL REL(restoredsa);
175 MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
176 JUMP REL(waitphase);
177
178 savedsa:
179 MOVE DSA0 to SFBR;
180 MOVE SFBR to SCRATCHB0;
181 MOVE DSA1 to SFBR;
182 MOVE SFBR to SCRATCHB1;
183 MOVE DSA2 to SFBR;
184 MOVE SFBR to SCRATCHB2;
185 MOVE DSA3 to SFBR;
186 MOVE SFBR to SCRATCHB3;
187 RETURN;
188
189 restoredsa:
190 MOVE SCRATCHB0 TO SFBR;
191 MOVE SFBR TO DSA0;
192 MOVE SCRATCHB1 TO SFBR;
193 MOVE SFBR TO DSA1;
194 MOVE SCRATCHB2 TO SFBR;
195 MOVE SFBR TO DSA2;
196 MOVE SCRATCHB3 TO SFBR;
197 MOVE SFBR TO DSA3;
198 RETURN;
199
200 disconnect:
201 MOVE SCNTL2 & 0x7f TO SCNTL2;
202 CLEAR ATN;
203 CLEAR ACK;
204 WAIT DISCONNECT;
205 RETURN;
206
207 handle_dis:
208 CALL REL(disconnect);
209 ; if we didn't get sdp, or if offset is 0, no need to interrupt
210 MOVE SCRATCHA0 & flag_sdp TO SFBR;
211 JUMP REL(sheduler), if 0x00;
212 MOVE SCRATCHA1 TO SFBR;
213 JUMP REL(sheduler), if 0x00;
214 ; Ok, we need to save data pointers
215 INT int_disc;
216
217 handle_cmpl:
218 CALL REL(disconnect);
219 INT int_done;
220 handle_sdp:
221 CLEAR ACK;
222 MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
223 JUMP REL(msgin) ; should get a disconnect message now
224
225 handle_extin:
226 CLEAR ACK;
227 INT int_err, IF NOT MSG_IN;
228 MOVE FROM t_ext_msg_in, WHEN MSG_IN;
229 INT int_extmsgin; /* let host fill in t_ext_msg_data */
230 get_extmsgdata:
231 CLEAR ACK;
232 INT int_err, IF NOT MSG_IN;
233 MOVE FROM t_ext_msg_data, WHEN MSG_IN;
234 INT int_extmsgdata;
235
236 sheduler:
237 NOP; /* will be changed by the slot scripts */
238
239 ; script used for the sheduler: when a slot is free the JUMP points to
240 ; the next slot so that instructions for this slot are not run.
241 ; once the CPU has set up the slot variables (DSA address) it changes
242 ; the JUMP address to 0 (so that it'll jump to the next instruction) and
243 ; this command will be processed next time the sheduler is executed.
244 ; When the target has been successfully selected the script changes the jump
245 ; addr back to the next slot, so that it's ignored the next time.
246 ;
247
248 PROC slot_script:
249 slot:
250 JUMP REL(nextslot);
251 idsa0:
252 MOVE 0x00 to dsa0;
253 idsa1:
254 MOVE 0x01 to dsa1;
255 idsa2:
256 MOVE 0x02 to dsa2;
257 idsa3:
258 MOVE 0x03 to dsa3;
259 SELECT ATN FROM t_id, slot_abs_reselect;
260 MOVE MEMORY 4, slot_shed_addrsrc, slot_nextp;
261 JUMP slot_abs_selected;
262 slotdata:
263 NOP; slot variables: dsa & jumppatchp
264 nextslot: NOP; /* will be changed to the next slot entry
265
266 PROC endslot_script:
267 JUMP endslot_abs_reselect;
268