Home | History | Annotate | Line # | Download | only in siop
siop.ss revision 1.7.2.1
      1  1.7.2.1      he ;	$NetBSD: siop.ss,v 1.7.2.1 2000/12/15 04:46:34 he 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.3  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.2  bouyer ; offsets in sym_xfer
     34      1.4  bouyer ABSOLUTE t_id = 24;
     35      1.4  bouyer ABSOLUTE t_msg_in = 32;
     36      1.4  bouyer ABSOLUTE t_ext_msg_in = 40;
     37      1.4  bouyer ABSOLUTE t_ext_msg_data = 48;
     38  1.7.2.1      he ABSOLUTE t_msg_out = 56;
     39  1.7.2.1      he ABSOLUTE t_cmd = 64;
     40  1.7.2.1      he ABSOLUTE t_status = 72;
     41  1.7.2.1      he ABSOLUTE t_data = 80;
     42      1.1  bouyer 
     43      1.1  bouyer ;; interrupt codes
     44  1.7.2.1      he ; 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.7.2.1      he ABSOLUTE int_disc	= 0xff04;
     50  1.7.2.1      he ; interrupts that don't have a valid DSA
     51  1.7.2.1      he ABSOLUTE int_reseltarg	= 0xff80;
     52  1.7.2.1      he ABSOLUTE int_resellun	= 0xff81;
     53  1.7.2.1      he ABSOLUTE int_reseltag	= 0xff82;
     54  1.7.2.1      he 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.7.2.1      he ; main script symbols
     63  1.7.2.1      he 
     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.7.2.1      he 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.7.2.1      he ENTRY reselected;
     77      1.2  bouyer ENTRY selected;
     78  1.7.2.1      he ENTRY script_sched;
     79  1.7.2.1      he ENTRY script_sched_slot0;
     80      1.2  bouyer ENTRY get_extmsgdata;
     81  1.7.2.1      he ENTRY resel_targ0;
     82  1.7.2.1      he ENTRY msgin_space;
     83  1.7.2.1      he ENTRY lunsw_return;
     84  1.7.2.1      he EXTERN abs_script_sched_slot0;
     85  1.7.2.1      he EXTERN abs_targ0;
     86  1.7.2.1      he EXTERN abs_msgin;
     87  1.7.2.1      he 
     88  1.7.2.1      he ; lun switch symbols
     89  1.7.2.1      he ENTRY lun_switch_entry;
     90  1.7.2.1      he ENTRY resel_lun0;
     91  1.7.2.1      he ENTRY restore_scntl3;
     92  1.7.2.1      he EXTERN abs_lunsw_return;
     93  1.7.2.1      he 
     94  1.7.2.1      he ; tag switch symbols
     95  1.7.2.1      he ENTRY tag_switch_entry;
     96  1.7.2.1      he ENTRY resel_tag0;
     97  1.7.2.1      he EXTERN abs_tag0;
     98  1.7.2.1      he 
     99  1.7.2.1      he ; command reselect script symbols
    100  1.7.2.1      he ENTRY rdsa0;
    101  1.7.2.1      he ENTRY rdsa1;
    102  1.7.2.1      he ENTRY rdsa2;
    103  1.7.2.1      he ENTRY rdsa3;
    104  1.7.2.1      he ENTRY ldsa_reload_dsa;
    105  1.7.2.1      he ENTRY ldsa_select;
    106  1.7.2.1      he ENTRY ldsa_data;
    107  1.7.2.1      he 
    108  1.7.2.1      he EXTERN ldsa_abs_reselected;
    109  1.7.2.1      he EXTERN ldsa_abs_reselect;
    110  1.7.2.1      he EXTERN ldsa_abs_selected;
    111  1.7.2.1      he EXTERN ldsa_abs_data;
    112  1.7.2.1      he EXTERN ldsa_abs_slot;
    113      1.2  bouyer 
    114  1.7.2.1      he ; main script
    115      1.1  bouyer 
    116      1.1  bouyer PROC  siop_script:
    117      1.1  bouyer 
    118  1.7.2.1      he reselected:
    119      1.1  bouyer ; starting a new session, init 'local variables'
    120      1.1  bouyer 	MOVE 0 to SCRATCHA0	; flags
    121      1.1  bouyer 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
    122  1.7.2.1      he 	MOVE SCRATCHA3 to SFBR  ; pending message ?
    123  1.7.2.1      he 	JUMP REL(handle_msgin), IF not 0x20;
    124      1.1  bouyer waitphase:
    125      1.1  bouyer 	JUMP REL(msgout), WHEN MSG_OUT;
    126      1.1  bouyer 	JUMP REL(msgin), WHEN MSG_IN;
    127      1.1  bouyer 	JUMP REL(dataout), WHEN DATA_OUT;
    128      1.1  bouyer 	JUMP REL(datain), WHEN DATA_IN;
    129      1.1  bouyer 	JUMP REL(cmdout), WHEN CMD;
    130      1.1  bouyer 	JUMP REL(status), WHEN STATUS;
    131      1.1  bouyer 	INT int_err;
    132      1.1  bouyer 
    133      1.1  bouyer reselect_fail:
    134      1.2  bouyer 	; check that host asserted SIGP, this'll clear SIGP in ISTAT
    135      1.2  bouyer 	MOVE CTEST2 & 0x40 TO SFBR;
    136      1.2  bouyer 	INT int_resfail,  IF 0x00;
    137  1.7.2.1      he script_sched:
    138  1.7.2.1      he 	; Clear DSA and init status
    139  1.7.2.1      he 	MOVE 0xff to DSA0;
    140  1.7.2.1      he 	MOVE 0xff to DSA1;
    141  1.7.2.1      he 	MOVE 0xff to DSA2;
    142  1.7.2.1      he 	MOVE 0xff to DSA3;
    143  1.7.2.1      he 	MOVE 0 to SCRATCHA0	; flags
    144  1.7.2.1      he 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
    145  1.7.2.1      he ; the script scheduler: siop_start() we set the absolute jump addr, and then 
    146  1.7.2.1      he ; changes the FALSE to TRUE. The select script will change it back to false
    147  1.7.2.1      he ; once the target is selected.
    148  1.7.2.1      he ; The RAM could hold 370 slot entry, we limit it to 40. Should be more than
    149  1.7.2.1      he ; enouth.
    150  1.7.2.1      he script_sched_slot0:
    151  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    152  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    153  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    154  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    155  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    156  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    157  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    158  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    159  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    160  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    161  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    162  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    163  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    164  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    165  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    166  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    167  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    168  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    169  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    170  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    171  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    172  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    173  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    174  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    175  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    176  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    177  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    178  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    179  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    180  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    181  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    182  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    183  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    184  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    185  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    186  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    187  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    188  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    189  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    190  1.7.2.1      he 	JUMP abs_script_sched_slot0, IF FALSE;
    191  1.7.2.1      he ; Nothing to do, wait for reselect
    192  1.7.2.1      he reselect:
    193  1.7.2.1      he 	; Clear DSA and init status
    194  1.7.2.1      he 	MOVE 0xff to DSA0;
    195  1.7.2.1      he 	MOVE 0xff to DSA1;
    196  1.7.2.1      he 	MOVE 0xff to DSA2;
    197  1.7.2.1      he 	MOVE 0xff to DSA3;
    198  1.7.2.1      he 	MOVE 0x00 to SCRATCHA2; no tag
    199  1.7.2.1      he 	MOVE 0x20 to SCRATCHA3; simple tag msg, ignored by reselected:
    200  1.7.2.1      he 	WAIT RESELECT REL(reselect_fail)
    201  1.7.2.1      he 	MOVE SSID & 0x8f to SFBR
    202  1.7.2.1      he 	MOVE SFBR to SCRATCHA0 ; save reselect ID
    203  1.7.2.1      he ; find the rigth param for this target
    204  1.7.2.1      he resel_targ0:
    205  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    206  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    207  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    208  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    209  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    210  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    211  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    212  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    213  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    214  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    215  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    216  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    217  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    218  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    219  1.7.2.1      he 	JUMP abs_targ0, IF 0xff;
    220  1.7.2.1      he 	INT int_reseltarg;
    221  1.7.2.1      he lunsw_return:
    222  1.7.2.1      he 	MOVE 1, abs_msgin, WHEN MSG_IN;
    223  1.7.2.1      he 	MOVE SFBR & 0x07 to SCRATCHA1; save LUN
    224  1.7.2.1      he 	CLEAR ACK;
    225  1.7.2.1      he 	RETURN, WHEN NOT MSG_IN; If no more message, jump to lun sw
    226  1.7.2.1      he 	MOVE 1, abs_msgin, WHEN MSG_IN;
    227  1.7.2.1      he 	CLEAR ACK;
    228  1.7.2.1      he 	MOVE SFBR  to SCRATCHA3; save message
    229  1.7.2.1      he 	RETURN, IF NOT 0x20; jump to lun sw if not simple tag msg
    230  1.7.2.1      he 	MOVE 1, abs_msgin, WHEN MSG_IN; get tag
    231  1.7.2.1      he 	CLEAR ACK;
    232  1.7.2.1      he 	MOVE SFBR  to SCRATCHA2; save tag
    233  1.7.2.1      he 	RETURN; jump to lun sw
    234      1.1  bouyer 
    235  1.7.2.1      he handle_sdp:
    236  1.7.2.1      he 	CLEAR ACK;
    237  1.7.2.1      he 	MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
    238  1.7.2.1      he 	; should get a disconnect message now
    239      1.1  bouyer msgin:
    240      1.1  bouyer 	CLEAR ATN
    241      1.1  bouyer 	MOVE FROM t_msg_in, WHEN MSG_IN;
    242  1.7.2.1      he handle_msgin:
    243      1.1  bouyer 	JUMP REL(handle_cmpl), IF 0x00        ; command complete message
    244      1.1  bouyer 	JUMP REL(handle_sdp), IF 0x02	      ; save data pointer message
    245      1.2  bouyer 	JUMP REL(handle_extin), IF 0x01	      ; extended message
    246  1.7.2.1      he 	INT int_msgin, IF not 0x04;
    247  1.7.2.1      he 	CALL REL(disconnect)                  ; disconnect message;
    248  1.7.2.1      he ; if we didn't get sdp, or if offset is 0, no need to interrupt
    249  1.7.2.1      he 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
    250  1.7.2.1      he 	JUMP REL(script_sched), if 0x00; 
    251  1.7.2.1      he 	MOVE SCRATCHA1 TO SFBR;
    252  1.7.2.1      he 	JUMP REL(script_sched), if 0x00; 
    253  1.7.2.1      he ; Ok, we need to save data pointers
    254  1.7.2.1      he 	INT int_disc;
    255      1.2  bouyer msgin_ack:
    256  1.7.2.1      he selected:
    257      1.2  bouyer 	CLEAR ACK;
    258      1.2  bouyer 	JUMP REL(waitphase);
    259      1.2  bouyer 
    260      1.2  bouyer ; entry point for msgout after a msgin or status phase
    261      1.2  bouyer send_msgout:
    262      1.2  bouyer 	SET ATN;
    263      1.2  bouyer 	CLEAR ACK;
    264      1.1  bouyer msgout:
    265      1.1  bouyer 	MOVE FROM t_msg_out, WHEN MSG_OUT;
    266      1.1  bouyer 	CLEAR ATN;
    267      1.1  bouyer 	JUMP REL(waitphase);
    268      1.1  bouyer cmdout:
    269      1.1  bouyer 	MOVE FROM t_cmd, WHEN CMD;
    270      1.1  bouyer 	JUMP REL(waitphase);
    271      1.1  bouyer status:
    272      1.1  bouyer 	MOVE FROM t_status, WHEN STATUS;
    273      1.1  bouyer 	JUMP REL(waitphase);
    274      1.1  bouyer datain:
    275      1.1  bouyer 	CALL REL(savedsa);
    276      1.4  bouyer 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    277      1.1  bouyer datain_loop:
    278      1.1  bouyer 	MOVE FROM t_data, WHEN DATA_IN;
    279      1.1  bouyer 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    280      1.1  bouyer 	MOVE DSA0 + 8 to DSA0;
    281      1.1  bouyer 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    282      1.1  bouyer 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    283      1.1  bouyer 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    284      1.1  bouyer 	JUMP REL(datain_loop), WHEN DATA_IN;
    285      1.1  bouyer 	CALL REL(restoredsa);
    286      1.4  bouyer 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    287      1.1  bouyer 	JUMP REL(waitphase);
    288      1.1  bouyer 
    289      1.1  bouyer dataout:
    290      1.1  bouyer 	CALL REL(savedsa);
    291      1.4  bouyer 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    292      1.1  bouyer dataout_loop:
    293      1.1  bouyer 	MOVE FROM t_data, WHEN DATA_OUT;
    294      1.1  bouyer 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    295      1.1  bouyer 	MOVE DSA0 + 8 to DSA0;
    296      1.1  bouyer 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    297      1.1  bouyer 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    298      1.1  bouyer 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    299      1.1  bouyer 	JUMP REL(dataout_loop), WHEN DATA_OUT;
    300      1.1  bouyer 	CALL REL(restoredsa);
    301      1.4  bouyer 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    302      1.1  bouyer 	JUMP REL(waitphase);
    303      1.1  bouyer 
    304      1.1  bouyer savedsa:
    305      1.1  bouyer 	MOVE DSA0 to SFBR;
    306      1.1  bouyer 	MOVE SFBR to SCRATCHB0;
    307      1.1  bouyer 	MOVE DSA1 to SFBR;
    308      1.1  bouyer 	MOVE SFBR to SCRATCHB1;
    309      1.1  bouyer 	MOVE DSA2 to SFBR;
    310      1.1  bouyer 	MOVE SFBR to SCRATCHB2;
    311      1.1  bouyer 	MOVE DSA3 to SFBR;
    312      1.1  bouyer 	MOVE SFBR to SCRATCHB3;
    313      1.1  bouyer 	RETURN;
    314      1.1  bouyer 
    315      1.1  bouyer restoredsa:
    316      1.1  bouyer 	MOVE SCRATCHB0 TO SFBR;
    317      1.1  bouyer 	MOVE SFBR TO DSA0;
    318      1.1  bouyer 	MOVE SCRATCHB1 TO SFBR;
    319      1.1  bouyer 	MOVE SFBR TO DSA1;
    320      1.1  bouyer 	MOVE SCRATCHB2 TO SFBR;
    321      1.1  bouyer 	MOVE SFBR TO DSA2;
    322      1.1  bouyer 	MOVE SCRATCHB3 TO SFBR;
    323      1.1  bouyer 	MOVE SFBR TO DSA3;
    324      1.1  bouyer 	RETURN;
    325      1.1  bouyer 
    326      1.1  bouyer disconnect:
    327      1.1  bouyer 	MOVE SCNTL2 & 0x7f TO SCNTL2;
    328      1.1  bouyer 	CLEAR ATN;
    329      1.1  bouyer 	CLEAR ACK;
    330      1.1  bouyer 	WAIT DISCONNECT;
    331      1.1  bouyer 	RETURN;
    332      1.1  bouyer 
    333      1.1  bouyer handle_cmpl:
    334      1.1  bouyer 	CALL REL(disconnect);
    335      1.1  bouyer 	INT int_done;
    336      1.2  bouyer 
    337      1.2  bouyer handle_extin:
    338      1.2  bouyer 	CLEAR ACK;
    339      1.2  bouyer 	MOVE FROM t_ext_msg_in, WHEN MSG_IN;
    340      1.2  bouyer 	INT int_extmsgin; /* let host fill in t_ext_msg_data */
    341      1.2  bouyer get_extmsgdata:
    342      1.2  bouyer 	CLEAR ACK;
    343      1.2  bouyer 	MOVE FROM t_ext_msg_data, WHEN MSG_IN;
    344      1.2  bouyer 	INT int_extmsgdata;
    345  1.7.2.1      he msgin_space:
    346  1.7.2.1      he 	NOP; space to store msgin when reselect
    347      1.2  bouyer 
    348      1.2  bouyer 
    349  1.7.2.1      he ;; per-target switch script for LUNs
    350  1.7.2.1      he ; hack: we first do a call to the target-specific code, so that a return
    351  1.7.2.1      he ; in the main switch will jump to the lun switch.
    352  1.7.2.1      he PROC lun_switch:
    353  1.7.2.1      he restore_scntl3:
    354  1.7.2.1      he 	MOVE 0xff TO SCNTL3;
    355  1.7.2.1      he 	MOVE 0xff TO SXFER;
    356  1.7.2.1      he 	JUMP abs_lunsw_return;
    357  1.7.2.1      he lun_switch_entry:
    358  1.7.2.1      he 	CALL REL(restore_scntl3);
    359  1.7.2.1      he 	MOVE SCRATCHA1 TO SFBR;
    360  1.7.2.1      he resel_lun0:
    361  1.7.2.1      he 	INT int_resellun;
    362      1.2  bouyer 
    363  1.7.2.1      he ;; Per-device switch script for tag
    364  1.7.2.1      he PROC tag_switch:
    365  1.7.2.1      he tag_switch_entry:
    366  1.7.2.1      he 	MOVE SCRATCHA2 TO SFBR; restore tag
    367  1.7.2.1      he resel_tag0:
    368  1.7.2.1      he 	JUMP abs_tag0, IF 0x00;
    369  1.7.2.1      he 	JUMP abs_tag0, IF 0x01;
    370  1.7.2.1      he 	JUMP abs_tag0, IF 0x02;
    371  1.7.2.1      he 	JUMP abs_tag0, IF 0x03;
    372  1.7.2.1      he 	JUMP abs_tag0, IF 0x04;
    373  1.7.2.1      he 	JUMP abs_tag0, IF 0x05;
    374  1.7.2.1      he 	JUMP abs_tag0, IF 0x06;
    375  1.7.2.1      he 	JUMP abs_tag0, IF 0x07;
    376  1.7.2.1      he 	JUMP abs_tag0, IF 0x08;
    377  1.7.2.1      he 	JUMP abs_tag0, IF 0x09;
    378  1.7.2.1      he 	JUMP abs_tag0, IF 0x0a;
    379  1.7.2.1      he 	JUMP abs_tag0, IF 0x0b;
    380  1.7.2.1      he 	JUMP abs_tag0, IF 0x0c;
    381  1.7.2.1      he 	JUMP abs_tag0, IF 0x0d;
    382  1.7.2.1      he 	JUMP abs_tag0, IF 0x0e;
    383  1.7.2.1      he 	JUMP abs_tag0, IF 0x0f;
    384  1.7.2.1      he 	INT int_reseltag;
    385  1.7.2.1      he 
    386  1.7.2.1      he ;; per-command script: select, and called after a reselect to load DSA
    387  1.7.2.1      he 
    388  1.7.2.1      he PROC load_dsa:
    389  1.7.2.1      he ; Can't use MOVE MEMORY to load DSA, doesn't work I/O mapped
    390  1.7.2.1      he rdsa0:
    391  1.7.2.1      he 	MOVE 0xf0 to DSA0;
    392  1.7.2.1      he rdsa1:
    393  1.7.2.1      he 	MOVE 0xf1 to DSA1;
    394  1.7.2.1      he rdsa2:
    395  1.7.2.1      he 	MOVE 0xf2 to DSA2;
    396  1.7.2.1      he rdsa3:
    397  1.7.2.1      he 	MOVE 0xf3 to DSA3;
    398  1.7.2.1      he 	RETURN;
    399  1.7.2.1      he ldsa_reload_dsa:
    400  1.7.2.1      he 	CALL REL(rdsa0);
    401  1.7.2.1      he 	JUMP ldsa_abs_reselected;
    402  1.7.2.1      he ldsa_select:
    403  1.7.2.1      he 	CALL REL(rdsa0);
    404  1.7.2.1      he 	SELECT ATN FROM t_id, ldsa_abs_reselect;
    405  1.7.2.1      he 	MOVE MEMORY 4, ldsa_abs_data, ldsa_abs_slot;
    406  1.7.2.1      he 	JUMP ldsa_abs_selected;
    407  1.7.2.1      he ldsa_data:
    408  1.7.2.1      he 	NOP; contains data used by the MOVE MEMORY
    409