siop.ss revision 1.17.10.1       1  1.17.10.1     snj ;	$NetBSD: siop.ss,v 1.17.10.1 2005/05/11 03:48:47 snj 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.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.12  bouyer ; 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.17.10.1     snj ; if we didn't get sdp, no need to interrupt
    264       1.12  bouyer 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
    265       1.12  bouyer 	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