Annotation of Gnu-Mach/linux/src/drivers/scsi/53c8xx_d.h, revision 1.1.1.1

1.1       root        1: u32 SCRIPT[] = {
                      2: /*
                      3: 
                      4: 
                      5: ; NCR 53c810 driver, main script
                      6: ; Sponsored by 
                      7: ;      iX Multiuser Multitasking Magazine
                      8: ;      [email protected]
                      9: ;
                     10: ; Copyright 1993, 1994, 1995 Drew Eckhardt
                     11: ;      Visionary Computing 
                     12: ;      (Unix and Linux consulting and custom programming)
                     13: ;      [email protected]
                     14: ;      +1 (303) 786-7975
                     15: ;
                     16: ; TolerANT and SCSI SCRIPTS are registered trademarks of NCR Corporation.
                     17: ;
                     18: ; PRE-ALPHA
                     19: ;
                     20: ; For more information, please consult 
                     21: ;
                     22: ; NCR 53C810
                     23: ; PCI-SCSI I/O Processor
                     24: ; Data Manual
                     25: ;
                     26: ; NCR 53C710 
                     27: ; SCSI I/O Processor
                     28: ; Programmers Guide
                     29: ;
                     30: ; NCR Microelectronics
                     31: ; 1635 Aeroplaza Drive
                     32: ; Colorado Springs, CO 80916
                     33: ; 1+ (719) 578-3400
                     34: ;
                     35: ; Toll free literature number
                     36: ; +1 (800) 334-5454
                     37: ;
                     38: ; IMPORTANT : This code is self modifying due to the limitations of 
                     39: ;      the NCR53c7,8xx series chips.  Persons debugging this code with
                     40: ;      the remote debugger should take this into account, and NOT set
                     41: ;      breakpoints in modified instructions.
                     42: ;
                     43: ; Design:
                     44: ; The NCR53c7,8xx family of SCSI chips are busmasters with an onboard 
                     45: ; microcontroller using a simple instruction set.   
                     46: ;
                     47: ; So, to minimize the effects of interrupt latency, and to maximize 
                     48: ; throughput, this driver offloads the practical maximum amount 
                     49: ; of processing to the SCSI chip while still maintaining a common
                     50: ; structure.
                     51: ;
                     52: ; Where tradeoffs were needed between efficiency on the older
                     53: ; chips and the newer NCR53c800 series, the NCR53c800 series 
                     54: ; was chosen.
                     55: ;
                     56: ; While the NCR53c700 and NCR53c700-66 lacked the facilities to fully
                     57: ; automate SCSI transfers without host processor intervention, this 
                     58: ; isn't the case with the NCR53c710 and newer chips which allow 
                     59: ;
                     60: ; - reads and writes to the internal registers from within the SCSI
                     61: ;      scripts, allowing the SCSI SCRIPTS(tm) code to save processor
                     62: ;      state so that multiple threads of execution are possible, and also
                     63: ;      provide an ALU for loop control, etc.
                     64: ; 
                     65: ; - table indirect addressing for some instructions. This allows 
                     66: ;      pointers to be located relative to the DSA ((Data Structure
                     67: ;      Address) register.
                     68: ;
                     69: ; These features make it possible to implement a mailbox style interface,
                     70: ; where the same piece of code is run to handle I/O for multiple threads
                     71: ; at once minimizing our need to relocate code.  Since the NCR53c700/
                     72: ; NCR53c800 series have a unique combination of features, making a 
                     73: ; a standard ingoing/outgoing mailbox system, costly, I've modified it.
                     74: ;
                     75: ; - Mailboxes are a mixture of code and data.  This lets us greatly
                     76: ;      simplify the NCR53c810 code and do things that would otherwise
                     77: ;      not be possible.
                     78: ;
                     79: ; The saved data pointer is now implemented as follows :
                     80: ;
                     81: ;      Control flow has been architected such that if control reaches
                     82: ;      munge_save_data_pointer, on a restore pointers message or 
                     83: ;      reconnection, a jump to the address formerly in the TEMP register
                     84: ;      will allow the SCSI command to resume execution.
                     85: ;
                     86: 
                     87: ;
                     88: ; Note : the DSA structures must be aligned on 32 bit boundaries,
                     89: ; since the source and destination of MOVE MEMORY instructions 
                     90: ; must share the same alignment and this is the alignment of the
                     91: ; NCR registers.
                     92: ;
                     93: 
                     94: ABSOLUTE dsa_temp_lun = 0              ; Patch to lun for current dsa
                     95: ABSOLUTE dsa_temp_next = 0             ; Patch to dsa next for current dsa
                     96: ABSOLUTE dsa_temp_addr_next = 0                ; Patch to address of dsa next address 
                     97:                                        ;       for current dsa
                     98: ABSOLUTE dsa_temp_sync = 0             ; Patch to address of per-target
                     99:                                        ;       sync routine
                    100: ABSOLUTE dsa_temp_target = 0           ; Patch to id for current dsa
                    101: ABSOLUTE dsa_temp_addr_saved_pointer = 0; Patch to address of per-command
                    102:                                        ;       saved data pointer
                    103: ABSOLUTE dsa_temp_addr_residual = 0    ; Patch to address of per-command
                    104:                                        ;       current residual code
                    105: ABSOLUTE dsa_temp_addr_saved_residual = 0; Patch to address of per-command
                    106:                                        ; saved residual code
                    107: ABSOLUTE dsa_temp_addr_new_value = 0   ; Address of value for JUMP operand
                    108: ABSOLUTE dsa_temp_addr_array_value = 0         ; Address to copy to
                    109: ABSOLUTE dsa_temp_addr_dsa_value = 0   ; Address of this DSA value
                    110: 
                    111: ;
                    112: ; Once a device has initiated reselection, we need to compare it 
                    113: ; against the singly linked list of commands which have disconnected
                    114: ; and are pending reselection.  These commands are maintained in 
                    115: ; an unordered singly linked list of DSA structures, through the
                    116: ; DSA pointers at their 'centers' headed by the reconnect_dsa_head
                    117: ; pointer.
                    118: ; 
                    119: ; To avoid complications in removing commands from the list,
                    120: ; I minimize the amount of expensive (at eight operations per
                    121: ; addition @ 500-600ns each) pointer operations which must
                    122: ; be done in the NCR driver by precomputing them on the 
                    123: ; host processor during dsa structure generation.
                    124: ;
                    125: ; The fixed-up per DSA code knows how to recognize the nexus
                    126: ; associated with the corresponding SCSI command, and modifies
                    127: ; the source and destination pointers for the MOVE MEMORY 
                    128: ; instruction which is executed when reselected_ok is called
                    129: ; to remove the command from the list.  Similarly, DSA is 
                    130: ; loaded with the address of the next DSA structure and
                    131: ; reselected_check_next is called if a failure occurs.
                    132: ;
                    133: ; Perhaps more concisely, the net effect of the mess is 
                    134: ;
                    135: ; for (dsa = reconnect_dsa_head, dest = &reconnect_dsa_head, 
                    136: ;     src = NULL; dsa; dest = &dsa->next, dsa = dsa->next) {
                    137: ;      src = &dsa->next;
                    138: ;      if (target_id == dsa->id && target_lun == dsa->lun) {
                    139: ;              *dest = *src;
                    140: ;              break;
                    141: ;         }    
                    142: ; }
                    143: ;
                    144: ; if (!dsa)
                    145: ;           error (int_err_unexpected_reselect);
                    146: ; else  
                    147: ;     longjmp (dsa->jump_resume, 0);
                    148: ;
                    149: ;      
                    150: 
                    151: 
                    152: ; Define DSA structure used for mailboxes
                    153: ENTRY dsa_code_template
                    154: dsa_code_template:
                    155: ENTRY dsa_code_begin
                    156: dsa_code_begin:
                    157:        MOVE dmode_memory_to_ncr TO DMODE
                    158: 
                    159: at 0x00000000 : */     0x78380000,0x00000000,
                    160: /*
                    161:        MOVE MEMORY 4, dsa_temp_addr_dsa_value, addr_scratch
                    162: 
                    163: at 0x00000002 : */     0xc0000004,0x00000000,0x00000000,
                    164: /*
                    165:        MOVE dmode_memory_to_memory TO DMODE
                    166: 
                    167: at 0x00000005 : */     0x78380000,0x00000000,
                    168: /*
                    169:        CALL scratch_to_dsa
                    170: 
                    171: at 0x00000007 : */     0x88080000,0x00000980,
                    172: /*
                    173:        CALL select
                    174: 
                    175: at 0x00000009 : */     0x88080000,0x000001fc,
                    176: /*
                    177: ; Handle the phase mismatch which may have resulted from the 
                    178: ; MOVE FROM dsa_msgout if we returned here.  The CLEAR ATN 
                    179: ; may or may not be necessary, and we should update script_asm.pl
                    180: ; to handle multiple pieces.
                    181:     CLEAR ATN
                    182: 
                    183: at 0x0000000b : */     0x60000008,0x00000000,
                    184: /*
                    185:     CLEAR ACK
                    186: 
                    187: at 0x0000000d : */     0x60000040,0x00000000,
                    188: /*
                    189: 
                    190: ; Replace second operand with address of JUMP instruction dest operand
                    191: ; in schedule table for this DSA.  Becomes dsa_jump_dest in 53c7,8xx.c.
                    192: ENTRY dsa_code_fix_jump
                    193: dsa_code_fix_jump:
                    194:        MOVE MEMORY 4, NOP_insn, 0
                    195: 
                    196: at 0x0000000f : */     0xc0000004,0x00000000,0x00000000,
                    197: /*
                    198:        JUMP select_done
                    199: 
                    200: at 0x00000012 : */     0x80080000,0x00000224,
                    201: /*
                    202: 
                    203: ; wrong_dsa loads the DSA register with the value of the dsa_next
                    204: ; field.
                    205: ;
                    206: wrong_dsa:
                    207: ;              Patch the MOVE MEMORY INSTRUCTION such that 
                    208: ;              the destination address is the address of the OLD 
                    209: ;              next pointer.
                    210: ;
                    211:        MOVE MEMORY 4, dsa_temp_addr_next, reselected_ok + 8
                    212: 
                    213: at 0x00000014 : */     0xc0000004,0x00000000,0x00000758,
                    214: /*
                    215:        MOVE dmode_memory_to_ncr TO DMODE       
                    216: 
                    217: at 0x00000017 : */     0x78380000,0x00000000,
                    218: /*
                    219: ;
                    220: ;      Move the _contents_ of the next pointer into the DSA register as 
                    221: ;      the next I_T_L or I_T_L_Q tupple to check against the established
                    222: ;      nexus.
                    223: ;
                    224:        MOVE MEMORY 4, dsa_temp_next, addr_scratch
                    225: 
                    226: at 0x00000019 : */     0xc0000004,0x00000000,0x00000000,
                    227: /*
                    228:        MOVE dmode_memory_to_memory TO DMODE
                    229: 
                    230: at 0x0000001c : */     0x78380000,0x00000000,
                    231: /*
                    232:        CALL scratch_to_dsa
                    233: 
                    234: at 0x0000001e : */     0x88080000,0x00000980,
                    235: /*
                    236:        JUMP reselected_check_next
                    237: 
                    238: at 0x00000020 : */     0x80080000,0x000006a4,
                    239: /*
                    240: 
                    241: ABSOLUTE dsa_save_data_pointer = 0
                    242: ENTRY dsa_code_save_data_pointer
                    243: dsa_code_save_data_pointer:
                    244:        MOVE dmode_ncr_to_memory TO DMODE
                    245: 
                    246: at 0x00000022 : */     0x78380000,0x00000000,
                    247: /*
                    248:        MOVE MEMORY 4, addr_temp, dsa_temp_addr_saved_pointer
                    249: 
                    250: at 0x00000024 : */     0xc0000004,0x00000000,0x00000000,
                    251: /*
                    252:        MOVE dmode_memory_to_memory TO DMODE
                    253: 
                    254: at 0x00000027 : */     0x78380000,0x00000000,
                    255: /*
                    256: ; HARD CODED : 24 bytes needs to agree with 53c7,8xx.h
                    257:        MOVE MEMORY 24, dsa_temp_addr_residual, dsa_temp_addr_saved_residual
                    258: 
                    259: at 0x00000029 : */     0xc0000018,0x00000000,0x00000000,
                    260: /*
                    261:         CLEAR ACK
                    262: 
                    263: at 0x0000002c : */     0x60000040,0x00000000,
                    264: /*
                    265: 
                    266: 
                    267: 
                    268:        RETURN
                    269: 
                    270: at 0x0000002e : */     0x90080000,0x00000000,
                    271: /*
                    272: ABSOLUTE dsa_restore_pointers = 0
                    273: ENTRY dsa_code_restore_pointers
                    274: dsa_code_restore_pointers:
                    275:        MOVE dmode_memory_to_ncr TO DMODE
                    276: 
                    277: at 0x00000030 : */     0x78380000,0x00000000,
                    278: /*
                    279:        MOVE MEMORY 4, dsa_temp_addr_saved_pointer, addr_temp
                    280: 
                    281: at 0x00000032 : */     0xc0000004,0x00000000,0x00000000,
                    282: /*
                    283:        MOVE dmode_memory_to_memory TO DMODE
                    284: 
                    285: at 0x00000035 : */     0x78380000,0x00000000,
                    286: /*
                    287: ; HARD CODED : 24 bytes needs to agree with 53c7,8xx.h
                    288:        MOVE MEMORY 24, dsa_temp_addr_saved_residual, dsa_temp_addr_residual
                    289: 
                    290: at 0x00000037 : */     0xc0000018,0x00000000,0x00000000,
                    291: /*
                    292:         CLEAR ACK
                    293: 
                    294: at 0x0000003a : */     0x60000040,0x00000000,
                    295: /*
                    296: 
                    297: 
                    298: 
                    299:        RETURN
                    300: 
                    301: at 0x0000003c : */     0x90080000,0x00000000,
                    302: /*
                    303: 
                    304: ABSOLUTE dsa_check_reselect = 0
                    305: ; dsa_check_reselect determines whether or not the current target and
                    306: ; lun match the current DSA
                    307: ENTRY dsa_code_check_reselect
                    308: dsa_code_check_reselect:
                    309:        MOVE SSID TO SFBR               ; SSID contains 3 bit target ID
                    310: 
                    311: at 0x0000003e : */     0x720a0000,0x00000000,
                    312: /*
                    313: ; FIXME : we need to accommodate bit fielded and binary here for '7xx/'8xx chips
                    314:        JUMP REL (wrong_dsa), IF NOT dsa_temp_target, AND MASK 0xf8
                    315: 
                    316: at 0x00000040 : */     0x8084f800,0x00ffff48,
                    317: /*
                    318: ;
                    319: ; Hack - move to scratch first, since SFBR is not writeable
                    320: ;      via the CPU and hence a MOVE MEMORY instruction.
                    321: ;
                    322:        MOVE dmode_memory_to_ncr TO DMODE
                    323: 
                    324: at 0x00000042 : */     0x78380000,0x00000000,
                    325: /*
                    326:        MOVE MEMORY 1, reselected_identify, addr_scratch
                    327: 
                    328: at 0x00000044 : */     0xc0000001,0x00000000,0x00000000,
                    329: /*
                    330:        MOVE dmode_memory_to_memory TO DMODE
                    331: 
                    332: at 0x00000047 : */     0x78380000,0x00000000,
                    333: /*
                    334:        MOVE SCRATCH0 TO SFBR
                    335: 
                    336: at 0x00000049 : */     0x72340000,0x00000000,
                    337: /*
                    338: ; FIXME : we need to accommodate bit fielded and binary here for '7xx/'8xx chips
                    339:        JUMP REL (wrong_dsa), IF NOT dsa_temp_lun, AND MASK 0xf8
                    340: 
                    341: at 0x0000004b : */     0x8084f800,0x00ffff1c,
                    342: /*
                    343: ;              Patch the MOVE MEMORY INSTRUCTION such that
                    344: ;              the source address is the address of this dsa's
                    345: ;              next pointer.
                    346:        MOVE MEMORY 4, dsa_temp_addr_next, reselected_ok + 4
                    347: 
                    348: at 0x0000004d : */     0xc0000004,0x00000000,0x00000754,
                    349: /*
                    350:        CALL reselected_ok
                    351: 
                    352: at 0x00000050 : */     0x88080000,0x00000750,
                    353: /*
                    354:        CALL dsa_temp_sync      
                    355: 
                    356: at 0x00000052 : */     0x88080000,0x00000000,
                    357: /*
                    358: ; Release ACK on the IDENTIFY message _after_ we've set the synchronous 
                    359: ; transfer parameters! 
                    360:        CLEAR ACK
                    361: 
                    362: at 0x00000054 : */     0x60000040,0x00000000,
                    363: /*
                    364: ; Implicitly restore pointers on reselection, so a RETURN
                    365: ; will transfer control back to the right spot.
                    366:        CALL REL (dsa_code_restore_pointers)
                    367: 
                    368: at 0x00000056 : */     0x88880000,0x00ffff60,
                    369: /*
                    370:        RETURN
                    371: 
                    372: at 0x00000058 : */     0x90080000,0x00000000,
                    373: /*
                    374: ENTRY dsa_zero
                    375: dsa_zero:
                    376: ENTRY dsa_code_template_end
                    377: dsa_code_template_end:
                    378: 
                    379: ; Perform sanity check for dsa_fields_start == dsa_code_template_end - 
                    380: ; dsa_zero, puke.
                    381: 
                    382: ABSOLUTE dsa_fields_start =  0 ; Sanity marker
                    383:                                ;       pad 48 bytes (fix this RSN)
                    384: ABSOLUTE dsa_next = 48         ; len 4 Next DSA
                    385:                                ; del 4 Previous DSA address
                    386: ABSOLUTE dsa_cmnd = 56         ; len 4 Scsi_Cmnd * for this thread.
                    387: ABSOLUTE dsa_select = 60       ; len 4 Device ID, Period, Offset for 
                    388:                                ;       table indirect select
                    389: ABSOLUTE dsa_msgout = 64       ; len 8 table indirect move parameter for 
                    390:                                ;       select message
                    391: ABSOLUTE dsa_cmdout = 72       ; len 8 table indirect move parameter for 
                    392:                                ;       command
                    393: ABSOLUTE dsa_dataout = 80      ; len 4 code pointer for dataout
                    394: ABSOLUTE dsa_datain = 84       ; len 4 code pointer for datain
                    395: ABSOLUTE dsa_msgin = 88                ; len 8 table indirect move for msgin
                    396: ABSOLUTE dsa_status = 96       ; len 8 table indirect move for status byte
                    397: ABSOLUTE dsa_msgout_other = 104        ; len 8 table indirect for normal message out
                    398:                                ; (Synchronous transfer negotiation, etc).
                    399: ABSOLUTE dsa_end = 112
                    400: 
                    401: ABSOLUTE schedule = 0          ; Array of JUMP dsa_begin or JUMP (next),
                    402:                                ; terminated by a call to JUMP wait_reselect
                    403: 
                    404: ; Linked lists of DSA structures
                    405: ABSOLUTE reconnect_dsa_head = 0        ; Link list of DSAs which can reconnect
                    406: ABSOLUTE addr_reconnect_dsa_head = 0 ; Address of variable containing
                    407:                                ; address of reconnect_dsa_head
                    408: 
                    409: ; These select the source and destination of a MOVE MEMORY instruction
                    410: ABSOLUTE dmode_memory_to_memory = 0x0
                    411: ABSOLUTE dmode_memory_to_ncr = 0x0
                    412: ABSOLUTE dmode_ncr_to_memory = 0x0
                    413: 
                    414: ABSOLUTE addr_scratch = 0x0
                    415: ABSOLUTE addr_temp = 0x0
                    416: 
                    417: 
                    418: ; Interrupts - 
                    419: ; MSB indicates type
                    420: ; 0    handle error condition
                    421: ; 1    handle message 
                    422: ; 2    handle normal condition
                    423: ; 3    debugging interrupt
                    424: ; 4    testing interrupt 
                    425: ; Next byte indicates specific error
                    426: 
                    427: ; XXX not yet implemented, I'm not sure if I want to - 
                    428: ; Next byte indicates the routine the error occurred in
                    429: ; The LSB indicates the specific place the error occurred
                    430:  
                    431: ABSOLUTE int_err_unexpected_phase = 0x00000000 ; Unexpected phase encountered
                    432: ABSOLUTE int_err_selected = 0x00010000         ; SELECTED (nee RESELECTED)
                    433: ABSOLUTE int_err_unexpected_reselect = 0x00020000 
                    434: ABSOLUTE int_err_check_condition = 0x00030000  
                    435: ABSOLUTE int_err_no_phase = 0x00040000
                    436: ABSOLUTE int_msg_wdtr = 0x01000000             ; WDTR message received
                    437: ABSOLUTE int_msg_sdtr = 0x01010000             ; SDTR received
                    438: ABSOLUTE int_msg_1 = 0x01020000                        ; single byte special message
                    439:                                                ; received
                    440: 
                    441: ABSOLUTE int_norm_select_complete = 0x02000000 ; Select complete, reprogram
                    442:                                                ; registers.
                    443: ABSOLUTE int_norm_reselect_complete = 0x02010000       ; Nexus established
                    444: ABSOLUTE int_norm_command_complete = 0x02020000 ; Command complete
                    445: ABSOLUTE int_norm_disconnected = 0x02030000    ; Disconnected 
                    446: ABSOLUTE int_norm_aborted =0x02040000          ; Aborted *dsa
                    447: ABSOLUTE int_norm_reset = 0x02050000           ; Generated BUS reset.
                    448: ABSOLUTE int_debug_break = 0x03000000          ; Break point
                    449: 
                    450: ABSOLUTE int_debug_panic = 0x030b0000          ; Panic driver
                    451: 
                    452: 
                    453: ABSOLUTE int_test_1 = 0x04000000               ; Test 1 complete
                    454: ABSOLUTE int_test_2 = 0x04010000               ; Test 2 complete
                    455: ABSOLUTE int_test_3 = 0x04020000               ; Test 3 complete
                    456: 
                    457: 
                    458: ; These should start with 0x05000000, with low bits incrementing for 
                    459: ; each one.
                    460: 
                    461: 
                    462:                                                
                    463: ABSOLUTE NCR53c7xx_msg_abort = 0       ; Pointer to abort message
                    464: ABSOLUTE NCR53c7xx_msg_reject = 0       ; Pointer to reject message
                    465: ABSOLUTE NCR53c7xx_zero        = 0             ; long with zero in it, use for source
                    466: ABSOLUTE NCR53c7xx_sink = 0            ; long to dump worthless data in
                    467: ABSOLUTE NOP_insn = 0                  ; NOP instruction
                    468: 
                    469: ; Pointer to message, potentially multi-byte
                    470: ABSOLUTE msg_buf = 0
                    471: 
                    472: ; Pointer to holding area for reselection information
                    473: ABSOLUTE reselected_identify = 0
                    474: ABSOLUTE reselected_tag = 0
                    475: 
                    476: ; Request sense command pointer, it's a 6 byte command, should
                    477: ; be constant for all commands since we always want 16 bytes of 
                    478: ; sense and we don't need to change any fields as we did under 
                    479: ; SCSI-I when we actually cared about the LUN field.
                    480: ;EXTERNAL NCR53c7xx_sense              ; Request sense command
                    481: 
                    482: 
                    483: ; dsa_schedule  
                    484: ; PURPOSE : after a DISCONNECT message has been received, and pointers
                    485: ;      saved, insert the current DSA structure at the head of the 
                    486: ;      disconnected queue and fall through to the scheduler.
                    487: ;
                    488: ; CALLS : OK
                    489: ;
                    490: ; INPUTS : dsa - current DSA structure, reconnect_dsa_head - list
                    491: ;      of disconnected commands
                    492: ;
                    493: ; MODIFIES : SCRATCH, reconnect_dsa_head
                    494: ; 
                    495: ; EXITS : always passes control to schedule
                    496: 
                    497: ENTRY dsa_schedule
                    498: dsa_schedule:
                    499: 
                    500: 
                    501: 
                    502: 
                    503: ;
                    504: ; Calculate the address of the next pointer within the DSA 
                    505: ; structure of the command that is currently disconnecting
                    506: ;
                    507:     CALL dsa_to_scratch
                    508: 
                    509: at 0x0000005a : */     0x88080000,0x00000938,
                    510: /*
                    511:     MOVE SCRATCH0 + dsa_next TO SCRATCH0
                    512: 
                    513: at 0x0000005c : */     0x7e343000,0x00000000,
                    514: /*
                    515:     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY
                    516: 
                    517: at 0x0000005e : */     0x7f350000,0x00000000,
                    518: /*
                    519:     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY
                    520: 
                    521: at 0x00000060 : */     0x7f360000,0x00000000,
                    522: /*
                    523:     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY
                    524: 
                    525: at 0x00000062 : */     0x7f370000,0x00000000,
                    526: /*
                    527: 
                    528: ; Point the next field of this DSA structure at the current disconnected 
                    529: ; list
                    530:     MOVE dmode_ncr_to_memory TO DMODE
                    531: 
                    532: at 0x00000064 : */     0x78380000,0x00000000,
                    533: /*
                    534:     MOVE MEMORY 4, addr_scratch, dsa_schedule_insert + 8
                    535: 
                    536: at 0x00000066 : */     0xc0000004,0x00000000,0x000001b4,
                    537: /*
                    538:     MOVE dmode_memory_to_memory TO DMODE
                    539: 
                    540: at 0x00000069 : */     0x78380000,0x00000000,
                    541: /*
                    542: dsa_schedule_insert:
                    543:     MOVE MEMORY 4, reconnect_dsa_head, 0 
                    544: 
                    545: at 0x0000006b : */     0xc0000004,0x00000000,0x00000000,
                    546: /*
                    547: 
                    548: ; And update the head pointer.
                    549:     CALL dsa_to_scratch
                    550: 
                    551: at 0x0000006e : */     0x88080000,0x00000938,
                    552: /*
                    553:     MOVE dmode_ncr_to_memory TO DMODE  
                    554: 
                    555: at 0x00000070 : */     0x78380000,0x00000000,
                    556: /*
                    557:     MOVE MEMORY 4, addr_scratch, reconnect_dsa_head
                    558: 
                    559: at 0x00000072 : */     0xc0000004,0x00000000,0x00000000,
                    560: /*
                    561:     MOVE dmode_memory_to_memory TO DMODE
                    562: 
                    563: at 0x00000075 : */     0x78380000,0x00000000,
                    564: /*
                    565: 
                    566: 
                    567:     MOVE SCNTL2 & 0x7f TO SCNTL2
                    568: 
                    569: at 0x00000077 : */     0x7c027f00,0x00000000,
                    570: /*
                    571:     CLEAR ACK
                    572: 
                    573: at 0x00000079 : */     0x60000040,0x00000000,
                    574: /*
                    575: 
                    576:     WAIT DISCONNECT
                    577: 
                    578: at 0x0000007b : */     0x48000000,0x00000000,
                    579: /*
                    580: 
                    581: 
                    582: 
                    583: 
                    584: 
                    585: 
                    586:     JUMP schedule
                    587: 
                    588: at 0x0000007d : */     0x80080000,0x00000000,
                    589: /*
                    590: 
                    591: 
                    592: ;
                    593: ; select
                    594: ;
                    595: ; PURPOSE : establish a nexus for the SCSI command referenced by DSA.
                    596: ;      On success, the current DSA structure is removed from the issue 
                    597: ;      queue.  Usually, this is entered as a fall-through from schedule,
                    598: ;      although the contingent allegiance handling code will write
                    599: ;      the select entry address to the DSP to restart a command as a 
                    600: ;      REQUEST SENSE.  A message is sent (usually IDENTIFY, although
                    601: ;      additional SDTR or WDTR messages may be sent).  COMMAND OUT
                    602: ;      is handled.
                    603: ;
                    604: ; INPUTS : DSA - SCSI command, issue_dsa_head
                    605: ;
                    606: ; CALLS : NOT OK
                    607: ;
                    608: ; MODIFIES : SCRATCH, issue_dsa_head
                    609: ;
                    610: ; EXITS : on reselection or selection, go to select_failed
                    611: ;      otherwise, RETURN so control is passed back to 
                    612: ;      dsa_begin.
                    613: ;
                    614: 
                    615: ENTRY select
                    616: select:
                    617: 
                    618: 
                    619: 
                    620: 
                    621: 
                    622: 
                    623: 
                    624: 
                    625: 
                    626: 
                    627: 
                    628: 
                    629:     CLEAR TARGET
                    630: 
                    631: at 0x0000007f : */     0x60000200,0x00000000,
                    632: /*
                    633: 
                    634: ; XXX
                    635: ;
                    636: ; In effect, SELECTION operations are backgrounded, with execution
                    637: ; continuing until code which waits for REQ or a fatal interrupt is 
                    638: ; encountered.
                    639: ;
                    640: ; So, for more performance, we could overlap the code which removes 
                    641: ; the command from the NCRs issue queue with the selection, but 
                    642: ; at this point I don't want to deal with the error recovery.
                    643: ;
                    644: 
                    645: 
                    646:     SELECT ATN FROM dsa_select, select_failed
                    647: 
                    648: at 0x00000081 : */     0x4300003c,0x000007a4,
                    649: /*
                    650:     JUMP select_msgout, WHEN MSG_OUT
                    651: 
                    652: at 0x00000083 : */     0x860b0000,0x00000214,
                    653: /*
                    654: ENTRY select_msgout
                    655: select_msgout:
                    656:     MOVE FROM dsa_msgout, WHEN MSG_OUT
                    657: 
                    658: at 0x00000085 : */     0x1e000000,0x00000040,
                    659: /*
                    660: 
                    661: 
                    662: 
                    663: 
                    664: 
                    665: 
                    666: 
                    667: 
                    668: 
                    669: 
                    670:    RETURN
                    671: 
                    672: at 0x00000087 : */     0x90080000,0x00000000,
                    673: /*
                    674: 
                    675: ; 
                    676: ; select_done
                    677: ; 
                    678: ; PURPOSE: continue on to normal data transfer; called as the exit 
                    679: ;      point from dsa_begin.
                    680: ;
                    681: ; INPUTS: dsa
                    682: ;
                    683: ; CALLS: OK
                    684: ;
                    685: ;
                    686: 
                    687: select_done:
                    688: 
                    689: 
                    690: 
                    691: 
                    692: 
                    693: 
                    694: 
                    695: ; After a successful selection, we should get either a CMD phase or 
                    696: ; some transfer request negotiation message.
                    697: 
                    698:     JUMP cmdout, WHEN CMD
                    699: 
                    700: at 0x00000089 : */     0x820b0000,0x00000244,
                    701: /*
                    702:     INT int_err_unexpected_phase, WHEN NOT MSG_IN 
                    703: 
                    704: at 0x0000008b : */     0x9f030000,0x00000000,
                    705: /*
                    706: 
                    707: select_msg_in:
                    708:     CALL msg_in, WHEN MSG_IN
                    709: 
                    710: at 0x0000008d : */     0x8f0b0000,0x00000404,
                    711: /*
                    712:     JUMP select_msg_in, WHEN MSG_IN
                    713: 
                    714: at 0x0000008f : */     0x870b0000,0x00000234,
                    715: /*
                    716: 
                    717: cmdout:
                    718:     INT int_err_unexpected_phase, WHEN NOT CMD
                    719: 
                    720: at 0x00000091 : */     0x9a030000,0x00000000,
                    721: /*
                    722: 
                    723: 
                    724: 
                    725: ENTRY cmdout_cmdout
                    726: cmdout_cmdout:
                    727: 
                    728:     MOVE FROM dsa_cmdout, WHEN CMD
                    729: 
                    730: at 0x00000093 : */     0x1a000000,0x00000048,
                    731: /*
                    732: 
                    733: 
                    734: 
                    735: 
                    736: ;
                    737: ; data_transfer  
                    738: ; other_out
                    739: ; other_in
                    740: ; other_transfer
                    741: ;
                    742: ; PURPOSE : handle the main data transfer for a SCSI command in 
                    743: ;      several parts.  In the first part, data_transfer, DATA_IN
                    744: ;      and DATA_OUT phases are allowed, with the user provided
                    745: ;      code (usually dynamically generated based on the scatter/gather
                    746: ;      list associated with a SCSI command) called to handle these 
                    747: ;      phases.
                    748: ;
                    749: ;      After control has passed to one of the user provided 
                    750: ;      DATA_IN or DATA_OUT routines, back calls are made to 
                    751: ;      other_transfer_in or other_transfer_out to handle non-DATA IN
                    752: ;      and DATA OUT phases respectively, with the state of the active
                    753: ;      data pointer being preserved in TEMP.
                    754: ;
                    755: ;      On completion, the user code passes control to other_transfer
                    756: ;      which causes DATA_IN and DATA_OUT to result in unexpected_phase
                    757: ;      interrupts so that data overruns may be trapped.
                    758: ;
                    759: ; INPUTS : DSA - SCSI command
                    760: ;
                    761: ; CALLS : OK in data_transfer_start, not ok in other_out and other_in, ok in
                    762: ;      other_transfer
                    763: ;
                    764: ; MODIFIES : SCRATCH
                    765: ;
                    766: ; EXITS : if STATUS IN is detected, signifying command completion,
                    767: ;      the NCR jumps to command_complete.  If MSG IN occurs, a 
                    768: ;      CALL is made to msg_in.  Otherwise, other_transfer runs in 
                    769: ;      an infinite loop.
                    770: ;      
                    771: 
                    772: ENTRY data_transfer
                    773: data_transfer:
                    774:     JUMP cmdout_cmdout, WHEN CMD
                    775: 
                    776: at 0x00000095 : */     0x820b0000,0x0000024c,
                    777: /*
                    778:     CALL msg_in, WHEN MSG_IN
                    779: 
                    780: at 0x00000097 : */     0x8f0b0000,0x00000404,
                    781: /*
                    782:     INT int_err_unexpected_phase, WHEN MSG_OUT
                    783: 
                    784: at 0x00000099 : */     0x9e0b0000,0x00000000,
                    785: /*
                    786:     JUMP do_dataout, WHEN DATA_OUT
                    787: 
                    788: at 0x0000009b : */     0x800b0000,0x0000028c,
                    789: /*
                    790:     JUMP do_datain, WHEN DATA_IN
                    791: 
                    792: at 0x0000009d : */     0x810b0000,0x000002e4,
                    793: /*
                    794:     JUMP command_complete, WHEN STATUS
                    795: 
                    796: at 0x0000009f : */     0x830b0000,0x0000060c,
                    797: /*
                    798:     JUMP data_transfer
                    799: 
                    800: at 0x000000a1 : */     0x80080000,0x00000254,
                    801: /*
                    802: ENTRY end_data_transfer
                    803: end_data_transfer:
                    804: 
                    805: ;
                    806: ; FIXME: On NCR53c700 and NCR53c700-66 chips, do_dataout/do_datain 
                    807: ; should be fixed up whenever the nexus changes so it can point to the 
                    808: ; correct routine for that command.
                    809: ;
                    810: 
                    811: 
                    812: ; Nasty jump to dsa->dataout
                    813: do_dataout:
                    814:     CALL dsa_to_scratch
                    815: 
                    816: at 0x000000a3 : */     0x88080000,0x00000938,
                    817: /*
                    818:     MOVE SCRATCH0 + dsa_dataout TO SCRATCH0    
                    819: 
                    820: at 0x000000a5 : */     0x7e345000,0x00000000,
                    821: /*
                    822:     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY 
                    823: 
                    824: at 0x000000a7 : */     0x7f350000,0x00000000,
                    825: /*
                    826:     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY 
                    827: 
                    828: at 0x000000a9 : */     0x7f360000,0x00000000,
                    829: /*
                    830:     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY 
                    831: 
                    832: at 0x000000ab : */     0x7f370000,0x00000000,
                    833: /*
                    834:     MOVE dmode_ncr_to_memory TO DMODE
                    835: 
                    836: at 0x000000ad : */     0x78380000,0x00000000,
                    837: /*
                    838:     MOVE MEMORY 4, addr_scratch, dataout_to_jump + 4
                    839: 
                    840: at 0x000000af : */     0xc0000004,0x00000000,0x000002d4,
                    841: /*
                    842:     MOVE dmode_memory_to_memory TO DMODE
                    843: 
                    844: at 0x000000b2 : */     0x78380000,0x00000000,
                    845: /*
                    846: dataout_to_jump:
                    847:     MOVE MEMORY 4, 0, dataout_jump + 4 
                    848: 
                    849: at 0x000000b4 : */     0xc0000004,0x00000000,0x000002e0,
                    850: /*
                    851: dataout_jump:
                    852:     JUMP 0
                    853: 
                    854: at 0x000000b7 : */     0x80080000,0x00000000,
                    855: /*
                    856: 
                    857: ; Nasty jump to dsa->dsain
                    858: do_datain:
                    859:     CALL dsa_to_scratch
                    860: 
                    861: at 0x000000b9 : */     0x88080000,0x00000938,
                    862: /*
                    863:     MOVE SCRATCH0 + dsa_datain TO SCRATCH0     
                    864: 
                    865: at 0x000000bb : */     0x7e345400,0x00000000,
                    866: /*
                    867:     MOVE SCRATCH1 + 0 TO SCRATCH1 WITH CARRY 
                    868: 
                    869: at 0x000000bd : */     0x7f350000,0x00000000,
                    870: /*
                    871:     MOVE SCRATCH2 + 0 TO SCRATCH2 WITH CARRY 
                    872: 
                    873: at 0x000000bf : */     0x7f360000,0x00000000,
                    874: /*
                    875:     MOVE SCRATCH3 + 0 TO SCRATCH3 WITH CARRY 
                    876: 
                    877: at 0x000000c1 : */     0x7f370000,0x00000000,
                    878: /*
                    879:     MOVE dmode_ncr_to_memory TO DMODE
                    880: 
                    881: at 0x000000c3 : */     0x78380000,0x00000000,
                    882: /*
                    883:     MOVE MEMORY 4, addr_scratch, datain_to_jump + 4
                    884: 
                    885: at 0x000000c5 : */     0xc0000004,0x00000000,0x0000032c,
                    886: /*
                    887:     MOVE dmode_memory_to_memory TO DMODE               
                    888: 
                    889: at 0x000000c8 : */     0x78380000,0x00000000,
                    890: /*
                    891: ENTRY datain_to_jump
                    892: datain_to_jump:
                    893:     MOVE MEMORY 4, 0, datain_jump + 4
                    894: 
                    895: at 0x000000ca : */     0xc0000004,0x00000000,0x00000338,
                    896: /*
                    897: 
                    898: 
                    899: 
                    900: datain_jump:
                    901:     JUMP 0
                    902: 
                    903: at 0x000000cd : */     0x80080000,0x00000000,
                    904: /*
                    905: 
                    906: 
                    907: 
                    908: ; Note that other_out and other_in loop until a non-data phase
                    909: ; is discovered, so we only execute return statements when we
                    910: ; can go on to the next data phase block move statement.
                    911: 
                    912: ENTRY other_out
                    913: other_out:
                    914: 
                    915: 
                    916: 
                    917:     INT int_err_unexpected_phase, WHEN CMD
                    918: 
                    919: at 0x000000cf : */     0x9a0b0000,0x00000000,
                    920: /*
                    921:     JUMP msg_in_restart, WHEN MSG_IN 
                    922: 
                    923: at 0x000000d1 : */     0x870b0000,0x000003e4,
                    924: /*
                    925:     INT int_err_unexpected_phase, WHEN MSG_OUT
                    926: 
                    927: at 0x000000d3 : */     0x9e0b0000,0x00000000,
                    928: /*
                    929:     INT int_err_unexpected_phase, WHEN DATA_IN
                    930: 
                    931: at 0x000000d5 : */     0x990b0000,0x00000000,
                    932: /*
                    933:     JUMP command_complete, WHEN STATUS
                    934: 
                    935: at 0x000000d7 : */     0x830b0000,0x0000060c,
                    936: /*
                    937:     JUMP other_out, WHEN NOT DATA_OUT
                    938: 
                    939: at 0x000000d9 : */     0x80030000,0x0000033c,
                    940: /*
                    941:     RETURN
                    942: 
                    943: at 0x000000db : */     0x90080000,0x00000000,
                    944: /*
                    945: 
                    946: ENTRY other_in
                    947: other_in:
                    948: 
                    949: 
                    950: 
                    951:     INT int_err_unexpected_phase, WHEN CMD
                    952: 
                    953: at 0x000000dd : */     0x9a0b0000,0x00000000,
                    954: /*
                    955:     JUMP msg_in_restart, WHEN MSG_IN 
                    956: 
                    957: at 0x000000df : */     0x870b0000,0x000003e4,
                    958: /*
                    959:     INT int_err_unexpected_phase, WHEN MSG_OUT
                    960: 
                    961: at 0x000000e1 : */     0x9e0b0000,0x00000000,
                    962: /*
                    963:     INT int_err_unexpected_phase, WHEN DATA_OUT
                    964: 
                    965: at 0x000000e3 : */     0x980b0000,0x00000000,
                    966: /*
                    967:     JUMP command_complete, WHEN STATUS
                    968: 
                    969: at 0x000000e5 : */     0x830b0000,0x0000060c,
                    970: /*
                    971:     JUMP other_in, WHEN NOT DATA_IN
                    972: 
                    973: at 0x000000e7 : */     0x81030000,0x00000374,
                    974: /*
                    975:     RETURN
                    976: 
                    977: at 0x000000e9 : */     0x90080000,0x00000000,
                    978: /*
                    979: 
                    980: 
                    981: ENTRY other_transfer
                    982: other_transfer:
                    983:     INT int_err_unexpected_phase, WHEN CMD
                    984: 
                    985: at 0x000000eb : */     0x9a0b0000,0x00000000,
                    986: /*
                    987:     CALL msg_in, WHEN MSG_IN
                    988: 
                    989: at 0x000000ed : */     0x8f0b0000,0x00000404,
                    990: /*
                    991:     INT int_err_unexpected_phase, WHEN MSG_OUT
                    992: 
                    993: at 0x000000ef : */     0x9e0b0000,0x00000000,
                    994: /*
                    995:     INT int_err_unexpected_phase, WHEN DATA_OUT
                    996: 
                    997: at 0x000000f1 : */     0x980b0000,0x00000000,
                    998: /*
                    999:     INT int_err_unexpected_phase, WHEN DATA_IN
                   1000: 
                   1001: at 0x000000f3 : */     0x990b0000,0x00000000,
                   1002: /*
                   1003:     JUMP command_complete, WHEN STATUS
                   1004: 
                   1005: at 0x000000f5 : */     0x830b0000,0x0000060c,
                   1006: /*
                   1007:     JUMP other_transfer
                   1008: 
                   1009: at 0x000000f7 : */     0x80080000,0x000003ac,
                   1010: /*
                   1011: 
                   1012: ;
                   1013: ; msg_in_restart
                   1014: ; msg_in
                   1015: ; munge_msg
                   1016: ;
                   1017: ; PURPOSE : process messages from a target.  msg_in is called when the 
                   1018: ;      caller hasn't read the first byte of the message.  munge_message
                   1019: ;      is called when the caller has read the first byte of the message,
                   1020: ;      and left it in SFBR.  msg_in_restart is called when the caller 
                   1021: ;      hasn't read the first byte of the message, and wishes RETURN
                   1022: ;      to transfer control back to the address of the conditional
                   1023: ;      CALL instruction rather than to the instruction after it.
                   1024: ;
                   1025: ;      Various int_* interrupts are generated when the host system
                   1026: ;      needs to intervene, as is the case with SDTR, WDTR, and
                   1027: ;      INITIATE RECOVERY messages.
                   1028: ;
                   1029: ;      When the host system handles one of these interrupts,
                   1030: ;      it can respond by reentering at reject_message, 
                   1031: ;      which rejects the message and returns control to
                   1032: ;      the caller of msg_in or munge_msg, accept_message
                   1033: ;      which clears ACK and returns control, or reply_message
                   1034: ;      which sends the message pointed to by the DSA 
                   1035: ;      msgout_other table indirect field.
                   1036: ;
                   1037: ;      DISCONNECT messages are handled by moving the command
                   1038: ;      to the reconnect_dsa_queue.
                   1039: ;
                   1040: ; INPUTS : DSA - SCSI COMMAND, SFBR - first byte of message (munge_msg
                   1041: ;      only)
                   1042: ;
                   1043: ; CALLS : NO.  The TEMP register isn't backed up to allow nested calls.
                   1044: ;
                   1045: ; MODIFIES : SCRATCH, DSA on DISCONNECT
                   1046: ;
                   1047: ; EXITS : On receipt of SAVE DATA POINTER, RESTORE POINTERS,
                   1048: ;      and normal return from message handlers running under
                   1049: ;      Linux, control is returned to the caller.  Receipt
                   1050: ;      of DISCONNECT messages pass control to dsa_schedule.
                   1051: ;
                   1052: ENTRY msg_in_restart
                   1053: msg_in_restart:
                   1054: ; XXX - hackish
                   1055: ;
                   1056: ; Since it's easier to debug changes to the statically 
                   1057: ; compiled code, rather than the dynamically generated 
                   1058: ; stuff, such as
                   1059: ;
                   1060: ;      MOVE x, y, WHEN data_phase
                   1061: ;      CALL other_z, WHEN NOT data_phase
                   1062: ;      MOVE x, y, WHEN data_phase
                   1063: ;
                   1064: ; I'd like to have certain routines (notably the message handler)
                   1065: ; restart on the conditional call rather than the next instruction.
                   1066: ;
                   1067: ; So, subtract 8 from the return address
                   1068: 
                   1069:     MOVE TEMP0 + 0xf8 TO TEMP0
                   1070: 
                   1071: at 0x000000f9 : */     0x7e1cf800,0x00000000,
                   1072: /*
                   1073:     MOVE TEMP1 + 0xff TO TEMP1 WITH CARRY
                   1074: 
                   1075: at 0x000000fb : */     0x7f1dff00,0x00000000,
                   1076: /*
                   1077:     MOVE TEMP2 + 0xff TO TEMP2 WITH CARRY
                   1078: 
                   1079: at 0x000000fd : */     0x7f1eff00,0x00000000,
                   1080: /*
                   1081:     MOVE TEMP3 + 0xff TO TEMP3 WITH CARRY
                   1082: 
                   1083: at 0x000000ff : */     0x7f1fff00,0x00000000,
                   1084: /*
                   1085: 
                   1086: ENTRY msg_in
                   1087: msg_in:
                   1088:     MOVE 1, msg_buf, WHEN MSG_IN
                   1089: 
                   1090: at 0x00000101 : */     0x0f000001,0x00000000,
                   1091: /*
                   1092: 
                   1093: munge_msg:
                   1094:     JUMP munge_extended, IF 0x01               ; EXTENDED MESSAGE
                   1095: 
                   1096: at 0x00000103 : */     0x800c0001,0x00000524,
                   1097: /*
                   1098:     JUMP munge_2, IF 0x20, AND MASK 0xdf       ; two byte message
                   1099: 
                   1100: at 0x00000105 : */     0x800cdf20,0x0000044c,
                   1101: /*
                   1102: ;
                   1103: ; XXX - I've seen a handful of broken SCSI devices which fail to issue
                   1104: ;      a SAVE POINTERS message before disconnecting in the middle of 
                   1105: ;      a transfer, assuming that the DATA POINTER will be implicitly 
                   1106: ;      restored.  
                   1107: ;
                   1108: ; Historically, I've often done an implicit save when the DISCONNECT
                   1109: ; message is processed.  We may want to consider having the option of 
                   1110: ; doing that here. 
                   1111: ;
                   1112:     JUMP munge_save_data_pointer, IF 0x02      ; SAVE DATA POINTER
                   1113: 
                   1114: at 0x00000107 : */     0x800c0002,0x00000454,
                   1115: /*
                   1116:     JUMP munge_restore_pointers, IF 0x03       ; RESTORE POINTERS 
                   1117: 
                   1118: at 0x00000109 : */     0x800c0003,0x000004b8,
                   1119: /*
                   1120:     JUMP munge_disconnect, IF 0x04             ; DISCONNECT
                   1121: 
                   1122: at 0x0000010b : */     0x800c0004,0x0000051c,
                   1123: /*
                   1124:     INT int_msg_1, IF 0x07                     ; MESSAGE REJECT
                   1125: 
                   1126: at 0x0000010d : */     0x980c0007,0x01020000,
                   1127: /*
                   1128:     INT int_msg_1, IF 0x0f                     ; INITIATE RECOVERY
                   1129: 
                   1130: at 0x0000010f : */     0x980c000f,0x01020000,
                   1131: /*
                   1132: 
                   1133: 
                   1134: 
                   1135:     JUMP reject_message
                   1136: 
                   1137: at 0x00000111 : */     0x80080000,0x000005b4,
                   1138: /*
                   1139: 
                   1140: munge_2:
                   1141:     JUMP reject_message
                   1142: 
                   1143: at 0x00000113 : */     0x80080000,0x000005b4,
                   1144: /*
                   1145: ;
                   1146: ; The SCSI standard allows targets to recover from transient 
                   1147: ; error conditions by backing up the data pointer with a 
                   1148: ; RESTORE POINTERS message.  
                   1149: ;      
                   1150: ; So, we must save and restore the _residual_ code as well as 
                   1151: ; the current instruction pointer.  Because of this messiness,
                   1152: ; it is simpler to put dynamic code in the dsa for this and to
                   1153: ; just do a simple jump down there. 
                   1154: ;
                   1155: 
                   1156: munge_save_data_pointer:
                   1157:     MOVE DSA0 + dsa_save_data_pointer TO SFBR
                   1158: 
                   1159: at 0x00000115 : */     0x76100000,0x00000000,
                   1160: /*
                   1161:     MOVE SFBR TO SCRATCH0
                   1162: 
                   1163: at 0x00000117 : */     0x6a340000,0x00000000,
                   1164: /*
                   1165:     MOVE DSA1 + 0xff TO SFBR WITH CARRY
                   1166: 
                   1167: at 0x00000119 : */     0x7711ff00,0x00000000,
                   1168: /*
                   1169:     MOVE SFBR TO SCRATCH1
                   1170: 
                   1171: at 0x0000011b : */     0x6a350000,0x00000000,
                   1172: /*
                   1173:     MOVE DSA2 + 0xff TO SFBR WITH CARRY 
                   1174: 
                   1175: at 0x0000011d : */     0x7712ff00,0x00000000,
                   1176: /*
                   1177:     MOVE SFBR TO SCRATCH2
                   1178: 
                   1179: at 0x0000011f : */     0x6a360000,0x00000000,
                   1180: /*
                   1181:     MOVE DSA3 + 0xff TO SFBR WITH CARRY
                   1182: 
                   1183: at 0x00000121 : */     0x7713ff00,0x00000000,
                   1184: /*
                   1185:     MOVE SFBR TO SCRATCH3
                   1186: 
                   1187: at 0x00000123 : */     0x6a370000,0x00000000,
                   1188: /*
                   1189: 
                   1190:     MOVE dmode_ncr_to_memory TO DMODE
                   1191: 
                   1192: at 0x00000125 : */     0x78380000,0x00000000,
                   1193: /*
                   1194:     MOVE MEMORY 4, addr_scratch, jump_dsa_save + 4
                   1195: 
                   1196: at 0x00000127 : */     0xc0000004,0x00000000,0x000004b4,
                   1197: /*
                   1198:     MOVE dmode_memory_to_memory TO DMODE
                   1199: 
                   1200: at 0x0000012a : */     0x78380000,0x00000000,
                   1201: /*
                   1202: jump_dsa_save:
                   1203:     JUMP 0
                   1204: 
                   1205: at 0x0000012c : */     0x80080000,0x00000000,
                   1206: /*
                   1207: 
                   1208: munge_restore_pointers:
                   1209:     MOVE DSA0 + dsa_restore_pointers TO SFBR
                   1210: 
                   1211: at 0x0000012e : */     0x76100000,0x00000000,
                   1212: /*
                   1213:     MOVE SFBR TO SCRATCH0
                   1214: 
                   1215: at 0x00000130 : */     0x6a340000,0x00000000,
                   1216: /*
                   1217:     MOVE DSA1 + 0xff TO SFBR WITH CARRY
                   1218: 
                   1219: at 0x00000132 : */     0x7711ff00,0x00000000,
                   1220: /*
                   1221:     MOVE SFBR TO SCRATCH1
                   1222: 
                   1223: at 0x00000134 : */     0x6a350000,0x00000000,
                   1224: /*
                   1225:     MOVE DSA2 + 0xff TO SFBR WITH CARRY
                   1226: 
                   1227: at 0x00000136 : */     0x7712ff00,0x00000000,
                   1228: /*
                   1229:     MOVE SFBR TO SCRATCH2
                   1230: 
                   1231: at 0x00000138 : */     0x6a360000,0x00000000,
                   1232: /*
                   1233:     MOVE DSA3 + 0xff TO SFBR WITH CARRY
                   1234: 
                   1235: at 0x0000013a : */     0x7713ff00,0x00000000,
                   1236: /*
                   1237:     MOVE SFBR TO SCRATCH3
                   1238: 
                   1239: at 0x0000013c : */     0x6a370000,0x00000000,
                   1240: /*
                   1241: 
                   1242:     MOVE dmode_ncr_to_memory TO DMODE
                   1243: 
                   1244: at 0x0000013e : */     0x78380000,0x00000000,
                   1245: /*
                   1246:     MOVE MEMORY 4, addr_scratch, jump_dsa_restore + 4
                   1247: 
                   1248: at 0x00000140 : */     0xc0000004,0x00000000,0x00000518,
                   1249: /*
                   1250:     MOVE dmode_memory_to_memory TO DMODE
                   1251: 
                   1252: at 0x00000143 : */     0x78380000,0x00000000,
                   1253: /*
                   1254: jump_dsa_restore:
                   1255:     JUMP 0
                   1256: 
                   1257: at 0x00000145 : */     0x80080000,0x00000000,
                   1258: /*
                   1259: 
                   1260: 
                   1261: munge_disconnect:
                   1262: 
                   1263: 
                   1264: 
                   1265: 
                   1266: 
                   1267: 
                   1268: 
                   1269: 
                   1270: 
                   1271:  
                   1272: 
                   1273: 
                   1274: 
                   1275: 
                   1276: 
                   1277: 
                   1278:     JUMP dsa_schedule
                   1279: 
                   1280: at 0x00000147 : */     0x80080000,0x00000168,
                   1281: /*
                   1282: 
                   1283: 
                   1284: 
                   1285: 
                   1286: 
                   1287: munge_extended:
                   1288:     CLEAR ACK
                   1289: 
                   1290: at 0x00000149 : */     0x60000040,0x00000000,
                   1291: /*
                   1292:     INT int_err_unexpected_phase, WHEN NOT MSG_IN
                   1293: 
                   1294: at 0x0000014b : */     0x9f030000,0x00000000,
                   1295: /*
                   1296:     MOVE 1, msg_buf + 1, WHEN MSG_IN
                   1297: 
                   1298: at 0x0000014d : */     0x0f000001,0x00000001,
                   1299: /*
                   1300:     JUMP munge_extended_2, IF 0x02
                   1301: 
                   1302: at 0x0000014f : */     0x800c0002,0x00000554,
                   1303: /*
                   1304:     JUMP munge_extended_3, IF 0x03 
                   1305: 
                   1306: at 0x00000151 : */     0x800c0003,0x00000584,
                   1307: /*
                   1308:     JUMP reject_message
                   1309: 
                   1310: at 0x00000153 : */     0x80080000,0x000005b4,
                   1311: /*
                   1312: 
                   1313: munge_extended_2:
                   1314:     CLEAR ACK
                   1315: 
                   1316: at 0x00000155 : */     0x60000040,0x00000000,
                   1317: /*
                   1318:     MOVE 1, msg_buf + 2, WHEN MSG_IN
                   1319: 
                   1320: at 0x00000157 : */     0x0f000001,0x00000002,
                   1321: /*
                   1322:     JUMP reject_message, IF NOT 0x02   ; Must be WDTR
                   1323: 
                   1324: at 0x00000159 : */     0x80040002,0x000005b4,
                   1325: /*
                   1326:     CLEAR ACK
                   1327: 
                   1328: at 0x0000015b : */     0x60000040,0x00000000,
                   1329: /*
                   1330:     MOVE 1, msg_buf + 3, WHEN MSG_IN
                   1331: 
                   1332: at 0x0000015d : */     0x0f000001,0x00000003,
                   1333: /*
                   1334:     INT int_msg_wdtr
                   1335: 
                   1336: at 0x0000015f : */     0x98080000,0x01000000,
                   1337: /*
                   1338: 
                   1339: munge_extended_3:
                   1340:     CLEAR ACK
                   1341: 
                   1342: at 0x00000161 : */     0x60000040,0x00000000,
                   1343: /*
                   1344:     MOVE 1, msg_buf + 2, WHEN MSG_IN
                   1345: 
                   1346: at 0x00000163 : */     0x0f000001,0x00000002,
                   1347: /*
                   1348:     JUMP reject_message, IF NOT 0x01   ; Must be SDTR
                   1349: 
                   1350: at 0x00000165 : */     0x80040001,0x000005b4,
                   1351: /*
                   1352:     CLEAR ACK
                   1353: 
                   1354: at 0x00000167 : */     0x60000040,0x00000000,
                   1355: /*
                   1356:     MOVE 2, msg_buf + 3, WHEN MSG_IN
                   1357: 
                   1358: at 0x00000169 : */     0x0f000002,0x00000003,
                   1359: /*
                   1360:     INT int_msg_sdtr
                   1361: 
                   1362: at 0x0000016b : */     0x98080000,0x01010000,
                   1363: /*
                   1364: 
                   1365: ENTRY reject_message
                   1366: reject_message:
                   1367:     SET ATN
                   1368: 
                   1369: at 0x0000016d : */     0x58000008,0x00000000,
                   1370: /*
                   1371:     CLEAR ACK
                   1372: 
                   1373: at 0x0000016f : */     0x60000040,0x00000000,
                   1374: /*
                   1375:     MOVE 1, NCR53c7xx_msg_reject, WHEN MSG_OUT
                   1376: 
                   1377: at 0x00000171 : */     0x0e000001,0x00000000,
                   1378: /*
                   1379:     RETURN
                   1380: 
                   1381: at 0x00000173 : */     0x90080000,0x00000000,
                   1382: /*
                   1383: 
                   1384: ENTRY accept_message
                   1385: accept_message:
                   1386:     CLEAR ATN
                   1387: 
                   1388: at 0x00000175 : */     0x60000008,0x00000000,
                   1389: /*
                   1390:     CLEAR ACK
                   1391: 
                   1392: at 0x00000177 : */     0x60000040,0x00000000,
                   1393: /*
                   1394:     RETURN
                   1395: 
                   1396: at 0x00000179 : */     0x90080000,0x00000000,
                   1397: /*
                   1398: 
                   1399: ENTRY respond_message
                   1400: respond_message:
                   1401:     SET ATN
                   1402: 
                   1403: at 0x0000017b : */     0x58000008,0x00000000,
                   1404: /*
                   1405:     CLEAR ACK
                   1406: 
                   1407: at 0x0000017d : */     0x60000040,0x00000000,
                   1408: /*
                   1409:     MOVE FROM dsa_msgout_other, WHEN MSG_OUT
                   1410: 
                   1411: at 0x0000017f : */     0x1e000000,0x00000068,
                   1412: /*
                   1413:     RETURN
                   1414: 
                   1415: at 0x00000181 : */     0x90080000,0x00000000,
                   1416: /*
                   1417: 
                   1418: ;
                   1419: ; command_complete
                   1420: ;
                   1421: ; PURPOSE : handle command termination when STATUS IN is detected by reading
                   1422: ;      a status byte followed by a command termination message. 
                   1423: ;
                   1424: ;      Normal termination results in an INTFLY instruction, and 
                   1425: ;      the host system can pick out which command terminated by 
                   1426: ;      examining the MESSAGE and STATUS buffers of all currently 
                   1427: ;      executing commands;
                   1428: ;
                   1429: ;      Abnormal (CHECK_CONDITION) termination results in an
                   1430: ;      int_err_check_condition interrupt so that a REQUEST SENSE
                   1431: ;      command can be issued out-of-order so that no other command
                   1432: ;      clears the contingent allegiance condition.
                   1433: ;      
                   1434: ;
                   1435: ; INPUTS : DSA - command       
                   1436: ;
                   1437: ; CALLS : OK
                   1438: ;
                   1439: ; EXITS : On successful termination, control is passed to schedule.
                   1440: ;      On abnormal termination, the user will usually modify the 
                   1441: ;      DSA fields and corresponding buffers and return control
                   1442: ;      to select.
                   1443: ;
                   1444: 
                   1445: ENTRY command_complete
                   1446: command_complete:
                   1447:     MOVE FROM dsa_status, WHEN STATUS
                   1448: 
                   1449: at 0x00000183 : */     0x1b000000,0x00000060,
                   1450: /*
                   1451: 
                   1452:     MOVE SFBR TO SCRATCH0              ; Save status
                   1453: 
                   1454: at 0x00000185 : */     0x6a340000,0x00000000,
                   1455: /*
                   1456: 
                   1457: ENTRY command_complete_msgin
                   1458: command_complete_msgin:
                   1459:     MOVE FROM dsa_msgin, WHEN MSG_IN
                   1460: 
                   1461: at 0x00000187 : */     0x1f000000,0x00000058,
                   1462: /*
                   1463: ; Indicate that we should be expecting a disconnect
                   1464:     MOVE SCNTL2 & 0x7f TO SCNTL2
                   1465: 
                   1466: at 0x00000189 : */     0x7c027f00,0x00000000,
                   1467: /*
                   1468:     CLEAR ACK
                   1469: 
                   1470: at 0x0000018b : */     0x60000040,0x00000000,
                   1471: /*
                   1472: 
                   1473:     WAIT DISCONNECT
                   1474: 
                   1475: at 0x0000018d : */     0x48000000,0x00000000,
                   1476: /*
                   1477: 
                   1478: ;
                   1479: ; The SCSI specification states that when a UNIT ATTENTION condition
                   1480: ; is pending, as indicated by a CHECK CONDITION status message,
                   1481: ; the target shall revert to asynchronous transfers.  Since
                   1482: ; synchronous transfers parameters are maintained on a per INITIATOR/TARGET 
                   1483: ; basis, and returning control to our scheduler could work on a command
                   1484: ; running on another lun on that target using the old parameters, we must
                   1485: ; interrupt the host processor to get them changed, or change them ourselves.
                   1486: ;
                   1487: ; Once SCSI-II tagged queueing is implemented, things will be even more
                   1488: ; hairy, since contingent allegiance conditions exist on a per-target/lun
                   1489: ; basis, and issuing a new command with a different tag would clear it.
                   1490: ; In these cases, we must interrupt the host processor to get a request 
                   1491: ; added to the HEAD of the queue with the request sense command, or we
                   1492: ; must automatically issue the request sense command.
                   1493: 
                   1494: 
                   1495: 
                   1496: 
                   1497: 
                   1498:     INTFLY
                   1499: 
                   1500: at 0x0000018f : */     0x98180000,0x00000000,
                   1501: /*
                   1502: 
                   1503: 
                   1504: 
                   1505: 
                   1506: 
                   1507:     JUMP schedule
                   1508: 
                   1509: at 0x00000191 : */     0x80080000,0x00000000,
                   1510: /*
                   1511: command_failed:
                   1512:     INT int_err_check_condition
                   1513: 
                   1514: at 0x00000193 : */     0x98080000,0x00030000,
                   1515: /*
                   1516: 
                   1517: 
                   1518: 
                   1519: 
                   1520: ;
                   1521: ; wait_reselect
                   1522: ;
                   1523: ; PURPOSE : This is essentially the idle routine, where control lands
                   1524: ;      when there are no new processes to schedule.  wait_reselect
                   1525: ;      waits for reselection, selection, and new commands.
                   1526: ;
                   1527: ;      When a successful reselection occurs, with the aid 
                   1528: ;      of fixed up code in each DSA, wait_reselect walks the 
                   1529: ;      reconnect_dsa_queue, asking each dsa if the target ID
                   1530: ;      and LUN match its.
                   1531: ;
                   1532: ;      If a match is found, a call is made back to reselected_ok,
                   1533: ;      which through the miracles of self modifying code, extracts
                   1534: ;      the found DSA from the reconnect_dsa_queue and then 
                   1535: ;      returns control to the DSAs thread of execution.
                   1536: ;
                   1537: ; INPUTS : NONE
                   1538: ;
                   1539: ; CALLS : OK
                   1540: ;
                   1541: ; MODIFIES : DSA,
                   1542: ;
                   1543: ; EXITS : On successful reselection, control is returned to the 
                   1544: ;      DSA which called reselected_ok.  If the WAIT RESELECT
                   1545: ;      was interrupted by a new commands arrival signaled by 
                   1546: ;      SIG_P, control is passed to schedule.  If the NCR is 
                   1547: ;      selected, the host system is interrupted with an 
                   1548: ;      int_err_selected which is usually responded to by
                   1549: ;      setting DSP to the target_abort address.
                   1550: 
                   1551: ENTRY wait_reselect
                   1552: wait_reselect:
                   1553: 
                   1554: 
                   1555: 
                   1556: 
                   1557: 
                   1558: 
                   1559:     WAIT RESELECT wait_reselect_failed
                   1560: 
                   1561: at 0x00000195 : */     0x50000000,0x0000076c,
                   1562: /*
                   1563: 
                   1564: reselected:
                   1565: 
                   1566: 
                   1567: 
                   1568:     CLEAR TARGET
                   1569: 
                   1570: at 0x00000197 : */     0x60000200,0x00000000,
                   1571: /*
                   1572:     MOVE dmode_memory_to_memory TO DMODE
                   1573: 
                   1574: at 0x00000199 : */     0x78380000,0x00000000,
                   1575: /*
                   1576:     ; Read all data needed to reestablish the nexus - 
                   1577:     MOVE 1, reselected_identify, WHEN MSG_IN
                   1578: 
                   1579: at 0x0000019b : */     0x0f000001,0x00000000,
                   1580: /*
                   1581:     ; We used to CLEAR ACK here.
                   1582: 
                   1583: 
                   1584: 
                   1585: 
                   1586: 
                   1587:     ; Point DSA at the current head of the disconnected queue.
                   1588:     MOVE dmode_memory_to_ncr  TO DMODE
                   1589: 
                   1590: at 0x0000019d : */     0x78380000,0x00000000,
                   1591: /*
                   1592:     MOVE MEMORY 4, reconnect_dsa_head, addr_scratch
                   1593: 
                   1594: at 0x0000019f : */     0xc0000004,0x00000000,0x00000000,
                   1595: /*
                   1596:     MOVE dmode_memory_to_memory TO DMODE
                   1597: 
                   1598: at 0x000001a2 : */     0x78380000,0x00000000,
                   1599: /*
                   1600:     CALL scratch_to_dsa
                   1601: 
                   1602: at 0x000001a4 : */     0x88080000,0x00000980,
                   1603: /*
                   1604: 
                   1605:     ; Fix the update-next pointer so that the reconnect_dsa_head
                   1606:     ; pointer is the one that will be updated if this DSA is a hit 
                   1607:     ; and we remove it from the queue.
                   1608: 
                   1609:     MOVE MEMORY 4, addr_reconnect_dsa_head, reselected_ok + 8
                   1610: 
                   1611: at 0x000001a6 : */     0xc0000004,0x00000000,0x00000758,
                   1612: /*
                   1613: 
                   1614: ENTRY reselected_check_next
                   1615: reselected_check_next:
                   1616: 
                   1617: 
                   1618: 
                   1619:     ; Check for a NULL pointer.
                   1620:     MOVE DSA0 TO SFBR
                   1621: 
                   1622: at 0x000001a9 : */     0x72100000,0x00000000,
                   1623: /*
                   1624:     JUMP reselected_not_end, IF NOT 0
                   1625: 
                   1626: at 0x000001ab : */     0x80040000,0x000006ec,
                   1627: /*
                   1628:     MOVE DSA1 TO SFBR
                   1629: 
                   1630: at 0x000001ad : */     0x72110000,0x00000000,
                   1631: /*
                   1632:     JUMP reselected_not_end, IF NOT 0
                   1633: 
                   1634: at 0x000001af : */     0x80040000,0x000006ec,
                   1635: /*
                   1636:     MOVE DSA2 TO SFBR
                   1637: 
                   1638: at 0x000001b1 : */     0x72120000,0x00000000,
                   1639: /*
                   1640:     JUMP reselected_not_end, IF NOT 0
                   1641: 
                   1642: at 0x000001b3 : */     0x80040000,0x000006ec,
                   1643: /*
                   1644:     MOVE DSA3 TO SFBR
                   1645: 
                   1646: at 0x000001b5 : */     0x72130000,0x00000000,
                   1647: /*
                   1648:     JUMP reselected_not_end, IF NOT 0
                   1649: 
                   1650: at 0x000001b7 : */     0x80040000,0x000006ec,
                   1651: /*
                   1652:     INT int_err_unexpected_reselect
                   1653: 
                   1654: at 0x000001b9 : */     0x98080000,0x00020000,
                   1655: /*
                   1656: 
                   1657: reselected_not_end:
                   1658:     ;
                   1659:     ; XXX the ALU is only eight bits wide, and the assembler
                   1660:     ; wont do the dirt work for us.  As long as dsa_check_reselect
                   1661:     ; is negative, we need to sign extend with 1 bits to the full
                   1662:     ; 32 bit width of the address.
                   1663:     ;
                   1664:     ; A potential work around would be to have a known alignment 
                   1665:     ; of the DSA structure such that the base address plus 
                   1666:     ; dsa_check_reselect doesn't require carrying from bytes 
                   1667:     ; higher than the LSB.
                   1668:     ;
                   1669: 
                   1670:     MOVE DSA0 TO SFBR
                   1671: 
                   1672: at 0x000001bb : */     0x72100000,0x00000000,
                   1673: /*
                   1674:     MOVE SFBR + dsa_check_reselect TO SCRATCH0
                   1675: 
                   1676: at 0x000001bd : */     0x6e340000,0x00000000,
                   1677: /*
                   1678:     MOVE DSA1 TO SFBR
                   1679: 
                   1680: at 0x000001bf : */     0x72110000,0x00000000,
                   1681: /*
                   1682:     MOVE SFBR + 0xff TO SCRATCH1 WITH CARRY
                   1683: 
                   1684: at 0x000001c1 : */     0x6f35ff00,0x00000000,
                   1685: /*
                   1686:     MOVE DSA2 TO SFBR
                   1687: 
                   1688: at 0x000001c3 : */     0x72120000,0x00000000,
                   1689: /*
                   1690:     MOVE SFBR + 0xff TO SCRATCH2 WITH CARRY
                   1691: 
                   1692: at 0x000001c5 : */     0x6f36ff00,0x00000000,
                   1693: /*
                   1694:     MOVE DSA3 TO SFBR
                   1695: 
                   1696: at 0x000001c7 : */     0x72130000,0x00000000,
                   1697: /*
                   1698:     MOVE SFBR + 0xff TO SCRATCH3 WITH CARRY
                   1699: 
                   1700: at 0x000001c9 : */     0x6f37ff00,0x00000000,
                   1701: /*
                   1702: 
                   1703:     MOVE dmode_ncr_to_memory TO DMODE
                   1704: 
                   1705: at 0x000001cb : */     0x78380000,0x00000000,
                   1706: /*
                   1707:     MOVE MEMORY 4, addr_scratch, reselected_check + 4
                   1708: 
                   1709: at 0x000001cd : */     0xc0000004,0x00000000,0x0000074c,
                   1710: /*
                   1711:     MOVE dmode_memory_to_memory TO DMODE
                   1712: 
                   1713: at 0x000001d0 : */     0x78380000,0x00000000,
                   1714: /*
                   1715: reselected_check:
                   1716:     JUMP 0
                   1717: 
                   1718: at 0x000001d2 : */     0x80080000,0x00000000,
                   1719: /*
                   1720: 
                   1721: 
                   1722: ;
                   1723: ;
                   1724: ENTRY reselected_ok
                   1725: reselected_ok:
                   1726:     MOVE MEMORY 4, 0, 0                                ; Patched : first word
                   1727: 
                   1728: at 0x000001d4 : */     0xc0000004,0x00000000,0x00000000,
                   1729: /*
                   1730:                                                ;       is address of 
                   1731:                                                ;       successful dsa_next
                   1732:                                                ; Second word is last 
                   1733:                                                ;       unsuccessful dsa_next,
                   1734:                                                ;       starting with 
                   1735:                                                ;       dsa_reconnect_head
                   1736:     ; We used to CLEAR ACK here.
                   1737: 
                   1738: 
                   1739: 
                   1740: 
                   1741: 
                   1742: 
                   1743:     RETURN                                     ; Return control to where
                   1744: 
                   1745: at 0x000001d7 : */     0x90080000,0x00000000,
                   1746: /*
                   1747: 
                   1748: 
                   1749: 
                   1750: 
                   1751: selected:
                   1752:     INT int_err_selected;
                   1753: 
                   1754: at 0x000001d9 : */     0x98080000,0x00010000,
                   1755: /*
                   1756: 
                   1757: ;
                   1758: ; A select or reselect failure can be caused by one of two conditions : 
                   1759: ; 1.  SIG_P was set.  This will be the case if the user has written
                   1760: ;      a new value to a previously NULL head of the issue queue.
                   1761: ;
                   1762: ; 2.  The NCR53c810 was selected or reselected by another device.
                   1763: ;
                   1764: ; 3.  The bus was already busy since we were selected or reselected
                   1765: ;      before starting the command.
                   1766: 
                   1767: wait_reselect_failed:
                   1768: 
                   1769: 
                   1770: 
                   1771: ; Check selected bit.  
                   1772:     MOVE SIST0 & 0x20 TO SFBR
                   1773: 
                   1774: at 0x000001db : */     0x74422000,0x00000000,
                   1775: /*
                   1776:     JUMP selected, IF 0x20
                   1777: 
                   1778: at 0x000001dd : */     0x800c0020,0x00000764,
                   1779: /*
                   1780: ; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
                   1781:     MOVE CTEST2 & 0x40 TO SFBR 
                   1782: 
                   1783: at 0x000001df : */     0x741a4000,0x00000000,
                   1784: /*
                   1785:     JUMP schedule, IF 0x40
                   1786: 
                   1787: at 0x000001e1 : */     0x800c0040,0x00000000,
                   1788: /*
                   1789: ; Check connected bit.  
                   1790: ; FIXME: this needs to change if we support target mode
                   1791:     MOVE ISTAT & 0x08 TO SFBR
                   1792: 
                   1793: at 0x000001e3 : */     0x74140800,0x00000000,
                   1794: /*
                   1795:     JUMP reselected, IF 0x08
                   1796: 
                   1797: at 0x000001e5 : */     0x800c0008,0x0000065c,
                   1798: /*
                   1799: ; FIXME : Something bogus happened, and we shouldn't fail silently.
                   1800: 
                   1801: 
                   1802: 
                   1803:     INT int_debug_panic
                   1804: 
                   1805: at 0x000001e7 : */     0x98080000,0x030b0000,
                   1806: /*
                   1807: 
                   1808: 
                   1809: 
                   1810: select_failed:
                   1811: 
                   1812: 
                   1813: 
                   1814: ; Otherwise, mask the selected and reselected bits off SIST0
                   1815:     MOVE SIST0 & 0x30 TO SFBR
                   1816: 
                   1817: at 0x000001e9 : */     0x74423000,0x00000000,
                   1818: /*
                   1819:     JUMP selected, IF 0x20
                   1820: 
                   1821: at 0x000001eb : */     0x800c0020,0x00000764,
                   1822: /*
                   1823:     JUMP reselected, IF 0x10 
                   1824: 
                   1825: at 0x000001ed : */     0x800c0010,0x0000065c,
                   1826: /*
                   1827: ; If SIGP is set, the user just gave us another command, and
                   1828: ; we should restart or return to the scheduler.
                   1829: ; Reading CTEST2 clears the SIG_P bit in the ISTAT register.
                   1830:     MOVE CTEST2 & 0x40 TO SFBR 
                   1831: 
                   1832: at 0x000001ef : */     0x741a4000,0x00000000,
                   1833: /*
                   1834:     JUMP select, IF 0x40
                   1835: 
                   1836: at 0x000001f1 : */     0x800c0040,0x000001fc,
                   1837: /*
                   1838: ; Check connected bit.  
                   1839: ; FIXME: this needs to change if we support target mode
                   1840: ; FIXME: is this really necessary? 
                   1841:     MOVE ISTAT & 0x08 TO SFBR
                   1842: 
                   1843: at 0x000001f3 : */     0x74140800,0x00000000,
                   1844: /*
                   1845:     JUMP reselected, IF 0x08
                   1846: 
                   1847: at 0x000001f5 : */     0x800c0008,0x0000065c,
                   1848: /*
                   1849: ; FIXME : Something bogus happened, and we shouldn't fail silently.
                   1850: 
                   1851: 
                   1852: 
                   1853:     INT int_debug_panic
                   1854: 
                   1855: at 0x000001f7 : */     0x98080000,0x030b0000,
                   1856: /*
                   1857: 
                   1858: 
                   1859: ;
                   1860: ; test_1
                   1861: ; test_2
                   1862: ;
                   1863: ; PURPOSE : run some verification tests on the NCR.  test_1
                   1864: ;      copies test_src to test_dest and interrupts the host
                   1865: ;      processor, testing for cache coherency and interrupt
                   1866: ;      problems in the processes.
                   1867: ;
                   1868: ;      test_2 runs a command with offsets relative to the 
                   1869: ;      DSA on entry, and is useful for miscellaneous experimentation.
                   1870: ;
                   1871: 
                   1872: ; Verify that interrupts are working correctly and that we don't 
                   1873: ; have a cache invalidation problem.
                   1874: 
                   1875: ABSOLUTE test_src = 0, test_dest = 0
                   1876: ENTRY test_1
                   1877: test_1:
                   1878:     MOVE MEMORY 4, test_src, test_dest
                   1879: 
                   1880: at 0x000001f9 : */     0xc0000004,0x00000000,0x00000000,
                   1881: /*
                   1882:     INT int_test_1
                   1883: 
                   1884: at 0x000001fc : */     0x98080000,0x04000000,
                   1885: /*
                   1886: 
                   1887: ;
                   1888: ; Run arbitrary commands, with test code establishing a DSA
                   1889: ;
                   1890:  
                   1891: ENTRY test_2
                   1892: test_2:
                   1893:     CLEAR TARGET
                   1894: 
                   1895: at 0x000001fe : */     0x60000200,0x00000000,
                   1896: /*
                   1897:     SELECT ATN FROM 0, test_2_fail
                   1898: 
                   1899: at 0x00000200 : */     0x43000000,0x00000850,
                   1900: /*
                   1901:     JUMP test_2_msgout, WHEN MSG_OUT
                   1902: 
                   1903: at 0x00000202 : */     0x860b0000,0x00000810,
                   1904: /*
                   1905: ENTRY test_2_msgout
                   1906: test_2_msgout:
                   1907:     MOVE FROM 8, WHEN MSG_OUT
                   1908: 
                   1909: at 0x00000204 : */     0x1e000000,0x00000008,
                   1910: /*
                   1911:     MOVE FROM 16, WHEN CMD 
                   1912: 
                   1913: at 0x00000206 : */     0x1a000000,0x00000010,
                   1914: /*
                   1915:     MOVE FROM 24, WHEN DATA_IN
                   1916: 
                   1917: at 0x00000208 : */     0x19000000,0x00000018,
                   1918: /*
                   1919:     MOVE FROM 32, WHEN STATUS
                   1920: 
                   1921: at 0x0000020a : */     0x1b000000,0x00000020,
                   1922: /*
                   1923:     MOVE FROM 40, WHEN MSG_IN
                   1924: 
                   1925: at 0x0000020c : */     0x1f000000,0x00000028,
                   1926: /*
                   1927:     MOVE SCNTL2 & 0x7f TO SCNTL2
                   1928: 
                   1929: at 0x0000020e : */     0x7c027f00,0x00000000,
                   1930: /*
                   1931:     CLEAR ACK
                   1932: 
                   1933: at 0x00000210 : */     0x60000040,0x00000000,
                   1934: /*
                   1935:     WAIT DISCONNECT
                   1936: 
                   1937: at 0x00000212 : */     0x48000000,0x00000000,
                   1938: /*
                   1939: test_2_fail:
                   1940:     INT int_test_2
                   1941: 
                   1942: at 0x00000214 : */     0x98080000,0x04010000,
                   1943: /*
                   1944: 
                   1945: ENTRY debug_break
                   1946: debug_break:
                   1947:     INT int_debug_break
                   1948: 
                   1949: at 0x00000216 : */     0x98080000,0x03000000,
                   1950: /*
                   1951: 
                   1952: ;
                   1953: ; initiator_abort
                   1954: ; target_abort
                   1955: ;
                   1956: ; PURPOSE : Abort the currently established nexus from with initiator
                   1957: ;      or target mode.
                   1958: ;
                   1959: ;  
                   1960: 
                   1961: ENTRY target_abort
                   1962: target_abort:
                   1963:     SET TARGET
                   1964: 
                   1965: at 0x00000218 : */     0x58000200,0x00000000,
                   1966: /*
                   1967:     DISCONNECT
                   1968: 
                   1969: at 0x0000021a : */     0x48000000,0x00000000,
                   1970: /*
                   1971:     CLEAR TARGET
                   1972: 
                   1973: at 0x0000021c : */     0x60000200,0x00000000,
                   1974: /*
                   1975:     JUMP schedule
                   1976: 
                   1977: at 0x0000021e : */     0x80080000,0x00000000,
                   1978: /*
                   1979:     
                   1980: ENTRY initiator_abort
                   1981: initiator_abort:
                   1982:     SET ATN
                   1983: 
                   1984: at 0x00000220 : */     0x58000008,0x00000000,
                   1985: /*
                   1986: ;
                   1987: ; The SCSI-I specification says that targets may go into MSG out at 
                   1988: ; their leisure upon receipt of the ATN single.  On all versions of the 
                   1989: ; specification, we can't change phases until REQ transitions true->false, 
                   1990: ; so we need to sink/source one byte of data to allow the transition.
                   1991: ;
                   1992: ; For the sake of safety, we'll only source one byte of data in all 
                   1993: ; cases, but to accommodate the SCSI-I dain bramage, we'll sink an  
                   1994: ; arbitrary number of bytes.
                   1995:     JUMP spew_cmd, WHEN CMD
                   1996: 
                   1997: at 0x00000222 : */     0x820b0000,0x000008b8,
                   1998: /*
                   1999:     JUMP eat_msgin, WHEN MSG_IN
                   2000: 
                   2001: at 0x00000224 : */     0x870b0000,0x000008c8,
                   2002: /*
                   2003:     JUMP eat_datain, WHEN DATA_IN
                   2004: 
                   2005: at 0x00000226 : */     0x810b0000,0x000008f8,
                   2006: /*
                   2007:     JUMP eat_status, WHEN STATUS
                   2008: 
                   2009: at 0x00000228 : */     0x830b0000,0x000008e0,
                   2010: /*
                   2011:     JUMP spew_dataout, WHEN DATA_OUT
                   2012: 
                   2013: at 0x0000022a : */     0x800b0000,0x00000910,
                   2014: /*
                   2015:     JUMP sated
                   2016: 
                   2017: at 0x0000022c : */     0x80080000,0x00000918,
                   2018: /*
                   2019: spew_cmd:
                   2020:     MOVE 1, NCR53c7xx_zero, WHEN CMD
                   2021: 
                   2022: at 0x0000022e : */     0x0a000001,0x00000000,
                   2023: /*
                   2024:     JUMP sated
                   2025: 
                   2026: at 0x00000230 : */     0x80080000,0x00000918,
                   2027: /*
                   2028: eat_msgin:
                   2029:     MOVE 1, NCR53c7xx_sink, WHEN MSG_IN
                   2030: 
                   2031: at 0x00000232 : */     0x0f000001,0x00000000,
                   2032: /*
                   2033:     JUMP eat_msgin, WHEN MSG_IN
                   2034: 
                   2035: at 0x00000234 : */     0x870b0000,0x000008c8,
                   2036: /*
                   2037:     JUMP sated
                   2038: 
                   2039: at 0x00000236 : */     0x80080000,0x00000918,
                   2040: /*
                   2041: eat_status:
                   2042:     MOVE 1, NCR53c7xx_sink, WHEN STATUS
                   2043: 
                   2044: at 0x00000238 : */     0x0b000001,0x00000000,
                   2045: /*
                   2046:     JUMP eat_status, WHEN STATUS
                   2047: 
                   2048: at 0x0000023a : */     0x830b0000,0x000008e0,
                   2049: /*
                   2050:     JUMP sated
                   2051: 
                   2052: at 0x0000023c : */     0x80080000,0x00000918,
                   2053: /*
                   2054: eat_datain:
                   2055:     MOVE 1, NCR53c7xx_sink, WHEN DATA_IN
                   2056: 
                   2057: at 0x0000023e : */     0x09000001,0x00000000,
                   2058: /*
                   2059:     JUMP eat_datain, WHEN DATA_IN
                   2060: 
                   2061: at 0x00000240 : */     0x810b0000,0x000008f8,
                   2062: /*
                   2063:     JUMP sated
                   2064: 
                   2065: at 0x00000242 : */     0x80080000,0x00000918,
                   2066: /*
                   2067: spew_dataout:
                   2068:     MOVE 1, NCR53c7xx_zero, WHEN DATA_OUT
                   2069: 
                   2070: at 0x00000244 : */     0x08000001,0x00000000,
                   2071: /*
                   2072: sated:
                   2073:     MOVE SCNTL2 & 0x7f TO SCNTL2
                   2074: 
                   2075: at 0x00000246 : */     0x7c027f00,0x00000000,
                   2076: /*
                   2077:     MOVE 1, NCR53c7xx_msg_abort, WHEN MSG_OUT
                   2078: 
                   2079: at 0x00000248 : */     0x0e000001,0x00000000,
                   2080: /*
                   2081:     WAIT DISCONNECT
                   2082: 
                   2083: at 0x0000024a : */     0x48000000,0x00000000,
                   2084: /*
                   2085:     INT int_norm_aborted
                   2086: 
                   2087: at 0x0000024c : */     0x98080000,0x02040000,
                   2088: /*
                   2089: 
                   2090: ;
                   2091: ; dsa_to_scratch
                   2092: ; scratch_to_dsa
                   2093: ;
                   2094: ; PURPOSE :
                   2095: ;      The NCR chips cannot do a move memory instruction with the DSA register 
                   2096: ;      as the source or destination.  So, we provide a couple of subroutines
                   2097: ;      that let us switch between the DSA register and scratch register.
                   2098: ;
                   2099: ;      Memory moves to/from the DSPS  register also don't work, but we 
                   2100: ;      don't use them.
                   2101: ;
                   2102: ;
                   2103: 
                   2104:  
                   2105: dsa_to_scratch:
                   2106:     MOVE DSA0 TO SFBR
                   2107: 
                   2108: at 0x0000024e : */     0x72100000,0x00000000,
                   2109: /*
                   2110:     MOVE SFBR TO SCRATCH0
                   2111: 
                   2112: at 0x00000250 : */     0x6a340000,0x00000000,
                   2113: /*
                   2114:     MOVE DSA1 TO SFBR
                   2115: 
                   2116: at 0x00000252 : */     0x72110000,0x00000000,
                   2117: /*
                   2118:     MOVE SFBR TO SCRATCH1
                   2119: 
                   2120: at 0x00000254 : */     0x6a350000,0x00000000,
                   2121: /*
                   2122:     MOVE DSA2 TO SFBR
                   2123: 
                   2124: at 0x00000256 : */     0x72120000,0x00000000,
                   2125: /*
                   2126:     MOVE SFBR TO SCRATCH2
                   2127: 
                   2128: at 0x00000258 : */     0x6a360000,0x00000000,
                   2129: /*
                   2130:     MOVE DSA3 TO SFBR
                   2131: 
                   2132: at 0x0000025a : */     0x72130000,0x00000000,
                   2133: /*
                   2134:     MOVE SFBR TO SCRATCH3
                   2135: 
                   2136: at 0x0000025c : */     0x6a370000,0x00000000,
                   2137: /*
                   2138:     RETURN
                   2139: 
                   2140: at 0x0000025e : */     0x90080000,0x00000000,
                   2141: /*
                   2142: 
                   2143: scratch_to_dsa:
                   2144:     MOVE SCRATCH0 TO SFBR
                   2145: 
                   2146: at 0x00000260 : */     0x72340000,0x00000000,
                   2147: /*
                   2148:     MOVE SFBR TO DSA0
                   2149: 
                   2150: at 0x00000262 : */     0x6a100000,0x00000000,
                   2151: /*
                   2152:     MOVE SCRATCH1 TO SFBR
                   2153: 
                   2154: at 0x00000264 : */     0x72350000,0x00000000,
                   2155: /*
                   2156:     MOVE SFBR TO DSA1
                   2157: 
                   2158: at 0x00000266 : */     0x6a110000,0x00000000,
                   2159: /*
                   2160:     MOVE SCRATCH2 TO SFBR
                   2161: 
                   2162: at 0x00000268 : */     0x72360000,0x00000000,
                   2163: /*
                   2164:     MOVE SFBR TO DSA2
                   2165: 
                   2166: at 0x0000026a : */     0x6a120000,0x00000000,
                   2167: /*
                   2168:     MOVE SCRATCH3 TO SFBR
                   2169: 
                   2170: at 0x0000026c : */     0x72370000,0x00000000,
                   2171: /*
                   2172:     MOVE SFBR TO DSA3
                   2173: 
                   2174: at 0x0000026e : */     0x6a130000,0x00000000,
                   2175: /*
                   2176:     RETURN
                   2177: 
                   2178: at 0x00000270 : */     0x90080000,0x00000000,
                   2179: };
                   2180: 
                   2181: #define A_NCR53c7xx_msg_abort  0x00000000
                   2182: u32 A_NCR53c7xx_msg_abort_used[] = {
                   2183:        0x00000249,
                   2184: };
                   2185: 
                   2186: #define A_NCR53c7xx_msg_reject 0x00000000
                   2187: u32 A_NCR53c7xx_msg_reject_used[] = {
                   2188:        0x00000172,
                   2189: };
                   2190: 
                   2191: #define A_NCR53c7xx_sink       0x00000000
                   2192: u32 A_NCR53c7xx_sink_used[] = {
                   2193:        0x00000233,
                   2194:        0x00000239,
                   2195:        0x0000023f,
                   2196: };
                   2197: 
                   2198: #define A_NCR53c7xx_zero       0x00000000
                   2199: u32 A_NCR53c7xx_zero_used[] = {
                   2200:        0x0000022f,
                   2201:        0x00000245,
                   2202: };
                   2203: 
                   2204: #define A_NOP_insn     0x00000000
                   2205: u32 A_NOP_insn_used[] = {
                   2206:        0x00000010,
                   2207: };
                   2208: 
                   2209: #define A_addr_reconnect_dsa_head      0x00000000
                   2210: u32 A_addr_reconnect_dsa_head_used[] = {
                   2211:        0x000001a7,
                   2212: };
                   2213: 
                   2214: #define A_addr_scratch 0x00000000
                   2215: u32 A_addr_scratch_used[] = {
                   2216:        0x00000004,
                   2217:        0x0000001b,
                   2218:        0x00000046,
                   2219:        0x00000067,
                   2220:        0x00000073,
                   2221:        0x000000b0,
                   2222:        0x000000c6,
                   2223:        0x00000128,
                   2224:        0x00000141,
                   2225:        0x000001a1,
                   2226:        0x000001ce,
                   2227: };
                   2228: 
                   2229: #define A_addr_temp    0x00000000
                   2230: u32 A_addr_temp_used[] = {
                   2231:        0x00000025,
                   2232:        0x00000034,
                   2233: };
                   2234: 
                   2235: #define A_dmode_memory_to_memory       0x00000000
                   2236: u32 A_dmode_memory_to_memory_used[] = {
                   2237:        0x00000005,
                   2238:        0x0000001c,
                   2239:        0x00000027,
                   2240:        0x00000035,
                   2241:        0x00000047,
                   2242:        0x00000069,
                   2243:        0x00000075,
                   2244:        0x000000b2,
                   2245:        0x000000c8,
                   2246:        0x0000012a,
                   2247:        0x00000143,
                   2248:        0x00000199,
                   2249:        0x000001a2,
                   2250:        0x000001d0,
                   2251: };
                   2252: 
                   2253: #define A_dmode_memory_to_ncr  0x00000000
                   2254: u32 A_dmode_memory_to_ncr_used[] = {
                   2255:        0x00000000,
                   2256:        0x00000017,
                   2257:        0x00000030,
                   2258:        0x00000042,
                   2259:        0x0000019d,
                   2260: };
                   2261: 
                   2262: #define A_dmode_ncr_to_memory  0x00000000
                   2263: u32 A_dmode_ncr_to_memory_used[] = {
                   2264:        0x00000022,
                   2265:        0x00000064,
                   2266:        0x00000070,
                   2267:        0x000000ad,
                   2268:        0x000000c3,
                   2269:        0x00000125,
                   2270:        0x0000013e,
                   2271:        0x000001cb,
                   2272: };
                   2273: 
                   2274: #define A_dsa_check_reselect   0x00000000
                   2275: u32 A_dsa_check_reselect_used[] = {
                   2276:        0x000001bd,
                   2277: };
                   2278: 
                   2279: #define A_dsa_cmdout   0x00000048
                   2280: u32 A_dsa_cmdout_used[] = {
                   2281:        0x00000094,
                   2282: };
                   2283: 
                   2284: #define A_dsa_cmnd     0x00000038
                   2285: u32 A_dsa_cmnd_used[] = {
                   2286: };
                   2287: 
                   2288: #define A_dsa_datain   0x00000054
                   2289: u32 A_dsa_datain_used[] = {
                   2290:        0x000000bb,
                   2291: };
                   2292: 
                   2293: #define A_dsa_dataout  0x00000050
                   2294: u32 A_dsa_dataout_used[] = {
                   2295:        0x000000a5,
                   2296: };
                   2297: 
                   2298: #define A_dsa_end      0x00000070
                   2299: u32 A_dsa_end_used[] = {
                   2300: };
                   2301: 
                   2302: #define A_dsa_fields_start     0x00000000
                   2303: u32 A_dsa_fields_start_used[] = {
                   2304: };
                   2305: 
                   2306: #define A_dsa_msgin    0x00000058
                   2307: u32 A_dsa_msgin_used[] = {
                   2308:        0x00000188,
                   2309: };
                   2310: 
                   2311: #define A_dsa_msgout   0x00000040
                   2312: u32 A_dsa_msgout_used[] = {
                   2313:        0x00000086,
                   2314: };
                   2315: 
                   2316: #define A_dsa_msgout_other     0x00000068
                   2317: u32 A_dsa_msgout_other_used[] = {
                   2318:        0x00000180,
                   2319: };
                   2320: 
                   2321: #define A_dsa_next     0x00000030
                   2322: u32 A_dsa_next_used[] = {
                   2323:        0x0000005c,
                   2324: };
                   2325: 
                   2326: #define A_dsa_restore_pointers 0x00000000
                   2327: u32 A_dsa_restore_pointers_used[] = {
                   2328:        0x0000012e,
                   2329: };
                   2330: 
                   2331: #define A_dsa_save_data_pointer        0x00000000
                   2332: u32 A_dsa_save_data_pointer_used[] = {
                   2333:        0x00000115,
                   2334: };
                   2335: 
                   2336: #define A_dsa_select   0x0000003c
                   2337: u32 A_dsa_select_used[] = {
                   2338:        0x00000081,
                   2339: };
                   2340: 
                   2341: #define A_dsa_status   0x00000060
                   2342: u32 A_dsa_status_used[] = {
                   2343:        0x00000184,
                   2344: };
                   2345: 
                   2346: #define A_dsa_temp_addr_array_value    0x00000000
                   2347: u32 A_dsa_temp_addr_array_value_used[] = {
                   2348: };
                   2349: 
                   2350: #define A_dsa_temp_addr_dsa_value      0x00000000
                   2351: u32 A_dsa_temp_addr_dsa_value_used[] = {
                   2352:        0x00000003,
                   2353: };
                   2354: 
                   2355: #define A_dsa_temp_addr_new_value      0x00000000
                   2356: u32 A_dsa_temp_addr_new_value_used[] = {
                   2357: };
                   2358: 
                   2359: #define A_dsa_temp_addr_next   0x00000000
                   2360: u32 A_dsa_temp_addr_next_used[] = {
                   2361:        0x00000015,
                   2362:        0x0000004e,
                   2363: };
                   2364: 
                   2365: #define A_dsa_temp_addr_residual       0x00000000
                   2366: u32 A_dsa_temp_addr_residual_used[] = {
                   2367:        0x0000002a,
                   2368:        0x00000039,
                   2369: };
                   2370: 
                   2371: #define A_dsa_temp_addr_saved_pointer  0x00000000
                   2372: u32 A_dsa_temp_addr_saved_pointer_used[] = {
                   2373:        0x00000026,
                   2374:        0x00000033,
                   2375: };
                   2376: 
                   2377: #define A_dsa_temp_addr_saved_residual 0x00000000
                   2378: u32 A_dsa_temp_addr_saved_residual_used[] = {
                   2379:        0x0000002b,
                   2380:        0x00000038,
                   2381: };
                   2382: 
                   2383: #define A_dsa_temp_lun 0x00000000
                   2384: u32 A_dsa_temp_lun_used[] = {
                   2385:        0x0000004b,
                   2386: };
                   2387: 
                   2388: #define A_dsa_temp_next        0x00000000
                   2389: u32 A_dsa_temp_next_used[] = {
                   2390:        0x0000001a,
                   2391: };
                   2392: 
                   2393: #define A_dsa_temp_sync        0x00000000
                   2394: u32 A_dsa_temp_sync_used[] = {
                   2395:        0x00000053,
                   2396: };
                   2397: 
                   2398: #define A_dsa_temp_target      0x00000000
                   2399: u32 A_dsa_temp_target_used[] = {
                   2400:        0x00000040,
                   2401: };
                   2402: 
                   2403: #define A_int_debug_break      0x03000000
                   2404: u32 A_int_debug_break_used[] = {
                   2405:        0x00000217,
                   2406: };
                   2407: 
                   2408: #define A_int_debug_panic      0x030b0000
                   2409: u32 A_int_debug_panic_used[] = {
                   2410:        0x000001e8,
                   2411:        0x000001f8,
                   2412: };
                   2413: 
                   2414: #define A_int_err_check_condition      0x00030000
                   2415: u32 A_int_err_check_condition_used[] = {
                   2416:        0x00000194,
                   2417: };
                   2418: 
                   2419: #define A_int_err_no_phase     0x00040000
                   2420: u32 A_int_err_no_phase_used[] = {
                   2421: };
                   2422: 
                   2423: #define A_int_err_selected     0x00010000
                   2424: u32 A_int_err_selected_used[] = {
                   2425:        0x000001da,
                   2426: };
                   2427: 
                   2428: #define A_int_err_unexpected_phase     0x00000000
                   2429: u32 A_int_err_unexpected_phase_used[] = {
                   2430:        0x0000008c,
                   2431:        0x00000092,
                   2432:        0x0000009a,
                   2433:        0x000000d0,
                   2434:        0x000000d4,
                   2435:        0x000000d6,
                   2436:        0x000000de,
                   2437:        0x000000e2,
                   2438:        0x000000e4,
                   2439:        0x000000ec,
                   2440:        0x000000f0,
                   2441:        0x000000f2,
                   2442:        0x000000f4,
                   2443:        0x0000014c,
                   2444: };
                   2445: 
                   2446: #define A_int_err_unexpected_reselect  0x00020000
                   2447: u32 A_int_err_unexpected_reselect_used[] = {
                   2448:        0x000001ba,
                   2449: };
                   2450: 
                   2451: #define A_int_msg_1    0x01020000
                   2452: u32 A_int_msg_1_used[] = {
                   2453:        0x0000010e,
                   2454:        0x00000110,
                   2455: };
                   2456: 
                   2457: #define A_int_msg_sdtr 0x01010000
                   2458: u32 A_int_msg_sdtr_used[] = {
                   2459:        0x0000016c,
                   2460: };
                   2461: 
                   2462: #define A_int_msg_wdtr 0x01000000
                   2463: u32 A_int_msg_wdtr_used[] = {
                   2464:        0x00000160,
                   2465: };
                   2466: 
                   2467: #define A_int_norm_aborted     0x02040000
                   2468: u32 A_int_norm_aborted_used[] = {
                   2469:        0x0000024d,
                   2470: };
                   2471: 
                   2472: #define A_int_norm_command_complete    0x02020000
                   2473: u32 A_int_norm_command_complete_used[] = {
                   2474: };
                   2475: 
                   2476: #define A_int_norm_disconnected        0x02030000
                   2477: u32 A_int_norm_disconnected_used[] = {
                   2478: };
                   2479: 
                   2480: #define A_int_norm_reselect_complete   0x02010000
                   2481: u32 A_int_norm_reselect_complete_used[] = {
                   2482: };
                   2483: 
                   2484: #define A_int_norm_reset       0x02050000
                   2485: u32 A_int_norm_reset_used[] = {
                   2486: };
                   2487: 
                   2488: #define A_int_norm_select_complete     0x02000000
                   2489: u32 A_int_norm_select_complete_used[] = {
                   2490: };
                   2491: 
                   2492: #define A_int_test_1   0x04000000
                   2493: u32 A_int_test_1_used[] = {
                   2494:        0x000001fd,
                   2495: };
                   2496: 
                   2497: #define A_int_test_2   0x04010000
                   2498: u32 A_int_test_2_used[] = {
                   2499:        0x00000215,
                   2500: };
                   2501: 
                   2502: #define A_int_test_3   0x04020000
                   2503: u32 A_int_test_3_used[] = {
                   2504: };
                   2505: 
                   2506: #define A_msg_buf      0x00000000
                   2507: u32 A_msg_buf_used[] = {
                   2508:        0x00000102,
                   2509:        0x0000014e,
                   2510:        0x00000158,
                   2511:        0x0000015e,
                   2512:        0x00000164,
                   2513:        0x0000016a,
                   2514: };
                   2515: 
                   2516: #define A_reconnect_dsa_head   0x00000000
                   2517: u32 A_reconnect_dsa_head_used[] = {
                   2518:        0x0000006c,
                   2519:        0x00000074,
                   2520:        0x000001a0,
                   2521: };
                   2522: 
                   2523: #define A_reselected_identify  0x00000000
                   2524: u32 A_reselected_identify_used[] = {
                   2525:        0x00000045,
                   2526:        0x0000019c,
                   2527: };
                   2528: 
                   2529: #define A_reselected_tag       0x00000000
                   2530: u32 A_reselected_tag_used[] = {
                   2531: };
                   2532: 
                   2533: #define A_schedule     0x00000000
                   2534: u32 A_schedule_used[] = {
                   2535:        0x0000007e,
                   2536:        0x00000192,
                   2537:        0x000001e2,
                   2538:        0x0000021f,
                   2539: };
                   2540: 
                   2541: #define A_test_dest    0x00000000
                   2542: u32 A_test_dest_used[] = {
                   2543:        0x000001fb,
                   2544: };
                   2545: 
                   2546: #define A_test_src     0x00000000
                   2547: u32 A_test_src_used[] = {
                   2548:        0x000001fa,
                   2549: };
                   2550: 
                   2551: #define Ent_accept_message     0x000005d4
                   2552: #define Ent_cmdout_cmdout      0x0000024c
                   2553: #define Ent_command_complete   0x0000060c
                   2554: #define Ent_command_complete_msgin     0x0000061c
                   2555: #define Ent_data_transfer      0x00000254
                   2556: #define Ent_datain_to_jump     0x00000328
                   2557: #define Ent_debug_break        0x00000858
                   2558: #define Ent_dsa_code_begin     0x00000000
                   2559: #define Ent_dsa_code_check_reselect    0x000000f8
                   2560: #define Ent_dsa_code_fix_jump  0x0000003c
                   2561: #define Ent_dsa_code_restore_pointers  0x000000c0
                   2562: #define Ent_dsa_code_save_data_pointer 0x00000088
                   2563: #define Ent_dsa_code_template  0x00000000
                   2564: #define Ent_dsa_code_template_end      0x00000168
                   2565: #define Ent_dsa_schedule       0x00000168
                   2566: #define Ent_dsa_zero   0x00000168
                   2567: #define Ent_end_data_transfer  0x0000028c
                   2568: #define Ent_initiator_abort    0x00000880
                   2569: #define Ent_msg_in     0x00000404
                   2570: #define Ent_msg_in_restart     0x000003e4
                   2571: #define Ent_other_in   0x00000374
                   2572: #define Ent_other_out  0x0000033c
                   2573: #define Ent_other_transfer     0x000003ac
                   2574: #define Ent_reject_message     0x000005b4
                   2575: #define Ent_reselected_check_next      0x000006a4
                   2576: #define Ent_reselected_ok      0x00000750
                   2577: #define Ent_respond_message    0x000005ec
                   2578: #define Ent_select     0x000001fc
                   2579: #define Ent_select_msgout      0x00000214
                   2580: #define Ent_target_abort       0x00000860
                   2581: #define Ent_test_1     0x000007e4
                   2582: #define Ent_test_2     0x000007f8
                   2583: #define Ent_test_2_msgout      0x00000810
                   2584: #define Ent_wait_reselect      0x00000654
                   2585: u32 LABELPATCHES[] = {
                   2586:        0x00000008,
                   2587:        0x0000000a,
                   2588:        0x00000013,
                   2589:        0x00000016,
                   2590:        0x0000001f,
                   2591:        0x00000021,
                   2592:        0x0000004f,
                   2593:        0x00000051,
                   2594:        0x0000005b,
                   2595:        0x00000068,
                   2596:        0x0000006f,
                   2597:        0x00000082,
                   2598:        0x00000084,
                   2599:        0x0000008a,
                   2600:        0x0000008e,
                   2601:        0x00000090,
                   2602:        0x00000096,
                   2603:        0x00000098,
                   2604:        0x0000009c,
                   2605:        0x0000009e,
                   2606:        0x000000a0,
                   2607:        0x000000a2,
                   2608:        0x000000a4,
                   2609:        0x000000b1,
                   2610:        0x000000b6,
                   2611:        0x000000ba,
                   2612:        0x000000c7,
                   2613:        0x000000cc,
                   2614:        0x000000d2,
                   2615:        0x000000d8,
                   2616:        0x000000da,
                   2617:        0x000000e0,
                   2618:        0x000000e6,
                   2619:        0x000000e8,
                   2620:        0x000000ee,
                   2621:        0x000000f6,
                   2622:        0x000000f8,
                   2623:        0x00000104,
                   2624:        0x00000106,
                   2625:        0x00000108,
                   2626:        0x0000010a,
                   2627:        0x0000010c,
                   2628:        0x00000112,
                   2629:        0x00000114,
                   2630:        0x00000129,
                   2631:        0x00000142,
                   2632:        0x00000148,
                   2633:        0x00000150,
                   2634:        0x00000152,
                   2635:        0x00000154,
                   2636:        0x0000015a,
                   2637:        0x00000166,
                   2638:        0x00000196,
                   2639:        0x000001a5,
                   2640:        0x000001a8,
                   2641:        0x000001ac,
                   2642:        0x000001b0,
                   2643:        0x000001b4,
                   2644:        0x000001b8,
                   2645:        0x000001cf,
                   2646:        0x000001de,
                   2647:        0x000001e6,
                   2648:        0x000001ec,
                   2649:        0x000001ee,
                   2650:        0x000001f2,
                   2651:        0x000001f6,
                   2652:        0x00000201,
                   2653:        0x00000203,
                   2654:        0x00000223,
                   2655:        0x00000225,
                   2656:        0x00000227,
                   2657:        0x00000229,
                   2658:        0x0000022b,
                   2659:        0x0000022d,
                   2660:        0x00000231,
                   2661:        0x00000235,
                   2662:        0x00000237,
                   2663:        0x0000023b,
                   2664:        0x0000023d,
                   2665:        0x00000241,
                   2666:        0x00000243,
                   2667: };
                   2668: 
                   2669: struct {
                   2670:        u32     offset;
                   2671:        void            *address;
                   2672: } EXTERNAL_PATCHES[] = {
                   2673: };
                   2674: 
                   2675: u32 INSTRUCTIONS       = 301;
                   2676: u32 PATCHES    = 81;
                   2677: u32 EXTERNAL_PATCHES_LEN       = 0;

unix.superglobalmegacorp.com

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