Home | History | Annotate | Line # | Download | only in siop
siop.ss revision 1.17.10.1.2.1
      1  1.17.10.1.2.1     riz ;	$NetBSD: siop.ss,v 1.17.10.1.2.1 2005/12/01 20:05:31 riz Exp $
      2            1.3  bouyer 
      3            1.3  bouyer ;
      4            1.3  bouyer ;  Copyright (c) 2000 Manuel Bouyer.
      5            1.3  bouyer ; 
      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.3  bouyer ; 
     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.5  bouyer ;  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.17.10.1.2.1     riz ABSOLUTE int_saveoffset	= 0xff05;
     51           1.10  bouyer ; interrupts that don't have a valid DSA
     52           1.10  bouyer ABSOLUTE int_reseltarg	= 0xff80;
     53           1.10  bouyer ABSOLUTE int_resellun	= 0xff81;
     54           1.10  bouyer ABSOLUTE int_reseltag	= 0xff82;
     55           1.10  bouyer ABSOLUTE int_resfail	= 0xff83;
     56            1.1  bouyer ABSOLUTE int_err 	= 0xffff;
     57            1.1  bouyer 
     58            1.1  bouyer ; flags for scratcha0
     59            1.1  bouyer ABSOLUTE flag_sdp 	= 0x01 ; got save data pointer
     60            1.4  bouyer ABSOLUTE flag_data 	= 0x02 ; we're in data phase
     61            1.4  bouyer ABSOLUTE flag_data_mask	= 0xfd ; ~flag_data
     62            1.1  bouyer 
     63           1.10  bouyer ; main script symbols
     64           1.10  bouyer 
     65            1.1  bouyer ENTRY waitphase;
     66            1.2  bouyer ENTRY send_msgout;
     67            1.1  bouyer ENTRY msgout;
     68            1.1  bouyer ENTRY msgin;
     69           1.10  bouyer ENTRY handle_msgin;
     70            1.2  bouyer ENTRY msgin_ack;
     71            1.1  bouyer ENTRY dataout;
     72            1.1  bouyer ENTRY datain;
     73            1.1  bouyer ENTRY cmdout;
     74            1.1  bouyer ENTRY status;
     75            1.1  bouyer ENTRY disconnect;
     76            1.1  bouyer ENTRY reselect;
     77           1.10  bouyer ENTRY reselected;
     78            1.2  bouyer ENTRY selected;
     79           1.10  bouyer ENTRY script_sched;
     80           1.12  bouyer ENTRY script_sched_slot0;
     81            1.2  bouyer ENTRY get_extmsgdata;
     82           1.10  bouyer ENTRY resel_targ0;
     83           1.10  bouyer ENTRY msgin_space;
     84           1.10  bouyer ENTRY lunsw_return;
     85           1.13  bouyer ENTRY led_on1;
     86           1.13  bouyer ENTRY led_on2;
     87           1.13  bouyer ENTRY led_off;
     88           1.12  bouyer EXTERN abs_script_sched_slot0;
     89           1.10  bouyer EXTERN abs_targ0;
     90           1.10  bouyer EXTERN abs_msgin;
     91           1.10  bouyer 
     92           1.10  bouyer ; lun switch symbols
     93           1.11  bouyer ENTRY lun_switch_entry;
     94           1.10  bouyer ENTRY resel_lun0;
     95           1.10  bouyer ENTRY restore_scntl3;
     96           1.10  bouyer EXTERN abs_lunsw_return;
     97           1.10  bouyer 
     98           1.12  bouyer ; tag switch symbols
     99           1.12  bouyer ENTRY tag_switch_entry;
    100           1.12  bouyer ENTRY resel_tag0;
    101           1.12  bouyer EXTERN abs_tag0;
    102           1.12  bouyer 
    103           1.10  bouyer ; command reselect script symbols
    104           1.10  bouyer ENTRY rdsa0;
    105           1.10  bouyer ENTRY rdsa1;
    106           1.10  bouyer ENTRY rdsa2;
    107           1.10  bouyer ENTRY rdsa3;
    108           1.12  bouyer ENTRY ldsa_reload_dsa;
    109           1.12  bouyer ENTRY ldsa_select;
    110           1.12  bouyer ENTRY ldsa_data;
    111           1.12  bouyer 
    112           1.12  bouyer EXTERN ldsa_abs_reselected;
    113           1.12  bouyer EXTERN ldsa_abs_reselect;
    114           1.12  bouyer EXTERN ldsa_abs_selected;
    115           1.12  bouyer EXTERN ldsa_abs_data;
    116           1.12  bouyer EXTERN ldsa_abs_slot;
    117            1.1  bouyer 
    118           1.10  bouyer ; main script
    119            1.8  bouyer 
    120            1.1  bouyer PROC  siop_script:
    121            1.1  bouyer 
    122           1.10  bouyer reselected:
    123            1.1  bouyer ; starting a new session, init 'local variables'
    124            1.1  bouyer 	MOVE 0 to SCRATCHA0	; flags
    125            1.1  bouyer 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
    126           1.10  bouyer 	MOVE SCRATCHA3 to SFBR  ; pending message ?
    127           1.12  bouyer 	JUMP REL(handle_msgin), IF not 0x20;
    128            1.1  bouyer waitphase:
    129            1.1  bouyer 	JUMP REL(msgout), WHEN MSG_OUT;
    130            1.1  bouyer 	JUMP REL(msgin), WHEN MSG_IN;
    131            1.1  bouyer 	JUMP REL(dataout), WHEN DATA_OUT;
    132            1.1  bouyer 	JUMP REL(datain), WHEN DATA_IN;
    133            1.1  bouyer 	JUMP REL(cmdout), WHEN CMD;
    134            1.1  bouyer 	JUMP REL(status), WHEN STATUS;
    135            1.1  bouyer 	INT int_err;
    136            1.1  bouyer 
    137           1.12  bouyer reselect_fail:
    138           1.12  bouyer 	; check that host asserted SIGP, this'll clear SIGP in ISTAT
    139           1.12  bouyer 	MOVE CTEST2 & 0x40 TO SFBR;
    140           1.12  bouyer 	INT int_resfail,  IF 0x00;
    141           1.13  bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
    142           1.13  bouyer ; option "SIOP_SYMLED"
    143           1.13  bouyer led_on1:
    144           1.13  bouyer 	NOP;
    145           1.12  bouyer script_sched:
    146           1.12  bouyer 	; Clear DSA and init status
    147           1.12  bouyer 	MOVE 0xff to DSA0;
    148           1.12  bouyer 	MOVE 0xff to DSA1;
    149           1.12  bouyer 	MOVE 0xff to DSA2;
    150           1.12  bouyer 	MOVE 0xff to DSA3;
    151           1.12  bouyer 	MOVE 0 to SCRATCHA0	; flags
    152           1.12  bouyer 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
    153           1.12  bouyer ; the script scheduler: siop_start() we set the absolute jump addr, and then 
    154           1.12  bouyer ; changes the FALSE to TRUE. The select script will change it back to false
    155           1.12  bouyer ; once the target is selected.
    156           1.12  bouyer ; The RAM could hold 370 slot entry, we limit it to 40. Should be more than
    157           1.16     wiz ; enough.
    158           1.12  bouyer script_sched_slot0:
    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 	JUMP abs_script_sched_slot0, IF FALSE;
    199           1.12  bouyer ; Nothing to do, wait for reselect
    200            1.1  bouyer reselect:
    201           1.10  bouyer 	; Clear DSA and init status
    202           1.10  bouyer 	MOVE 0xff to DSA0;
    203           1.10  bouyer 	MOVE 0xff to DSA1;
    204           1.10  bouyer 	MOVE 0xff to DSA2;
    205           1.10  bouyer 	MOVE 0xff to DSA3;
    206           1.12  bouyer 	MOVE 0x00 to SCRATCHA2; no tag
    207           1.12  bouyer 	MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected:
    208           1.13  bouyer ; a NOP by default; patched with MOVE GPREG | 0x01 to GPREG on compile-time
    209           1.13  bouyer ; option "SIOP_SYMLED"
    210           1.13  bouyer led_off:
    211           1.13  bouyer 	NOP;
    212            1.1  bouyer 	WAIT RESELECT REL(reselect_fail)
    213           1.13  bouyer ; a NOP by default; patched with MOVE GPREG & 0xfe to GPREG on compile-time
    214           1.13  bouyer ; option "SIOP_SYMLED"
    215           1.13  bouyer led_on2:
    216           1.13  bouyer 	NOP;
    217            1.1  bouyer 	MOVE SSID & 0x8f to SFBR
    218            1.1  bouyer 	MOVE SFBR to SCRATCHA0 ; save reselect ID
    219           1.17     wiz ; find the right param for this target
    220           1.10  bouyer resel_targ0:
    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 	JUMP abs_targ0, IF 0xff;
    236           1.10  bouyer 	INT int_reseltarg;
    237           1.10  bouyer lunsw_return:
    238           1.10  bouyer 	MOVE 1, abs_msgin, WHEN MSG_IN;
    239           1.10  bouyer 	MOVE SFBR & 0x07 to SCRATCHA1; save LUN
    240           1.10  bouyer 	CLEAR ACK;
    241           1.10  bouyer 	RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw
    242           1.10  bouyer 	MOVE 1, abs_msgin, WHEN MSG_IN;
    243           1.10  bouyer 	CLEAR ACK;
    244           1.10  bouyer 	MOVE SFBR  to SCRATCHA3; save message
    245           1.12  bouyer 	RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg
    246           1.10  bouyer 	MOVE 1, abs_msgin, WHEN MSG_IN; get tag
    247           1.10  bouyer 	CLEAR ACK;
    248           1.10  bouyer 	MOVE SFBR  to SCRATCHA2; save tag
    249           1.10  bouyer 	RETURN; jump to lun sw
    250           1.10  bouyer 
    251           1.10  bouyer handle_sdp:
    252           1.10  bouyer 	CLEAR ACK;
    253           1.10  bouyer 	MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
    254           1.10  bouyer 	; should get a disconnect message now
    255            1.1  bouyer msgin:
    256            1.1  bouyer 	CLEAR ATN
    257            1.1  bouyer 	MOVE FROM t_msg_in, WHEN MSG_IN;
    258           1.10  bouyer handle_msgin:
    259            1.1  bouyer 	JUMP REL(handle_cmpl), IF 0x00        ; command complete message
    260            1.1  bouyer 	JUMP REL(handle_sdp), IF 0x02	      ; save data pointer message
    261            1.2  bouyer 	JUMP REL(handle_extin), IF 0x01	      ; extended message
    262           1.12  bouyer 	INT int_msgin, IF not 0x04;
    263           1.12  bouyer 	CALL REL(disconnect)                  ; disconnect message;
    264      1.17.10.1     snj ; if we didn't get sdp, no need to interrupt
    265           1.12  bouyer 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
    266  1.17.10.1.2.1     riz 	INT int_disc, IF not 0x00;
    267  1.17.10.1.2.1     riz ; update offset if we did some data transfer
    268  1.17.10.1.2.1     riz 	MOVE SCRATCHA1 TO SFBR;
    269           1.12  bouyer 	JUMP REL(script_sched), if 0x00; 
    270  1.17.10.1.2.1     riz 	INT int_saveoffset;
    271  1.17.10.1.2.1     riz 
    272            1.2  bouyer msgin_ack:
    273           1.10  bouyer selected:
    274            1.2  bouyer 	CLEAR ACK;
    275            1.2  bouyer 	JUMP REL(waitphase);
    276            1.2  bouyer 
    277            1.2  bouyer ; entry point for msgout after a msgin or status phase
    278            1.2  bouyer send_msgout:
    279            1.2  bouyer 	SET ATN;
    280            1.2  bouyer 	CLEAR ACK;
    281            1.1  bouyer msgout:
    282            1.1  bouyer 	MOVE FROM t_msg_out, WHEN MSG_OUT;
    283            1.1  bouyer 	CLEAR ATN;
    284            1.1  bouyer 	JUMP REL(waitphase);
    285            1.1  bouyer cmdout:
    286            1.1  bouyer 	MOVE FROM t_cmd, WHEN CMD;
    287            1.1  bouyer 	JUMP REL(waitphase);
    288            1.1  bouyer status:
    289            1.1  bouyer 	MOVE FROM t_status, WHEN STATUS;
    290            1.1  bouyer 	JUMP REL(waitphase);
    291            1.1  bouyer datain:
    292            1.1  bouyer 	CALL REL(savedsa);
    293            1.4  bouyer 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    294            1.1  bouyer datain_loop:
    295            1.1  bouyer 	MOVE FROM t_data, WHEN DATA_IN;
    296            1.1  bouyer 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    297            1.1  bouyer 	MOVE DSA0 + 8 to DSA0;
    298            1.1  bouyer 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    299            1.1  bouyer 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    300            1.1  bouyer 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    301            1.1  bouyer 	JUMP REL(datain_loop), WHEN DATA_IN;
    302            1.1  bouyer 	CALL REL(restoredsa);
    303            1.4  bouyer 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    304            1.1  bouyer 	JUMP REL(waitphase);
    305            1.1  bouyer 
    306            1.1  bouyer dataout:
    307            1.1  bouyer 	CALL REL(savedsa);
    308            1.4  bouyer 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    309            1.1  bouyer dataout_loop:
    310            1.1  bouyer 	MOVE FROM t_data, WHEN DATA_OUT;
    311            1.1  bouyer 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    312            1.1  bouyer 	MOVE DSA0 + 8 to DSA0;
    313            1.1  bouyer 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    314            1.1  bouyer 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    315            1.1  bouyer 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    316            1.1  bouyer 	JUMP REL(dataout_loop), WHEN DATA_OUT;
    317            1.1  bouyer 	CALL REL(restoredsa);
    318            1.4  bouyer 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    319            1.1  bouyer 	JUMP REL(waitphase);
    320            1.1  bouyer 
    321            1.1  bouyer savedsa:
    322            1.1  bouyer 	MOVE DSA0 to SFBR;
    323            1.1  bouyer 	MOVE SFBR to SCRATCHB0;
    324            1.1  bouyer 	MOVE DSA1 to SFBR;
    325            1.1  bouyer 	MOVE SFBR to SCRATCHB1;
    326            1.1  bouyer 	MOVE DSA2 to SFBR;
    327            1.1  bouyer 	MOVE SFBR to SCRATCHB2;
    328            1.1  bouyer 	MOVE DSA3 to SFBR;
    329            1.1  bouyer 	MOVE SFBR to SCRATCHB3;
    330            1.1  bouyer 	RETURN;
    331            1.1  bouyer 
    332            1.1  bouyer restoredsa:
    333            1.1  bouyer 	MOVE SCRATCHB0 TO SFBR;
    334            1.1  bouyer 	MOVE SFBR TO DSA0;
    335            1.1  bouyer 	MOVE SCRATCHB1 TO SFBR;
    336            1.1  bouyer 	MOVE SFBR TO DSA1;
    337            1.1  bouyer 	MOVE SCRATCHB2 TO SFBR;
    338            1.1  bouyer 	MOVE SFBR TO DSA2;
    339            1.1  bouyer 	MOVE SCRATCHB3 TO SFBR;
    340            1.1  bouyer 	MOVE SFBR TO DSA3;
    341            1.1  bouyer 	RETURN;
    342            1.1  bouyer 
    343            1.1  bouyer disconnect:
    344            1.1  bouyer 	MOVE SCNTL2 & 0x7f TO SCNTL2;
    345            1.1  bouyer 	CLEAR ATN;
    346            1.1  bouyer 	CLEAR ACK;
    347            1.1  bouyer 	WAIT DISCONNECT;
    348            1.1  bouyer 	RETURN;
    349            1.1  bouyer 
    350            1.1  bouyer handle_cmpl:
    351            1.1  bouyer 	CALL REL(disconnect);
    352            1.1  bouyer 	INT int_done;
    353            1.2  bouyer 
    354            1.2  bouyer handle_extin:
    355            1.2  bouyer 	CLEAR ACK;
    356            1.2  bouyer 	MOVE FROM t_ext_msg_in, WHEN MSG_IN;
    357            1.2  bouyer 	INT int_extmsgin; /* let host fill in t_ext_msg_data */
    358            1.2  bouyer get_extmsgdata:
    359            1.2  bouyer 	CLEAR ACK;
    360            1.2  bouyer 	MOVE FROM t_ext_msg_data, WHEN MSG_IN;
    361            1.2  bouyer 	INT int_extmsgdata;
    362           1.10  bouyer msgin_space:
    363           1.10  bouyer 	NOP; space to store msgin when reselect
    364           1.10  bouyer 
    365            1.2  bouyer 
    366           1.10  bouyer ;; per-target switch script for LUNs
    367           1.12  bouyer ; hack: we first do a call to the target-specific code, so that a return
    368           1.10  bouyer ; in the main switch will jump to the lun switch.
    369           1.10  bouyer PROC lun_switch:
    370           1.11  bouyer restore_scntl3:
    371           1.11  bouyer 	MOVE 0xff TO SCNTL3;
    372           1.11  bouyer 	MOVE 0xff TO SXFER;
    373           1.11  bouyer 	JUMP abs_lunsw_return;
    374           1.11  bouyer lun_switch_entry:
    375           1.10  bouyer 	CALL REL(restore_scntl3);
    376           1.10  bouyer 	MOVE SCRATCHA1 TO SFBR;
    377           1.10  bouyer resel_lun0:
    378           1.10  bouyer 	INT int_resellun;
    379           1.10  bouyer 
    380           1.12  bouyer ;; Per-device switch script for tag
    381           1.12  bouyer PROC tag_switch:
    382           1.12  bouyer tag_switch_entry:
    383           1.12  bouyer 	MOVE SCRATCHA2 TO SFBR; restore tag
    384           1.12  bouyer resel_tag0:
    385           1.12  bouyer 	JUMP abs_tag0, IF 0x00;
    386           1.12  bouyer 	JUMP abs_tag0, IF 0x01;
    387           1.12  bouyer 	JUMP abs_tag0, IF 0x02;
    388           1.12  bouyer 	JUMP abs_tag0, IF 0x03;
    389           1.12  bouyer 	JUMP abs_tag0, IF 0x04;
    390           1.12  bouyer 	JUMP abs_tag0, IF 0x05;
    391           1.12  bouyer 	JUMP abs_tag0, IF 0x06;
    392           1.12  bouyer 	JUMP abs_tag0, IF 0x07;
    393           1.12  bouyer 	JUMP abs_tag0, IF 0x08;
    394           1.12  bouyer 	JUMP abs_tag0, IF 0x09;
    395           1.12  bouyer 	JUMP abs_tag0, IF 0x0a;
    396           1.12  bouyer 	JUMP abs_tag0, IF 0x0b;
    397           1.12  bouyer 	JUMP abs_tag0, IF 0x0c;
    398           1.12  bouyer 	JUMP abs_tag0, IF 0x0d;
    399           1.12  bouyer 	JUMP abs_tag0, IF 0x0e;
    400           1.12  bouyer 	JUMP abs_tag0, IF 0x0f;
    401           1.12  bouyer 	INT int_reseltag;
    402           1.12  bouyer 
    403           1.12  bouyer ;; per-command script: select, and called after a reselect to load DSA
    404           1.10  bouyer 
    405           1.10  bouyer PROC load_dsa:
    406           1.10  bouyer ; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped
    407            1.8  bouyer rdsa0:
    408           1.10  bouyer 	MOVE 0xf0 to DSA0;
    409            1.8  bouyer rdsa1:
    410           1.10  bouyer 	MOVE 0xf1 to DSA1;
    411            1.8  bouyer rdsa2:
    412           1.10  bouyer 	MOVE 0xf2 to DSA2;
    413            1.8  bouyer rdsa3:
    414           1.10  bouyer 	MOVE 0xf3 to DSA3;
    415           1.10  bouyer 	RETURN;
    416           1.12  bouyer ldsa_reload_dsa:
    417           1.12  bouyer 	CALL REL(rdsa0);
    418           1.12  bouyer 	JUMP ldsa_abs_reselected;
    419           1.12  bouyer ldsa_select:
    420           1.10  bouyer 	CALL REL(rdsa0);
    421           1.12  bouyer 	SELECT ATN FROM t_id, ldsa_abs_reselect;
    422           1.12  bouyer 	MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot;
    423           1.12  bouyer 	JUMP ldsa_abs_selected;
    424           1.12  bouyer ldsa_data:
    425           1.12  bouyer 	NOP; contains data used by the MOVE MEMORY
    426           1.13  bouyer 
    427           1.13  bouyer PROC siop_led_on:
    428           1.13  bouyer 	MOVE GPREG & 0xfe TO GPREG;
    429           1.13  bouyer 
    430           1.13  bouyer PROC siop_led_off:
    431           1.13  bouyer 	MOVE GPREG | 0x01 TO GPREG;
    432