xref: /netbsd-src/sys/dev/microcode/siop/siop.ss (revision 6d07b400dc878478f544ef48ff61b3295c40c6bb)
1*6d07b400Sbouyer;	$NetBSD: siop.ss,v 1.21 2009/10/19 18:41:13 bouyer Exp $
2fe54b787Sbouyer
3fe54b787Sbouyer;
4fe54b787Sbouyer;  Copyright (c) 2000 Manuel Bouyer.
5fe54b787Sbouyer;
6fe54b787Sbouyer;  Redistribution and use in source and binary forms, with or without
7fe54b787Sbouyer;  modification, are permitted provided that the following conditions
8fe54b787Sbouyer;  are met:
9fe54b787Sbouyer;  1. Redistributions of source code must retain the above copyright
10fe54b787Sbouyer;     notice, this list of conditions and the following disclaimer.
11fe54b787Sbouyer;  2. Redistributions in binary form must reproduce the above copyright
12fe54b787Sbouyer;     notice, this list of conditions and the following disclaimer in the
13fe54b787Sbouyer;     documentation and/or other materials provided with the distribution.
14fe54b787Sbouyer;
1506d4aa45Sbouyer;  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1606d4aa45Sbouyer;  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1706d4aa45Sbouyer;  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1806d4aa45Sbouyer;  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1906d4aa45Sbouyer;  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2006d4aa45Sbouyer;  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2106d4aa45Sbouyer;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2206d4aa45Sbouyer;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2306d4aa45Sbouyer;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2406d4aa45Sbouyer;  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25fe54b787Sbouyer
2619ada4a8SbouyerARCH 720
2719ada4a8Sbouyer
286d37782aSbouyer; offsets in siop_common_xfer
296d37782aSbouyerABSOLUTE t_id = 40;
306d37782aSbouyerABSOLUTE t_msg_in = 48;
316d37782aSbouyerABSOLUTE t_ext_msg_in = 56;
326d37782aSbouyerABSOLUTE t_ext_msg_data = 64;
336d37782aSbouyerABSOLUTE t_msg_out = 72;
346d37782aSbouyerABSOLUTE t_cmd = 80;
356d37782aSbouyerABSOLUTE t_status = 88;
366d37782aSbouyerABSOLUTE t_data = 96;
3719ada4a8Sbouyer
3819ada4a8Sbouyer;; interrupt codes
3975246b83Sbouyer; interrupts that need a valid DSA
4019ada4a8SbouyerABSOLUTE int_done	= 0xff00;
4119ada4a8SbouyerABSOLUTE int_msgin	= 0xff01;
4288be4752SbouyerABSOLUTE int_extmsgin	= 0xff02;
4388be4752SbouyerABSOLUTE int_extmsgdata	= 0xff03;
4475246b83SbouyerABSOLUTE int_disc	= 0xff04;
4598fae666SbouyerABSOLUTE int_saveoffset	= 0xff05;
4675246b83Sbouyer; interrupts that don't have a valid DSA
4775246b83SbouyerABSOLUTE int_reseltarg	= 0xff80;
4875246b83SbouyerABSOLUTE int_resellun	= 0xff81;
4975246b83SbouyerABSOLUTE int_reseltag	= 0xff82;
5075246b83SbouyerABSOLUTE int_resfail	= 0xff83;
5119ada4a8SbouyerABSOLUTE int_err 	= 0xffff;
5219ada4a8Sbouyer
5319ada4a8Sbouyer; flags for scratcha0
5419ada4a8SbouyerABSOLUTE flag_sdp 	= 0x01 ; got save data pointer
55c8ff442fSbouyerABSOLUTE flag_data 	= 0x02 ; we're in data phase
56c8ff442fSbouyerABSOLUTE flag_data_mask	= 0xfd ; ~flag_data
5719ada4a8Sbouyer
5875246b83Sbouyer; main script symbols
5975246b83Sbouyer
6019ada4a8SbouyerENTRY waitphase;
6188be4752SbouyerENTRY send_msgout;
6219ada4a8SbouyerENTRY msgout;
6319ada4a8SbouyerENTRY msgin;
6475246b83SbouyerENTRY handle_msgin;
6588be4752SbouyerENTRY msgin_ack;
6619ada4a8SbouyerENTRY dataout;
6719ada4a8SbouyerENTRY datain;
6819ada4a8SbouyerENTRY cmdout;
6919ada4a8SbouyerENTRY status;
7019ada4a8SbouyerENTRY disconnect;
7119ada4a8SbouyerENTRY reselect;
7275246b83SbouyerENTRY reselected;
7388be4752SbouyerENTRY selected;
7475246b83SbouyerENTRY script_sched;
757ae5c097SbouyerENTRY script_sched_slot0;
7688be4752SbouyerENTRY get_extmsgdata;
7775246b83SbouyerENTRY resel_targ0;
7875246b83SbouyerENTRY msgin_space;
7975246b83SbouyerENTRY lunsw_return;
80172d73c2SbouyerENTRY led_on1;
81172d73c2SbouyerENTRY led_on2;
82172d73c2SbouyerENTRY led_off;
837ae5c097SbouyerEXTERN abs_script_sched_slot0;
8475246b83SbouyerEXTERN abs_targ0;
8575246b83SbouyerEXTERN abs_msgin;
8675246b83Sbouyer
8775246b83Sbouyer; lun switch symbols
8867618a69SbouyerENTRY lun_switch_entry;
8975246b83SbouyerENTRY resel_lun0;
9075246b83SbouyerENTRY restore_scntl3;
9175246b83SbouyerEXTERN abs_lunsw_return;
9275246b83Sbouyer
937ae5c097Sbouyer; tag switch symbols
947ae5c097SbouyerENTRY tag_switch_entry;
957ae5c097SbouyerENTRY resel_tag0;
967ae5c097SbouyerEXTERN abs_tag0;
977ae5c097Sbouyer
9875246b83Sbouyer; command reselect script symbols
9975246b83SbouyerENTRY rdsa0;
10075246b83SbouyerENTRY rdsa1;
10175246b83SbouyerENTRY rdsa2;
10275246b83SbouyerENTRY rdsa3;
1037ae5c097SbouyerENTRY ldsa_reload_dsa;
1047ae5c097SbouyerENTRY ldsa_select;
1057ae5c097SbouyerENTRY ldsa_data;
10675246b83Sbouyer
1077ae5c097SbouyerEXTERN ldsa_abs_reselected;
1087ae5c097SbouyerEXTERN ldsa_abs_reselect;
1097ae5c097SbouyerEXTERN ldsa_abs_selected;
1107ae5c097SbouyerEXTERN ldsa_abs_data;
1117ae5c097SbouyerEXTERN ldsa_abs_slot;
11219ada4a8Sbouyer
11375246b83Sbouyer; main script
114c67eef4eSbouyer
11519ada4a8SbouyerPROC  siop_script:
11619ada4a8Sbouyer
11775246b83Sbouyerreselected:
11819ada4a8Sbouyer; starting a new session, init 'local variables'
11919ada4a8Sbouyer	MOVE 0 to SCRATCHA0	; flags
12019ada4a8Sbouyer	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
12175246b83Sbouyer	MOVE SCRATCHA3 to SFBR  ; pending message ?
1227ae5c097Sbouyer	JUMP REL(handle_msgin), IF not 0x20;
12319ada4a8Sbouyerwaitphase:
12419ada4a8Sbouyer	JUMP REL(msgout), WHEN MSG_OUT;
12519ada4a8Sbouyer	JUMP REL(msgin), WHEN MSG_IN;
12619ada4a8Sbouyer	JUMP REL(dataout), WHEN DATA_OUT;
12719ada4a8Sbouyer	JUMP REL(datain), WHEN DATA_IN;
12819ada4a8Sbouyer	JUMP REL(cmdout), WHEN CMD;
12919ada4a8Sbouyer	JUMP REL(status), WHEN STATUS;
13019ada4a8Sbouyer	INT int_err;
13119ada4a8Sbouyer
1327ae5c097Sbouyerreselect_fail:
1337ae5c097Sbouyer	; check that host asserted SIGP, this'll clear SIGP in ISTAT
1347ae5c097Sbouyer	MOVE CTEST2 & 0x40 TO SFBR;
1357ae5c097Sbouyer	INT int_resfail,  IF 0x00;
136172d73c2Sbouyer; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
137172d73c2Sbouyer; option "SIOP_SYMLED"
138172d73c2Sbouyerled_on1:
139172d73c2Sbouyer	NOP;
1407ae5c097Sbouyerscript_sched:
1417ae5c097Sbouyer	; Clear DSA and init status
1427ae5c097Sbouyer	MOVE 0xff to DSA0;
1437ae5c097Sbouyer	MOVE 0xff to DSA1;
1447ae5c097Sbouyer	MOVE 0xff to DSA2;
1457ae5c097Sbouyer	MOVE 0xff to DSA3;
1467ae5c097Sbouyer	MOVE 0 to SCRATCHA0	; flags
1477ae5c097Sbouyer	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
1487ae5c097Sbouyer; the script scheduler: siop_start() we set the absolute jump addr, and then
1497ae5c097Sbouyer; changes the FALSE to TRUE. The select script will change it back to false
1507ae5c097Sbouyer; once the target is selected.
1517ae5c097Sbouyer; The RAM could hold 370 slot entry, we limit it to 40. Should be more than
1525db23d2cSwiz; enough.
1537ae5c097Sbouyerscript_sched_slot0:
1547ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1557ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1567ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1577ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1587ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1597ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1607ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1617ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1627ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1637ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1647ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1657ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1667ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1677ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1687ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1697ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1707ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1717ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1727ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1737ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1747ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1757ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1767ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1777ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1787ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1797ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1807ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1817ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1827ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1837ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1847ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1857ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1867ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1877ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1887ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1897ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1907ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1917ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1927ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1937ae5c097Sbouyer	JUMP abs_script_sched_slot0, IF FALSE;
1947ae5c097Sbouyer; Nothing to do, wait for reselect
19519ada4a8Sbouyerreselect:
19675246b83Sbouyer	; Clear DSA and init status
19775246b83Sbouyer	MOVE 0xff to DSA0;
19875246b83Sbouyer	MOVE 0xff to DSA1;
19975246b83Sbouyer	MOVE 0xff to DSA2;
20075246b83Sbouyer	MOVE 0xff to DSA3;
2017ae5c097Sbouyer	MOVE 0x00 to SCRATCHA2; no tag
2027ae5c097Sbouyer	MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected:
203172d73c2Sbouyer; a NOP by default; patched with MOVE GPREG | 0x01 to GPREG on compile-time
204172d73c2Sbouyer; option "SIOP_SYMLED"
205172d73c2Sbouyerled_off:
206172d73c2Sbouyer	NOP;
20719ada4a8Sbouyer	WAIT RESELECT REL(reselect_fail)
208172d73c2Sbouyer; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
209172d73c2Sbouyer; option "SIOP_SYMLED"
210172d73c2Sbouyerled_on2:
211172d73c2Sbouyer	NOP;
21219ada4a8Sbouyer	MOVE SSID & 0x8f to SFBR
21319ada4a8Sbouyer	MOVE SFBR to SCRATCHA0 ; save reselect ID
214645df36eSwiz; find the right param for this target
21575246b83Sbouyerresel_targ0:
21675246b83Sbouyer	JUMP abs_targ0, IF 0xff;
21775246b83Sbouyer	JUMP abs_targ0, IF 0xff;
21875246b83Sbouyer	JUMP abs_targ0, IF 0xff;
21975246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22075246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22175246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22275246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22375246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22475246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22575246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22675246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22775246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22875246b83Sbouyer	JUMP abs_targ0, IF 0xff;
22975246b83Sbouyer	JUMP abs_targ0, IF 0xff;
23075246b83Sbouyer	JUMP abs_targ0, IF 0xff;
23175246b83Sbouyer	INT int_reseltarg;
23275246b83Sbouyerlunsw_return:
23375246b83Sbouyer	MOVE 1, abs_msgin, WHEN MSG_IN;
23475246b83Sbouyer	MOVE SFBR & 0x07 to SCRATCHA1; save LUN
23575246b83Sbouyer	CLEAR ACK;
23675246b83Sbouyer	RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw
23775246b83Sbouyer	MOVE 1, abs_msgin, WHEN MSG_IN;
23875246b83Sbouyer	CLEAR ACK;
23975246b83Sbouyer	MOVE SFBR  to SCRATCHA3; save message
2407ae5c097Sbouyer	RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg
24175246b83Sbouyer	MOVE 1, abs_msgin, WHEN MSG_IN; get tag
24275246b83Sbouyer	CLEAR ACK;
24375246b83Sbouyer	MOVE SFBR  to SCRATCHA2; save tag
24475246b83Sbouyer	RETURN; jump to lun sw
24575246b83Sbouyer
24675246b83Sbouyerhandle_sdp:
24775246b83Sbouyer	CLEAR ACK;
24875246b83Sbouyer	MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
24975246b83Sbouyer	; should get a disconnect message now
25019ada4a8Sbouyermsgin:
25119ada4a8Sbouyer	CLEAR ATN
25219ada4a8Sbouyer	MOVE FROM t_msg_in, WHEN MSG_IN;
25375246b83Sbouyerhandle_msgin:
25419ada4a8Sbouyer	JUMP REL(handle_cmpl), IF 0x00        ; command complete message
25519ada4a8Sbouyer	JUMP REL(handle_sdp), IF 0x02	      ; save data pointer message
25688be4752Sbouyer	JUMP REL(handle_extin), IF 0x01	      ; extended message
2577ae5c097Sbouyer	INT int_msgin, IF not 0x04;
2587ae5c097Sbouyer	CALL REL(disconnect)                  ; disconnect message;
25983478e12Sbouyer; if we didn't get sdp, no need to interrupt
2607ae5c097Sbouyer	MOVE SCRATCHA0 & flag_sdp TO SFBR;
26198fae666Sbouyer	INT int_disc, IF not 0x00;
26298fae666Sbouyer; update offset if we did some data transfer
26398fae666Sbouyer	MOVE SCRATCHA1 TO SFBR;
2647ae5c097Sbouyer	JUMP REL(script_sched), if 0x00;
26598fae666Sbouyer	INT int_saveoffset;
26698fae666Sbouyer
26788be4752Sbouyermsgin_ack:
26875246b83Sbouyerselected:
26988be4752Sbouyer	CLEAR ACK;
27088be4752Sbouyer	JUMP REL(waitphase);
27188be4752Sbouyer
27288be4752Sbouyer; entry point for msgout after a msgin or status phase
27388be4752Sbouyersend_msgout:
27488be4752Sbouyer	SET ATN;
27588be4752Sbouyer	CLEAR ACK;
27619ada4a8Sbouyermsgout:
27719ada4a8Sbouyer	MOVE FROM t_msg_out, WHEN MSG_OUT;
27819ada4a8Sbouyer	CLEAR ATN;
27919ada4a8Sbouyer	JUMP REL(waitphase);
28019ada4a8Sbouyercmdout:
28119ada4a8Sbouyer	MOVE FROM t_cmd, WHEN CMD;
28219ada4a8Sbouyer	JUMP REL(waitphase);
28319ada4a8Sbouyerstatus:
28419ada4a8Sbouyer	MOVE FROM t_status, WHEN STATUS;
28519ada4a8Sbouyer	JUMP REL(waitphase);
28619ada4a8Sbouyerdatain:
28719ada4a8Sbouyer	CALL REL(savedsa);
288c8ff442fSbouyer	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
28919ada4a8Sbouyerdatain_loop:
29019ada4a8Sbouyer	MOVE FROM t_data, WHEN DATA_IN;
29119ada4a8Sbouyer	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
29219ada4a8Sbouyer	MOVE DSA0 + 8 to DSA0;
29319ada4a8Sbouyer	MOVE DSA1 + 0 to DSA1 WITH CARRY;
29419ada4a8Sbouyer	MOVE DSA2 + 0 to DSA2 WITH CARRY;
29519ada4a8Sbouyer	MOVE DSA3 + 0 to DSA3 WITH CARRY;
29619ada4a8Sbouyer	JUMP REL(datain_loop), WHEN DATA_IN;
29719ada4a8Sbouyer	CALL REL(restoredsa);
298c8ff442fSbouyer	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
29919ada4a8Sbouyer	JUMP REL(waitphase);
30019ada4a8Sbouyer
30119ada4a8Sbouyerdataout:
30219ada4a8Sbouyer	CALL REL(savedsa);
303c8ff442fSbouyer	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
30419ada4a8Sbouyerdataout_loop:
30519ada4a8Sbouyer	MOVE FROM t_data, WHEN DATA_OUT;
30619ada4a8Sbouyer	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
30719ada4a8Sbouyer	MOVE DSA0 + 8 to DSA0;
30819ada4a8Sbouyer	MOVE DSA1 + 0 to DSA1 WITH CARRY;
30919ada4a8Sbouyer	MOVE DSA2 + 0 to DSA2 WITH CARRY;
31019ada4a8Sbouyer	MOVE DSA3 + 0 to DSA3 WITH CARRY;
31119ada4a8Sbouyer	JUMP REL(dataout_loop), WHEN DATA_OUT;
31219ada4a8Sbouyer	CALL REL(restoredsa);
313c8ff442fSbouyer	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
31419ada4a8Sbouyer	JUMP REL(waitphase);
31519ada4a8Sbouyer
31619ada4a8Sbouyersavedsa:
31719ada4a8Sbouyer	MOVE DSA0 to SFBR;
31819ada4a8Sbouyer	MOVE SFBR to SCRATCHB0;
31919ada4a8Sbouyer	MOVE DSA1 to SFBR;
32019ada4a8Sbouyer	MOVE SFBR to SCRATCHB1;
32119ada4a8Sbouyer	MOVE DSA2 to SFBR;
32219ada4a8Sbouyer	MOVE SFBR to SCRATCHB2;
32319ada4a8Sbouyer	MOVE DSA3 to SFBR;
32419ada4a8Sbouyer	MOVE SFBR to SCRATCHB3;
32519ada4a8Sbouyer	RETURN;
32619ada4a8Sbouyer
32719ada4a8Sbouyerrestoredsa:
32819ada4a8Sbouyer	MOVE SCRATCHB0 TO SFBR;
32919ada4a8Sbouyer	MOVE SFBR TO DSA0;
33019ada4a8Sbouyer	MOVE SCRATCHB1 TO SFBR;
33119ada4a8Sbouyer	MOVE SFBR TO DSA1;
33219ada4a8Sbouyer	MOVE SCRATCHB2 TO SFBR;
33319ada4a8Sbouyer	MOVE SFBR TO DSA2;
33419ada4a8Sbouyer	MOVE SCRATCHB3 TO SFBR;
33519ada4a8Sbouyer	MOVE SFBR TO DSA3;
33619ada4a8Sbouyer	RETURN;
33719ada4a8Sbouyer
33819ada4a8Sbouyerdisconnect:
33919ada4a8Sbouyer	MOVE SCNTL2 & 0x7f TO SCNTL2;
34019ada4a8Sbouyer	CLEAR ATN;
34119ada4a8Sbouyer	CLEAR ACK;
34219ada4a8Sbouyer	WAIT DISCONNECT;
34319ada4a8Sbouyer	RETURN;
34419ada4a8Sbouyer
34519ada4a8Sbouyerhandle_cmpl:
34619ada4a8Sbouyer	CALL REL(disconnect);
34719ada4a8Sbouyer	INT int_done;
34888be4752Sbouyer
34988be4752Sbouyerhandle_extin:
35088be4752Sbouyer	CLEAR ACK;
35188be4752Sbouyer	MOVE FROM t_ext_msg_in, WHEN MSG_IN;
35288be4752Sbouyer	INT int_extmsgin; /* let host fill in t_ext_msg_data */
35388be4752Sbouyerget_extmsgdata:
35488be4752Sbouyer	CLEAR ACK;
35588be4752Sbouyer	MOVE FROM t_ext_msg_data, WHEN MSG_IN;
35688be4752Sbouyer	INT int_extmsgdata;
35775246b83Sbouyermsgin_space:
35875246b83Sbouyer	NOP; space to store msgin when reselect
35975246b83Sbouyer
36088be4752Sbouyer
36175246b83Sbouyer;; per-target switch script for LUNs
3627ae5c097Sbouyer; hack: we first do a call to the target-specific code, so that a return
36375246b83Sbouyer; in the main switch will jump to the lun switch.
36475246b83SbouyerPROC lun_switch:
36567618a69Sbouyerrestore_scntl3:
36667618a69Sbouyer	MOVE 0xff TO SCNTL3;
36767618a69Sbouyer	MOVE 0xff TO SXFER;
36867618a69Sbouyer	JUMP abs_lunsw_return;
36967618a69Sbouyerlun_switch_entry:
37075246b83Sbouyer	CALL REL(restore_scntl3);
37175246b83Sbouyer	MOVE SCRATCHA1 TO SFBR;
37275246b83Sbouyerresel_lun0:
37375246b83Sbouyer	INT int_resellun;
374c67eef4eSbouyer
3757ae5c097Sbouyer;; Per-device switch script for tag
3767ae5c097SbouyerPROC tag_switch:
3777ae5c097Sbouyertag_switch_entry:
3787ae5c097Sbouyer	MOVE SCRATCHA2 TO SFBR; restore tag
3797ae5c097Sbouyerresel_tag0:
3807ae5c097Sbouyer	JUMP abs_tag0, IF 0x00;
3817ae5c097Sbouyer	JUMP abs_tag0, IF 0x01;
3827ae5c097Sbouyer	JUMP abs_tag0, IF 0x02;
3837ae5c097Sbouyer	JUMP abs_tag0, IF 0x03;
3847ae5c097Sbouyer	JUMP abs_tag0, IF 0x04;
3857ae5c097Sbouyer	JUMP abs_tag0, IF 0x05;
3867ae5c097Sbouyer	JUMP abs_tag0, IF 0x06;
3877ae5c097Sbouyer	JUMP abs_tag0, IF 0x07;
3887ae5c097Sbouyer	JUMP abs_tag0, IF 0x08;
3897ae5c097Sbouyer	JUMP abs_tag0, IF 0x09;
3907ae5c097Sbouyer	JUMP abs_tag0, IF 0x0a;
3917ae5c097Sbouyer	JUMP abs_tag0, IF 0x0b;
3927ae5c097Sbouyer	JUMP abs_tag0, IF 0x0c;
3937ae5c097Sbouyer	JUMP abs_tag0, IF 0x0d;
3947ae5c097Sbouyer	JUMP abs_tag0, IF 0x0e;
3957ae5c097Sbouyer	JUMP abs_tag0, IF 0x0f;
3967ae5c097Sbouyer	INT int_reseltag;
3977ae5c097Sbouyer
3987ae5c097Sbouyer;; per-command script: select, and called after a reselect to load DSA
39975246b83Sbouyer
40075246b83SbouyerPROC load_dsa:
40175246b83Sbouyer; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped
402c67eef4eSbouyerrdsa0:
40375246b83Sbouyer	MOVE 0xf0 to DSA0;
404c67eef4eSbouyerrdsa1:
40575246b83Sbouyer	MOVE 0xf1 to DSA1;
406c67eef4eSbouyerrdsa2:
40775246b83Sbouyer	MOVE 0xf2 to DSA2;
408c67eef4eSbouyerrdsa3:
40975246b83Sbouyer	MOVE 0xf3 to DSA3;
41075246b83Sbouyer	RETURN;
4117ae5c097Sbouyerldsa_reload_dsa:
41275246b83Sbouyer	CALL REL(rdsa0);
4137ae5c097Sbouyer	JUMP ldsa_abs_reselected;
4147ae5c097Sbouyerldsa_select:
4157ae5c097Sbouyer	CALL REL(rdsa0);
4167ae5c097Sbouyer	SELECT ATN FROM t_id, ldsa_abs_reselect;
4177ae5c097Sbouyer	MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot;
4187ae5c097Sbouyer	JUMP ldsa_abs_selected;
4197ae5c097Sbouyerldsa_data:
4207ae5c097Sbouyer	NOP; contains data used by the MOVE MEMORY
421172d73c2Sbouyer
422172d73c2SbouyerPROC siop_led_on:
423172d73c2Sbouyer	MOVE GPREG & 0xfe TO GPREG;
424172d73c2Sbouyer
425172d73c2SbouyerPROC siop_led_off:
426172d73c2Sbouyer	MOVE GPREG | 0x01 TO GPREG;
427