Annotation of XNU/iokit/Drivers/scsi/drvSymbios8xx/Sym8xxScript.lis, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.