siop.ss revision 1.19 1 1.19 perry ; $NetBSD: siop.ss,v 1.19 2005/02/27 00:27:29 perry Exp $
2 1.3 bouyer
3 1.3 bouyer ;
4 1.3 bouyer ; Copyright (c) 2000 Manuel Bouyer.
5 1.19 perry ;
6 1.3 bouyer ; Redistribution and use in source and binary forms, with or without
7 1.3 bouyer ; modification, are permitted provided that the following conditions
8 1.3 bouyer ; are met:
9 1.3 bouyer ; 1. Redistributions of source code must retain the above copyright
10 1.3 bouyer ; notice, this list of conditions and the following disclaimer.
11 1.3 bouyer ; 2. Redistributions in binary form must reproduce the above copyright
12 1.3 bouyer ; notice, this list of conditions and the following disclaimer in the
13 1.3 bouyer ; documentation and/or other materials provided with the distribution.
14 1.3 bouyer ; 3. All advertising materials mentioning features or use of this software
15 1.3 bouyer ; must display the following acknowledgement:
16 1.15 bouyer ; This product includes software developed by Manuel Bouyer.
17 1.3 bouyer ; 4. The name of the author may not be used to endorse or promote products
18 1.3 bouyer ; derived from this software without specific prior written permission.
19 1.19 perry ;
20 1.5 bouyer ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 1.5 bouyer ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 1.5 bouyer ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 1.19 perry ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 1.5 bouyer ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 1.5 bouyer ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 1.5 bouyer ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 1.5 bouyer ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 1.5 bouyer ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 1.5 bouyer ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.3 bouyer
31 1.1 bouyer ARCH 720
32 1.1 bouyer
33 1.14 bouyer ; offsets in siop_common_xfer
34 1.14 bouyer ABSOLUTE t_id = 40;
35 1.14 bouyer ABSOLUTE t_msg_in = 48;
36 1.14 bouyer ABSOLUTE t_ext_msg_in = 56;
37 1.14 bouyer ABSOLUTE t_ext_msg_data = 64;
38 1.14 bouyer ABSOLUTE t_msg_out = 72;
39 1.14 bouyer ABSOLUTE t_cmd = 80;
40 1.14 bouyer ABSOLUTE t_status = 88;
41 1.14 bouyer ABSOLUTE t_data = 96;
42 1.1 bouyer
43 1.1 bouyer ;; interrupt codes
44 1.10 bouyer ; interrupts that need a valid DSA
45 1.1 bouyer ABSOLUTE int_done = 0xff00;
46 1.1 bouyer ABSOLUTE int_msgin = 0xff01;
47 1.2 bouyer ABSOLUTE int_extmsgin = 0xff02;
48 1.2 bouyer ABSOLUTE int_extmsgdata = 0xff03;
49 1.10 bouyer ABSOLUTE int_disc = 0xff04;
50 1.10 bouyer ; interrupts that don't have a valid DSA
51 1.10 bouyer ABSOLUTE int_reseltarg = 0xff80;
52 1.10 bouyer ABSOLUTE int_resellun = 0xff81;
53 1.10 bouyer ABSOLUTE int_reseltag = 0xff82;
54 1.10 bouyer ABSOLUTE int_resfail = 0xff83;
55 1.1 bouyer ABSOLUTE int_err = 0xffff;
56 1.1 bouyer
57 1.1 bouyer ; flags for scratcha0
58 1.1 bouyer ABSOLUTE flag_sdp = 0x01 ; got save data pointer
59 1.4 bouyer ABSOLUTE flag_data = 0x02 ; we're in data phase
60 1.4 bouyer ABSOLUTE flag_data_mask = 0xfd ; ~flag_data
61 1.1 bouyer
62 1.10 bouyer ; main script symbols
63 1.10 bouyer
64 1.1 bouyer ENTRY waitphase;
65 1.2 bouyer ENTRY send_msgout;
66 1.1 bouyer ENTRY msgout;
67 1.1 bouyer ENTRY msgin;
68 1.10 bouyer ENTRY handle_msgin;
69 1.2 bouyer ENTRY msgin_ack;
70 1.1 bouyer ENTRY dataout;
71 1.1 bouyer ENTRY datain;
72 1.1 bouyer ENTRY cmdout;
73 1.1 bouyer ENTRY status;
74 1.1 bouyer ENTRY disconnect;
75 1.1 bouyer ENTRY reselect;
76 1.10 bouyer ENTRY reselected;
77 1.2 bouyer ENTRY selected;
78 1.10 bouyer ENTRY script_sched;
79 1.12 bouyer ENTRY script_sched_slot0;
80 1.2 bouyer ENTRY get_extmsgdata;
81 1.10 bouyer ENTRY resel_targ0;
82 1.10 bouyer ENTRY msgin_space;
83 1.10 bouyer ENTRY lunsw_return;
84 1.13 bouyer ENTRY led_on1;
85 1.13 bouyer ENTRY led_on2;
86 1.13 bouyer ENTRY led_off;
87 1.12 bouyer EXTERN abs_script_sched_slot0;
88 1.10 bouyer EXTERN abs_targ0;
89 1.10 bouyer EXTERN abs_msgin;
90 1.10 bouyer
91 1.10 bouyer ; lun switch symbols
92 1.11 bouyer ENTRY lun_switch_entry;
93 1.10 bouyer ENTRY resel_lun0;
94 1.10 bouyer ENTRY restore_scntl3;
95 1.10 bouyer EXTERN abs_lunsw_return;
96 1.10 bouyer
97 1.12 bouyer ; tag switch symbols
98 1.12 bouyer ENTRY tag_switch_entry;
99 1.12 bouyer ENTRY resel_tag0;
100 1.12 bouyer EXTERN abs_tag0;
101 1.12 bouyer
102 1.10 bouyer ; command reselect script symbols
103 1.10 bouyer ENTRY rdsa0;
104 1.10 bouyer ENTRY rdsa1;
105 1.10 bouyer ENTRY rdsa2;
106 1.10 bouyer ENTRY rdsa3;
107 1.12 bouyer ENTRY ldsa_reload_dsa;
108 1.12 bouyer ENTRY ldsa_select;
109 1.12 bouyer ENTRY ldsa_data;
110 1.12 bouyer
111 1.12 bouyer EXTERN ldsa_abs_reselected;
112 1.12 bouyer EXTERN ldsa_abs_reselect;
113 1.12 bouyer EXTERN ldsa_abs_selected;
114 1.12 bouyer EXTERN ldsa_abs_data;
115 1.12 bouyer EXTERN ldsa_abs_slot;
116 1.1 bouyer
117 1.10 bouyer ; main script
118 1.8 bouyer
119 1.1 bouyer PROC siop_script:
120 1.1 bouyer
121 1.10 bouyer reselected:
122 1.1 bouyer ; starting a new session, init 'local variables'
123 1.1 bouyer MOVE 0 to SCRATCHA0 ; flags
124 1.1 bouyer MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer)
125 1.10 bouyer MOVE SCRATCHA3 to SFBR ; pending message ?
126 1.12 bouyer JUMP REL(handle_msgin), IF not 0x20;
127 1.1 bouyer waitphase:
128 1.1 bouyer JUMP REL(msgout), WHEN MSG_OUT;
129 1.1 bouyer JUMP REL(msgin), WHEN MSG_IN;
130 1.1 bouyer JUMP REL(dataout), WHEN DATA_OUT;
131 1.1 bouyer JUMP REL(datain), WHEN DATA_IN;
132 1.1 bouyer JUMP REL(cmdout), WHEN CMD;
133 1.1 bouyer JUMP REL(status), WHEN STATUS;
134 1.1 bouyer INT int_err;
135 1.1 bouyer
136 1.12 bouyer reselect_fail:
137 1.12 bouyer ; check that host asserted SIGP, this'll clear SIGP in ISTAT
138 1.12 bouyer MOVE CTEST2 & 0x40 TO SFBR;
139 1.12 bouyer INT int_resfail, IF 0x00;
140 1.13 bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
141 1.13 bouyer ; option "SIOP_SYMLED"
142 1.13 bouyer led_on1:
143 1.13 bouyer NOP;
144 1.12 bouyer script_sched:
145 1.12 bouyer ; Clear DSA and init status
146 1.12 bouyer MOVE 0xff to DSA0;
147 1.12 bouyer MOVE 0xff to DSA1;
148 1.12 bouyer MOVE 0xff to DSA2;
149 1.12 bouyer MOVE 0xff to DSA3;
150 1.12 bouyer MOVE 0 to SCRATCHA0 ; flags
151 1.12 bouyer MOVE 0 to SCRATCHA1 ; DSA offset (for S/G save data pointer)
152 1.19 perry ; the script scheduler: siop_start() we set the absolute jump addr, and then
153 1.12 bouyer ; changes the FALSE to TRUE. The select script will change it back to false
154 1.12 bouyer ; once the target is selected.
155 1.12 bouyer ; The RAM could hold 370 slot entry, we limit it to 40. Should be more than
156 1.16 wiz ; enough.
157 1.12 bouyer script_sched_slot0:
158 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
159 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
160 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
161 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
162 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
163 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
164 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
165 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
166 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
167 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
168 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
169 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
170 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
171 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
172 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
173 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
174 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
175 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
176 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
177 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
178 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
179 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
180 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
181 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
182 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
183 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
184 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
185 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
186 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
187 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
188 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
189 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
190 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
191 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
192 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
193 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
194 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
195 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
196 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
197 1.12 bouyer JUMP abs_script_sched_slot0, IF FALSE;
198 1.12 bouyer ; Nothing to do, wait for reselect
199 1.1 bouyer reselect:
200 1.10 bouyer ; Clear DSA and init status
201 1.10 bouyer MOVE 0xff to DSA0;
202 1.10 bouyer MOVE 0xff to DSA1;
203 1.10 bouyer MOVE 0xff to DSA2;
204 1.10 bouyer MOVE 0xff to DSA3;
205 1.12 bouyer MOVE 0x00 to SCRATCHA2; no tag
206 1.12 bouyer MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected:
207 1.13 bouyer ; a NOP by default; patched with MOVE GPREG | 0x01 to GPREG on compile-time
208 1.13 bouyer ; option "SIOP_SYMLED"
209 1.13 bouyer led_off:
210 1.13 bouyer NOP;
211 1.1 bouyer WAIT RESELECT REL(reselect_fail)
212 1.13 bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
213 1.13 bouyer ; option "SIOP_SYMLED"
214 1.13 bouyer led_on2:
215 1.13 bouyer NOP;
216 1.1 bouyer MOVE SSID & 0x8f to SFBR
217 1.1 bouyer MOVE SFBR to SCRATCHA0 ; save reselect ID
218 1.17 wiz ; find the right param for this target
219 1.10 bouyer resel_targ0:
220 1.10 bouyer JUMP abs_targ0, IF 0xff;
221 1.10 bouyer JUMP abs_targ0, IF 0xff;
222 1.10 bouyer JUMP abs_targ0, IF 0xff;
223 1.10 bouyer JUMP abs_targ0, IF 0xff;
224 1.10 bouyer JUMP abs_targ0, IF 0xff;
225 1.10 bouyer JUMP abs_targ0, IF 0xff;
226 1.10 bouyer JUMP abs_targ0, IF 0xff;
227 1.10 bouyer JUMP abs_targ0, IF 0xff;
228 1.10 bouyer JUMP abs_targ0, IF 0xff;
229 1.10 bouyer JUMP abs_targ0, IF 0xff;
230 1.10 bouyer JUMP abs_targ0, IF 0xff;
231 1.10 bouyer JUMP abs_targ0, IF 0xff;
232 1.10 bouyer JUMP abs_targ0, IF 0xff;
233 1.10 bouyer JUMP abs_targ0, IF 0xff;
234 1.10 bouyer JUMP abs_targ0, IF 0xff;
235 1.10 bouyer INT int_reseltarg;
236 1.10 bouyer lunsw_return:
237 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN;
238 1.10 bouyer MOVE SFBR & 0x07 to SCRATCHA1; save LUN
239 1.10 bouyer CLEAR ACK;
240 1.10 bouyer RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw
241 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN;
242 1.10 bouyer CLEAR ACK;
243 1.10 bouyer MOVE SFBR to SCRATCHA3; save message
244 1.12 bouyer RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg
245 1.10 bouyer MOVE 1, abs_msgin, WHEN MSG_IN; get tag
246 1.10 bouyer CLEAR ACK;
247 1.10 bouyer MOVE SFBR to SCRATCHA2; save tag
248 1.10 bouyer RETURN; jump to lun sw
249 1.10 bouyer
250 1.10 bouyer handle_sdp:
251 1.10 bouyer CLEAR ACK;
252 1.10 bouyer MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
253 1.10 bouyer ; should get a disconnect message now
254 1.1 bouyer msgin:
255 1.1 bouyer CLEAR ATN
256 1.1 bouyer MOVE FROM t_msg_in, WHEN MSG_IN;
257 1.10 bouyer handle_msgin:
258 1.1 bouyer JUMP REL(handle_cmpl), IF 0x00 ; command complete message
259 1.1 bouyer JUMP REL(handle_sdp), IF 0x02 ; save data pointer message
260 1.2 bouyer JUMP REL(handle_extin), IF 0x01 ; extended message
261 1.12 bouyer INT int_msgin, IF not 0x04;
262 1.12 bouyer CALL REL(disconnect) ; disconnect message;
263 1.18 bouyer ; if we didn't get sdp, no need to interrupt
264 1.12 bouyer MOVE SCRATCHA0 & flag_sdp TO SFBR;
265 1.19 perry JUMP REL(script_sched), if 0x00;
266 1.12 bouyer ; Ok, we need to save data pointers
267 1.12 bouyer INT int_disc;
268 1.2 bouyer msgin_ack:
269 1.10 bouyer selected:
270 1.2 bouyer CLEAR ACK;
271 1.2 bouyer JUMP REL(waitphase);
272 1.2 bouyer
273 1.2 bouyer ; entry point for msgout after a msgin or status phase
274 1.2 bouyer send_msgout:
275 1.2 bouyer SET ATN;
276 1.2 bouyer CLEAR ACK;
277 1.1 bouyer msgout:
278 1.1 bouyer MOVE FROM t_msg_out, WHEN MSG_OUT;
279 1.1 bouyer CLEAR ATN;
280 1.1 bouyer JUMP REL(waitphase);
281 1.1 bouyer cmdout:
282 1.1 bouyer MOVE FROM t_cmd, WHEN CMD;
283 1.1 bouyer JUMP REL(waitphase);
284 1.1 bouyer status:
285 1.1 bouyer MOVE FROM t_status, WHEN STATUS;
286 1.1 bouyer JUMP REL(waitphase);
287 1.1 bouyer datain:
288 1.1 bouyer CALL REL(savedsa);
289 1.4 bouyer MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
290 1.1 bouyer datain_loop:
291 1.1 bouyer MOVE FROM t_data, WHEN DATA_IN;
292 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
293 1.1 bouyer MOVE DSA0 + 8 to DSA0;
294 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY;
295 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY;
296 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY;
297 1.1 bouyer JUMP REL(datain_loop), WHEN DATA_IN;
298 1.1 bouyer CALL REL(restoredsa);
299 1.4 bouyer MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
300 1.1 bouyer JUMP REL(waitphase);
301 1.1 bouyer
302 1.1 bouyer dataout:
303 1.1 bouyer CALL REL(savedsa);
304 1.4 bouyer MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
305 1.1 bouyer dataout_loop:
306 1.1 bouyer MOVE FROM t_data, WHEN DATA_OUT;
307 1.1 bouyer MOVE SCRATCHA1 + 1 TO SCRATCHA1 ; adjust offset
308 1.1 bouyer MOVE DSA0 + 8 to DSA0;
309 1.1 bouyer MOVE DSA1 + 0 to DSA1 WITH CARRY;
310 1.1 bouyer MOVE DSA2 + 0 to DSA2 WITH CARRY;
311 1.1 bouyer MOVE DSA3 + 0 to DSA3 WITH CARRY;
312 1.1 bouyer JUMP REL(dataout_loop), WHEN DATA_OUT;
313 1.1 bouyer CALL REL(restoredsa);
314 1.4 bouyer MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
315 1.1 bouyer JUMP REL(waitphase);
316 1.1 bouyer
317 1.1 bouyer savedsa:
318 1.1 bouyer MOVE DSA0 to SFBR;
319 1.1 bouyer MOVE SFBR to SCRATCHB0;
320 1.1 bouyer MOVE DSA1 to SFBR;
321 1.1 bouyer MOVE SFBR to SCRATCHB1;
322 1.1 bouyer MOVE DSA2 to SFBR;
323 1.1 bouyer MOVE SFBR to SCRATCHB2;
324 1.1 bouyer MOVE DSA3 to SFBR;
325 1.1 bouyer MOVE SFBR to SCRATCHB3;
326 1.1 bouyer RETURN;
327 1.1 bouyer
328 1.1 bouyer restoredsa:
329 1.1 bouyer MOVE SCRATCHB0 TO SFBR;
330 1.1 bouyer MOVE SFBR TO DSA0;
331 1.1 bouyer MOVE SCRATCHB1 TO SFBR;
332 1.1 bouyer MOVE SFBR TO DSA1;
333 1.1 bouyer MOVE SCRATCHB2 TO SFBR;
334 1.1 bouyer MOVE SFBR TO DSA2;
335 1.1 bouyer MOVE SCRATCHB3 TO SFBR;
336 1.1 bouyer MOVE SFBR TO DSA3;
337 1.1 bouyer RETURN;
338 1.1 bouyer
339 1.1 bouyer disconnect:
340 1.1 bouyer MOVE SCNTL2 & 0x7f TO SCNTL2;
341 1.1 bouyer CLEAR ATN;
342 1.1 bouyer CLEAR ACK;
343 1.1 bouyer WAIT DISCONNECT;
344 1.1 bouyer RETURN;
345 1.1 bouyer
346 1.1 bouyer handle_cmpl:
347 1.1 bouyer CALL REL(disconnect);
348 1.1 bouyer INT int_done;
349 1.2 bouyer
350 1.2 bouyer handle_extin:
351 1.2 bouyer CLEAR ACK;
352 1.2 bouyer MOVE FROM t_ext_msg_in, WHEN MSG_IN;
353 1.2 bouyer INT int_extmsgin; /* let host fill in t_ext_msg_data */
354 1.2 bouyer get_extmsgdata:
355 1.2 bouyer CLEAR ACK;
356 1.2 bouyer MOVE FROM t_ext_msg_data, WHEN MSG_IN;
357 1.2 bouyer INT int_extmsgdata;
358 1.10 bouyer msgin_space:
359 1.10 bouyer NOP; space to store msgin when reselect
360 1.10 bouyer
361 1.2 bouyer
362 1.10 bouyer ;; per-target switch script for LUNs
363 1.12 bouyer ; hack: we first do a call to the target-specific code, so that a return
364 1.10 bouyer ; in the main switch will jump to the lun switch.
365 1.10 bouyer PROC lun_switch:
366 1.11 bouyer restore_scntl3:
367 1.11 bouyer MOVE 0xff TO SCNTL3;
368 1.11 bouyer MOVE 0xff TO SXFER;
369 1.11 bouyer JUMP abs_lunsw_return;
370 1.11 bouyer lun_switch_entry:
371 1.10 bouyer CALL REL(restore_scntl3);
372 1.10 bouyer MOVE SCRATCHA1 TO SFBR;
373 1.10 bouyer resel_lun0:
374 1.10 bouyer INT int_resellun;
375 1.10 bouyer
376 1.12 bouyer ;; Per-device switch script for tag
377 1.12 bouyer PROC tag_switch:
378 1.12 bouyer tag_switch_entry:
379 1.12 bouyer MOVE SCRATCHA2 TO SFBR; restore tag
380 1.12 bouyer resel_tag0:
381 1.12 bouyer JUMP abs_tag0, IF 0x00;
382 1.12 bouyer JUMP abs_tag0, IF 0x01;
383 1.12 bouyer JUMP abs_tag0, IF 0x02;
384 1.12 bouyer JUMP abs_tag0, IF 0x03;
385 1.12 bouyer JUMP abs_tag0, IF 0x04;
386 1.12 bouyer JUMP abs_tag0, IF 0x05;
387 1.12 bouyer JUMP abs_tag0, IF 0x06;
388 1.12 bouyer JUMP abs_tag0, IF 0x07;
389 1.12 bouyer JUMP abs_tag0, IF 0x08;
390 1.12 bouyer JUMP abs_tag0, IF 0x09;
391 1.12 bouyer JUMP abs_tag0, IF 0x0a;
392 1.12 bouyer JUMP abs_tag0, IF 0x0b;
393 1.12 bouyer JUMP abs_tag0, IF 0x0c;
394 1.12 bouyer JUMP abs_tag0, IF 0x0d;
395 1.12 bouyer JUMP abs_tag0, IF 0x0e;
396 1.12 bouyer JUMP abs_tag0, IF 0x0f;
397 1.12 bouyer INT int_reseltag;
398 1.12 bouyer
399 1.12 bouyer ;; per-command script: select, and called after a reselect to load DSA
400 1.10 bouyer
401 1.10 bouyer PROC load_dsa:
402 1.10 bouyer ; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped
403 1.8 bouyer rdsa0:
404 1.10 bouyer MOVE 0xf0 to DSA0;
405 1.8 bouyer rdsa1:
406 1.10 bouyer MOVE 0xf1 to DSA1;
407 1.8 bouyer rdsa2:
408 1.10 bouyer MOVE 0xf2 to DSA2;
409 1.8 bouyer rdsa3:
410 1.10 bouyer MOVE 0xf3 to DSA3;
411 1.10 bouyer RETURN;
412 1.12 bouyer ldsa_reload_dsa:
413 1.12 bouyer CALL REL(rdsa0);
414 1.12 bouyer JUMP ldsa_abs_reselected;
415 1.12 bouyer ldsa_select:
416 1.10 bouyer CALL REL(rdsa0);
417 1.12 bouyer SELECT ATN FROM t_id, ldsa_abs_reselect;
418 1.12 bouyer MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot;
419 1.12 bouyer JUMP ldsa_abs_selected;
420 1.12 bouyer ldsa_data:
421 1.12 bouyer NOP; contains data used by the MOVE MEMORY
422 1.13 bouyer
423 1.13 bouyer PROC siop_led_on:
424 1.13 bouyer MOVE GPREG & 0xfe TO GPREG;
425 1.13 bouyer
426 1.13 bouyer PROC siop_led_off:
427 1.13 bouyer MOVE GPREG | 0x01 TO GPREG;
428