xref: /OK3568_Linux_fs/kernel/drivers/scsi/53c700.scr (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun; Script for the NCR (or symbios) 53c700 and 53c700-66 chip
2*4882a593Smuzhiyun;
3*4882a593Smuzhiyun; Copyright (C) 2001 James.Bottomley@HansenPartnership.com
4*4882a593Smuzhiyun;;-----------------------------------------------------------------------------
5*4882a593Smuzhiyun;;
6*4882a593Smuzhiyun;;  This program is free software; you can redistribute it and/or modify
7*4882a593Smuzhiyun;;  it under the terms of the GNU General Public License as published by
8*4882a593Smuzhiyun;;  the Free Software Foundation; either version 2 of the License, or
9*4882a593Smuzhiyun;;  (at your option) any later version.
10*4882a593Smuzhiyun;;
11*4882a593Smuzhiyun;;  This program is distributed in the hope that it will be useful,
12*4882a593Smuzhiyun;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
13*4882a593Smuzhiyun;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*4882a593Smuzhiyun;;  GNU General Public License for more details.
15*4882a593Smuzhiyun;;
16*4882a593Smuzhiyun;;  You should have received a copy of the GNU General Public License
17*4882a593Smuzhiyun;;  along with this program; if not, write to the Free Software
18*4882a593Smuzhiyun;;  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19*4882a593Smuzhiyun;;
20*4882a593Smuzhiyun;;-----------------------------------------------------------------------------
21*4882a593Smuzhiyun;
22*4882a593Smuzhiyun; This script is designed to be modified for the particular command in
23*4882a593Smuzhiyun; operation.  The particular variables pertaining to the commands are:
24*4882a593Smuzhiyun;
25*4882a593SmuzhiyunABSOLUTE	Device_ID = 0		; ID of target for command
26*4882a593SmuzhiyunABSOLUTE	MessageCount = 0	; Number of bytes in message
27*4882a593SmuzhiyunABSOLUTE	MessageLocation = 0	; Addr of message
28*4882a593SmuzhiyunABSOLUTE	CommandCount = 0	; Number of bytes in command
29*4882a593SmuzhiyunABSOLUTE	CommandAddress = 0	; Addr of Command
30*4882a593SmuzhiyunABSOLUTE	StatusAddress = 0	; Addr to receive status return
31*4882a593SmuzhiyunABSOLUTE	ReceiveMsgAddress = 0	; Addr to receive msg
32*4882a593Smuzhiyun;
33*4882a593Smuzhiyun; This is the magic component for handling scatter-gather.  Each of the
34*4882a593Smuzhiyun; SG components is preceded by a script fragment which moves the
35*4882a593Smuzhiyun; necessary amount of data and jumps to the next SG segment.  The final
36*4882a593Smuzhiyun; SG segment jumps back to .  However, this address is the first SG script
37*4882a593Smuzhiyun; segment.
38*4882a593Smuzhiyun;
39*4882a593SmuzhiyunABSOLUTE	SGScriptStartAddress = 0
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun; The following represent status interrupts we use 3 hex digits for
42*4882a593Smuzhiyun; this: 0xPRS where
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun; P:
45*4882a593SmuzhiyunABSOLUTE	AFTER_SELECTION 	= 0x100
46*4882a593SmuzhiyunABSOLUTE	BEFORE_CMD 		= 0x200
47*4882a593SmuzhiyunABSOLUTE	AFTER_CMD 		= 0x300
48*4882a593SmuzhiyunABSOLUTE	AFTER_STATUS 		= 0x400
49*4882a593SmuzhiyunABSOLUTE	AFTER_DATA_IN		= 0x500
50*4882a593SmuzhiyunABSOLUTE	AFTER_DATA_OUT		= 0x600
51*4882a593SmuzhiyunABSOLUTE	DURING_DATA_IN		= 0x700
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun; R:
54*4882a593SmuzhiyunABSOLUTE	NOT_MSG_OUT 		= 0x10
55*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_PHASE 	= 0x20
56*4882a593SmuzhiyunABSOLUTE	NOT_MSG_IN 		= 0x30
57*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_MSG		= 0x40
58*4882a593SmuzhiyunABSOLUTE	MSG_IN			= 0x50
59*4882a593SmuzhiyunABSOLUTE	SDTR_MSG_R		= 0x60
60*4882a593SmuzhiyunABSOLUTE	REJECT_MSG_R		= 0x70
61*4882a593SmuzhiyunABSOLUTE	DISCONNECT		= 0x80
62*4882a593SmuzhiyunABSOLUTE	MSG_OUT			= 0x90
63*4882a593SmuzhiyunABSOLUTE	WDTR_MSG_R		= 0xA0
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun; S:
66*4882a593SmuzhiyunABSOLUTE	GOOD_STATUS 		= 0x1
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun; Combinations, since the script assembler can't process |
69*4882a593SmuzhiyunABSOLUTE	NOT_MSG_OUT_AFTER_SELECTION = 0x110
70*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_PHASE_BEFORE_CMD = 0x220
71*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_PHASE_AFTER_CMD = 0x320
72*4882a593SmuzhiyunABSOLUTE	NOT_MSG_IN_AFTER_STATUS = 0x430
73*4882a593SmuzhiyunABSOLUTE	GOOD_STATUS_AFTER_STATUS = 0x401
74*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_PHASE_AFTER_DATA_IN = 0x520
75*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_PHASE_AFTER_DATA_OUT = 0x620
76*4882a593SmuzhiyunABSOLUTE	UNEXPECTED_MSG_BEFORE_CMD = 0x240
77*4882a593SmuzhiyunABSOLUTE	MSG_IN_BEFORE_CMD = 0x250
78*4882a593SmuzhiyunABSOLUTE	MSG_IN_AFTER_CMD = 0x350
79*4882a593SmuzhiyunABSOLUTE	SDTR_MSG_BEFORE_CMD = 0x260
80*4882a593SmuzhiyunABSOLUTE	REJECT_MSG_BEFORE_CMD = 0x270
81*4882a593SmuzhiyunABSOLUTE	DISCONNECT_AFTER_CMD = 0x380
82*4882a593SmuzhiyunABSOLUTE	SDTR_MSG_AFTER_CMD = 0x360
83*4882a593SmuzhiyunABSOLUTE	WDTR_MSG_AFTER_CMD = 0x3A0
84*4882a593SmuzhiyunABSOLUTE	MSG_IN_AFTER_STATUS = 0x440
85*4882a593SmuzhiyunABSOLUTE	DISCONNECT_AFTER_DATA = 0x580
86*4882a593SmuzhiyunABSOLUTE	MSG_IN_AFTER_DATA_IN = 0x550
87*4882a593SmuzhiyunABSOLUTE	MSG_IN_AFTER_DATA_OUT = 0x650
88*4882a593SmuzhiyunABSOLUTE	MSG_OUT_AFTER_DATA_IN = 0x590
89*4882a593SmuzhiyunABSOLUTE	DATA_IN_AFTER_DATA_IN = 0x5a0
90*4882a593SmuzhiyunABSOLUTE	MSG_IN_DURING_DATA_IN = 0x750
91*4882a593SmuzhiyunABSOLUTE	DISCONNECT_DURING_DATA = 0x780
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun;
94*4882a593Smuzhiyun; Other interrupt conditions
95*4882a593Smuzhiyun;
96*4882a593SmuzhiyunABSOLUTE	RESELECTED_DURING_SELECTION = 0x1000
97*4882a593SmuzhiyunABSOLUTE	COMPLETED_SELECTION_AS_TARGET = 0x1001
98*4882a593SmuzhiyunABSOLUTE	RESELECTION_IDENTIFIED = 0x1003
99*4882a593Smuzhiyun;
100*4882a593Smuzhiyun; Fatal interrupt conditions.  If you add to this, also add to the
101*4882a593Smuzhiyun; array of corresponding messages
102*4882a593Smuzhiyun;
103*4882a593SmuzhiyunABSOLUTE	FATAL = 0x2000
104*4882a593SmuzhiyunABSOLUTE	FATAL_UNEXPECTED_RESELECTION_MSG = 0x2000
105*4882a593SmuzhiyunABSOLUTE	FATAL_SEND_MSG = 0x2001
106*4882a593SmuzhiyunABSOLUTE	FATAL_NOT_MSG_IN_AFTER_SELECTION = 0x2002
107*4882a593SmuzhiyunABSOLUTE	FATAL_ILLEGAL_MSG_LENGTH = 0x2003
108*4882a593Smuzhiyun
109*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT	= 0x3000
110*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT1 = 0x3001
111*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT2 = 0x3002
112*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT3 = 0x3003
113*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT4 = 0x3004
114*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT5 = 0x3005
115*4882a593SmuzhiyunABSOLUTE	DEBUG_INTERRUPT6 = 0x3006
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun;
119*4882a593Smuzhiyun; SCSI Messages we interpret in the script
120*4882a593Smuzhiyun;
121*4882a593SmuzhiyunABSOLUTE	COMMAND_COMPLETE_MSG	= 0x00
122*4882a593SmuzhiyunABSOLUTE	EXTENDED_MSG		= 0x01
123*4882a593SmuzhiyunABSOLUTE	SDTR_MSG		= 0x01
124*4882a593SmuzhiyunABSOLUTE	SAVE_DATA_PTRS_MSG	= 0x02
125*4882a593SmuzhiyunABSOLUTE	RESTORE_DATA_PTRS_MSG	= 0x03
126*4882a593SmuzhiyunABSOLUTE	WDTR_MSG		= 0x03
127*4882a593SmuzhiyunABSOLUTE	DISCONNECT_MSG		= 0x04
128*4882a593SmuzhiyunABSOLUTE	REJECT_MSG		= 0x07
129*4882a593SmuzhiyunABSOLUTE	PARITY_ERROR_MSG	= 0x09
130*4882a593SmuzhiyunABSOLUTE	SIMPLE_TAG_MSG		= 0x20
131*4882a593SmuzhiyunABSOLUTE	IDENTIFY_MSG		= 0x80
132*4882a593SmuzhiyunABSOLUTE	IDENTIFY_MSG_MASK	= 0x7F
133*4882a593SmuzhiyunABSOLUTE	TWO_BYTE_MSG		= 0x20
134*4882a593SmuzhiyunABSOLUTE	TWO_BYTE_MSG_MASK	= 0x0F
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun; This is where the script begins
137*4882a593Smuzhiyun
138*4882a593SmuzhiyunENTRY	StartUp
139*4882a593Smuzhiyun
140*4882a593SmuzhiyunStartUp:
141*4882a593Smuzhiyun	SELECT	ATN Device_ID, Reselect
142*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
143*4882a593Smuzhiyun	JUMP	SendIdentifyMsg, IF MSG_OUT
144*4882a593Smuzhiyun	INT	NOT_MSG_OUT_AFTER_SELECTION
145*4882a593Smuzhiyun
146*4882a593SmuzhiyunReselect:
147*4882a593Smuzhiyun	WAIT	RESELECT SelectedAsTarget
148*4882a593Smuzhiyun	INT	RESELECTED_DURING_SELECTION, WHEN MSG_IN
149*4882a593Smuzhiyun	INT	FATAL_NOT_MSG_IN_AFTER_SELECTION
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun	ENTRY	GetReselectionData
152*4882a593SmuzhiyunGetReselectionData:
153*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
154*4882a593Smuzhiyun	INT	RESELECTION_IDENTIFIED
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun	ENTRY	GetReselectionWithTag
157*4882a593SmuzhiyunGetReselectionWithTag:
158*4882a593Smuzhiyun	MOVE	3, ReceiveMsgAddress, WHEN MSG_IN
159*4882a593Smuzhiyun	INT	RESELECTION_IDENTIFIED
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun	ENTRY	SelectedAsTarget
162*4882a593SmuzhiyunSelectedAsTarget:
163*4882a593Smuzhiyun; Basically tell the selecting device that there's nothing here
164*4882a593Smuzhiyun	SET	TARGET
165*4882a593Smuzhiyun	DISCONNECT
166*4882a593Smuzhiyun	CLEAR	TARGET
167*4882a593Smuzhiyun	INT	COMPLETED_SELECTION_AS_TARGET
168*4882a593Smuzhiyun;
169*4882a593Smuzhiyun; These are the messaging entries
170*4882a593Smuzhiyun;
171*4882a593Smuzhiyun; Send a message.  Message count should be correctly patched
172*4882a593Smuzhiyun	ENTRY	SendMessage
173*4882a593SmuzhiyunSendMessage:
174*4882a593Smuzhiyun	MOVE	MessageCount, MessageLocation, WHEN MSG_OUT
175*4882a593SmuzhiyunResumeSendMessage:
176*4882a593Smuzhiyun	RETURN,	WHEN NOT MSG_OUT
177*4882a593Smuzhiyun	INT	FATAL_SEND_MSG
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	ENTRY	SendMessagePhaseMismatch
180*4882a593SmuzhiyunSendMessagePhaseMismatch:
181*4882a593Smuzhiyun	CLEAR	ACK
182*4882a593Smuzhiyun	JUMP	ResumeSendMessage
183*4882a593Smuzhiyun;
184*4882a593Smuzhiyun; Receive a message.  Need to identify the message to
185*4882a593Smuzhiyun; receive it correctly
186*4882a593Smuzhiyun	ENTRY	ReceiveMessage
187*4882a593SmuzhiyunReceiveMessage:
188*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
189*4882a593Smuzhiyun;
190*4882a593Smuzhiyun; Use this entry if we've just tried to look at the first byte
191*4882a593Smuzhiyun; of the message and want to process it further
192*4882a593SmuzhiyunProcessReceiveMessage:
193*4882a593Smuzhiyun	JUMP	ReceiveExtendedMessage, IF EXTENDED_MSG
194*4882a593Smuzhiyun	RETURN,	IF NOT TWO_BYTE_MSG, AND MASK TWO_BYTE_MSG_MASK
195*4882a593Smuzhiyun	CLEAR	ACK
196*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress + 1, WHEN MSG_IN
197*4882a593Smuzhiyun	RETURN
198*4882a593SmuzhiyunReceiveExtendedMessage:
199*4882a593Smuzhiyun	CLEAR	ACK
200*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress + 1, WHEN MSG_IN
201*4882a593Smuzhiyun	JUMP	Receive1Byte, IF 0x01
202*4882a593Smuzhiyun	JUMP	Receive2Byte, IF 0x02
203*4882a593Smuzhiyun	JUMP	Receive3Byte, IF 0x03
204*4882a593Smuzhiyun	JUMP	Receive4Byte, IF 0x04
205*4882a593Smuzhiyun	JUMP	Receive5Byte, IF 0x05
206*4882a593Smuzhiyun	INT	FATAL_ILLEGAL_MSG_LENGTH
207*4882a593SmuzhiyunReceive1Byte:
208*4882a593Smuzhiyun	CLEAR	ACK
209*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress + 2, WHEN MSG_IN
210*4882a593Smuzhiyun	RETURN
211*4882a593SmuzhiyunReceive2Byte:
212*4882a593Smuzhiyun	CLEAR	ACK
213*4882a593Smuzhiyun	MOVE	2, ReceiveMsgAddress + 2, WHEN MSG_IN
214*4882a593Smuzhiyun	RETURN
215*4882a593SmuzhiyunReceive3Byte:
216*4882a593Smuzhiyun	CLEAR	ACK
217*4882a593Smuzhiyun	MOVE	3, ReceiveMsgAddress + 2, WHEN MSG_IN
218*4882a593Smuzhiyun	RETURN
219*4882a593SmuzhiyunReceive4Byte:
220*4882a593Smuzhiyun	CLEAR	ACK
221*4882a593Smuzhiyun	MOVE	4, ReceiveMsgAddress + 2, WHEN MSG_IN
222*4882a593Smuzhiyun	RETURN
223*4882a593SmuzhiyunReceive5Byte:
224*4882a593Smuzhiyun	CLEAR	ACK
225*4882a593Smuzhiyun	MOVE	5, ReceiveMsgAddress + 2, WHEN MSG_IN
226*4882a593Smuzhiyun	RETURN
227*4882a593Smuzhiyun;
228*4882a593Smuzhiyun; Come here from the message processor to ignore the message
229*4882a593Smuzhiyun;
230*4882a593Smuzhiyun	ENTRY	IgnoreMessage
231*4882a593SmuzhiyunIgnoreMessage:
232*4882a593Smuzhiyun	CLEAR	ACK
233*4882a593Smuzhiyun	RETURN
234*4882a593Smuzhiyun;
235*4882a593Smuzhiyun; Come here to send a reply to a message
236*4882a593Smuzhiyun;
237*4882a593Smuzhiyun	ENTRY	SendMessageWithATN
238*4882a593SmuzhiyunSendMessageWithATN:
239*4882a593Smuzhiyun	SET	ATN
240*4882a593Smuzhiyun	CLEAR	ACK
241*4882a593Smuzhiyun	JUMP	SendMessage
242*4882a593Smuzhiyun
243*4882a593SmuzhiyunSendIdentifyMsg:
244*4882a593Smuzhiyun	CALL	SendMessage
245*4882a593Smuzhiyun	CLEAR	ATN
246*4882a593Smuzhiyun
247*4882a593SmuzhiyunIgnoreMsgBeforeCommand:
248*4882a593Smuzhiyun	CLEAR	ACK
249*4882a593Smuzhiyun	ENTRY	SendCommand
250*4882a593SmuzhiyunSendCommand:
251*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
252*4882a593Smuzhiyun	JUMP	MsgInBeforeCommand, IF MSG_IN
253*4882a593Smuzhiyun	INT	UNEXPECTED_PHASE_BEFORE_CMD, IF NOT CMD
254*4882a593Smuzhiyun	MOVE	CommandCount, CommandAddress, WHEN CMD
255*4882a593SmuzhiyunResumeSendCommand:
256*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
257*4882a593Smuzhiyun	JUMP	MsgInAfterCmd, IF MSG_IN
258*4882a593Smuzhiyun	JUMP	DataIn, IF DATA_IN
259*4882a593Smuzhiyun	JUMP	DataOut, IF DATA_OUT
260*4882a593Smuzhiyun	INT	UNEXPECTED_PHASE_AFTER_CMD
261*4882a593Smuzhiyun
262*4882a593SmuzhiyunIgnoreMsgDuringData:
263*4882a593Smuzhiyun	CLEAR	ACK
264*4882a593Smuzhiyun	; fall through to MsgInDuringData
265*4882a593Smuzhiyun
266*4882a593SmuzhiyunEntry MsgInDuringData
267*4882a593SmuzhiyunMsgInDuringData:
268*4882a593Smuzhiyun;
269*4882a593Smuzhiyun; Could be we have nothing more to transfer
270*4882a593Smuzhiyun;
271*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
272*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
273*4882a593Smuzhiyun	JUMP	DisconnectDuringDataIn, IF DISCONNECT_MSG
274*4882a593Smuzhiyun	JUMP	IgnoreMsgDuringData, IF SAVE_DATA_PTRS_MSG
275*4882a593Smuzhiyun	JUMP	IgnoreMsgDuringData, IF RESTORE_DATA_PTRS_MSG
276*4882a593Smuzhiyun	INT	MSG_IN_DURING_DATA_IN
277*4882a593Smuzhiyun
278*4882a593SmuzhiyunMsgInAfterCmd:
279*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
280*4882a593Smuzhiyun	JUMP	DisconnectAfterCmd, IF DISCONNECT_MSG
281*4882a593Smuzhiyun	JUMP	IgnoreMsgInAfterCmd, IF SAVE_DATA_PTRS_MSG
282*4882a593Smuzhiyun	JUMP	IgnoreMsgInAfterCmd, IF RESTORE_DATA_PTRS_MSG
283*4882a593Smuzhiyun	CALL	ProcessReceiveMessage
284*4882a593Smuzhiyun	INT	MSG_IN_AFTER_CMD
285*4882a593Smuzhiyun	CLEAR	ACK
286*4882a593Smuzhiyun	JUMP	ResumeSendCommand
287*4882a593Smuzhiyun
288*4882a593SmuzhiyunIgnoreMsgInAfterCmd:
289*4882a593Smuzhiyun	CLEAR	ACK
290*4882a593Smuzhiyun	JUMP	ResumeSendCommand
291*4882a593Smuzhiyun
292*4882a593SmuzhiyunDisconnectAfterCmd:
293*4882a593Smuzhiyun	CLEAR	ACK
294*4882a593Smuzhiyun	WAIT	DISCONNECT
295*4882a593Smuzhiyun	ENTRY	Disconnect1
296*4882a593SmuzhiyunDisconnect1:
297*4882a593Smuzhiyun	INT	DISCONNECT_AFTER_CMD
298*4882a593Smuzhiyun	ENTRY	Disconnect2
299*4882a593SmuzhiyunDisconnect2:
300*4882a593Smuzhiyun; We return here after a reselection
301*4882a593Smuzhiyun	CLEAR	ACK
302*4882a593Smuzhiyun	JUMP	ResumeSendCommand
303*4882a593Smuzhiyun
304*4882a593SmuzhiyunMsgInBeforeCommand:
305*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
306*4882a593Smuzhiyun	JUMP	IgnoreMsgBeforeCommand, IF SAVE_DATA_PTRS_MSG
307*4882a593Smuzhiyun	JUMP	IgnoreMsgBeforeCommand, IF RESTORE_DATA_PTRS_MSG
308*4882a593Smuzhiyun	CALL	ProcessReceiveMessage
309*4882a593Smuzhiyun	INT	MSG_IN_BEFORE_CMD
310*4882a593Smuzhiyun	CLEAR	ACK
311*4882a593Smuzhiyun	JUMP	SendCommand
312*4882a593Smuzhiyun
313*4882a593SmuzhiyunDataIn:
314*4882a593Smuzhiyun	CALL	SGScriptStartAddress
315*4882a593SmuzhiyunResumeDataIn:
316*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
317*4882a593Smuzhiyun	JUMP	MsgInAfterDataIn, IF MSG_IN
318*4882a593Smuzhiyun	JUMP	DataInAfterDataIn, if DATA_IN
319*4882a593Smuzhiyun	INT	MSG_OUT_AFTER_DATA_IN, if MSG_OUT
320*4882a593Smuzhiyun	INT	UNEXPECTED_PHASE_AFTER_DATA_IN
321*4882a593Smuzhiyun
322*4882a593SmuzhiyunDataInAfterDataIn:
323*4882a593Smuzhiyun	INT	DATA_IN_AFTER_DATA_IN
324*4882a593Smuzhiyun	JUMP	ResumeDataIn
325*4882a593Smuzhiyun
326*4882a593SmuzhiyunDataOut:
327*4882a593Smuzhiyun	CALL	SGScriptStartAddress
328*4882a593SmuzhiyunResumeDataOut:
329*4882a593Smuzhiyun	JUMP	Finish, WHEN STATUS
330*4882a593Smuzhiyun	JUMP	MsgInAfterDataOut, IF MSG_IN
331*4882a593Smuzhiyun	INT	UNEXPECTED_PHASE_AFTER_DATA_OUT
332*4882a593Smuzhiyun
333*4882a593SmuzhiyunMsgInAfterDataIn:
334*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
335*4882a593Smuzhiyun	JUMP	DisconnectAfterDataIn, IF DISCONNECT_MSG
336*4882a593Smuzhiyun	JUMP	IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
337*4882a593Smuzhiyun	JUMP	IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
338*4882a593Smuzhiyun	CALL	ProcessReceiveMessage
339*4882a593Smuzhiyun	INT	MSG_IN_AFTER_DATA_IN
340*4882a593Smuzhiyun	CLEAR	ACK
341*4882a593Smuzhiyun	JUMP	ResumeDataIn
342*4882a593Smuzhiyun
343*4882a593SmuzhiyunDisconnectDuringDataIn:
344*4882a593Smuzhiyun	CLEAR	ACK
345*4882a593Smuzhiyun	WAIT	DISCONNECT
346*4882a593Smuzhiyun	ENTRY	Disconnect3
347*4882a593SmuzhiyunDisconnect3:
348*4882a593Smuzhiyun	INT	DISCONNECT_DURING_DATA
349*4882a593Smuzhiyun	ENTRY	Disconnect4
350*4882a593SmuzhiyunDisconnect4:
351*4882a593Smuzhiyun; we return here after a reselection
352*4882a593Smuzhiyun	CLEAR	ACK
353*4882a593Smuzhiyun	JUMP	ResumeSendCommand
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun
356*4882a593SmuzhiyunDisconnectAfterDataIn:
357*4882a593Smuzhiyun	CLEAR	ACK
358*4882a593Smuzhiyun	WAIT	DISCONNECT
359*4882a593Smuzhiyun	ENTRY	Disconnect5
360*4882a593SmuzhiyunDisconnect5:
361*4882a593Smuzhiyun	INT	DISCONNECT_AFTER_DATA
362*4882a593Smuzhiyun	ENTRY	Disconnect6
363*4882a593SmuzhiyunDisconnect6:
364*4882a593Smuzhiyun; we return here after a reselection
365*4882a593Smuzhiyun	CLEAR	ACK
366*4882a593Smuzhiyun	JUMP	ResumeDataIn
367*4882a593Smuzhiyun
368*4882a593SmuzhiyunMsgInAfterDataOut:
369*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
370*4882a593Smuzhiyun	JUMP	DisconnectAfterDataOut, if DISCONNECT_MSG
371*4882a593Smuzhiyun	JUMP	IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
372*4882a593Smuzhiyun	JUMP	IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
373*4882a593Smuzhiyun	CALL	ProcessReceiveMessage
374*4882a593Smuzhiyun	INT	MSG_IN_AFTER_DATA_OUT
375*4882a593Smuzhiyun	CLEAR	ACK
376*4882a593Smuzhiyun	JUMP	ResumeDataOut
377*4882a593Smuzhiyun
378*4882a593SmuzhiyunIgnoreMsgAfterData:
379*4882a593Smuzhiyun	CLEAR	ACK
380*4882a593Smuzhiyun; Data in and out do the same thing on resume, so pick one
381*4882a593Smuzhiyun	JUMP	ResumeDataIn
382*4882a593Smuzhiyun
383*4882a593SmuzhiyunDisconnectAfterDataOut:
384*4882a593Smuzhiyun	CLEAR	ACK
385*4882a593Smuzhiyun	WAIT	DISCONNECT
386*4882a593Smuzhiyun	ENTRY	Disconnect7
387*4882a593SmuzhiyunDisconnect7:
388*4882a593Smuzhiyun	INT	DISCONNECT_AFTER_DATA
389*4882a593Smuzhiyun	ENTRY	Disconnect8
390*4882a593SmuzhiyunDisconnect8:
391*4882a593Smuzhiyun; we return here after a reselection
392*4882a593Smuzhiyun	CLEAR	ACK
393*4882a593Smuzhiyun	JUMP	ResumeDataOut
394*4882a593Smuzhiyun
395*4882a593SmuzhiyunFinish:
396*4882a593Smuzhiyun	MOVE	1, StatusAddress, WHEN STATUS
397*4882a593Smuzhiyun	INT	NOT_MSG_IN_AFTER_STATUS, WHEN NOT MSG_IN
398*4882a593Smuzhiyun	MOVE	1, ReceiveMsgAddress, WHEN MSG_IN
399*4882a593Smuzhiyun	JUMP	FinishCommandComplete, IF COMMAND_COMPLETE_MSG
400*4882a593Smuzhiyun	CALL	ProcessReceiveMessage
401*4882a593Smuzhiyun	INT	MSG_IN_AFTER_STATUS
402*4882a593Smuzhiyun	ENTRY	FinishCommandComplete
403*4882a593SmuzhiyunFinishCommandComplete:
404*4882a593Smuzhiyun	CLEAR	ACK
405*4882a593Smuzhiyun	WAIT	DISCONNECT
406*4882a593Smuzhiyun	ENTRY	Finish1
407*4882a593SmuzhiyunFinish1:
408*4882a593Smuzhiyun	INT	GOOD_STATUS_AFTER_STATUS
409*4882a593Smuzhiyun	ENTRY	Finish2
410*4882a593SmuzhiyunFinish2:
411*4882a593Smuzhiyun
412