- 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.
\ No newline at end of file