siop_script.ss revision 1.3 1 ; $NetBSD: siop_script.ss,v 1.3 1995/08/18 15:28:11 chopps Exp $
2
3 ;
4 ; Copyright (c) 1995 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 53c710 script
34 ;
35 ABSOLUTE ds_Device = 0
36 ABSOLUTE ds_MsgOut = ds_Device + 4
37 ABSOLUTE ds_Cmd = ds_MsgOut + 8
38 ABSOLUTE ds_Status = ds_Cmd + 8
39 ABSOLUTE ds_Msg = ds_Status + 8
40 ABSOLUTE ds_MsgIn = ds_Msg + 8
41 ABSOLUTE ds_ExtMsg = ds_MsgIn + 8
42 ABSOLUTE ds_SyncMsg = ds_ExtMsg + 8
43 ABSOLUTE ds_Data1 = ds_SyncMsg + 8
44 ABSOLUTE ds_Data2 = ds_Data1 + 8
45 ABSOLUTE ds_Data3 = ds_Data2 + 8
46 ABSOLUTE ds_Data4 = ds_Data3 + 8
47 ABSOLUTE ds_Data5 = ds_Data4 + 8
48 ABSOLUTE ds_Data6 = ds_Data5 + 8
49 ABSOLUTE ds_Data7 = ds_Data6 + 8
50 ABSOLUTE ds_Data8 = ds_Data7 + 8
51 ABSOLUTE ds_Data9 = ds_Data8 + 8
52
53 ABSOLUTE ok = 0xff00
54 ABSOLUTE err1 = 0xff01
55 ABSOLUTE err2 = 0xff02
56 ABSOLUTE err3 = 0xff03
57 ABSOLUTE err4 = 0xff04
58 ABSOLUTE err5 = 0xff05
59 ABSOLUTE err6 = 0xff06
60 ABSOLUTE err7 = 0xff07
61 ABSOLUTE err8 = 0xff08
62 ABSOLUTE err9 = 0xff09
63 ABSOLUTE err10 = 0xff0a
64
65 ENTRY scripts
66 ENTRY switch
67 ENTRY wait_reselect
68 ENTRY dataout
69 ENTRY datain
70
71 PROC scripts:
72
73 scripts:
74
75 SELECT ATN FROM ds_Device, REL(reselect)
76 ;
77 switch:
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
87 msgin:
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
96 msg_rdp:
97 msg_rej:
98 CLEAR ACK
99 CLEAR ATN
100 JUMP REL(switch)
101
102 ext_msg:
103 CLEAR ACK
104 MOVE FROM ds_ExtMsg, WHEN MSG_IN
105 JUMP REL(sync_msg), IF 0x03
106 int err7 ; extended message not SDTR
107
108 sync_msg:
109 CLEAR ACK
110 MOVE FROM ds_SyncMsg, WHEN MSG_IN
111 CLEAR ACK
112 JUMP REL(switch)
113
114 disc:
115 CLEAR ACK
116 WAIT DISCONNECT
117
118 int err2 ; signal disconnect w/o save DP
119
120 msg_sdp:
121 CLEAR ACK ; acknowledge message
122 JUMP REL(switch), WHEN NOT MSG_IN
123 MOVE FROM ds_ExtMsg, WHEN MSG_IN
124 INT err8, IF NOT 0x04 ; interrupt if not disconnect
125 CLEAR ACK
126 WAIT DISCONNECT
127
128 INT err1 ; signal disconnect
129
130 reselect:
131 wait_reselect:
132 WAIT RESELECT REL(select_adr)
133 MOVE LCRC to SFBR ; Save reselect ID
134 MOVE SFBR to SCRATCH0
135
136 INT err9, WHEN NOT MSG_IN ; didn't get IDENTIFY
137 MOVE FROM ds_Msg, WHEN MSG_IN
138 INT err3 ; let host know about reconnect
139 CLEAR ACK ; acknowlege the message
140 JUMP REL(switch)
141
142
143 select_adr:
144 MOVE SCNTL1 & 0x10 to SFBR ; get connected status
145 INT err4, IF 0x00 ; tell host if not connected
146 MOVE CTEST2 & 0x40 to SFBR ; clear Sig_P
147 JUMP REL(wait_reselect) ; and try reselect again
148
149 msgout:
150 MOVE FROM ds_MsgOut, WHEN MSG_OUT
151 JUMP REL(switch)
152
153 command_phase:
154 CLEAR ATN
155 MOVE FROM ds_Cmd, WHEN CMD
156 JUMP REL(switch)
157
158 dataout:
159 MOVE FROM ds_Data1, WHEN DATA_OUT
160 CALL REL(switch), WHEN NOT DATA_OUT
161 MOVE FROM ds_Data2, WHEN DATA_OUT
162 CALL REL(switch), WHEN NOT DATA_OUT
163 MOVE FROM ds_Data3, WHEN DATA_OUT
164 CALL REL(switch), WHEN NOT DATA_OUT
165 MOVE FROM ds_Data4, WHEN DATA_OUT
166 CALL REL(switch), WHEN NOT DATA_OUT
167 MOVE FROM ds_Data5, WHEN DATA_OUT
168 CALL REL(switch), WHEN NOT DATA_OUT
169 MOVE FROM ds_Data6, WHEN DATA_OUT
170 CALL REL(switch), WHEN NOT DATA_OUT
171 MOVE FROM ds_Data7, WHEN DATA_OUT
172 CALL REL(switch), WHEN NOT DATA_OUT
173 MOVE FROM ds_Data8, WHEN DATA_OUT
174 CALL REL(switch), WHEN NOT DATA_OUT
175 MOVE FROM ds_Data9, WHEN DATA_OUT
176 CALL REL(switch)
177
178 datain:
179 MOVE FROM ds_Data1, WHEN DATA_IN
180 CALL REL(switch), WHEN NOT DATA_IN
181 MOVE FROM ds_Data2, WHEN DATA_IN
182 CALL REL(switch), WHEN NOT DATA_IN
183 MOVE FROM ds_Data3, WHEN DATA_IN
184 CALL REL(switch), WHEN NOT DATA_IN
185 MOVE FROM ds_Data4, WHEN DATA_IN
186 CALL REL(switch), WHEN NOT DATA_IN
187 MOVE FROM ds_Data5, WHEN DATA_IN
188 CALL REL(switch), WHEN NOT DATA_IN
189 MOVE FROM ds_Data6, WHEN DATA_IN
190 CALL REL(switch), WHEN NOT DATA_IN
191 MOVE FROM ds_Data7, WHEN DATA_IN
192 CALL REL(switch), WHEN NOT DATA_IN
193 MOVE FROM ds_Data8, WHEN DATA_IN
194 CALL REL(switch), WHEN NOT DATA_IN
195 MOVE FROM ds_Data9, WHEN DATA_IN
196 CALL REL(switch)
197
198 end:
199 MOVE FROM ds_Status, WHEN STATUS
200 int err10, WHEN NOT MSG_IN ; status not followed by msg
201 MOVE FROM ds_Msg, WHEN MSG_IN
202 CLEAR ACK
203 WAIT DISCONNECT
204 INT ok ; signal completion
205 JUMP REL(wait_reselect)
206