1
2 ; Copyright (c) 1997-1999 Apple Computer, Inc. All rights reserved.
3 ;
4 ; @APPLE_LICENSE_HEADER_START@
5 ;
6 ; The contents of this file constitute Original Code as defined in and
7 ; are subject to the Apple Public Source License Version 1.1 (the
8 ; "License"). You may not use this file except in compliance with the
9 ; License. Please obtain a copy of the License at
10 ; http://www.apple.com/publicsource and read it before using this file.
11 ;
12 ; This Original Code and all software distributed under the License are
13 ; distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 ; EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 ; INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 ; FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 ; License for the specific language governing rights and limitations
18 ; under the License.
19 ;
20 ; @APPLE_LICENSE_HEADER_END@
21 ;
22 ; File Ownership:
23 ;
24 ; DRI: Mike Johnson
25 ;
26 ; Other Contact: Russ Berkoff
27 ;
28 ; Technology: SCSI
29 ;
30 ; Writers:
31 ;
32 ; (MLJ) Mike Johnson
33 ; (RRA) Rick Auricchio
34
35
36 ; NCR Errata Listing 125 Item 1 : Clear the SCNTL0 start bit
37 ; when jump to reselect during select (try_reselect)
38 ;
39 ; NCR Errata Listing 117 Item 4 : Bad parity if odd bytes during
40 ; wide transfer. Only for DATA OUT in Initiator mode.
41 ; (Confirm by Manfred Eierle 3rd June 93 not during DATA IN)
42
43 ARCH 825A ;specifically for 825a and 875 (new instructions)
44
45
46 ;*****************************************************************
47 ;
48 ; Phase codes - These values represent which action is being handled
49 ;
50 ;*****************************************************************
51
52 ABSOLUTE kphase_DATA_OUT = 0x00
53 ABSOLUTE kphase_DATA_IN = 0x01
54 ABSOLUTE kphase_COMMAND = 0x02
55 ABSOLUTE kphase_STATUS = 0x03
56 ABSOLUTE kphase_MSG_OUT = 0x06
57 ABSOLUTE kphase_MSG_IN = 0x07
58 ABSOLUTE kphase_SELECT = 0x08
59 ABSOLUTE kphase_RESELECT = 0x09
60 ABSOLUTE kphase_ABORT_CURRENT = 0x0A
61 ABSOLUTE kphase_ABORT_MAILBOX = 0x0B
62 ABSOLUTE kphase_CMD_COMPLETE = 0x0C
63 ABSOLUTE kphase_DISCONNECT = 0x0D
64 ABSOLUTE kphase_saveDataPointer = 0x0E ; ??? driver work to be done
65 ABSOLUTE kphase_restoreDataPointer = 0x0F ; ??? driver work to be done
66
67
68 ;*****************************************************************
69 ; interrupt codes
70 ;*****************************************************************
71
72 ABSOLUTE unknown_phase = 0x00 ; A spurious phase on SCSI Bus
73 ABSOLUTE status_error = 0x01 ; IO completes, but with status error
74 ABSOLUTE unexpected_msg = 0x02 ; An 'unknown' message is in ld_message var
75 ABSOLUTE unexpected_ext_msg = 0x03 ; An 'unknown' extended message in ld_message
76 ABSOLUTE wide_32_not_supported = 0x04 ; The device wants 32 bits data phase
77 ABSOLUTE no_msgin_after_reselect = 0x05 ; No message-in after reselection
78 ABSOLUTE reqack_too_large = 0x06 ; The device answer ReqAck offset is greater than 8
79 ABSOLUTE unknown_reselect = 0x07 ; The valid bit in SFBR reg not set
80 ABSOLUTE unallocated_nexus = 0x08 ; nexus index -> 0xFFFFFFFF
81 ABSOLUTE abort_mailbox = 0x09 ; Abort/BDR mailbox completed
82 ABSOLUTE abort_current = 0x0A ; Abort/BDR current op completed
83 ABSOLUTE unknown_message_out = 0x0B ; Unknown phase before message out
84 ABSOLUTE unknown_msg_reject = 0x0C ; Unknown message reject
85 ABSOLUTE negotiateSDTR = 0x0D ; Sync negotiation rx'd
86 ABSOLUTE negotiateWDTR = 0x0E ; Wide negotiation rx'd
87 ABSOLUTE sglist_complete = 0x0F ; SGList complete
88
89
90 ;*****************************************************************
91 ;
92 ; Data structure for T/L/Q Nexus:
93 ;
94 ;*****************************************************************
95
96 ABSOLUTE TLQ_SCSI_ID = 0 ; 4 SCSI ID et al for SELECT instruction
97 ABSOLUTE TLQ_xferAdr = 4 ; 4 Physical address of CHMOV instructions
98 ABSOLUTE TLQ_MSGOp = 8 ; 8 Byte count, data adr -> TLQ_MSGO
99 ABSOLUTE TLQ_CDBp = 16 ; 8 Byte count, data adr -> TLQ_CDB
100 ABSOLUTE TLQ_CDP = 24 ; 4 Current Data Pointer
101 ABSOLUTE TLQ_SDP = 28 ; 4 Saved Data Pointer
102 ABSOLUTE TLQ_index = 32 ; 1 index into nexus array
103 ABSOLUTE TLQ_xferStarted= 33 ; 1 transfer started flag
104 ABSOLUTE TLQ_IWR = 34 ; 1 flag to Ignore Wide Residue
105 ABSOLUTE TLQ_pad = 35 ; 1 pad byte
106
107
108 ;*****************************************************************
109 ;
110 ; ENTRY declarations - Declare entry points for driver
111 ;
112 ;*****************************************************************
113
114 ENTRY select_phase
115 ENTRY phase_handler
116 ENTRY issueMessageOut ; for negotiation and Reject messages
117 ENTRY issueAbort_BDR ; to immediately Abort or Bus-Device-Reset
118 ENTRY clearACK ; MsgIn done - clr ACK, jump to phase handler
119
120
121 ;*****************************************************************
122 ;
123 ; Define local data structure at start of SCRIPTS.
124 ; This structure is allocated by the following nops.
125 ;
126 ;*****************************************************************
127 ;
128
129 RELATIVE local_data \
130 00000000: ld_AbortCode = 4{??}\ ; 1 byte code to Abort or BDR
131 00000004: ld_zeroes = 4{??}\ ; 4 bytes of 0 to clear registers
132 00000008: ld_status = 4{??}\ ; Status byte from target
133 0000000C: ld_counter = 4{??}\ ; index into mailbox array
134 00000010: ld_AbortBdr_mailbox = 4{??}\ ; Abort/BusDeviceReset mailbox
135 00000014: ld_IOdone_mailbox = 4{??}\ ; [ nexus 0 0 semaphore ]
136 00000018: ld_sched_mlbx_base_adr = 4{??}\ ; base addr of mailbox array
137 0000001C: ld_mailboxp = 4{??}\ ; address of current mailbox
138 00000020: ld_scsi_id = 4{??}\ ; ptr to current mailbox
139 00000024: ld_nexus_array_base = 4{??}\ ; base address of Nexus pointers
140 00000028: ld_nexus_index = 4{??}\ ; index to Nexus pointer
141 0000002C: ld_nexus = 4{??}\ ; address of Nexus
142 00000030: ld_phase_flag = 4{??}\ ; for debugging
143 00000034: ld_device_table_base_adr = 4{??}\ ; device configuration table
144 00000038: ld_scratch = 4{??}\ ; scratch memory
145 0000003C: ld_unused = 4{??}\ ; unused
146 00000040: ld_message = 4{??}\ ; buffer for MsgIn bytes
147 00000044: ld_message4 = 4{??}\ ; buffer continuation
148 00000048: ld_pad = 4{??}\ ; padding
149 0000004C: ld_size = 4{??} ; size of this structure
150
151
152 00000000: PROC BSC_SCRIPT:
153
154 ; *** These NOPs must be at address 0. ***
155 ; *** This is reserved space for the structure "local_data". ***
156 ; *** The driver inits this area to zero. ***
157
158 00000000: 80000000 00000000 nop 0 ; ld_AbortCode, ld_zeroes
159 00000008: 80000000 00000000 nop 0 ; ld_status, ld_counter
160
161 00000010: 80000000 00000000 nop 0 ; ld_AbortBdr_mailbox, ld_IOdone_mailbox
162 00000018: 80000000 00000000 nop 0 ; ld_sched_mlbx_base_adr, ld_mailboxp
163
164 00000020: 80000000 00000000 nop 0 ; ld_scsi_id, ld_nexus_array_base
165 00000028: 80000000 00000000 nop 0 ; ld_nexus_index, ld_nexus
166
167 00000030: 80000000 00000000 nop 0 ; ld_phase_flag, ld_device_table_base_adr
168 00000038: 80000000 00000000 nop 0 ; ld_scratch, ld_unused
169
170 00000040: 80000000 00000000 nop 0 ; ld_message, ld_message4
171 00000048: 80000000 0000004C nop ld_size ; ld_pad, ld_size (Use ld_size or lose it)
172
173 00000050: 80000000 0000000F nop sglist_complete ; use sglist_complete or lose it from gen'd output file
174
175 ;****************************************************************************
176 ;
177 ; findNexusFromIndex - load DSA with pointer to Nexus given a Nexus index:
178 ;
179 ;****************************************************************************
180
181 00000058: findNexusFromIndex:
182
183 00000058: E1340004 00000028 load SCRATCHA0, 4, ld_nexus_index ; load index and leading zeroes
184 00000060: 60000400 00000000 clear CARRY
185 00000068: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double the index
186 00000070: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1
187 00000078: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double again
188 00000080: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1 ; A0 now has index to 4-byte address
189 00000088: E0340004 0000009C store SCRATCHA0, 4, patchArrayOffset+4 ; *** patch the code
190
191 00000090: E1100004 00000024 load DSA0, 4, ld_nexus_array_base ; load base address of array of Nexus pointers
192 00000098: patchArrayOffset:
193 00000098: F1100004 00000000 load DSA0, 4, DSAREL( 0 ) ; *** patched offset. Load pointer.
194
195 000000A0: 72100000 00000000 move DSA0 to SFBR ; Ensure pointer is not 0xFFFFFFFF
196 000000A8: 980C00FF 00000008 int unallocated_nexus, if 0xFF ; Interrupt if NFG
197
198 000000B0: E0100004 0000002C store DSA0, 4, ld_nexus ; Store the Nexus pointer
199 000000B8: 90080000 00000000 return ; end findNexusFromIndex
200
201
202 ;****************************************************************************
203 ;
204 ; initContext - Initialize the registers for Sync and Wide using
205 ; values stored in the device configuration table.
206 ; Return with values in SCRATCHB for Select code.
207 ;
208 ;****************************************************************************
209
210 000000C0: initContext:
211
212 000000C0: E15C0004 00000020 load SCRATCHB0, 4, ld_scsi_id ; load 4-bit SCSI ID and zeroes
213 000000C8: 60000400 00000000 clear CARRY
214 000000D0: 795C0000 00000000 move SCRATCHB0 SHL SCRATCHB0 ; * 2
215 000000D8: 795C0000 00000000 move SCRATCHB0 SHL SCRATCHB0 ; * 2 -> UInt32 index
216 000000E0: E05C0004 000000F4 store SCRATCHB0, 4, patchGetDevConfigOffset+4 ; *** Patch load code
217
218 000000E8: E1100004 00000034 load DSA0, 4, ld_device_table_base_adr ; load base physical addr of tables
219
220 000000F0: patchGetDevConfigOffset:
221 000000F0: F15C0004 00000000 load SCRATCHB0, 4, DSAREL( 0 ) ; *** Patched table offset ***
222
223 ; SCRATCHB0 = 0
224 ; SCRATCHB1 = TP,MO (SXFER bits7-5 bits3-0)
225 ; SCRATCHB2 = 0 (position for SCSI ID)
226 ; SCRATCHB3 = SCCF,EWS (SCNTL3 bits6-4 bit 3)
227
228 000000F8: 725D0000 00000000 move SCRATCHB1 to SFBR ; init SXFER from B1
229 00000100: 6A050000 00000000 move SFBR to SXFER
230 ; Init SCNTL3 from B3
231 00000108: 725F0000 00000000 move SCRATCHB3 to SFBR
232 00000110: 6A030000 00000000 move SFBR to SCNTL3
233 00000118: 90080000 00000000 return ; return with SCRATCHB intact.
234
235
236 ;*****************************************************************
237 ;
238 ; Select_phase:
239 ; Clear the SIGP bit.
240 ; Check if any Abort/BusDeviceReset request waiting.
241 ; Nexus is found in the list of 256 mailboxes.
242 ; If current mailbox is empty, jump to reselect_phase.
243 ; SCRIPTS tries to select device.
244 ; If select fails due to reselect, jump to reselect_phase
245 ; Select Timeout handled by driver.
246 ; If select succeeds, clear the mailbox entry
247 ; and increment the mailbox counter.
248 ; Jump to the phase_handler (hopefully for MSG_OUT)
249 ;
250 ;*****************************************************************
251
252 00000120: select_phase:
253
254 00000120: 7A1A0000 00000000 move CTEST2 | 0x00 to CTEST2 ; Clear SIGP bit from ISTAT reg
255
256 ; Check abort mailbox:
257
258 00000128: E1340004 00000010 load SCRATCHA0, 4, ld_AbortBdr_mailbox ; Get AbortBdr mailbox
259 ; The Identify byte in byte 0 is also the semaphore
260 ; A0 = Identify byte (0xC0 + LUN N.B. Disconnect allowed)
261 ; A1 = Tag, if any
262 ; A2 = SCSI ID
263 ; A3 = Abort code Abort=0x06; Abort Tag=0D; Bus Device Reset=0x0C
264 00000130: 72340000 00000000 move SCRATCHA0 to SFBR ; test the semaphore/Identify
265 00000138: 80840000 000005F0 jump rel( AbortMailbox ), if not 0 ; jump if aborting
266
267
268 ; Get the next IO nexus in the mailboxes circular list.
269 ; Calculate current mailbox address as so:
270 ; counter byte index * 4 to get mailbox index
271 ; add base physical address of mailboxes giving current mailbox address
272
273 00000140: E1340004 0000000C load SCRATCHA0, 4, ld_counter ; get 1-byte mailbox counter & 0s
274 00000148: 60000400 00000000 clear CARRY
275 00000150: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double it
276 00000158: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1
277 00000160: 79340000 00000000 move SCRATCHA0 SHL 0 to SCRATCHA0 ; double it again
278 00000168: 79350000 00000000 move SCRATCHA1 SHL 0 to SCRATCHA1 ; now have a UInt32 index
279 00000170: E0340004 0000018C store SCRATCHA0, 4, fetchMailbox+4 ; *** patch the load DSA instruction
280 00000178: E0340004 0000025C store SCRATCHA0, 4, clear_mailbox+4 ; *** patch the store DSA instruction
281
282 00000180: E1100004 00000018 load DSA0, 4, ld_sched_mlbx_base_adr ; load base physical address of mailboxes
283
284 00000188: fetchMailbox:
285 00000188: F1100004 00000000 load DSA0, 4, DSAREL( 0 ) ; *** Patched offset. Load Nexus address
286 00000190: E0100004 0000002C store DSA0, 4, ld_nexus ; save pointer to current Nexus
287 00000198: E1340004 0000002C load SCRATCHA0, 4, ld_nexus ; copy to A0
288
289 000001A0: 72340000 00000000 move SCRATCHA0 to SFBR ;
290 000001A8: 808C0001 00000098 jump rel( next_mailbox ), if 1 ; if low-byte == 0x01 then cancelled mailbox
291
292 000001B0: 72B50000 00000000 move SCRATCHA1 | SFBR to SFBR ; if non-zero, have implicit semaphore
293 000001B8: 72B60000 00000000 move SCRATCHA2 | SFBR to SFBR
294 000001C0: 72B70000 00000000 move SCRATCHA3 | SFBR to SFBR
295 000001C8: 808C0000 00000458 jump rel( reselect_phase ), if 0 ; go to reselect_phase if empty
296
297 ;*****************************************************************
298 ;
299 ; Something in mailbox: we have work to do
300 ;
301 ;*****************************************************************
302
303 000001D0: 785C0800 00000000 move kphase_SELECT to SCRATCHB0 ; set phase indicator
304 000001D8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
305
306 000001E0: E15C0004 00000004 load SCRATCHB0, 4, ld_zeroes ; clr the invalid-nexus-index flag
307 000001E8: F15C0001 00000020 load SCRATCHB0, 1, DSAREL( TLQ_index ) ; get index byte from nexus
308 000001F0: E05C0004 00000028 store SCRATCHB0, 4, ld_nexus_index ; save it in local data
309
310 000001F8: E1100004 0000002C load DSA0, 4, ld_nexus ; restore DSA register
311 00000200: F15E0001 00000002 load SCRATCHB2, 1, DSAREL( TLQ_SCSI_ID+2 ) ; get Target's SCSI ID
312 00000208: 725E0000 00000000 move SCRATCHB2 to SFBR
313 00000210: 6A5C0000 00000000 move SFBR to SCRATCHB0 ; position it
314 00000218: E05C0001 00000020 store SCRATCHB0, 1, ld_scsi_id ; save it
315 00000220: 88880000 FFFFFE98 call rel( initContext ) ; setup Sync/Wide regs in SCRATCHB
316 00000228: E1100004 0000002C load DSA0, 4, ld_nexus ; restore DSA register
317 00000230: F05D0001 00000001 store SCRATCHB1, 1, DSAREL( TLQ_SCSI_ID+1 ) ; SXFER
318 00000238: F05F0001 00000003 store SCRATCHB3, 1, DSAREL( TLQ_SCSI_ID+3 ) ; SCNTL3
319
320 ;********************** select the device ********************************
321 00000240: 47000000 000003D0 SELECT ATN from TLQ_SCSI_ID, rel( try_reselect ) ; ************************
322 ;*************************************************************************
323
324 ; looking good - clear the mailbox:
325
326 00000248: next_mailbox:
327 00000248: E1340004 00000004 load SCRATCHA0, 4, ld_zeroes ; zero out scratch register A
328 00000250: E1100004 00000018 load DSA0, 4, ld_sched_mlbx_base_adr ; load base physical address of mailboxes
329 00000258: clear_mailbox:
330 00000258: F0340004 00000000 store SCRATCHA0, 4, DSAREL( 0 ) ; *** Patched offset. Zero the mailbox
331
332 ; Update the index to the mailbox circular list:
333 00000260: E15C0001 0000000C load SCRATCHB0, 1, ld_counter ; get counter (mailbox index)
334 00000268: 7E5C0100 00000000 move SCRATCHB0 + 1 to SCRATCHB0 ; add 1
335 00000270: E05C0001 0000000C store SCRATCHB0, 1, ld_counter ; put it back
336
337 00000278: E15C0001 0000002C load SCRATCHB0, 1, ld_nexus ; if low-byte == 0x01 then cancelled mailbox
338 00000280: 725C0000 00000000 move SCRATCHB0 to SFBR
339 00000288: 808C0001 FFFFFE90 jump rel( select_phase ), if 1
340
341 ; *** FALL THROUGH TO phase_handler ***
342
343
344 ;*****************************************************************
345 ;
346 ; Phase_handler
347 ; The phase handler script is a dispatcher function of SCSI phase
348 ;
349 ;*****************************************************************
350
351 00000290: phase_handler:
352 00000290: E1100004 0000002C load DSA0, 4, ld_nexus ; reload DSA
353 00000298: 828B0000 00000088 jump rel( command_phase ), when CMD ; wait for REQ
354 000002A0: 808A0000 000000A8 jump rel( data_out_phase ), if DATA_OUT ; already latched REQ signal
355 000002A8: 868A0000 00000020 jump rel( message_out_phase ), if MSG_OUT
356 000002B0: 818A0000 000000E0 jump rel( data_in_phase ), if DATA_IN
357 000002B8: 838A0000 00000108 jump rel( status_phase ), if STATUS
358 000002C0: 878A0000 00000120 jump rel( message_in_phase ), if MSG_IN
359 000002C8: 98080000 00000000 int unknown_phase
360
361
362 ;*****************************************************************
363 ;
364 ; Message-Out phase
365 ;
366 ;*****************************************************************
367
368 000002D0: message_out_phase:
369 000002D0: 785C0600 00000000 move kphase_MSG_OUT to SCRATCHB0 ; Set phase indicator
370 000002D8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
371
372 000002E0: 1E000000 00000008 move from TLQ_MSGOp, when MSG_OUT ; put out the message(s)
373 000002E8: 80880000 FFFFFFA0 jump rel( phase_handler )
374
375
376 ; issueMessageOut - Driver entry point for Sync/Wide negotiation and
377 ; to issue message Reject:
378
379 000002F0: issueMessageOut:
380 000002F0: 58000008 00000000 set ATN ; tell Target we have something to say
381 000002F8: 60000040 00000000 clear ACK
382 00000300: 868B0000 FFFFFFC8 jump rel( message_out_phase ), when MSG_OUT ; wait for REQ. Jump if msg-out phase.
383 00000308: 87820000 FFFFFF80 jump rel( phase_handler ), if not MSG_IN ; jump if weird phase
384 00000310: 0F000001 00000039 move 1, ld_scratch+1, when MSG_IN ; dump the msg byte
385 00000318: 60000040 00000000 clear ACK ; accept Target's last msg-in byte
386 00000320: 80880000 FFFFFFC8 jump rel( issueMessageOut )
387
388
389 ;*****************************************************************
390 ;
391 ; Command phase
392 ;
393 ;*****************************************************************
394
395 00000328: command_phase:
396 00000328: 785C0200 00000000 move kphase_COMMAND to SCRATCHB0 ; Set phase indicator
397 00000330: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
398
399 00000338: 60000008 00000000 clear ATN ; In case we missed the sending nego
400 00000340: 1A000000 00000010 move FROM TLQ_CDBp, when CMD ; issue the CDB
401 00000348: 80880000 FFFFFF40 jump rel( phase_handler )
402
403
404 ;*****************************************************************
405 ;
406 ; Data_out_phase
407 ;
408 ;*****************************************************************
409
410 00000350: data_out_phase:
411 00000350: 785C0000 00000000 move kphase_DATA_OUT to SCRATCHB0 ; Set phase indicator
412 00000358: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
413
414 00000360: 88880000 00000008 call rel( driverXfer ) ; call driver-built CHMOV instructions
415 00000368: 80880000 FFFFFF20 jump rel( phase_handler ) ; if all data xfer'd, get next phase
416
417 00000370: driverXfer: ; get here from data-in code also
418 00000370: F1340004 00000004 load SCRATCHA0, 4, DSAREL( TLQ_xferAdr )
419 00000378: E0340004 00000394 store SCRATCHA0, 4, doItPatch+4 ; *** patch the JUMP address
420 00000380: 7835FF00 00000000 move 0xFF to SCRATCHA1
421 00000388: F0350001 00000021 store SCRATCHA1, 1, DSAREL( TLQ_xferStarted )
422
423 00000390: doItPatch:
424 00000390: 80080000 00000333 jump 0x0333 ; *** patched address
425
426
427
428 ;*****************************************************************
429 ;
430 ; Data_in_phase
431 ; 875 sets ATN if bad parity detected.
432 ; Use of CHMOV instructions assures that we properly handle
433 ; a leftover wide byte in the SWIDE or SODL register, depending
434 ; on the data direction. This can happen in either of two conditions:
435 ; 1. The Target disconnects at an odd boundary. This is
436 ; extremely unlikely with disk devices.
437 ; 2. The client passes either an odd buffer address or
438 ; an odd transfer count. When the Target disconnects (at
439 ; an even boundary, we end up with the extra wide
440 ; byte in SWIDE or SODL. MacOS does this with VM on.
441 ;
442 ;*****************************************************************
443
444 00000398: data_in_phase:
445 00000398: 785C0100 00000000 move kphase_DATA_IN to SCRATCHB0 ; Set phase indicator
446 000003A0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
447
448 000003A8: 88880000 FFFFFFC0 call rel( driverXfer ) ; call driver-built CHMOV instructions
449
450 ; The driver gets interrupted if a phase mismatch occurs as when
451 ; the Target goes MSG-IN with a Disconnect.
452 ; The driver codes either a RETURN if the Scatter/Gather list is complete or
453 ; an INT if more Scatter/Gather elements need to be generated.
454 ; On the Macintosh, client programs expect extra incoming data to be dumped.
455 ; For example, during boot the ROM reads 512 bytes from a 2K-byte-sector CD.
456
457 000003B0: bucket_loop:
458 000003B0: 81830000 FFFFFED8 jump rel( phase_handler ), when not DATA_IN ; wait for phase, exit if changed
459 000003B8: 01000001 00000008 CHMOV 1, ld_status, when DATA_IN ; eat a byte
460 000003C0: 80880000 FFFFFFE8 jump rel( bucket_loop ); ; keep dumping bytes
461
462
463 ;*****************************************************************
464 ;
465 ; Status phase
466 ;
467 ;*****************************************************************
468
469 000003C8: status_phase:
470 000003C8: 785C0300 00000000 move kphase_STATUS to SCRATCHB0 ; Set phase indicator
471 000003D0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
472
473 000003D8: 0B000001 00000008 move 1, ld_status, when STATUS ; Read Status byte from bus
474 000003E0: 80880000 FFFFFEA8 jump rel( phase_handler )
475
476
477 ;*****************************************************************
478 ;
479 ; Message-In phase
480 ;
481 ;*****************************************************************
482
483 000003E8: message_in_phase:
484 000003E8: 785C0700 00000000 move kphase_MSG_IN to SCRATCHB0 ; Set phase indicator
485 000003F0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
486
487 000003F8: 0F000001 00000040 move 1, ld_message, when MSG_IN ; Read byte from bus
488
489 00000400: 808C0000 000000C0 jump rel( cmdComplete ), if 0x00 ; Command Complete
490 00000408: 808C0002 000001A8 jump rel( saveDataPointer ), if 0x02 ; Save Data Pointer
491 00000410: 808C0004 00000148 jump rel( disconnect_msg ), if 0x04 ; Disconnect
492 00000418: 808C0023 00000038 jump rel( ignoreWideResidue ), if 0x23 ; Ignore Wide Residue
493 00000420: 808C0003 000001B0 jump rel( restoreDataPointer ), if 0x03 ; Restore Data Pointer
494 00000428: 808C0001 00000058 jump rel( extended_msg ), if 0x01 ; Extended message
495 00000430: 808C0007 00000008 jump rel( msg_reject ), if 0x07 ; Message Reject
496 ; Identify, if 0x80-FF ; Identify + LUN
497 ; simple_queue_tag, if 0x20 ; Simple Queue Tag
498 ; initiate_recovery, if 0x0F ; Initiate Recovery
499 ; linked_cde_complete, if 0x0A/0x0B
500 00000438: 98080000 00000002 int unexpected_msg ; unknown
501
502 00000440: msg_reject:
503 00000440: 98080000 0000000C int unknown_msg_reject
504
505 00000448: clearACK: ; ENTRY point to end negotiation
506 00000448: 60000040 00000000 clear ACK
507 00000450: 80880000 FFFFFE38 jump rel( phase_handler )
508
509
510
511 ;*****************************************************************
512 ;
513 ; Ignore Wide Residue
514 ;
515 ;*****************************************************************
516
517 00000458: ignoreWideResidue: ; this is a two byte message so snag the 2nd byte here
518 00000458: 60000040 00000000 clear ACK
519 00000460: 0F000001 00000041 move 1, ld_message+1, when MSG_IN ; save residue count
520 00000468: 6A5E0000 00000000 move SFBR to SCRATCHB2 ; byte is still in SFBR. Position it.
521 00000470: F05E0001 00000022 store SCRATCHB2, 1, DSAREL( TLQ_IWR ) ; Store residue count in Nexus for driver.
522 00000478: 60000040 00000000 clear ACK
523 00000480: 80880000 FFFFFE08 jump rel( phase_handler )
524
525
526 ;*****************************************************************
527 ;
528 ; Extended message
529 ; Accept Wide and Synchronous Data Transfer messages
530 ;
531 ;*****************************************************************
532
533 00000488: extended_msg:
534 00000488: 60000040 00000000 clear ACK
535 00000490: 0F000001 00000041 move 1, ld_message+1, when MSG_IN ; read msg length byte from bus
536 00000498: 60000040 00000000 clear ACK
537 000004A0: 0F000001 00000042 move 1, ld_message+2, when MSG_IN ; read ext msg code from bus
538 000004A8: 60000040 00000000 clear ACK
539 ; extended_identify, IF 0x02
540 ; modify_data_pointer, if 0x00
541 000004B0: 808C0001 00000140 jump rel( sdtr ), if 0x01 ; jump if SDTR, sync negotiation msg
542 000004B8: 808C0003 00000148 jump rel( wdtr ), if 0x03 ; jump if WDTR, wide negotiation msg
543 000004C0: 98080000 00000003 int unexpected_ext_msg ; let driver deal with unknown
544
545
546 ;*****************************************************************
547 ;
548 ; Command complete
549 ; The Command-Complete message is sent to indicate that the
550 ; IO operation has completed and valid status has been sent.
551 ; The Target should then disconnect.
552 ; SCRIPTS must spin until the IOdone mailbox is empty.
553 ; Then it sets the IOdone mailbox with the current Nexus.
554 ; The status message is analyzed.
555 ; If status is good, INTF the driver and jump to select_phase.
556 ; If status is NG, save it in the NEXUS and INT the driver.
557 ;
558 ;*****************************************************************
559
560 000004C8: cmdComplete:
561 000004C8: 785C0C00 00000000 move kphase_CMD_COMPLETE to SCRATCHB0 ; Set phase indicator
562 000004D0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
563
564 000004D8: 7C027F00 00000000 move SCNTL2 & 0X7F to SCNTL2 ; Clr SDU: SCSI Disconnect Unexpected
565 000004E0: 60000040 00000000 clear ACK
566 000004E8: 48000000 00000000 WAIT DISCONNECT
567
568 000004F0: testMbxLp: ; loop until IOdone mailbox empty
569 000004F0: E1340004 00000014 load SCRATCHA0, 4, ld_IOdone_mailbox
570 000004F8: 72370000 00000000 move SCRATCHA3 to SFBR ; A3 = semaphore
571 00000500: 80840000 FFFFFFE8 jump rel( testMbxLp ), if not 0
572
573 ; Fill in the IOdone mailbox with the following:
574 ; A0 = index to Nexus
575 ; A1 = Status
576 ; A2 = 0
577 ; A3 = semaphore (FF = set)
578 00000508: E1340001 00000028 load SCRATCHA0, 1, ld_nexus_index ; A0 = index to Nexus
579 00000510: E15C0001 00000008 load SCRATCHB0, 1, ld_status
580 00000518: 725C0000 00000000 move SCRATCHB0 to SFBR
581 00000520: 6A350000 00000000 move SFBR to SCRATCHA1 ; A1 = Status
582 00000528: 78360000 00000000 move 0x00 to SCRATCHA2 ; A2 = 0
583 00000530: 7837FF00 00000000 move 0xFF to SCRATCHA3 ; A3 = semaphore IOdone mailbox
584 00000538: E0340004 00000014 store SCRATCHA0, 4, ld_IOdone_mailbox
585
586 00000540: 72350000 00000000 move SCRATCHA1 to SFBR ; Test the Status of this IO
587 ; SFBR = status msg
588 ; Test status - If good, Interrupt on the fly and jump to select phase
589 00000548: 981CC100 000000FF intfly 0xFF, if 0 and mask 0xC1 ; mask off reserved bits
590 00000550: 808CC100 FFFFFBC8 jump rel( select_phase ), if 0 and mask 0xC1
591 00000558: 98080000 00000001 int status_error ; Status err. Interrupt driver & stop
592
593
594 ;*****************************************************************
595 ;
596 ; Disconnect
597 ; The 8xx Accepts the disconnection and jumps to the select_phase
598 ; to check for another IO
599 ;
600 ;*****************************************************************
601
602 00000560: disconnect_msg:
603 00000560: E15C0001 00000030 load SCRATCHB0, 1, ld_phase_flag
604 00000568: 725C0000 00000000 move SCRATCHB0 to SFBR
605 ; If we got here from reselect just bailout since ld_nexus is
606 ; not setup and the code using it is not needed anyway (no data xfer)
607 00000570: 808C0009 00000010 jump rel( bailout ), if kphase_RESELECT
608
609 00000578: 785C0D00 00000000 move kphase_DISCONNECT to SCRATCHB0
610 00000580: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
611
612 00000588: bailout:
613 00000588: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
614 00000590: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
615 00000598: 7C027F00 00000000 move SCNTL2 & 0x7F to SCNTL2 ; Clr SDU: SCSI Disconnect Unexpected
616 000005A0: 60000040 00000000 clear ACK
617 000005A8: 48000000 00000000 WAIT DISCONNECT ; wait for bus-free
618 000005B0: 80880000 FFFFFB68 jump rel( select_phase ) ; go see if more to do
619
620
621 ;******************************************************************
622 ;
623 ; ??? mlj - saveDataPointer and restoreDataPointer are incorrect.
624 ; ??? They basically do nothing.
625 ; Save Data Pointer
626 ;
627 ;*****************************************************************
628
629 000005B8: saveDataPointer:
630 000005B8: 785C0E00 00000000 move kphase_saveDataPointer to SCRATCHB0
631 000005C0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
632 000005C8: 60000040 00000000 clear ACK
633 000005D0: 80880000 FFFFFCB8 jump rel( phase_handler )
634
635
636 ;******************************************************************
637 ;
638 ; ??? mlj - saveDataPointer and restoreDataPointer are incorrect.
639 ; ??? They basically do nothing.
640 ; Restore Data Pointer
641 ; The local values still blocks, still bytes and data address
642 ; must be loaded from the corresponding NEXUS data set.
643 ; This message should followed an IDE (parity error)
644 ;
645 ;*****************************************************************
646
647 000005D8: restoreDataPointer:
648 000005D8: 785C0F00 00000000 move kphase_restoreDataPointer to SCRATCHB0
649 000005E0: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
650 000005E8: 60000040 00000000 clear ACK
651 000005F0: 80880000 FFFFFC98 jump rel( phase_handler )
652
653
654 ;*****************************************************************
655 ;
656 ; Synchronous data transfer request or response
657 ;
658 ;*****************************************************************
659 000005F8: sdtr:
660 000005F8: 0F000002 00000043 move 2, ld_message+3, when MSG_IN ; Read period & offset from bus
661 00000600: 98080000 0000000D int negotiateSDTR
662
663
664 ;***************************************************************************
665 ;
666 ; Wide Data Transfer request or response
667 ;
668 ;***************************************************************************
669 00000608: wdtr:
670 00000608: 0F000001 00000043 move 1, ld_message+3, when MSG_IN ; get Transfer Width Exponent fm bus
671 00000610: 98080000 0000000E int negotiateWDTR
672
673
674 ;*****************************************************************
675 ;
676 ; Reselect phase
677 ; The chip waits here either for a Reselection from a Target or
678 ; a SIGP from the driver indicating something in the mailbox.
679 ; If reselected, the script uses the Nexus value which is either
680 ; a Tag or a SCSI ID/LUN combo to lookup the Nexus.
681 ; Then init the SXFER and SCNTL3 registers from the device config table.
682 ;
683 ;*****************************************************************
684
685 00000618: try_reselect: ; Select failed - probably reselecting
686 ; Cf NCR Errata Listing 117 Item 1:
687 00000618: 7C00DF00 00000000 move SCNTL0 & 0xDF to SCNTL0 ; clr Start bit
688 00000620: 7A1A0000 00000000 move CTEST2 | 0x00 to CTEST2 ; Clear SIGP bit from ISTAT reg
689
690 00000628: reselect_phase:
691 00000628: 785C0900 00000000 move kphase_RESELECT to SCRATCHB0 ; Set phase indicator
692 00000630: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
693
694 00000638: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
695 00000640: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
696
697 ; wait here for reselect from a Target
698 ; or SIGP from the driver
699
700 00000648: 54000000 FFFFFAD0 WAIT RESELECT REL( select_phase ) ; jump if SIGP
701
702 ; Reselected:
703
704 00000650: 720A0000 00000000 move SSID to SFBR ; SSID = [ Valxxx Scsi_id ]
705 00000658: 980C7F00 00000007 int unknown_reselect, if 0 and mask 0x7F; Interrupt if VAL bit not set
706 00000660: 6C5C0F00 00000000 move SFBR & 0x0F to SCRATCHB0 ; B0 = Target ID
707 00000668: E05C0001 00000020 store SCRATCHB0, 1, ld_scsi_id ; save it
708
709 00000670: 88880000 FFFFFA48 call rel( initContext ) ; setup sync regs here
710
711 00000678: 9F030000 00000005 int no_msgin_after_reselect, when not MSG_IN
712
713 00000680: 0F000001 00000040 move 1, ld_message, when MSG_IN ; Read Identify byte from bus
714
715 ; if another REQ is asserted, a SimpleQueueTag message should be next
716
717 00000688: 60000040 00000000 clear ACK ; notify Target: msg byte rx'd
718 00000690: 878B0000 00000048 jump rel( getNextMsg ), when MSG_IN ; jump if SimpleQueueTag coming
719
720 ; untagged operation:
721
722 00000698: 6C340700 00000000 move SFBR & 0x07 to SCRATCHA0 ; isolate LUN from Identify byte
723
724 000006A0: E15C0001 00000020 load SCRATCHB0, 1, ld_scsi_id ; B0 = Target ID
725 000006A8: 60000400 00000000 clear CARRY
726 000006B0: 715C0000 00000000 move SCRATCHB0 SHL SFBR ; shift left #1
727 000006B8: 695C0000 00000000 move SFBR SHL SCRATCHB0 ; shift left #2
728 000006C0: 715C0000 00000000 move SCRATCHB0 SHL SFBR ; shift left #3
729 000006C8: 7AB40000 00000000 move SCRATCHA0 | SFBR to SCRATCHA0 ; form Nexus index = 0b0TTTTLLL
730
731 000006D0: E0340001 00000028 store SCRATCHA0, 1, ld_nexus_index ; store as index to Nexus
732 000006D8: 80880000 00000030 jump rel( haveNexusIndex )
733
734 ; should be tagged operation:
735
736 000006E0: getNextMsg:
737 000006E0: 0F000001 00000040 move 1, ld_message, when MSG_IN ; read message byte from bus
738 000006E8: 808C0004 FFFFFE70 jump rel( disconnect_msg ), if 0x04 ; if Disconnect, oh well.
739 000006F0: 60000040 00000000 clear ACK
740 000006F8: 80840020 FFFFFB90 jump rel( phase_handler ), if not 0x20; Branch if not Queue tag code
741 ; get the Queue Tag and save as the nexus index
742 00000700: 0F000001 00000028 move 1, ld_nexus_index, when MSG_IN ; Nexus index <- Tag from bus
743 00000708: 60000040 00000000 clear ACK ; acknowledge it
744
745 00000710: haveNexusIndex:
746 00000710: 785F0000 00000000 move 0x00 to SCRATCHB3 ; clear invalid-nexus-index flag
747 00000718: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
748 00000720: 88880000 FFFFF930 call rel( findNexusFromIndex ) ; set DSA <- Nexus pointer
749 00000728: 80880000 FFFFFB60 jump rel( phase_handler ) ; start handling phases.
750
751
752 ;*****************************************************************
753 ;
754 ; AbortMailbox - Abort (or BusDeviceReset) the mailbox entry.
755 ; This is a queued operation - not an immediate
756 ; operation as is issueAbort_BDR.
757 ; The Abort message clears all IO processes for the
758 ; selecting Initiator on the specified LUN.
759 ;
760 ; The Bus Device Reset message clears all IO processes for
761 ; all Initiators on all LUNs of selected Target.
762 ; It forces a hard reset condition to the selected SCSI device.
763 ;
764 ; A0 = Identify byte (0xC0 + LUN N.B. Disconnect allowed)
765 ; A1 = Tag, if any
766 ; A2 = SCSI ID
767 ; A3 = Abort code Abort=0x06; Abort Tag=0D; Bus Device Reset=0x0C
768 ;
769 ; Mailbox not cleared by SCRIPTS so that driver can find SCSI ID when done
770 ; N.B.: Device is Async and Narrow after BDR!!!
771 ; Driver must set the device config table values accordingly.
772 ;*****************************************************************
773
774 00000730: AbortMailbox:
775 00000730: 785C0B00 00000000 move kphase_ABORT_MAILBOX to SCRATCHB0 ; Set phase code
776 00000738: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
777
778 00000740: 785FFF00 00000000 move 0xFF to SCRATCHB3 ; invalidate nexus index for driver
779 00000748: E05F0001 0000002B store SCRATCHB3, 1, ld_nexus_index+3
780
781 00000750: E15E0001 00000012 load SCRATCHB2, 1, ld_AbortBdr_mailbox+2 ; get SCSI ID
782 00000758: E05E0001 00000762 store SCRATCHB2, 1, AbortSelect+2 ; *** Patch the Select/ATN instruction
783
784 00000760: AbortSelect:
785 00000760: 45000000 FFFFFEB0 SELECT ATN 0, REL( try_reselect ) ; *** Patched SCSI ID
786
787 00000768: 72350000 00000000 move SCRATCHA1 to SFBR ; check for Tag
788 00000770: 80840000 00000038 jump rel( taggedAbort ) if not 0x00 ; jump if tagged abort
789
790 ; untagged Abort or BusDeviceReset:
791
792 00000778: 72370000 00000000 move SCRATCHA3 to SFBR ; position the abort code
793 00000780: 6A350000 00000000 move SFBR to SCRATCHA1
794 00000788: E0340002 00000038 store SCRATCHA0, 2, ld_scratch ; Store Identify and Abort msgs
795 00000790: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
796 00000798: 0E000002 00000038 move 2, ld_scratch , when MSG_OUT ; emit Identify and Abort messages
797 000007A0: 48000000 00000000 WAIT DISCONNECT
798 000007A8: 98080000 00000009 int abort_mailbox
799
800 ; AbortTag:
801
802 000007B0: taggedAbort:
803 000007B0: 72350000 00000000 move SCRATCHA1 to SFBR ; position the Tag
804 000007B8: 6A360000 00000000 move SFBR to SCRATCHA2
805 000007C0: 78352000 00000000 move 0x20 to SCRATCHA1 ; gen SimpleQueueTag code
806 000007C8: E0340004 00000038 store SCRATCHA0, 4, ld_scratch ; store Identify, SQT, Tag, AbortTag
807 000007D0: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
808 000007D8: 0E000004 00000038 move 4, ld_scratch, when MSG_OUT ; emit all 4 bytes
809 000007E0: 48000000 00000000 WAIT DISCONNECT
810 000007E8: 98080000 00000009 int abort_mailbox
811
812
813 ;*****************************************************************
814 ;
815 ; issueAbort_BDR - Abort (or BusDeviceReset) the current operation.
816 ; This is an immediate operation - not a queued operation
817 ; as is AbortMailbox.
818 ; The Abort message clears all IO processes for the
819 ; selecting Initiator on the specified LUN.
820 ;
821 ; The Bus Device Reset message clears all IO processes for
822 ; all Initiators on all LUNs of selected Target.
823 ; It forces a hard reset condition to the selected SCSI device.
824 ;
825 ;*****************************************************************
826
827 000007F0: issueAbort_BDR:
828 000007F0: 785C0A00 00000000 move kphase_ABORT_CURRENT to SCRATCHB0 ; Set phase code
829 000007F8: E05C0001 00000030 store SCRATCHB0, 1, ld_phase_flag
830
831 00000800: 74140800 00000000 move ISTAT & 0x08 to SFBR ; see if Target connected to bus
832 00000808: 980C0000 0000000A int abort_current, if 0 ; interrupt driver if not connected
833
834 00000810: 58000008 00000000 SET ATN ; get Target's attention
835 00000818: E1100004 0000002C load DSA0, 4, ld_nexus ; load pointer to Nexus
836
837 00000820: bucketLoop:
838 00000820: 60000040 00000000 clear ACK
839 00000828: 868B0000 000000A8 jump rel( sendAbortBDR ), when MSG_OUT ; wait for REQ. Jump if OK.
840
841 00000830: 838A0000 00000030 jump rel( BucketInStatus ), if STATUS ; bit bucket in
842 00000838: 878A0000 00000038 jump rel( BucketInMsg ), if MSG_IN ; bit bucket in
843 00000840: 818A0000 00000040 jump rel( BucketInData ), if DATA_IN ; bit bucket in
844
845 00000848: 7834AD00 00000000 move 0xAD to SCRATCHA0
846 00000850: 808A0000 00000040 jump rel( BucketOutData ), if DATA_OUT ; bit bucket out
847 00000858: 828A0000 00000058 jump rel( BucketOutCmd ), if CMD ; bit bucket out
848 00000860: 98080000 00000000 int unknown_phase ; back to driver for harsher measures
849
850
851 00000868: BucketInStatus:
852 00000868: 0B000001 00000038 move 1, ld_scratch, when STATUS ; eat the Status byte
853 00000870: 80880000 FFFFFFA8 jump rel( bucketLoop ); ; keep bit-bucketing bytes
854
855 00000878: BucketInMsg:
856 00000878: 0F000001 00000038 move 1, ld_scratch, when MSG_IN ; eat a message byte
857 00000880: 80880000 FFFFFF98 jump rel( bucketLoop ); ; keep bit-bucketing bytes
858
859 00000888: BucketInData:
860 00000888: 09000001 00000038 move 1, ld_scratch, when DATA_IN ; eat a data byte
861 00000890: 80880000 FFFFFF88 jump rel( bucketLoop ); ; keep bit-bucketing bytes
862
863 00000898: BucketOutData:
864 00000898: 7B347300 00000000 move SCRATCHA0 xor 0x73 to SCRATCHA0 ; gen 0xDEAD ...
865 000008A0: E0340001 00000038 store SCRATCHA0, 1, ld_scratch
866 000008A8: 08000001 00000038 move 1, ld_scratch, when DATA_OUT ; pad a byte out
867 000008B0: 80880000 FFFFFF68 jump rel( bucketLoop ); ; keep bit-bucketing bytes
868
869 000008B8: BucketOutCmd:
870 000008B8: 78340000 00000000 move 0x00 to SCRATCHA0 ; load Null, TestUnitReady, whatever
871 000008C0: E0340001 00000038 store SCRATCHA0, 1, ld_scratch
872 000008C8: 0A000001 00000038 move 1, ld_scratch, when CMD ; pad a byte out
873 000008D0: 80880000 FFFFFF48 jump rel( bucketLoop ); ; keep bit-bucketing bytes
874
875
876 000008D8: sendAbortBDR:
877 000008D8: 78020000 00000000 move 0x00 to SCNTL2 ; Clr SDU SCSI Disconnect Unexpected
878 000008E0: 0E000001 00000000 move 1, ld_AbortCode, when MSG_OUT ; Send Abort(06) or BDR(0C) message
879 000008E8: E1340004 00000004 load SCRATCHA0, 4, ld_zeroes ; load 0's
880 000008F0: E0340004 00000000 store SCRATCHA0, 4, ld_AbortCode ; clear the Abort code
881 000008F8: 48000000 00000000 WAIT DISCONNECT
882 00000900: 98080000 0000000A int abort_current ; went BusFree - tell Driver
--SYMBOL---------------------------VALUE------TYPE-------
abort_current 0000000A ABSOLUTE
abort_mailbox 00000009 ABSOLUTE
kphase_ABORT_MAILBOX 0000000B ABSOLUTE
kphase_ABORT_CURRENT 0000000A ABSOLUTE
kphase_CMD_COMPLETE 0000000C ABSOLUTE
kphase_COMMAND 00000002 ABSOLUTE
kphase_DATA_IN 00000001 ABSOLUTE
kphase_DATA_OUT 00000000 ABSOLUTE
kphase_DISCONNECT 0000000D ABSOLUTE
kphase_MSG_IN 00000007 ABSOLUTE
kphase_MSG_OUT 00000006 ABSOLUTE
kphase_RESELECT 00000009 ABSOLUTE
kphase_SELECT 00000008 ABSOLUTE
kphase_STATUS 00000003 ABSOLUTE
kphase_restoreDataPointer 0000000F ABSOLUTE
kphase_saveDataPointer 0000000E ABSOLUTE
negotiateWDTR 0000000E ABSOLUTE
negotiateSDTR 0000000D ABSOLUTE
no_msgin_after_reselect 00000005 ABSOLUTE
reqack_too_large 00000006 ABSOLUTE
sglist_complete 0000000F ABSOLUTE
status_error 00000001 ABSOLUTE
TLQ_CDP 00000018 ABSOLUTE
TLQ_CDBp 00000010 ABSOLUTE
TLQ_IWR 00000022 ABSOLUTE
TLQ_MSGOp 00000008 ABSOLUTE
TLQ_SDP 0000001C ABSOLUTE
TLQ_index 00000020 ABSOLUTE
TLQ_pad 00000023 ABSOLUTE
TLQ_xferAdr 00000004 ABSOLUTE
TLQ_SCSI_ID 00000000 ABSOLUTE
TLQ_xferStarted 00000021 ABSOLUTE
unallocated_nexus 00000008 ABSOLUTE
unexpected_ext_msg 00000003 ABSOLUTE
unexpected_msg 00000002 ABSOLUTE
unknown_message_out 0000000B ABSOLUTE
unknown_msg_reject 0000000C ABSOLUTE
unknown_phase 00000000 ABSOLUTE
unknown_reselect 00000007 ABSOLUTE
wide_32_not_supported 00000004 ABSOLUTE
BSC_SCRIPT 00000000 CODE SEGMENT
SCRIPT 00000000 CODE SEGMENT
local_data 00000000 DATA SEGMENT
clearACK 00000448 ENTRY
issueAbort_BDR 000007F0 ENTRY
issueMessageOut 000002F0 ENTRY
phase_handler 00000290 ENTRY
select_phase 00000120 ENTRY
AbortSelect 00000760 LABEL
AbortMailbox 00000730 LABEL
BucketInData 00000888 LABEL
BucketInMsg 00000878 LABEL
BucketInStatus 00000868 LABEL
BucketOutCmd 000008B8 LABEL
BucketOutData 00000898 LABEL
bucketLoop 00000820 LABEL
bailout 00000588 LABEL
bucket_loop 000003B0 LABEL
clear_mailbox 00000258 LABEL
cmdComplete 000004C8 LABEL
command_phase 00000328 LABEL
data_in_phase 00000398 LABEL
data_out_phase 00000350 LABEL
disconnect_msg 00000560 LABEL
doItPatch 00000390 LABEL
driverXfer 00000370 LABEL
extended_msg 00000488 LABEL
fetchMailbox 00000188 LABEL
findNexusFromIndex 00000058 LABEL
getNextMsg 000006E0 LABEL
haveNexusIndex 00000710 LABEL
ignoreWideResidue 00000458 LABEL
initContext 000000C0 LABEL
message_in_phase 000003E8 LABEL
message_out_phase 000002D0 LABEL
msg_reject 00000440 LABEL
next_mailbox 00000248 LABEL
patchGetDevConfigOffset 000000F0 LABEL
patchArrayOffset 00000098 LABEL
reselect_phase 00000628 LABEL
restoreDataPointer 000005D8 LABEL
sdtr 000005F8 LABEL
saveDataPointer 000005B8 LABEL
sendAbortBDR 000008D8 LABEL
status_phase 000003C8 LABEL
taggedAbort 000007B0 LABEL
testMbxLp 000004F0 LABEL
try_reselect 00000618 LABEL
wdtr 00000608 LABEL
ld_IOdone_mailbox 00000014 RELATIVE.
ld_AbortBdr_mailbox 00000010 RELATIVE.
ld_counter 0000000C RELATIVE.
ld_device_table_base_adr 00000034 RELATIVE.
ld_mailboxp 0000001C RELATIVE.
ld_message 00000040 RELATIVE.
ld_message4 00000044 RELATIVE.
ld_nexus 0000002C RELATIVE.
ld_nexus_array_base 00000024 RELATIVE.
ld_nexus_index 00000028 RELATIVE.
ld_pad 00000048 RELATIVE.
ld_phase_flag 00000030 RELATIVE.
ld_sched_mlbx_base_adr 00000018 RELATIVE.
ld_scratch 00000038 RELATIVE.
ld_scsi_id 00000020 RELATIVE.
ld_size 0000004C RELATIVE.
ld_status 00000008 RELATIVE.
ld_unused 0000003C RELATIVE.
ld_zeroes 00000004 RELATIVE.
ld_AbortCode 00000000 RELATIVE.