oosiop.ss revision 1.1 1 ; $NetBSD: oosiop.ss,v 1.1 2001/12/05 18:27:13 fredette Exp $
2
3 ;
4 ; Copyright (c) 2001 Matt Fredette
5 ; Copyright (c) 1995 Michael L. Hitch
6 ; All rights reserved.
7 ;
8 ; Redistribution and use in source and binary forms, with or without
9 ; modification, are permitted provided that the following conditions
10 ; are met:
11 ; 1. Redistributions of source code must retain the above copyright
12 ; notice, this list of conditions and the following disclaimer.
13 ; 2. Redistributions in binary form must reproduce the above copyright
14 ; notice, this list of conditions and the following disclaimer in the
15 ; documentation and/or other materials provided with the distribution.
16 ; 3. All advertising materials mentioning features or use of this software
17 ; must display the following acknowledgement:
18 ; This product includes software developed by Michael L. Hitch.
19 ; 4. The name of the author may not be used to endorse or promote products
20 ; derived from this software without specific prior written permission
21 ;
22 ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23 ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26 ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27 ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31 ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 ;
33
34 ; NCR 53c700 script
35 ;
36 ARCH 700
37 ;
38 EXTERNAL ds_Device
39 EXTERNAL ds_MsgOut
40 EXTERNAL ds_Cmd
41 EXTERNAL ds_Status
42 EXTERNAL ds_Msg
43 EXTERNAL ds_MsgIn
44 EXTERNAL ds_ExtMsg
45 EXTERNAL ds_SyncMsg
46 EXTERNAL ds_Data1
47
48
49 ABSOLUTE ok = 0xff00
50 ABSOLUTE int_disc = 0xff01
51 ABSOLUTE int_disc_wodp = 0xff02
52 ABSOLUTE int_reconnect = 0xff03
53 ABSOLUTE int_connect = 0xff04
54 ABSOLUTE int_phase = 0xff05
55 ABSOLUTE int_msgin = 0xff06
56 ABSOLUTE int_extmsg = 0xff07
57 ABSOLUTE int_msgsdp = 0xff08
58 ABSOLUTE int_identify = 0xff09
59 ABSOLUTE int_status = 0xff0a
60 ABSOLUTE int_syncmsg = 0xff0b
61
62 ENTRY scripts
63 ENTRY switch
64 ENTRY wait_reselect
65 ENTRY dataout
66 ENTRY datain
67 ENTRY clear_ack
68
69 PROC oosiop_script:
70
71 scripts:
72
73 SELECT ATN ds_Device, reselect
74 ;
75 switch:
76 JUMP msgin, WHEN MSG_IN
77 JUMP msgout, IF MSG_OUT
78 JUMP command_phase, IF CMD
79 JUMP dataout, IF DATA_OUT
80 JUMP datain, IF DATA_IN
81 JUMP end, IF STATUS
82
83 INT int_phase ; Unrecognized phase
84
85 msgin:
86 MOVE 0, ds_MsgIn, WHEN MSG_IN
87 JUMP ext_msg, IF 0x01 ; extended message
88 JUMP disc, IF 0x04 ; disconnect message
89 JUMP msg_sdp, IF 0x02 ; save data pointers
90 JUMP msg_rej, IF 0x07 ; message reject
91 JUMP msg_rdp, IF 0x03 ; restore data pointers
92 INT int_msgin ; unrecognized message
93
94 msg_rej:
95 ; Do we need to interrupt host here to let it handle the reject?
96 msg_rdp:
97 clear_ack:
98 CLEAR ACK
99 CLEAR ATN
100 JUMP switch
101
102 ext_msg:
103 CLEAR ACK
104 MOVE 0, ds_ExtMsg, WHEN MSG_IN
105 JUMP sync_msg, IF 0x03
106 int int_extmsg ; extended message not SDTR
107
108 sync_msg:
109 CLEAR ACK
110 MOVE 0, ds_SyncMsg, WHEN MSG_IN
111 int int_syncmsg ; Let host handle the message
112 ; If we continue from the interrupt, the host has set up a response
113 ; message to be sent. Set ATN, clear ACK, and continue.
114 SET ATN
115 CLEAR ACK
116 JUMP switch
117
118 disc:
119 CLEAR ACK
120 WAIT DISCONNECT
121
122 int int_disc_wodp ; signal disconnect w/o save DP
123
124 msg_sdp:
125 CLEAR ACK ; acknowledge message
126 JUMP switch, WHEN NOT MSG_IN
127 MOVE 0, ds_ExtMsg, WHEN MSG_IN
128 INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect
129 CLEAR ACK
130 WAIT DISCONNECT
131
132 INT int_disc ; signal disconnect
133
134 reselect:
135 wait_reselect:
136 WAIT RESELECT select_adr
137 ; NB: these NOPs are CRITICAL to preserve the 1:1
138 ; correspondence between instructions in this script
139 ; and instructions in the osiop (53c710) script:
140 NOP
141 NOP ; reselect ID already in SFBR
142
143 INT int_identify, WHEN NOT MSG_IN
144 MOVE 0, ds_Msg, WHEN MSG_IN
145 INT int_reconnect ; let host know about reconnect
146 CLEAR ACK ; acknowlege the message
147 JUMP switch
148
149 select_adr:
150 MOVE SCNTL1 & 0x10 to SFBR ; get connected status
151 INT int_connect, IF 0x00 ; tell host if not connected
152 NOP ; Sig_P doesn't exist on the 53c700
153 JUMP wait_reselect ; and try reselect again
154
155 msgout:
156 MOVE 0, ds_MsgOut, WHEN MSG_OUT
157 JUMP switch
158
159 command_phase:
160 CLEAR ATN
161 MOVE 0, ds_Cmd, WHEN CMD
162 JUMP switch
163
164 dataout:
165 MOVE 0, ds_Data1, WHEN DATA_OUT
166 CALL switch, WHEN NOT DATA_OUT
167 MOVE 0, ds_Data1, WHEN DATA_OUT
168 CALL switch, WHEN NOT DATA_OUT
169 MOVE 0, ds_Data1, WHEN DATA_OUT
170 CALL switch, WHEN NOT DATA_OUT
171 MOVE 0, ds_Data1, WHEN DATA_OUT
172 CALL switch, WHEN NOT DATA_OUT
173 MOVE 0, ds_Data1, WHEN DATA_OUT
174 CALL switch, WHEN NOT DATA_OUT
175 MOVE 0, ds_Data1, WHEN DATA_OUT
176 CALL switch, WHEN NOT DATA_OUT
177 MOVE 0, ds_Data1, WHEN DATA_OUT
178 CALL switch, WHEN NOT DATA_OUT
179 MOVE 0, ds_Data1, WHEN DATA_OUT
180 CALL switch, WHEN NOT DATA_OUT
181 MOVE 0, ds_Data1, WHEN DATA_OUT
182 CALL switch, WHEN NOT DATA_OUT
183 MOVE 0, ds_Data1, WHEN DATA_OUT
184 CALL switch, WHEN NOT DATA_OUT
185 MOVE 0, ds_Data1, WHEN DATA_OUT
186 CALL switch, WHEN NOT DATA_OUT
187 MOVE 0, ds_Data1, WHEN DATA_OUT
188 CALL switch, WHEN NOT DATA_OUT
189 MOVE 0, ds_Data1, WHEN DATA_OUT
190 CALL switch, WHEN NOT DATA_OUT
191 MOVE 0, ds_Data1, WHEN DATA_OUT
192 CALL switch, WHEN NOT DATA_OUT
193 MOVE 0, ds_Data1, WHEN DATA_OUT
194 CALL switch, WHEN NOT DATA_OUT
195 MOVE 0, ds_Data1, WHEN DATA_OUT
196 CALL switch, WHEN NOT DATA_OUT
197 MOVE 0, ds_Data1, WHEN DATA_OUT
198 CALL switch
199
200 datain:
201 MOVE 0, ds_Data1, WHEN DATA_IN
202 CALL switch, WHEN NOT DATA_IN
203 MOVE 0, ds_Data1, WHEN DATA_IN
204 CALL switch, WHEN NOT DATA_IN
205 MOVE 0, ds_Data1, WHEN DATA_IN
206 CALL switch, WHEN NOT DATA_IN
207 MOVE 0, ds_Data1, WHEN DATA_IN
208 CALL switch, WHEN NOT DATA_IN
209 MOVE 0, ds_Data1, WHEN DATA_IN
210 CALL switch, WHEN NOT DATA_IN
211 MOVE 0, ds_Data1, WHEN DATA_IN
212 CALL switch, WHEN NOT DATA_IN
213 MOVE 0, ds_Data1, WHEN DATA_IN
214 CALL switch, WHEN NOT DATA_IN
215 MOVE 0, ds_Data1, WHEN DATA_IN
216 CALL switch, WHEN NOT DATA_IN
217 MOVE 0, ds_Data1, WHEN DATA_IN
218 CALL switch, WHEN NOT DATA_IN
219 MOVE 0, ds_Data1, WHEN DATA_IN
220 CALL switch, WHEN NOT DATA_IN
221 MOVE 0, ds_Data1, WHEN DATA_IN
222 CALL switch, WHEN NOT DATA_IN
223 MOVE 0, ds_Data1, WHEN DATA_IN
224 CALL switch, WHEN NOT DATA_IN
225 MOVE 0, ds_Data1, WHEN DATA_IN
226 CALL switch, WHEN NOT DATA_IN
227 MOVE 0, ds_Data1, WHEN DATA_IN
228 CALL switch, WHEN NOT DATA_IN
229 MOVE 0, ds_Data1, WHEN DATA_IN
230 CALL switch, WHEN NOT DATA_IN
231 MOVE 0, ds_Data1, WHEN DATA_IN
232 CALL switch, WHEN NOT DATA_IN
233 MOVE 0, ds_Data1, WHEN DATA_IN
234 CALL switch
235
236 end:
237 MOVE 0, ds_Status, WHEN STATUS
238 int int_status, WHEN NOT MSG_IN ; status not followed by msg
239 MOVE 0, ds_Msg, WHEN MSG_IN
240 CLEAR ACK
241 WAIT DISCONNECT
242 INT ok ; signal completion
243 JUMP wait_reselect
244