Home | History | Annotate | Line # | Download | only in siop
siop.ss revision 1.4
      1 ;	$NetBSD: siop.ss,v 1.4 2000/05/04 15:42:42 bouyer Exp $
      2 
      3 ;
      4 ;  Copyright (c) 2000 Manuel Bouyer.
      5 ; 
      6 ;  Redistribution and use in source and binary forms, with or without
      7 ;  modification, are permitted provided that the following conditions
      8 ;  are met:
      9 ;  1. Redistributions of source code must retain the above copyright
     10 ;     notice, this list of conditions and the following disclaimer.
     11 ;  2. Redistributions in binary form must reproduce the above copyright
     12 ;     notice, this list of conditions and the following disclaimer in the
     13 ;     documentation and/or other materials provided with the distribution.
     14 ;  3. All advertising materials mentioning features or use of this software
     15 ;     must display the following acknowledgement:
     16 ; 	This product includes software developed by Manuel Bouyer
     17 ;  4. The name of the author may not be used to endorse or promote products
     18 ;     derived from this software without specific prior written permission.
     19 ; 
     20 ;  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
     21 ;  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
     22 ;  AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
     23 ;  AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
     24 ;  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25 ;  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26 ;  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27 ;  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28 ;  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29 ;  POSSIBILITY OF SUCH DAMAGE.
     30 ; 
     31 
     32 ARCH 720
     33 
     34 ; offsets in sym_xfer
     35 ABSOLUTE t_id = 24;
     36 ABSOLUTE t_msg_in = 32;
     37 ABSOLUTE t_ext_msg_in = 40;
     38 ABSOLUTE t_ext_msg_data = 48;
     39 ABSOLUTE t_ext_msg_tag = 56;
     40 ABSOLUTE t_msg_out = 64;
     41 ABSOLUTE t_cmd = 72;
     42 ABSOLUTE t_status = 80;
     43 ABSOLUTE t_data = 88;
     44 
     45 ;; interrupt codes
     46 ABSOLUTE int_done	= 0xff00;
     47 ABSOLUTE int_msgin	= 0xff01;
     48 ABSOLUTE int_extmsgin	= 0xff02;
     49 ABSOLUTE int_extmsgdata	= 0xff03;
     50 ABSOLUTE int_resel	= 0xff04;
     51 ABSOLUTE int_reseltag	= 0xff05;
     52 ABSOLUTE int_resfail	= 0xff06;
     53 ABSOLUTE int_disc	= 0xff07;
     54 ABSOLUTE int_err 	= 0xffff;
     55 
     56 ; flags for scratcha0
     57 ABSOLUTE flag_sdp 	= 0x01 ; got save data pointer
     58 ABSOLUTE flag_data 	= 0x02 ; we're in data phase
     59 ABSOLUTE flag_data_mask	= 0xfd ; ~flag_data
     60 
     61 ENTRY waitphase;
     62 ENTRY send_msgout;
     63 ENTRY msgout;
     64 ENTRY msgin;
     65 ENTRY msgin_ack;
     66 ENTRY dataout;
     67 ENTRY datain;
     68 ENTRY cmdout;
     69 ENTRY status;
     70 ENTRY disconnect;
     71 ENTRY reselect;
     72 ENTRY selected;
     73 ENTRY get_extmsgdata;
     74 ENTRY sheduler;
     75 ENTRY slot;
     76 ENTRY idsa0;
     77 ENTRY idsa1;
     78 ENTRY idsa2;
     79 ENTRY idsa3;
     80 ENTRY slotdata;
     81 ENTRY nextslot;
     82 ENTRY endslot;
     83 
     84 EXTERN slot_nextp;
     85 EXTERN slot_shed_addrsrc;
     86 EXTERN slot_abs_reselect;
     87 EXTERN slot_abs_selected;
     88 
     89 EXTERN endslot_abs_reselect;
     90 
     91 PROC  siop_script:
     92 
     93 selected:
     94 ; starting a new session, init 'local variables'
     95 	MOVE 0 to SCRATCHA0	; flags
     96 	MOVE 0 to SCRATCHA1	; DSA offset (for S/G save data pointer)
     97 waitphase:
     98 	JUMP REL(msgout), WHEN MSG_OUT;
     99 	JUMP REL(msgin), WHEN MSG_IN;
    100 	JUMP REL(dataout), WHEN DATA_OUT;
    101 	JUMP REL(datain), WHEN DATA_IN;
    102 	JUMP REL(cmdout), WHEN CMD;
    103 	JUMP REL(status), WHEN STATUS;
    104 err:
    105 	INT int_err;
    106 
    107 reselect:
    108 	WAIT RESELECT REL(reselect_fail)
    109 	MOVE SSID & 0x8f to SFBR
    110 	MOVE SFBR to SCRATCHA0 ; save reselect ID
    111 	INT int_err, WHEN NOT MSG_IN;
    112 	MOVE FROM t_msg_in, WHEN MSG_IN;
    113 	CLEAR ACK;
    114 	INT int_resel;
    115 
    116 reselect_fail:
    117 	; check that host asserted SIGP, this'll clear SIGP in ISTAT
    118 	MOVE CTEST2 & 0x40 TO SFBR;
    119 	INT int_resfail,  IF 0x00;
    120 	JUMP REL(sheduler);
    121 
    122 msgin:
    123 	CLEAR ATN
    124 	MOVE FROM t_msg_in, WHEN MSG_IN;
    125 	JUMP REL(handle_dis), IF 0x04         ; disconnect message
    126 	JUMP REL(handle_cmpl), IF 0x00        ; command complete message
    127 	JUMP REL(handle_sdp), IF 0x02	      ; save data pointer message
    128 	JUMP REL(handle_extin), IF 0x01	      ; extended message
    129 	INT int_msgin;
    130 msgin_ack:
    131 	CLEAR ACK;
    132 	JUMP REL(waitphase);
    133 
    134 ; entry point for msgout after a msgin or status phase
    135 send_msgout:
    136 	SET ATN;
    137 	CLEAR ACK;
    138 msgout:
    139 	MOVE FROM t_msg_out, WHEN MSG_OUT;
    140 	CLEAR ATN;
    141 	JUMP REL(waitphase);
    142 cmdout:
    143 	MOVE FROM t_cmd, WHEN CMD;
    144 	JUMP REL(waitphase);
    145 status:
    146 	MOVE FROM t_status, WHEN STATUS;
    147 	JUMP REL(waitphase);
    148 datain:
    149 	CALL REL(savedsa);
    150 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    151 datain_loop:
    152 	MOVE FROM t_data, WHEN DATA_IN;
    153 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    154 	MOVE DSA0 + 8 to DSA0;
    155 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    156 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    157 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    158 	JUMP REL(datain_loop), WHEN DATA_IN;
    159 	CALL REL(restoredsa);
    160 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    161 	JUMP REL(waitphase);
    162 
    163 dataout:
    164 	CALL REL(savedsa);
    165 	MOVE SCRATCHA0 | flag_data TO SCRATCHA0;
    166 dataout_loop:
    167 	MOVE FROM t_data, WHEN DATA_OUT;
    168 	MOVE SCRATCHA1 + 1 TO SCRATCHA1	; adjust offset
    169 	MOVE DSA0 + 8 to DSA0;
    170 	MOVE DSA1 + 0 to DSA1 WITH CARRY;
    171 	MOVE DSA2 + 0 to DSA2 WITH CARRY;
    172 	MOVE DSA3 + 0 to DSA3 WITH CARRY;
    173 	JUMP REL(dataout_loop), WHEN DATA_OUT;
    174 	CALL REL(restoredsa);
    175 	MOVE SCRATCHA0 & flag_data_mask TO SCRATCHA0;
    176 	JUMP REL(waitphase);
    177 
    178 savedsa:
    179 	MOVE DSA0 to SFBR;
    180 	MOVE SFBR to SCRATCHB0;
    181 	MOVE DSA1 to SFBR;
    182 	MOVE SFBR to SCRATCHB1;
    183 	MOVE DSA2 to SFBR;
    184 	MOVE SFBR to SCRATCHB2;
    185 	MOVE DSA3 to SFBR;
    186 	MOVE SFBR to SCRATCHB3;
    187 	RETURN;
    188 
    189 restoredsa:
    190 	MOVE SCRATCHB0 TO SFBR;
    191 	MOVE SFBR TO DSA0;
    192 	MOVE SCRATCHB1 TO SFBR;
    193 	MOVE SFBR TO DSA1;
    194 	MOVE SCRATCHB2 TO SFBR;
    195 	MOVE SFBR TO DSA2;
    196 	MOVE SCRATCHB3 TO SFBR;
    197 	MOVE SFBR TO DSA3;
    198 	RETURN;
    199 
    200 disconnect:
    201 	MOVE SCNTL2 & 0x7f TO SCNTL2;
    202 	CLEAR ATN;
    203 	CLEAR ACK;
    204 	WAIT DISCONNECT;
    205 	RETURN;
    206 
    207 handle_dis:
    208 	CALL REL(disconnect);
    209 ; if we didn't get sdp, or if offset is 0, no need to interrupt
    210 	MOVE SCRATCHA0 & flag_sdp TO SFBR;
    211 	JUMP REL(sheduler), if 0x00; 
    212 	MOVE SCRATCHA1 TO SFBR;
    213 	JUMP REL(sheduler), if 0x00; 
    214 ; Ok, we need to save data pointers
    215 	INT int_disc;
    216 
    217 handle_cmpl:
    218 	CALL REL(disconnect);
    219 	INT int_done;
    220 handle_sdp:
    221 	CLEAR ACK;
    222 	MOVE SCRATCHA0 | flag_sdp TO SCRATCHA0;
    223 	JUMP REL(msgin) ; should get a disconnect message now
    224 
    225 handle_extin:
    226 	CLEAR ACK;
    227 	INT int_err, IF NOT MSG_IN;
    228 	MOVE FROM t_ext_msg_in, WHEN MSG_IN;
    229 	INT int_extmsgin; /* let host fill in t_ext_msg_data */
    230 get_extmsgdata:
    231 	CLEAR ACK;
    232 	INT int_err, IF NOT MSG_IN;
    233 	MOVE FROM t_ext_msg_data, WHEN MSG_IN;
    234 	INT int_extmsgdata;
    235 
    236 sheduler:
    237 	NOP; /* will be changed by the slot scripts */
    238 
    239 ; script used for the sheduler: when a slot is free the JUMP points to
    240 ; the next slot so that instructions for this slot are not run.
    241 ; once the CPU has set up the slot variables (DSA address) it changes
    242 ; the JUMP address to 0 (so that it'll jump to the next instruction) and
    243 ; this command will be processed next time the sheduler is executed.
    244 ; When the target has been successfully selected the script changes the jump
    245 ; addr back to the next slot, so that it's ignored the next time.
    246 ;
    247 
    248 PROC  slot_script:
    249 slot:
    250         JUMP REL(nextslot);
    251 idsa0:
    252 	MOVE 0x00 to dsa0;
    253 idsa1:
    254 	MOVE 0x01 to dsa1;
    255 idsa2:
    256 	MOVE 0x02 to dsa2;
    257 idsa3:
    258 	MOVE 0x03 to dsa3;
    259 	SELECT ATN FROM t_id, slot_abs_reselect;
    260 	MOVE MEMORY 4, slot_shed_addrsrc, slot_nextp;
    261 	JUMP slot_abs_selected;  
    262 slotdata:
    263 	NOP; slot variables: dsa & jumppatchp
    264 nextslot:	NOP; /* will be changed to the next slot entry
    265 
    266 PROC  endslot_script:
    267 	JUMP endslot_abs_reselect;
    268