siop2_script.ss revision 1.2
1;	$NetBSD: siop2_script.ss,v 1.2 1999/03/13 19:42:52 is Exp $
2
3;
4; Copyright (c) 1998 Michael L. Hitch
5; All rights reserved.
6;
7; Redistribution and use in source and binary forms, with or without
8; modification, are permitted provided that the following conditions
9; are met:
10; 1. Redistributions of source code must retain the above copyright
11;    notice, this list of conditions and the following disclaimer.
12; 2. Redistributions in binary form must reproduce the above copyright
13;    notice, this list of conditions and the following disclaimer in the
14;    documentation and/or other materials provided with the distribution.
15; 3. All advertising materials mentioning features or use of this software
16;    must display the following acknowledgement:
17;      This product includes software developed by Michael L. Hitch.
18; 4. The name of the author may not be used to endorse or promote products
19;    derived from this software without specific prior written permission
20;
21; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31;
32
33; NCR 53c770 script
34;
35ARCH 720
36;
37ABSOLUTE ds_Device	= 0
38ABSOLUTE ds_MsgOut 	= ds_Device + 4
39ABSOLUTE ds_Cmd		= ds_MsgOut + 8
40ABSOLUTE ds_Status	= ds_Cmd + 8
41ABSOLUTE ds_Msg		= ds_Status + 8
42ABSOLUTE ds_MsgIn	= ds_Msg + 8
43ABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
44ABSOLUTE ds_SyncMsg	= ds_ExtMsg + 8
45ABSOLUTE ds_Data1	= ds_SyncMsg + 8
46ABSOLUTE ds_Data2	= ds_Data1 + 8
47ABSOLUTE ds_Data3	= ds_Data2 + 8
48ABSOLUTE ds_Data4	= ds_Data3 + 8
49ABSOLUTE ds_Data5	= ds_Data4 + 8
50ABSOLUTE ds_Data6	= ds_Data5 + 8
51ABSOLUTE ds_Data7	= ds_Data6 + 8
52ABSOLUTE ds_Data8	= ds_Data7 + 8
53ABSOLUTE ds_Data9	= ds_Data8 + 8
54
55ABSOLUTE ok		= 0xff00
56ABSOLUTE err1		= 0xff01
57ABSOLUTE err2		= 0xff02
58ABSOLUTE err3		= 0xff03
59ABSOLUTE err4		= 0xff04
60ABSOLUTE err5		= 0xff05
61ABSOLUTE err6		= 0xff06
62ABSOLUTE err7		= 0xff07
63ABSOLUTE err8		= 0xff08
64ABSOLUTE err9		= 0xff09
65ABSOLUTE err10		= 0xff0a
66
67ENTRY	scripts
68ENTRY	switch
69ENTRY	wait_reselect
70ENTRY	dataout
71ENTRY	datain
72
73PROC	siopng_scripts:
74
75scripts:
76
77	SELECT ATN FROM ds_Device, REL(reselect)
78;
79switch:
80	JUMP REL(msgin), WHEN MSG_IN
81	JUMP REL(msgout), IF MSG_OUT
82	JUMP REL(command_phase), IF CMD
83	JUMP REL(dataout), IF DATA_OUT
84	JUMP REL(datain), IF DATA_IN
85	JUMP REL(end), IF STATUS
86
87	INT err5			; Unrecognized phase
88
89msgin:
90	MOVE FROM ds_MsgIn, WHEN MSG_IN
91	JUMP REL(ext_msg), IF 0x01	; extended message
92	JUMP REL(disc), IF 0x04		; disconnect message
93	JUMP REL(msg_sdp), IF 0x02	; save data pointers
94	JUMP REL(msg_rej), IF 0x07	; message reject
95	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
96	INT err6			; unrecognized message
97
98msg_rdp:
99msg_rej:
100	CLEAR ACK
101	CLEAR ATN
102	JUMP REL(switch)
103
104ext_msg:
105	CLEAR ACK
106	MOVE FROM ds_ExtMsg, WHEN MSG_IN
107	JUMP REL(sync_msg), IF 0x03
108	int err7			; extended message not SDTR
109
110sync_msg:
111	CLEAR ACK
112	MOVE FROM ds_SyncMsg, WHEN MSG_IN
113	CLEAR ACK
114	JUMP REL(switch)
115
116disc:
117	MOVE SCNTL2 & 0x7f TO SCNTL2
118	CLEAR ACK
119	WAIT DISCONNECT
120
121	int err2			; signal disconnect w/o save DP
122
123msg_sdp:
124	CLEAR ACK			; acknowledge message
125	JUMP REL(switch), WHEN NOT MSG_IN
126	MOVE FROM ds_ExtMsg, WHEN MSG_IN
127	INT err8, IF NOT 0x04		; interrupt if not disconnect
128	MOVE SCNTL2 & 0x7f TO SCNTL2
129	CLEAR ACK
130	WAIT DISCONNECT
131
132	INT err1			; signal disconnect
133
134reselect:
135wait_reselect:
136	WAIT RESELECT REL(select_adr)
137	MOVE SSID & 0x8f to SFBR	; Save reselect ID
138	MOVE SFBR to SCRATCHA0
139
140	INT err9, WHEN NOT MSG_IN	; didn't get IDENTIFY
141	MOVE FROM ds_Msg, WHEN MSG_IN
142	INT err3			; let host know about reconnect
143	CLEAR ACK			; acknowlege the message
144	JUMP REL(switch)
145
146
147select_adr:
148	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
149	INT err4, IF 0x00		; tell host if not connected
150	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
151	JUMP REL(wait_reselect)		; and try reselect again
152
153msgout:
154	MOVE FROM ds_MsgOut, WHEN MSG_OUT
155	JUMP REL(switch)
156
157command_phase:
158	CLEAR ATN
159	MOVE FROM ds_Cmd, WHEN CMD
160	JUMP REL(switch)
161
162dataout:
163	MOVE FROM ds_Data1, WHEN DATA_OUT
164	CALL REL(switch), WHEN NOT DATA_OUT
165	MOVE FROM ds_Data2, WHEN DATA_OUT
166	CALL REL(switch), WHEN NOT DATA_OUT
167	MOVE FROM ds_Data3, WHEN DATA_OUT
168	CALL REL(switch), WHEN NOT DATA_OUT
169	MOVE FROM ds_Data4, WHEN DATA_OUT
170	CALL REL(switch), WHEN NOT DATA_OUT
171	MOVE FROM ds_Data5, WHEN DATA_OUT
172	CALL REL(switch), WHEN NOT DATA_OUT
173	MOVE FROM ds_Data6, WHEN DATA_OUT
174	CALL REL(switch), WHEN NOT DATA_OUT
175	MOVE FROM ds_Data7, WHEN DATA_OUT
176	CALL REL(switch), WHEN NOT DATA_OUT
177	MOVE FROM ds_Data8, WHEN DATA_OUT
178	CALL REL(switch), WHEN NOT DATA_OUT
179	MOVE FROM ds_Data9, WHEN DATA_OUT
180	CALL REL(switch)
181
182datain:
183	MOVE FROM ds_Data1, WHEN DATA_IN
184	CALL REL(switch), WHEN NOT DATA_IN
185	MOVE FROM ds_Data2, WHEN DATA_IN
186	CALL REL(switch), WHEN NOT DATA_IN
187	MOVE FROM ds_Data3, WHEN DATA_IN
188	CALL REL(switch), WHEN NOT DATA_IN
189	MOVE FROM ds_Data4, WHEN DATA_IN
190	CALL REL(switch), WHEN NOT DATA_IN
191	MOVE FROM ds_Data5, WHEN DATA_IN
192	CALL REL(switch), WHEN NOT DATA_IN
193	MOVE FROM ds_Data6, WHEN DATA_IN
194	CALL REL(switch), WHEN NOT DATA_IN
195	MOVE FROM ds_Data7, WHEN DATA_IN
196	CALL REL(switch), WHEN NOT DATA_IN
197	MOVE FROM ds_Data8, WHEN DATA_IN
198	CALL REL(switch), WHEN NOT DATA_IN
199	MOVE FROM ds_Data9, WHEN DATA_IN
200	CALL REL(switch)
201
202end:
203	MOVE FROM ds_Status, WHEN STATUS
204	int err10, WHEN NOT MSG_IN	; status not followed by msg
205	MOVE FROM ds_Msg, WHEN MSG_IN
206	MOVE SCNTL2 & 0x7f TO SCNTL2
207	CLEAR ACK
208	WAIT DISCONNECT
209	INT ok				; signal completion
210	JUMP REL(wait_reselect)
211