xref: /netbsd-src/sys/arch/amiga/dev/siop2_script.ss (revision 21cc7f1b6b3ceba58353c4989891a751a88d9588)
1;	$NetBSD: siop2_script.ss,v 1.8 2016/12/12 15:58:44 maya 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;
16; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26;
27
28; NCR 53c770 script
29;
30ARCH 720
31;
32ABSOLUTE ds_Device	= 0
33ABSOLUTE ds_MsgOut 	= ds_Device + 4
34ABSOLUTE ds_Cmd		= ds_MsgOut + 8
35ABSOLUTE ds_Status	= ds_Cmd + 8
36ABSOLUTE ds_Msg		= ds_Status + 8
37ABSOLUTE ds_MsgIn	= ds_Msg + 8
38ABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
39ABSOLUTE ds_NegMsg	= ds_ExtMsg + 8
40ABSOLUTE ds_Data1	= ds_NegMsg + 8
41ABSOLUTE ds_Data2	= ds_Data1 + 8
42ABSOLUTE ds_Data3	= ds_Data2 + 8
43ABSOLUTE ds_Data4	= ds_Data3 + 8
44ABSOLUTE ds_Data5	= ds_Data4 + 8
45ABSOLUTE ds_Data6	= ds_Data5 + 8
46ABSOLUTE ds_Data7	= ds_Data6 + 8
47ABSOLUTE ds_Data8	= ds_Data7 + 8
48ABSOLUTE ds_Data9	= ds_Data8 + 8
49
50ABSOLUTE ok		= 0xff00
51ABSOLUTE err1		= 0xff01
52ABSOLUTE err2		= 0xff02
53ABSOLUTE err3		= 0xff03
54ABSOLUTE err4		= 0xff04
55ABSOLUTE err5		= 0xff05
56ABSOLUTE err6		= 0xff06
57ABSOLUTE err7		= 0xff07
58ABSOLUTE err8		= 0xff08
59ABSOLUTE err9		= 0xff09
60ABSOLUTE err10		= 0xff0a
61ABSOLUTE err11		= 0xff0b
62
63ENTRY	scripts
64ENTRY	switch
65ENTRY	wait_reselect
66ENTRY	dataout
67ENTRY	datain
68ENTRY	clear_ack
69
70PROC	siopng_scripts:
71
72scripts:
73
74	SELECT ATN FROM ds_Device, REL(reselect)
75;
76switch:
77	MOVE GPREG | 0x10 TO GPREG
78	JUMP REL(msgin), WHEN MSG_IN
79	JUMP REL(msgout), IF MSG_OUT
80	JUMP REL(command_phase), IF CMD
81	JUMP REL(dataout), IF DATA_OUT
82	JUMP REL(datain), IF DATA_IN
83	JUMP REL(end), IF STATUS
84
85	INT err5			; Unrecognized phase
86
87msgin:
88	MOVE FROM ds_MsgIn, WHEN MSG_IN
89	JUMP REL(ext_msg), IF 0x01	; extended message
90	JUMP REL(disc), IF 0x04		; disconnect message
91	JUMP REL(msg_sdp), IF 0x02	; save data pointers
92	JUMP REL(msg_rej), IF 0x07	; message reject
93	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
94	INT err6			; unrecognized message
95
96msg_rej:
97; Do we need to interrupt host here to let it handle the reject?
98msg_rdp:
99clear_ack:
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(neg_msg), IF 0x03	; extended message might be SDTR
108	JUMP REL(neg_msg), IF 0x02	; extended message might be WDTR
109	INT err7			; extended message not SDTR
110
111neg_msg:
112	CLEAR ACK
113	MOVE FROM ds_NegMsg, WHEN MSG_IN
114	INT err11			; Let host handle the message
115; If we continue from the interrupt, the host has set up a response
116; message to be sent.  Set ATN, clear ACK, and continue.
117	SET ATN
118	CLEAR ACK
119	JUMP REL(switch)
120
121disc:
122	MOVE SCNTL2 & 0x7f TO SCNTL2
123	MOVE GPREG & 0xEF TO GPREG
124	CLEAR ACK
125	WAIT DISCONNECT
126
127	INT err2			; signal disconnect w/o save DP
128
129msg_sdp:
130	CLEAR ACK			; acknowledge message
131	JUMP REL(switch), WHEN NOT MSG_IN
132	MOVE FROM ds_ExtMsg, WHEN MSG_IN
133	INT err8, IF NOT 0x04		; interrupt if not disconnect
134	MOVE SCNTL2 & 0x7f TO SCNTL2
135	CLEAR ACK
136	WAIT DISCONNECT
137
138	INT err1			; signal disconnect
139
140reselect:
141wait_reselect:
142	WAIT RESELECT REL(select_adr)
143	MOVE SSID & 0x8f to SFBR	; Save reselect ID
144	MOVE SFBR to SCRATCHA0
145
146	INT err9, WHEN NOT MSG_IN	; didn't get IDENTIFY
147	MOVE FROM ds_Msg, WHEN MSG_IN
148	INT err3			; let host know about reconnect
149	CLEAR ACK			; acknowledge the message
150	JUMP REL(switch)
151
152
153select_adr:
154	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
155	INT err4, IF 0x00		; tell host if not connected
156	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
157	JUMP REL(wait_reselect)		; and try reselect again
158
159msgout:
160	MOVE FROM ds_MsgOut, WHEN MSG_OUT
161	JUMP REL(switch)
162
163command_phase:
164	CLEAR ATN
165	MOVE FROM ds_Cmd, WHEN CMD
166	JUMP REL(switch)
167
168dataout:
169	MOVE FROM ds_Data1, WHEN DATA_OUT
170	CALL REL(switch), WHEN NOT DATA_OUT
171	MOVE FROM ds_Data2, WHEN DATA_OUT
172	CALL REL(switch), WHEN NOT DATA_OUT
173	MOVE FROM ds_Data3, WHEN DATA_OUT
174	CALL REL(switch), WHEN NOT DATA_OUT
175	MOVE FROM ds_Data4, WHEN DATA_OUT
176	CALL REL(switch), WHEN NOT DATA_OUT
177	MOVE FROM ds_Data5, WHEN DATA_OUT
178	CALL REL(switch), WHEN NOT DATA_OUT
179	MOVE FROM ds_Data6, WHEN DATA_OUT
180	CALL REL(switch), WHEN NOT DATA_OUT
181	MOVE FROM ds_Data7, WHEN DATA_OUT
182	CALL REL(switch), WHEN NOT DATA_OUT
183	MOVE FROM ds_Data8, WHEN DATA_OUT
184	CALL REL(switch), WHEN NOT DATA_OUT
185	MOVE FROM ds_Data9, WHEN DATA_OUT
186	CALL REL(switch)
187
188datain:
189	MOVE FROM ds_Data1, WHEN DATA_IN
190	CALL REL(switch), WHEN NOT DATA_IN
191	MOVE FROM ds_Data2, WHEN DATA_IN
192	CALL REL(switch), WHEN NOT DATA_IN
193	MOVE FROM ds_Data3, WHEN DATA_IN
194	CALL REL(switch), WHEN NOT DATA_IN
195	MOVE FROM ds_Data4, WHEN DATA_IN
196	CALL REL(switch), WHEN NOT DATA_IN
197	MOVE FROM ds_Data5, WHEN DATA_IN
198	CALL REL(switch), WHEN NOT DATA_IN
199	MOVE FROM ds_Data6, WHEN DATA_IN
200	CALL REL(switch), WHEN NOT DATA_IN
201	MOVE FROM ds_Data7, WHEN DATA_IN
202	CALL REL(switch), WHEN NOT DATA_IN
203	MOVE FROM ds_Data8, WHEN DATA_IN
204	CALL REL(switch), WHEN NOT DATA_IN
205	MOVE FROM ds_Data9, WHEN DATA_IN
206	CALL REL(switch)
207
208end:
209	MOVE FROM ds_Status, WHEN STATUS
210	INT err10, WHEN NOT MSG_IN	; status not followed by msg
211	MOVE FROM ds_Msg, WHEN MSG_IN
212	MOVE SCNTL2 & 0x7f TO SCNTL2
213	CLEAR ACK
214	WAIT DISCONNECT
215	MOVE GPREG & 0xEF TO GPREG
216	INT ok				; signal completion
217	JUMP REL(wait_reselect)
218