Annotation of XNU/iokit/Drivers/scsi/drvSymbios8xx/Sym8xxScript.lis, revision 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.