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