Annotation of sys/dev/microcode/siop/osiop.ss, Revision 1.1.1.1
1.1 nbrk 1: ; $OpenBSD: osiop.ss,v 1.1 2003/01/08 02:11:38 krw Exp $
2: ; $NetBSD: osiop.ss,v 1.1 2001/04/30 04:47:51 tsutsui Exp $
3:
4: ;
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 53c710 script
35: ;
36: ARCH 710
37: ;
38: ABSOLUTE ds_Device = 0
39: ABSOLUTE ds_MsgOut = ds_Device + 8
40: ABSOLUTE ds_Cmd = ds_MsgOut + 8
41: ABSOLUTE ds_Status = ds_Cmd + 8
42: ABSOLUTE ds_Msg = ds_Status + 8
43: ABSOLUTE ds_MsgIn = ds_Msg + 8
44: ABSOLUTE ds_ExtMsg = ds_MsgIn + 8
45: ABSOLUTE ds_SyncMsg = ds_ExtMsg + 8
46: ABSOLUTE ds_Data1 = ds_SyncMsg + 8
47: ABSOLUTE ds_Data2 = ds_Data1 + 8
48: ABSOLUTE ds_Data3 = ds_Data2 + 8
49: ABSOLUTE ds_Data4 = ds_Data3 + 8
50: ABSOLUTE ds_Data5 = ds_Data4 + 8
51: ABSOLUTE ds_Data6 = ds_Data5 + 8
52: ABSOLUTE ds_Data7 = ds_Data6 + 8
53: ABSOLUTE ds_Data8 = ds_Data7 + 8
54: ABSOLUTE ds_Data9 = ds_Data8 + 8
55: ABSOLUTE ds_Data10 = ds_Data9 + 8
56: ABSOLUTE ds_Data11 = ds_Data10 + 8
57: ABSOLUTE ds_Data12 = ds_Data11 + 8
58: ABSOLUTE ds_Data13 = ds_Data12 + 8
59: ABSOLUTE ds_Data14 = ds_Data13 + 8
60: ABSOLUTE ds_Data15 = ds_Data14 + 8
61: ABSOLUTE ds_Data16 = ds_Data15 + 8
62: ABSOLUTE ds_Data17 = ds_Data16 + 8
63:
64:
65: ABSOLUTE ok = 0xff00
66: ABSOLUTE int_disc = 0xff01
67: ABSOLUTE int_disc_wodp = 0xff02
68: ABSOLUTE int_reconnect = 0xff03
69: ABSOLUTE int_connect = 0xff04
70: ABSOLUTE int_phase = 0xff05
71: ABSOLUTE int_msgin = 0xff06
72: ABSOLUTE int_extmsg = 0xff07
73: ABSOLUTE int_msgsdp = 0xff08
74: ABSOLUTE int_identify = 0xff09
75: ABSOLUTE int_status = 0xff0a
76: ABSOLUTE int_syncmsg = 0xff0b
77:
78: ENTRY scripts
79: ENTRY switch
80: ENTRY wait_reselect
81: ENTRY dataout
82: ENTRY datain
83: ENTRY clear_ack
84:
85: PROC osiop_script:
86:
87: scripts:
88:
89: SELECT ATN FROM ds_Device, REL(reselect)
90: ;
91: switch:
92: JUMP REL(msgin), WHEN MSG_IN
93: JUMP REL(msgout), IF MSG_OUT
94: JUMP REL(command_phase), IF CMD
95: JUMP REL(dataout), IF DATA_OUT
96: JUMP REL(datain), IF DATA_IN
97: JUMP REL(end), IF STATUS
98:
99: INT int_phase ; Unrecognized phase
100:
101: msgin:
102: MOVE FROM ds_MsgIn, WHEN MSG_IN
103: JUMP REL(ext_msg), IF 0x01 ; extended message
104: JUMP REL(disc), IF 0x04 ; disconnect message
105: JUMP REL(msg_sdp), IF 0x02 ; save data pointers
106: JUMP REL(msg_rej), IF 0x07 ; message reject
107: JUMP REL(msg_rdp), IF 0x03 ; restore data pointers
108: INT int_msgin ; unrecognized message
109:
110: msg_rej:
111: ; Do we need to interrupt host here to let it handle the reject?
112: msg_rdp:
113: clear_ack:
114: CLEAR ACK
115: CLEAR ATN
116: JUMP REL(switch)
117:
118: ext_msg:
119: CLEAR ACK
120: MOVE FROM ds_ExtMsg, WHEN MSG_IN
121: JUMP REL(sync_msg), IF 0x03
122: int int_extmsg ; extended message not SDTR
123:
124: sync_msg:
125: CLEAR ACK
126: MOVE FROM ds_SyncMsg, WHEN MSG_IN
127: int int_syncmsg ; Let host handle the message
128: ; If we continue from the interrupt, the host has set up a response
129: ; message to be sent. Set ATN, clear ACK, and continue.
130: SET ATN
131: CLEAR ACK
132: JUMP REL(switch)
133:
134: disc:
135: CLEAR ACK
136: WAIT DISCONNECT
137:
138: int int_disc_wodp ; signal disconnect w/o save DP
139:
140: msg_sdp:
141: CLEAR ACK ; acknowledge message
142: JUMP REL(switch), WHEN NOT MSG_IN
143: MOVE FROM ds_ExtMsg, WHEN MSG_IN
144: INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect
145: CLEAR ACK
146: WAIT DISCONNECT
147:
148: INT int_disc ; signal disconnect
149:
150: reselect:
151: wait_reselect:
152: WAIT RESELECT REL(select_adr)
153: MOVE LCRC to SFBR ; Save reselect ID
154: MOVE SFBR to SCRATCH0
155:
156: INT int_identify, WHEN NOT MSG_IN
157: MOVE FROM ds_Msg, WHEN MSG_IN
158: INT int_reconnect ; let host know about reconnect
159: CLEAR ACK ; acknowlege the message
160: JUMP REL(switch)
161:
162: select_adr:
163: MOVE SCNTL1 & 0x10 to SFBR ; get connected status
164: INT int_connect, IF 0x00 ; tell host if not connected
165: MOVE CTEST2 & 0x40 to SFBR ; clear Sig_P
166: JUMP REL(wait_reselect) ; and try reselect again
167:
168: msgout:
169: MOVE FROM ds_MsgOut, WHEN MSG_OUT
170: JUMP REL(switch)
171:
172: command_phase:
173: CLEAR ATN
174: MOVE FROM ds_Cmd, WHEN CMD
175: JUMP REL(switch)
176:
177: dataout:
178: MOVE FROM ds_Data1, WHEN DATA_OUT
179: CALL REL(switch), WHEN NOT DATA_OUT
180: MOVE FROM ds_Data2, WHEN DATA_OUT
181: CALL REL(switch), WHEN NOT DATA_OUT
182: MOVE FROM ds_Data3, WHEN DATA_OUT
183: CALL REL(switch), WHEN NOT DATA_OUT
184: MOVE FROM ds_Data4, WHEN DATA_OUT
185: CALL REL(switch), WHEN NOT DATA_OUT
186: MOVE FROM ds_Data5, WHEN DATA_OUT
187: CALL REL(switch), WHEN NOT DATA_OUT
188: MOVE FROM ds_Data6, WHEN DATA_OUT
189: CALL REL(switch), WHEN NOT DATA_OUT
190: MOVE FROM ds_Data7, WHEN DATA_OUT
191: CALL REL(switch), WHEN NOT DATA_OUT
192: MOVE FROM ds_Data8, WHEN DATA_OUT
193: CALL REL(switch), WHEN NOT DATA_OUT
194: MOVE FROM ds_Data9, WHEN DATA_OUT
195: CALL REL(switch), WHEN NOT DATA_OUT
196: MOVE FROM ds_Data10, WHEN DATA_OUT
197: CALL REL(switch), WHEN NOT DATA_OUT
198: MOVE FROM ds_Data11, WHEN DATA_OUT
199: CALL REL(switch), WHEN NOT DATA_OUT
200: MOVE FROM ds_Data12, WHEN DATA_OUT
201: CALL REL(switch), WHEN NOT DATA_OUT
202: MOVE FROM ds_Data13, WHEN DATA_OUT
203: CALL REL(switch), WHEN NOT DATA_OUT
204: MOVE FROM ds_Data14, WHEN DATA_OUT
205: CALL REL(switch), WHEN NOT DATA_OUT
206: MOVE FROM ds_Data15, WHEN DATA_OUT
207: CALL REL(switch), WHEN NOT DATA_OUT
208: MOVE FROM ds_Data16, WHEN DATA_OUT
209: CALL REL(switch), WHEN NOT DATA_OUT
210: MOVE FROM ds_Data17, WHEN DATA_OUT
211: CALL REL(switch)
212:
213: datain:
214: MOVE FROM ds_Data1, WHEN DATA_IN
215: CALL REL(switch), WHEN NOT DATA_IN
216: MOVE FROM ds_Data2, WHEN DATA_IN
217: CALL REL(switch), WHEN NOT DATA_IN
218: MOVE FROM ds_Data3, WHEN DATA_IN
219: CALL REL(switch), WHEN NOT DATA_IN
220: MOVE FROM ds_Data4, WHEN DATA_IN
221: CALL REL(switch), WHEN NOT DATA_IN
222: MOVE FROM ds_Data5, WHEN DATA_IN
223: CALL REL(switch), WHEN NOT DATA_IN
224: MOVE FROM ds_Data6, WHEN DATA_IN
225: CALL REL(switch), WHEN NOT DATA_IN
226: MOVE FROM ds_Data7, WHEN DATA_IN
227: CALL REL(switch), WHEN NOT DATA_IN
228: MOVE FROM ds_Data8, WHEN DATA_IN
229: CALL REL(switch), WHEN NOT DATA_IN
230: MOVE FROM ds_Data9, WHEN DATA_IN
231: CALL REL(switch), WHEN NOT DATA_IN
232: MOVE FROM ds_Data10, WHEN DATA_IN
233: CALL REL(switch), WHEN NOT DATA_IN
234: MOVE FROM ds_Data11, WHEN DATA_IN
235: CALL REL(switch), WHEN NOT DATA_IN
236: MOVE FROM ds_Data12, WHEN DATA_IN
237: CALL REL(switch), WHEN NOT DATA_IN
238: MOVE FROM ds_Data13, WHEN DATA_IN
239: CALL REL(switch), WHEN NOT DATA_IN
240: MOVE FROM ds_Data14, WHEN DATA_IN
241: CALL REL(switch), WHEN NOT DATA_IN
242: MOVE FROM ds_Data15, WHEN DATA_IN
243: CALL REL(switch), WHEN NOT DATA_IN
244: MOVE FROM ds_Data16, WHEN DATA_IN
245: CALL REL(switch), WHEN NOT DATA_IN
246: MOVE FROM ds_Data17, WHEN DATA_IN
247: CALL REL(switch)
248:
249: end:
250: MOVE FROM ds_Status, WHEN STATUS
251: int int_status, WHEN NOT MSG_IN ; status not followed by msg
252: MOVE FROM ds_Msg, WHEN MSG_IN
253: CLEAR ACK
254: WAIT DISCONNECT
255: INT ok ; signal completion
256: JUMP REL(wait_reselect)
CVSweb