1*7c478bd9Sstevel@tonic-gate; 2*7c478bd9Sstevel@tonic-gate; Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3*7c478bd9Sstevel@tonic-gate; Use is subject to license terms. 4*7c478bd9Sstevel@tonic-gate; 5*7c478bd9Sstevel@tonic-gate; CDDL HEADER START 6*7c478bd9Sstevel@tonic-gate; 7*7c478bd9Sstevel@tonic-gate; The contents of this file are subject to the terms of the 8*7c478bd9Sstevel@tonic-gate; Common Development and Distribution License, Version 1.0 only 9*7c478bd9Sstevel@tonic-gate; (the "License"). You may not use this file except in compliance 10*7c478bd9Sstevel@tonic-gate; with the License. 11*7c478bd9Sstevel@tonic-gate; 12*7c478bd9Sstevel@tonic-gate; You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 13*7c478bd9Sstevel@tonic-gate; or http://www.opensolaris.org/os/licensing. 14*7c478bd9Sstevel@tonic-gate; See the License for the specific language governing permissions 15*7c478bd9Sstevel@tonic-gate; and limitations under the License. 16*7c478bd9Sstevel@tonic-gate; 17*7c478bd9Sstevel@tonic-gate; When distributing Covered Code, include this CDDL HEADER in each 18*7c478bd9Sstevel@tonic-gate; file and include the License file at usr/src/OPENSOLARIS.LICENSE. 19*7c478bd9Sstevel@tonic-gate; If applicable, add the following below this CDDL HEADER, with the 20*7c478bd9Sstevel@tonic-gate; fields enclosed by brackets "[]" replaced with your own identifying 21*7c478bd9Sstevel@tonic-gate; information: Portions Copyright [yyyy] [name of copyright owner] 22*7c478bd9Sstevel@tonic-gate; 23*7c478bd9Sstevel@tonic-gate; CDDL HEADER END 24*7c478bd9Sstevel@tonic-gate; 25*7c478bd9Sstevel@tonic-gate; Multi-threaded general purpose script for the 26*7c478bd9Sstevel@tonic-gate; Symbios 53C825/875 host bus adapter chips. 27*7c478bd9Sstevel@tonic-gate; 28*7c478bd9Sstevel@tonic-gate; ident "%Z%%M% %I% %E% SMI" 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate ARCH 825A 31*7c478bd9Sstevel@tonic-gate 32*7c478bd9Sstevel@tonic-gate ABSOLUTE NBIT_ICON = 0x10 ; CON bit in SCNTL1 register 33*7c478bd9Sstevel@tonic-gate 34*7c478bd9Sstevel@tonic-gate; 35*7c478bd9Sstevel@tonic-gate; Scatter/Gather DMA instructions for datain and dataout 36*7c478bd9Sstevel@tonic-gate; 37*7c478bd9Sstevel@tonic-gate ENTRY dt_do_list_end 38*7c478bd9Sstevel@tonic-gate ENTRY dt_di_list_end 39*7c478bd9Sstevel@tonic-gate ENTRY do_list_end 40*7c478bd9Sstevel@tonic-gate ENTRY di_list_end 41*7c478bd9Sstevel@tonic-gate 42*7c478bd9Sstevel@tonic-gate; SCSI I/O entry points. One of these addresses must be loaded into the 43*7c478bd9Sstevel@tonic-gate; DSA register to initiate SCSI I/O. 44*7c478bd9Sstevel@tonic-gate 45*7c478bd9Sstevel@tonic-gate ENTRY start_up 46*7c478bd9Sstevel@tonic-gate ENTRY resel_m 47*7c478bd9Sstevel@tonic-gate ENTRY ext_msg_out 48*7c478bd9Sstevel@tonic-gate ENTRY clear_ack 49*7c478bd9Sstevel@tonic-gate ENTRY continue 50*7c478bd9Sstevel@tonic-gate ENTRY errmsg 51*7c478bd9Sstevel@tonic-gate ENTRY abort 52*7c478bd9Sstevel@tonic-gate ENTRY dev_reset 53*7c478bd9Sstevel@tonic-gate ENTRY ext_msg_in 54*7c478bd9Sstevel@tonic-gate ENTRY phase_mis_match 55*7c478bd9Sstevel@tonic-gate 56*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 57*7c478bd9Sstevel@tonic-gate 58*7c478bd9Sstevel@tonic-gatestart_up: 59*7c478bd9Sstevel@tonic-gate SELECT ATN FROM 0, REL(resel_m) 60*7c478bd9Sstevel@tonic-gate 61*7c478bd9Sstevel@tonic-gate; after selection, next phase should be msg_out or status 62*7c478bd9Sstevel@tonic-gate INT PASS(NINT_ILI_PHASE), WHEN NOT MSG_OUT 63*7c478bd9Sstevel@tonic-gate 64*7c478bd9Sstevel@tonic-gatemsgout: 65*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_sendmsg)), WHEN MSG_OUT 66*7c478bd9Sstevel@tonic-gate JUMP REL(command_phase), WHEN CMD 67*7c478bd9Sstevel@tonic-gate JUMP REL(switch), WHEN NOT MSG_OUT 68*7c478bd9Sstevel@tonic-gate; target requested repeat, set atn in case it's an extended msg 69*7c478bd9Sstevel@tonic-gate SET ATN 70*7c478bd9Sstevel@tonic-gate JUMP REL(msgout) 71*7c478bd9Sstevel@tonic-gate 72*7c478bd9Sstevel@tonic-gate 73*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 74*7c478bd9Sstevel@tonic-gate 75*7c478bd9Sstevel@tonic-gate; The sync (SDTR) message interrupt handler restarts here if the 76*7c478bd9Sstevel@tonic-gate; initiator and target have both succesfully exchanged SDTR messages. 77*7c478bd9Sstevel@tonic-gate 78*7c478bd9Sstevel@tonic-gateclear_ack: 79*7c478bd9Sstevel@tonic-gate CLEAR ACK 80*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 81*7c478bd9Sstevel@tonic-gate 82*7c478bd9Sstevel@tonic-gate 83*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 84*7c478bd9Sstevel@tonic-gate 85*7c478bd9Sstevel@tonic-gate; Restart here after phase mismatch interrupt, clear ATN in case the 86*7c478bd9Sstevel@tonic-gate; interrupt occurred during the msg_out phase. 87*7c478bd9Sstevel@tonic-gate 88*7c478bd9Sstevel@tonic-gatecontinue: 89*7c478bd9Sstevel@tonic-gate CLEAR ATN 90*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 91*7c478bd9Sstevel@tonic-gate 92*7c478bd9Sstevel@tonic-gate 93*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 94*7c478bd9Sstevel@tonic-gate 95*7c478bd9Sstevel@tonic-gate; Send error message to the target. Usually the target will change 96*7c478bd9Sstevel@tonic-gate; phase immediately. But if in data in or data out phase, or part 97*7c478bd9Sstevel@tonic-gate; way through a command or message in the phase change will happen 98*7c478bd9Sstevel@tonic-gate; at the end of the current phase. 99*7c478bd9Sstevel@tonic-gate 100*7c478bd9Sstevel@tonic-gateerrmsg: 101*7c478bd9Sstevel@tonic-gate SET ATN 102*7c478bd9Sstevel@tonic-gate CLEAR ACK 103*7c478bd9Sstevel@tonic-gate JUMP REL(errmsg_out), WHEN MSG_OUT 104*7c478bd9Sstevel@tonic-gate; not message out phase, the target will change phase later 105*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 106*7c478bd9Sstevel@tonic-gate 107*7c478bd9Sstevel@tonic-gateerrmsg_out: 108*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_errmsg)), WHEN MSG_OUT 109*7c478bd9Sstevel@tonic-gate JUMP REL(switch) , WHEN NOT MSG_OUT 110*7c478bd9Sstevel@tonic-gate; target requested repeat 111*7c478bd9Sstevel@tonic-gate JUMP REL(errmsg_out) 112*7c478bd9Sstevel@tonic-gate 113*7c478bd9Sstevel@tonic-gate 114*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 115*7c478bd9Sstevel@tonic-gate 116*7c478bd9Sstevel@tonic-gate; Send an abort message to a target that's attempting an invalid 117*7c478bd9Sstevel@tonic-gate; reconnection. 118*7c478bd9Sstevel@tonic-gate 119*7c478bd9Sstevel@tonic-gateabort: 120*7c478bd9Sstevel@tonic-gate SET ATN 121*7c478bd9Sstevel@tonic-gate CLEAR ACK 122*7c478bd9Sstevel@tonic-gate INT PASS(NINT_ILI_PHASE), WHEN NOT MSG_OUT 123*7c478bd9Sstevel@tonic-gate 124*7c478bd9Sstevel@tonic-gateabort_out: 125*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_errmsg)), WHEN MSG_OUT 126*7c478bd9Sstevel@tonic-gate JUMP REL(abort_done), WHEN NOT MSG_OUT 127*7c478bd9Sstevel@tonic-gate SET ATN 128*7c478bd9Sstevel@tonic-gate JUMP REL(abort_out) 129*7c478bd9Sstevel@tonic-gate 130*7c478bd9Sstevel@tonic-gateabort_done: 131*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SCNTL2 132*7c478bd9Sstevel@tonic-gate CLEAR ACK 133*7c478bd9Sstevel@tonic-gate WAIT DISCONNECT 134*7c478bd9Sstevel@tonic-gate INT PASS(NINT_OK) 135*7c478bd9Sstevel@tonic-gate 136*7c478bd9Sstevel@tonic-gate 137*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 138*7c478bd9Sstevel@tonic-gate 139*7c478bd9Sstevel@tonic-gate; send an Abort or Bus Device Reset message and wait for the disconnect 140*7c478bd9Sstevel@tonic-gate 141*7c478bd9Sstevel@tonic-gatedev_reset: 142*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SCNTL2 143*7c478bd9Sstevel@tonic-gate SELECT ATN FROM 0, REL(resel_m) 144*7c478bd9Sstevel@tonic-gate; after selection, next phase should be msg_out 145*7c478bd9Sstevel@tonic-gate INT PASS(NINT_ILI_PHASE), WHEN NOT MSG_OUT 146*7c478bd9Sstevel@tonic-gate 147*7c478bd9Sstevel@tonic-gatedev_reset_out: 148*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_sendmsg)), WHEN MSG_OUT 149*7c478bd9Sstevel@tonic-gate CLEAR ACK 150*7c478bd9Sstevel@tonic-gate MOVE SCNTL2 & 0x7F TO SCNTL2 151*7c478bd9Sstevel@tonic-gate WAIT DISCONNECT 152*7c478bd9Sstevel@tonic-gate INT PASS(NINT_DEV_RESET) 153*7c478bd9Sstevel@tonic-gate 154*7c478bd9Sstevel@tonic-gate 155*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 156*7c478bd9Sstevel@tonic-gate 157*7c478bd9Sstevel@tonic-gate; The sync (SDTR) or wide (WDTR) message interrupt handler restarts here 158*7c478bd9Sstevel@tonic-gate; if the initiator needs to send an SDTR/WDTR message in response to the 159*7c478bd9Sstevel@tonic-gate; target's SDTR/WDTR. 160*7c478bd9Sstevel@tonic-gate; 161*7c478bd9Sstevel@tonic-gate; Set the ATN signal to let target know we've got a message to send 162*7c478bd9Sstevel@tonic-gate; and ack the last byte of its SDTR/WDTR message. 163*7c478bd9Sstevel@tonic-gate 164*7c478bd9Sstevel@tonic-gateext_msg_out: 165*7c478bd9Sstevel@tonic-gate SET ATN 166*7c478bd9Sstevel@tonic-gate CLEAR ACK 167*7c478bd9Sstevel@tonic-gate JUMP REL(msg_out), WHEN MSG_OUT 168*7c478bd9Sstevel@tonic-gate; not message out phase, assume target decided not to do sync i/o 169*7c478bd9Sstevel@tonic-gate; if this doesn't work, change it to treat this as illegal phase 170*7c478bd9Sstevel@tonic-gate CLEAR ATN 171*7c478bd9Sstevel@tonic-gate INT PASS(NINT_NEG_REJECT) 172*7c478bd9Sstevel@tonic-gate 173*7c478bd9Sstevel@tonic-gatemsg_out: 174*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_sendmsg)), WHEN MSG_OUT 175*7c478bd9Sstevel@tonic-gate JUMP REL(ext_msg_out_chk), WHEN NOT MSG_OUT 176*7c478bd9Sstevel@tonic-gate SET ATN ; target requested repeat 177*7c478bd9Sstevel@tonic-gate JUMP REL(msg_out) 178*7c478bd9Sstevel@tonic-gate 179*7c478bd9Sstevel@tonic-gate 180*7c478bd9Sstevel@tonic-gateext_msg_out_chk: 181*7c478bd9Sstevel@tonic-gate; test whether the target accepted the SDTR message 182*7c478bd9Sstevel@tonic-gate; any phase besides MSG_IN means the sdtr message is okay 183*7c478bd9Sstevel@tonic-gate JUMP REL(switch), WHEN NOT MSG_IN 184*7c478bd9Sstevel@tonic-gate 185*7c478bd9Sstevel@tonic-gate; any message besides Message Reject means the SDTR message is okay 186*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_rcvmsg)), WHEN MSG_IN 187*7c478bd9Sstevel@tonic-gate JUMP REL(msgin2), IF NOT 0x07 ; anything else is okay 188*7c478bd9Sstevel@tonic-gate 189*7c478bd9Sstevel@tonic-gate; SDTR got Message Reject response 190*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SXFER 191*7c478bd9Sstevel@tonic-gate INT PASS(NINT_NEG_REJECT) 192*7c478bd9Sstevel@tonic-gate 193*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 194*7c478bd9Sstevel@tonic-gate 195*7c478bd9Sstevel@tonic-gateresel_m: 196*7c478bd9Sstevel@tonic-gate WAIT RESELECT REL(alt_sig_p) 197*7c478bd9Sstevel@tonic-gate MOVE SSID SHL SFBR 198*7c478bd9Sstevel@tonic-gate MOVE SFBR SHL SFBR 199*7c478bd9Sstevel@tonic-gate MOVE SFBR & 0x3C TO DSA0 200*7c478bd9Sstevel@tonic-gate MOVE SCRATCHB1 TO SFBR 201*7c478bd9Sstevel@tonic-gate MOVE SFBR TO DSA1 202*7c478bd9Sstevel@tonic-gate MOVE SCRATCHB2 TO SFBR 203*7c478bd9Sstevel@tonic-gate MOVE SFBR TO DSA2 204*7c478bd9Sstevel@tonic-gate MOVE SCRATCHB3 TO SFBR 205*7c478bd9Sstevel@tonic-gate MOVE SFBR TO DSA3 206*7c478bd9Sstevel@tonic-gate SELECT FROM 0x00, REL(Next_Inst) 207*7c478bd9Sstevel@tonic-gateNext_Inst: 208*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO DSA0 209*7c478bd9Sstevel@tonic-gate INT PASS(NINT_MSGIN), WHEN NOT MSG_IN 210*7c478bd9Sstevel@tonic-gate ; 211*7c478bd9Sstevel@tonic-gate ; reselection Identify msg. 212*7c478bd9Sstevel@tonic-gate ; 213*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(HBAOFFSET(g_rcvmsg)), WHEN MSG_IN 214*7c478bd9Sstevel@tonic-gate CLEAR ACK 215*7c478bd9Sstevel@tonic-gate ; 216*7c478bd9Sstevel@tonic-gate ; Target will either continue in msg-in phase (tag q'ing) or 217*7c478bd9Sstevel@tonic-gate ; transistion to data or status phase. 218*7c478bd9Sstevel@tonic-gate ; 219*7c478bd9Sstevel@tonic-gate ; non-tq case: target switched to status phase. 220*7c478bd9Sstevel@tonic-gate ; 221*7c478bd9Sstevel@tonic-gate INT PASS(NINT_RESEL), WHEN NOT MSG_IN ; Let UNIX driver grab it 222*7c478bd9Sstevel@tonic-gate ; 223*7c478bd9Sstevel@tonic-gate ; should be the 0x20 (tag msg). 224*7c478bd9Sstevel@tonic-gate ; 225*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(HBAOFFSET(g_moremsgin)), WHEN MSG_IN 226*7c478bd9Sstevel@tonic-gate ; 227*7c478bd9Sstevel@tonic-gate ; if the target resel and disconnects, handle that here. 228*7c478bd9Sstevel@tonic-gate JUMP REL(resel_disc), IF 0x04 229*7c478bd9Sstevel@tonic-gate ; 230*7c478bd9Sstevel@tonic-gate ; Check msg-in byte for 20, 21, or 22. 231*7c478bd9Sstevel@tonic-gate JUMP REL(Got_tag), IF 0x20 AND MASK 0x01 232*7c478bd9Sstevel@tonic-gate INT PASS(NINT_RESEL), IF NOT 0x22 ; Let UNIX driver grab it 233*7c478bd9Sstevel@tonic-gateGot_tag: 234*7c478bd9Sstevel@tonic-gate CLEAR ACK 235*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(HBAOFFSET(g_tagmsg)), WHEN MSG_IN 236*7c478bd9Sstevel@tonic-gate CLEAR ACK 237*7c478bd9Sstevel@tonic-gate INT PASS(NINT_RESEL) ; Let UNIX driver grab it 238*7c478bd9Sstevel@tonic-gate 239*7c478bd9Sstevel@tonic-gatealt_sig_p: 240*7c478bd9Sstevel@tonic-gate ; The driver hit sig_p to start a new cmd. 241*7c478bd9Sstevel@tonic-gate ; Test the connected bit in SCNTL1. If its set, retry the 242*7c478bd9Sstevel@tonic-gate ; wait reselect. Otherwise, let the driver start a new cmd. 243*7c478bd9Sstevel@tonic-gate MOVE CTEST2 TO SFBR ; clear sig_p bit, if set 244*7c478bd9Sstevel@tonic-gate MOVE SCNTL1 & NBIT_ICON TO SFBR ; test the connected bit 245*7c478bd9Sstevel@tonic-gate 246*7c478bd9Sstevel@tonic-gate ; Interrupt if not connected. 247*7c478bd9Sstevel@tonic-gate INT PASS(NINT_SIGPROC), IF NOT NBIT_ICON 248*7c478bd9Sstevel@tonic-gate 249*7c478bd9Sstevel@tonic-gate ; otherwise, handle reselection. 250*7c478bd9Sstevel@tonic-gate JUMP REL(resel_m) 251*7c478bd9Sstevel@tonic-gate 252*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 253*7c478bd9Sstevel@tonic-gate 254*7c478bd9Sstevel@tonic-gate; Every phase comes back to here. 255*7c478bd9Sstevel@tonic-gateswitch: 256*7c478bd9Sstevel@tonic-gate JUMP REL(msgin), WHEN MSG_IN 257*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_gotos), IF DATA_OUT 258*7c478bd9Sstevel@tonic-gate JUMP REL(datain_gotos), IF DATA_IN 259*7c478bd9Sstevel@tonic-gate JUMP REL(status_phase), IF STATUS 260*7c478bd9Sstevel@tonic-gate JUMP REL(command_phase), IF CMD 261*7c478bd9Sstevel@tonic-gate JUMP REL(errmsg_out), WHEN MSG_OUT 262*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_gotos), IF RES4 263*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_gotos), IF RES5 264*7c478bd9Sstevel@tonic-gate INT PASS(NINT_ILI_PHASE) 265*7c478bd9Sstevel@tonic-gate 266*7c478bd9Sstevel@tonic-gate 267*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 268*7c478bd9Sstevel@tonic-gate 269*7c478bd9Sstevel@tonic-gatemsgin: 270*7c478bd9Sstevel@tonic-gate; read the first byte 271*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_rcvmsg)), WHEN MSG_IN 272*7c478bd9Sstevel@tonic-gatemsgin2: 273*7c478bd9Sstevel@tonic-gate JUMP REL(end), IF 0x00 ; command complete message 274*7c478bd9Sstevel@tonic-gate INT PASS(NINT_SDP_MSG), IF 0x02 ; save data pointers 275*7c478bd9Sstevel@tonic-gate JUMP REL(disc), IF 0x04 ; disconnect message 276*7c478bd9Sstevel@tonic-gate INT PASS(NINT_RP_MSG), IF 0x03 ; restore data pointers 277*7c478bd9Sstevel@tonic-gate INT PASS(NINT_MSGREJ), IF 0x07 ; Message Reject 278*7c478bd9Sstevel@tonic-gate JUMP REL(ext_msg_in), IF 0x01 ; extended message 279*7c478bd9Sstevel@tonic-gate JUMP REL(ignore_wide_residue), IF 0x23 ; ignore wide residue 280*7c478bd9Sstevel@tonic-gate INT PASS(NINT_UNS_MSG) ; unsupported message type 281*7c478bd9Sstevel@tonic-gate 282*7c478bd9Sstevel@tonic-gatedisc: 283*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SCNTL2 284*7c478bd9Sstevel@tonic-gate CLEAR ACK 285*7c478bd9Sstevel@tonic-gate WAIT DISCONNECT 286*7c478bd9Sstevel@tonic-gate INT PASS(NINT_DISC) 287*7c478bd9Sstevel@tonic-gate 288*7c478bd9Sstevel@tonic-gateresel_disc: 289*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SCNTL2 290*7c478bd9Sstevel@tonic-gate CLEAR ACK 291*7c478bd9Sstevel@tonic-gate WAIT DISCONNECT 292*7c478bd9Sstevel@tonic-gate INT PASS(NINT_RESEL) 293*7c478bd9Sstevel@tonic-gate 294*7c478bd9Sstevel@tonic-gateext_msg_in: 295*7c478bd9Sstevel@tonic-gate CLEAR ACK 296*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_extmsg)), WHEN MSG_IN 297*7c478bd9Sstevel@tonic-gate JUMP REL(wide_msg_in), IF 0x02 298*7c478bd9Sstevel@tonic-gate JUMP REL(sync_msg_in), IF 0x03 299*7c478bd9Sstevel@tonic-gate JUMP REL(ppr_msg_in), IF 0x06 300*7c478bd9Sstevel@tonic-gate INT PASS(NINT_UNS_EXTMSG) 301*7c478bd9Sstevel@tonic-gate 302*7c478bd9Sstevel@tonic-gateignore_wide_residue: 303*7c478bd9Sstevel@tonic-gate CLEAR ACK 304*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_rcvmsg)), WHEN MSG_IN 305*7c478bd9Sstevel@tonic-gate INT PASS(NINT_IWR) 306*7c478bd9Sstevel@tonic-gate 307*7c478bd9Sstevel@tonic-gateppr_msg_in: 308*7c478bd9Sstevel@tonic-gate CLEAR ACK 309*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_pprin)), WHEN MSG_IN 310*7c478bd9Sstevel@tonic-gate; don't ack the last byte until after the interrupt handler returns 311*7c478bd9Sstevel@tonic-gate INT PASS(NINT_PPR), IF 0x04 312*7c478bd9Sstevel@tonic-gate 313*7c478bd9Sstevel@tonic-gatesync_msg_in: 314*7c478bd9Sstevel@tonic-gate CLEAR ACK 315*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_syncin)), WHEN MSG_IN 316*7c478bd9Sstevel@tonic-gate; don't ack the last byte until after the interrupt handler returns 317*7c478bd9Sstevel@tonic-gate INT PASS(NINT_SDTR), IF 0x01 318*7c478bd9Sstevel@tonic-gate 319*7c478bd9Sstevel@tonic-gate; unsupported extended message 320*7c478bd9Sstevel@tonic-gate INT PASS(NINT_UNS_EXTMSG) 321*7c478bd9Sstevel@tonic-gate 322*7c478bd9Sstevel@tonic-gatewide_msg_in: 323*7c478bd9Sstevel@tonic-gate CLEAR ACK 324*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_widein)), WHEN MSG_IN 325*7c478bd9Sstevel@tonic-gate; don't ack the last byte until after the interrupt handler returns 326*7c478bd9Sstevel@tonic-gate INT PASS(NINT_WDTR), IF 0x03 327*7c478bd9Sstevel@tonic-gate 328*7c478bd9Sstevel@tonic-gate; unsupported extended message 329*7c478bd9Sstevel@tonic-gate INT PASS(NINT_UNS_EXTMSG) 330*7c478bd9Sstevel@tonic-gate 331*7c478bd9Sstevel@tonic-gatephase_mis_match: 332*7c478bd9Sstevel@tonic-gate INT PASS(NINT_PMM) 333*7c478bd9Sstevel@tonic-gate 334*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 335*7c478bd9Sstevel@tonic-gate 336*7c478bd9Sstevel@tonic-gatecommand_phase: 337*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_cmd)), WHEN CMD 338*7c478bd9Sstevel@tonic-gate JUMP REL(msgin), WHEN MSG_IN 339*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 340*7c478bd9Sstevel@tonic-gate 341*7c478bd9Sstevel@tonic-gate 342*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 343*7c478bd9Sstevel@tonic-gate 344*7c478bd9Sstevel@tonic-gatestatus_phase: 345*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_status)), WHEN STATUS 346*7c478bd9Sstevel@tonic-gate JUMP REL(switch), WHEN NOT MSG_IN 347*7c478bd9Sstevel@tonic-gate MOVE FROM PASS(NTOFFSET(nt_rcvmsg)), WHEN MSG_IN 348*7c478bd9Sstevel@tonic-gate 349*7c478bd9Sstevel@tonic-gate 350*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 351*7c478bd9Sstevel@tonic-gate 352*7c478bd9Sstevel@tonic-gateend: 353*7c478bd9Sstevel@tonic-gate MOVE 0x00 TO SCNTL2 354*7c478bd9Sstevel@tonic-gate CLEAR ACK 355*7c478bd9Sstevel@tonic-gate WAIT DISCONNECT 356*7c478bd9Sstevel@tonic-gate INT PASS(NINT_OK) 357*7c478bd9Sstevel@tonic-gate 358*7c478bd9Sstevel@tonic-gate 359*7c478bd9Sstevel@tonic-gate;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 360*7c478bd9Sstevel@tonic-gate 361*7c478bd9Sstevel@tonic-gate; The data in and data out scatter/gather dma lists are set up by 362*7c478bd9Sstevel@tonic-gate; the driver such that they're right justified in the table indirect 363*7c478bd9Sstevel@tonic-gate; array. In other words if the s/g list contains a single segment then 364*7c478bd9Sstevel@tonic-gate; only the last entry in the list is used. If the s/g list contains 365*7c478bd9Sstevel@tonic-gate; two entries then the last two entries are used, etc.. The jump table 366*7c478bd9Sstevel@tonic-gate; below skip over the unused entries. This way when a phase mismatch 367*7c478bd9Sstevel@tonic-gate; interrupt occurs I can easily compute how far into the list processing 368*7c478bd9Sstevel@tonic-gate; has proceeded and reset the pointers and the scratch register to 369*7c478bd9Sstevel@tonic-gate; properly restart the dma. 370*7c478bd9Sstevel@tonic-gate 371*7c478bd9Sstevel@tonic-gatedataout_gotos: 372*7c478bd9Sstevel@tonic-gate MOVE SCRATCHA0 TO SFBR 373*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA), IF 0 374*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_1), IF 1 375*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_2), IF 2 376*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_3), IF 3 377*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_4), IF 4 378*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_5), IF 5 379*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_6), IF 6 380*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_7), IF 7 381*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_8), IF 8 382*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_9), IF 9 383*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_10), IF 10 384*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_11), IF 11 385*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_12), IF 12 386*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_13), IF 13 387*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_14), IF 14 388*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_15), IF 15 389*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_16), IF 16 390*7c478bd9Sstevel@tonic-gate JUMP REL(dataout_17), IF 17 391*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA) 392*7c478bd9Sstevel@tonic-gate 393*7c478bd9Sstevel@tonic-gatedataout_17: MOVE FROM PASS(NTOFFSET(nt_data[16])), WHEN DATA_OUT 394*7c478bd9Sstevel@tonic-gatedataout_16: MOVE FROM PASS(NTOFFSET(nt_data[15])), WHEN DATA_OUT 395*7c478bd9Sstevel@tonic-gatedataout_15: MOVE FROM PASS(NTOFFSET(nt_data[14])), WHEN DATA_OUT 396*7c478bd9Sstevel@tonic-gatedataout_14: MOVE FROM PASS(NTOFFSET(nt_data[13])), WHEN DATA_OUT 397*7c478bd9Sstevel@tonic-gatedataout_13: MOVE FROM PASS(NTOFFSET(nt_data[12])), WHEN DATA_OUT 398*7c478bd9Sstevel@tonic-gatedataout_12: MOVE FROM PASS(NTOFFSET(nt_data[11])), WHEN DATA_OUT 399*7c478bd9Sstevel@tonic-gatedataout_11: MOVE FROM PASS(NTOFFSET(nt_data[10])), WHEN DATA_OUT 400*7c478bd9Sstevel@tonic-gatedataout_10: MOVE FROM PASS(NTOFFSET(nt_data[9])), WHEN DATA_OUT 401*7c478bd9Sstevel@tonic-gatedataout_9: MOVE FROM PASS(NTOFFSET(nt_data[8])), WHEN DATA_OUT 402*7c478bd9Sstevel@tonic-gatedataout_8: MOVE FROM PASS(NTOFFSET(nt_data[7])), WHEN DATA_OUT 403*7c478bd9Sstevel@tonic-gatedataout_7: MOVE FROM PASS(NTOFFSET(nt_data[6])), WHEN DATA_OUT 404*7c478bd9Sstevel@tonic-gatedataout_6: MOVE FROM PASS(NTOFFSET(nt_data[5])), WHEN DATA_OUT 405*7c478bd9Sstevel@tonic-gatedataout_5: MOVE FROM PASS(NTOFFSET(nt_data[4])), WHEN DATA_OUT 406*7c478bd9Sstevel@tonic-gatedataout_4: MOVE FROM PASS(NTOFFSET(nt_data[3])), WHEN DATA_OUT 407*7c478bd9Sstevel@tonic-gatedataout_3: MOVE FROM PASS(NTOFFSET(nt_data[2])), WHEN DATA_OUT 408*7c478bd9Sstevel@tonic-gatedataout_2: MOVE FROM PASS(NTOFFSET(nt_data[1])), WHEN DATA_OUT 409*7c478bd9Sstevel@tonic-gatedataout_1: MOVE FROM PASS(NTOFFSET(nt_data[0])), WHEN DATA_OUT 410*7c478bd9Sstevel@tonic-gatedo_list_end: 411*7c478bd9Sstevel@tonic-gate MOVE 0 TO SCRATCHA0 412*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 413*7c478bd9Sstevel@tonic-gate 414*7c478bd9Sstevel@tonic-gate; 415*7c478bd9Sstevel@tonic-gate; data in processing 416*7c478bd9Sstevel@tonic-gate; 417*7c478bd9Sstevel@tonic-gate 418*7c478bd9Sstevel@tonic-gatedatain_gotos: 419*7c478bd9Sstevel@tonic-gate MOVE SCRATCHA0 TO SFBR 420*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA), IF 0 421*7c478bd9Sstevel@tonic-gate JUMP REL(datain_1), IF 1 422*7c478bd9Sstevel@tonic-gate JUMP REL(datain_2), IF 2 423*7c478bd9Sstevel@tonic-gate JUMP REL(datain_3), IF 3 424*7c478bd9Sstevel@tonic-gate JUMP REL(datain_4), IF 4 425*7c478bd9Sstevel@tonic-gate JUMP REL(datain_5), IF 5 426*7c478bd9Sstevel@tonic-gate JUMP REL(datain_6), IF 6 427*7c478bd9Sstevel@tonic-gate JUMP REL(datain_7), IF 7 428*7c478bd9Sstevel@tonic-gate JUMP REL(datain_8), IF 8 429*7c478bd9Sstevel@tonic-gate JUMP REL(datain_9), IF 9 430*7c478bd9Sstevel@tonic-gate JUMP REL(datain_10), IF 10 431*7c478bd9Sstevel@tonic-gate JUMP REL(datain_11), IF 11 432*7c478bd9Sstevel@tonic-gate JUMP REL(datain_12), IF 12 433*7c478bd9Sstevel@tonic-gate JUMP REL(datain_13), IF 13 434*7c478bd9Sstevel@tonic-gate JUMP REL(datain_14), IF 14 435*7c478bd9Sstevel@tonic-gate JUMP REL(datain_15), IF 15 436*7c478bd9Sstevel@tonic-gate JUMP REL(datain_16), IF 16 437*7c478bd9Sstevel@tonic-gate JUMP REL(datain_17), IF 17 438*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA) 439*7c478bd9Sstevel@tonic-gate 440*7c478bd9Sstevel@tonic-gatedatain_17: MOVE FROM PASS(NTOFFSET(nt_data[16])), WHEN DATA_IN 441*7c478bd9Sstevel@tonic-gatedatain_16: MOVE FROM PASS(NTOFFSET(nt_data[15])), WHEN DATA_IN 442*7c478bd9Sstevel@tonic-gatedatain_15: MOVE FROM PASS(NTOFFSET(nt_data[14])), WHEN DATA_IN 443*7c478bd9Sstevel@tonic-gatedatain_14: MOVE FROM PASS(NTOFFSET(nt_data[13])), WHEN DATA_IN 444*7c478bd9Sstevel@tonic-gatedatain_13: MOVE FROM PASS(NTOFFSET(nt_data[12])), WHEN DATA_IN 445*7c478bd9Sstevel@tonic-gatedatain_12: MOVE FROM PASS(NTOFFSET(nt_data[11])), WHEN DATA_IN 446*7c478bd9Sstevel@tonic-gatedatain_11: MOVE FROM PASS(NTOFFSET(nt_data[10])), WHEN DATA_IN 447*7c478bd9Sstevel@tonic-gatedatain_10: MOVE FROM PASS(NTOFFSET(nt_data[9])), WHEN DATA_IN 448*7c478bd9Sstevel@tonic-gatedatain_9: MOVE FROM PASS(NTOFFSET(nt_data[8])), WHEN DATA_IN 449*7c478bd9Sstevel@tonic-gatedatain_8: MOVE FROM PASS(NTOFFSET(nt_data[7])), WHEN DATA_IN 450*7c478bd9Sstevel@tonic-gatedatain_7: MOVE FROM PASS(NTOFFSET(nt_data[6])), WHEN DATA_IN 451*7c478bd9Sstevel@tonic-gatedatain_6: MOVE FROM PASS(NTOFFSET(nt_data[5])), WHEN DATA_IN 452*7c478bd9Sstevel@tonic-gatedatain_5: MOVE FROM PASS(NTOFFSET(nt_data[4])), WHEN DATA_IN 453*7c478bd9Sstevel@tonic-gatedatain_4: MOVE FROM PASS(NTOFFSET(nt_data[3])), WHEN DATA_IN 454*7c478bd9Sstevel@tonic-gatedatain_3: MOVE FROM PASS(NTOFFSET(nt_data[2])), WHEN DATA_IN 455*7c478bd9Sstevel@tonic-gatedatain_2: MOVE FROM PASS(NTOFFSET(nt_data[1])), WHEN DATA_IN 456*7c478bd9Sstevel@tonic-gatedatain_1: MOVE FROM PASS(NTOFFSET(nt_data[0])), WHEN DATA_IN 457*7c478bd9Sstevel@tonic-gatedi_list_end: 458*7c478bd9Sstevel@tonic-gate MOVE 0 TO SCRATCHA0 459*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 460*7c478bd9Sstevel@tonic-gate 461*7c478bd9Sstevel@tonic-gate 462*7c478bd9Sstevel@tonic-gatedt_dataout_gotos: 463*7c478bd9Sstevel@tonic-gate MOVE SCRATCHA0 TO SFBR 464*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA), IF 0 465*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_1), IF 1 466*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_2), IF 2 467*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_3), IF 3 468*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_4), IF 4 469*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_5), IF 5 470*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_6), IF 6 471*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_7), IF 7 472*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_8), IF 8 473*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_9), IF 9 474*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_10), IF 10 475*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_11), IF 11 476*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_12), IF 12 477*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_13), IF 13 478*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_14), IF 14 479*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_15), IF 15 480*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_16), IF 16 481*7c478bd9Sstevel@tonic-gate JUMP REL(dt_dataout_17), IF 17 482*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA) 483*7c478bd9Sstevel@tonic-gate 484*7c478bd9Sstevel@tonic-gatedt_dataout_17: MOVE FROM PASS(NTOFFSET(nt_data[16])), WHEN RES4 485*7c478bd9Sstevel@tonic-gatedt_dataout_16: MOVE FROM PASS(NTOFFSET(nt_data[15])), WHEN RES4 486*7c478bd9Sstevel@tonic-gatedt_dataout_15: MOVE FROM PASS(NTOFFSET(nt_data[14])), WHEN RES4 487*7c478bd9Sstevel@tonic-gatedt_dataout_14: MOVE FROM PASS(NTOFFSET(nt_data[13])), WHEN RES4 488*7c478bd9Sstevel@tonic-gatedt_dataout_13: MOVE FROM PASS(NTOFFSET(nt_data[12])), WHEN RES4 489*7c478bd9Sstevel@tonic-gatedt_dataout_12: MOVE FROM PASS(NTOFFSET(nt_data[11])), WHEN RES4 490*7c478bd9Sstevel@tonic-gatedt_dataout_11: MOVE FROM PASS(NTOFFSET(nt_data[10])), WHEN RES4 491*7c478bd9Sstevel@tonic-gatedt_dataout_10: MOVE FROM PASS(NTOFFSET(nt_data[9])), WHEN RES4 492*7c478bd9Sstevel@tonic-gatedt_dataout_9: MOVE FROM PASS(NTOFFSET(nt_data[8])), WHEN RES4 493*7c478bd9Sstevel@tonic-gatedt_dataout_8: MOVE FROM PASS(NTOFFSET(nt_data[7])), WHEN RES4 494*7c478bd9Sstevel@tonic-gatedt_dataout_7: MOVE FROM PASS(NTOFFSET(nt_data[6])), WHEN RES4 495*7c478bd9Sstevel@tonic-gatedt_dataout_6: MOVE FROM PASS(NTOFFSET(nt_data[5])), WHEN RES4 496*7c478bd9Sstevel@tonic-gatedt_dataout_5: MOVE FROM PASS(NTOFFSET(nt_data[4])), WHEN RES4 497*7c478bd9Sstevel@tonic-gatedt_dataout_4: MOVE FROM PASS(NTOFFSET(nt_data[3])), WHEN RES4 498*7c478bd9Sstevel@tonic-gatedt_dataout_3: MOVE FROM PASS(NTOFFSET(nt_data[2])), WHEN RES4 499*7c478bd9Sstevel@tonic-gatedt_dataout_2: MOVE FROM PASS(NTOFFSET(nt_data[1])), WHEN RES4 500*7c478bd9Sstevel@tonic-gatedt_dataout_1: MOVE FROM PASS(NTOFFSET(nt_data[0])), WHEN RES4 501*7c478bd9Sstevel@tonic-gatedt_do_list_end: 502*7c478bd9Sstevel@tonic-gate MOVE 0 TO SCRATCHA0 503*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 504*7c478bd9Sstevel@tonic-gate 505*7c478bd9Sstevel@tonic-gate; 506*7c478bd9Sstevel@tonic-gate; data in processing 507*7c478bd9Sstevel@tonic-gate; 508*7c478bd9Sstevel@tonic-gate 509*7c478bd9Sstevel@tonic-gatedt_datain_gotos: 510*7c478bd9Sstevel@tonic-gate MOVE SCRATCHA0 TO SFBR 511*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA), IF 0 512*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_1), IF 1 513*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_2), IF 2 514*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_3), IF 3 515*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_4), IF 4 516*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_5), IF 5 517*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_6), IF 6 518*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_7), IF 7 519*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_8), IF 8 520*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_9), IF 9 521*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_10), IF 10 522*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_11), IF 11 523*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_12), IF 12 524*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_13), IF 13 525*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_14), IF 14 526*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_15), IF 15 527*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_16), IF 16 528*7c478bd9Sstevel@tonic-gate JUMP REL(dt_datain_17), IF 17 529*7c478bd9Sstevel@tonic-gate INT PASS(NINT_TOOMUCHDATA) 530*7c478bd9Sstevel@tonic-gate 531*7c478bd9Sstevel@tonic-gatedt_datain_17: MOVE FROM PASS(NTOFFSET(nt_data[16])), WHEN RES5 532*7c478bd9Sstevel@tonic-gatedt_datain_16: MOVE FROM PASS(NTOFFSET(nt_data[15])), WHEN RES5 533*7c478bd9Sstevel@tonic-gatedt_datain_15: MOVE FROM PASS(NTOFFSET(nt_data[14])), WHEN RES5 534*7c478bd9Sstevel@tonic-gatedt_datain_14: MOVE FROM PASS(NTOFFSET(nt_data[13])), WHEN RES5 535*7c478bd9Sstevel@tonic-gatedt_datain_13: MOVE FROM PASS(NTOFFSET(nt_data[12])), WHEN RES5 536*7c478bd9Sstevel@tonic-gatedt_datain_12: MOVE FROM PASS(NTOFFSET(nt_data[11])), WHEN RES5 537*7c478bd9Sstevel@tonic-gatedt_datain_11: MOVE FROM PASS(NTOFFSET(nt_data[10])), WHEN RES5 538*7c478bd9Sstevel@tonic-gatedt_datain_10: MOVE FROM PASS(NTOFFSET(nt_data[9])), WHEN RES5 539*7c478bd9Sstevel@tonic-gatedt_datain_9: MOVE FROM PASS(NTOFFSET(nt_data[8])), WHEN RES5 540*7c478bd9Sstevel@tonic-gatedt_datain_8: MOVE FROM PASS(NTOFFSET(nt_data[7])), WHEN RES5 541*7c478bd9Sstevel@tonic-gatedt_datain_7: MOVE FROM PASS(NTOFFSET(nt_data[6])), WHEN RES5 542*7c478bd9Sstevel@tonic-gatedt_datain_6: MOVE FROM PASS(NTOFFSET(nt_data[5])), WHEN RES5 543*7c478bd9Sstevel@tonic-gatedt_datain_5: MOVE FROM PASS(NTOFFSET(nt_data[4])), WHEN RES5 544*7c478bd9Sstevel@tonic-gatedt_datain_4: MOVE FROM PASS(NTOFFSET(nt_data[3])), WHEN RES5 545*7c478bd9Sstevel@tonic-gatedt_datain_3: MOVE FROM PASS(NTOFFSET(nt_data[2])), WHEN RES5 546*7c478bd9Sstevel@tonic-gatedt_datain_2: MOVE FROM PASS(NTOFFSET(nt_data[1])), WHEN RES5 547*7c478bd9Sstevel@tonic-gatedt_datain_1: MOVE FROM PASS(NTOFFSET(nt_data[0])), WHEN RES5 548*7c478bd9Sstevel@tonic-gatedt_di_list_end: 549*7c478bd9Sstevel@tonic-gate MOVE 0 TO SCRATCHA0 550*7c478bd9Sstevel@tonic-gate JUMP REL(switch) 551