xref: /netbsd/sys/arch/amiga/dev/siop2_script.ss (revision bf9ec67e)
1;	$NetBSD: siop2_script.ss,v 1.4 2001/10/08 21:18:58 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_NegMsg	= ds_ExtMsg + 8
45ABSOLUTE ds_Data1	= ds_NegMsg + 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
66ABSOLUTE err11		= 0xff0b
67
68ENTRY	scripts
69ENTRY	switch
70ENTRY	wait_reselect
71ENTRY	dataout
72ENTRY	datain
73ENTRY	clear_ack
74
75PROC	siopng_scripts:
76
77scripts:
78
79	SELECT ATN FROM ds_Device, REL(reselect)
80;
81switch:
82	MOVE GPREG | 0x10 TO GPREG
83	JUMP REL(msgin), WHEN MSG_IN
84	JUMP REL(msgout), IF MSG_OUT
85	JUMP REL(command_phase), IF CMD
86	JUMP REL(dataout), IF DATA_OUT
87	JUMP REL(datain), IF DATA_IN
88	JUMP REL(end), IF STATUS
89
90	INT err5			; Unrecognized phase
91
92msgin:
93	MOVE FROM ds_MsgIn, WHEN MSG_IN
94	JUMP REL(ext_msg), IF 0x01	; extended message
95	JUMP REL(disc), IF 0x04		; disconnect message
96	JUMP REL(msg_sdp), IF 0x02	; save data pointers
97	JUMP REL(msg_rej), IF 0x07	; message reject
98	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
99	INT err6			; unrecognized message
100
101msg_rej:
102; Do we need to interrupt host here to let it handle the reject?
103msg_rdp:
104clear_ack:
105	CLEAR ACK
106	CLEAR ATN
107	JUMP REL(switch)
108
109ext_msg:
110	CLEAR ACK
111	MOVE FROM ds_ExtMsg, WHEN MSG_IN
112	JUMP REL(neg_msg), IF 0x03	; extended message might be SDTR
113	JUMP REL(neg_msg), IF 0x02	; extended message might be WDTR
114	int err7			; extended message not SDTR
115
116neg_msg:
117	CLEAR ACK
118	MOVE FROM ds_NegMsg, WHEN MSG_IN
119	int err11			; Let host handle the message
120; If we continue from the interrupt, the host has set up a response
121; message to be sent.  Set ATN, clear ACK, and continue.
122	SET ATN
123	CLEAR ACK
124	JUMP REL(switch)
125
126disc:
127	MOVE SCNTL2 & 0x7f TO SCNTL2
128	MOVE GPREG & 0xEF TO GPREG
129	CLEAR ACK
130	WAIT DISCONNECT
131
132	int err2			; signal disconnect w/o save DP
133
134msg_sdp:
135	CLEAR ACK			; acknowledge message
136	JUMP REL(switch), WHEN NOT MSG_IN
137	MOVE FROM ds_ExtMsg, WHEN MSG_IN
138	INT err8, IF NOT 0x04		; interrupt if not disconnect
139	MOVE SCNTL2 & 0x7f TO SCNTL2
140	CLEAR ACK
141	WAIT DISCONNECT
142
143	INT err1			; signal disconnect
144
145reselect:
146wait_reselect:
147	WAIT RESELECT REL(select_adr)
148	MOVE SSID & 0x8f to SFBR	; Save reselect ID
149	MOVE SFBR to SCRATCHA0
150
151	INT err9, WHEN NOT MSG_IN	; didn't get IDENTIFY
152	MOVE FROM ds_Msg, WHEN MSG_IN
153	INT err3			; let host know about reconnect
154	CLEAR ACK			; acknowlege the message
155	JUMP REL(switch)
156
157
158select_adr:
159	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
160	INT err4, IF 0x00		; tell host if not connected
161	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
162	JUMP REL(wait_reselect)		; and try reselect again
163
164msgout:
165	MOVE FROM ds_MsgOut, WHEN MSG_OUT
166	JUMP REL(switch)
167
168command_phase:
169	CLEAR ATN
170	MOVE FROM ds_Cmd, WHEN CMD
171	JUMP REL(switch)
172
173dataout:
174	MOVE FROM ds_Data1, WHEN DATA_OUT
175	CALL REL(switch), WHEN NOT DATA_OUT
176	MOVE FROM ds_Data2, WHEN DATA_OUT
177	CALL REL(switch), WHEN NOT DATA_OUT
178	MOVE FROM ds_Data3, WHEN DATA_OUT
179	CALL REL(switch), WHEN NOT DATA_OUT
180	MOVE FROM ds_Data4, WHEN DATA_OUT
181	CALL REL(switch), WHEN NOT DATA_OUT
182	MOVE FROM ds_Data5, WHEN DATA_OUT
183	CALL REL(switch), WHEN NOT DATA_OUT
184	MOVE FROM ds_Data6, WHEN DATA_OUT
185	CALL REL(switch), WHEN NOT DATA_OUT
186	MOVE FROM ds_Data7, WHEN DATA_OUT
187	CALL REL(switch), WHEN NOT DATA_OUT
188	MOVE FROM ds_Data8, WHEN DATA_OUT
189	CALL REL(switch), WHEN NOT DATA_OUT
190	MOVE FROM ds_Data9, WHEN DATA_OUT
191	CALL REL(switch)
192
193datain:
194	MOVE FROM ds_Data1, WHEN DATA_IN
195	CALL REL(switch), WHEN NOT DATA_IN
196	MOVE FROM ds_Data2, WHEN DATA_IN
197	CALL REL(switch), WHEN NOT DATA_IN
198	MOVE FROM ds_Data3, WHEN DATA_IN
199	CALL REL(switch), WHEN NOT DATA_IN
200	MOVE FROM ds_Data4, WHEN DATA_IN
201	CALL REL(switch), WHEN NOT DATA_IN
202	MOVE FROM ds_Data5, WHEN DATA_IN
203	CALL REL(switch), WHEN NOT DATA_IN
204	MOVE FROM ds_Data6, WHEN DATA_IN
205	CALL REL(switch), WHEN NOT DATA_IN
206	MOVE FROM ds_Data7, WHEN DATA_IN
207	CALL REL(switch), WHEN NOT DATA_IN
208	MOVE FROM ds_Data8, WHEN DATA_IN
209	CALL REL(switch), WHEN NOT DATA_IN
210	MOVE FROM ds_Data9, WHEN DATA_IN
211	CALL REL(switch)
212
213end:
214	MOVE FROM ds_Status, WHEN STATUS
215	int err10, WHEN NOT MSG_IN	; status not followed by msg
216	MOVE FROM ds_Msg, WHEN MSG_IN
217	MOVE SCNTL2 & 0x7f TO SCNTL2
218	CLEAR ACK
219	WAIT DISCONNECT
220	MOVE GPREG & 0xEF TO GPREG
221	INT ok				; signal completion
222	JUMP REL(wait_reselect)
223