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