123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- ; Script for the NCR (or symbios) 53c700 and 53c700-66 chip
- ;
- ; Copyright (C) 2001 James.Bottomley@HansenPartnership.com
- ;;-----------------------------------------------------------------------------
- ;;
- ;; This program is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 2 of the License, or
- ;; (at your option) any later version.
- ;;
- ;; This program is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;;
- ;; You should have received a copy of the GNU General Public License
- ;; along with this program; if not, write to the Free Software
- ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- ;;
- ;;-----------------------------------------------------------------------------
- ;
- ; This script is designed to be modified for the particular command in
- ; operation. The particular variables pertaining to the commands are:
- ;
- ABSOLUTE Device_ID = 0 ; ID of target for command
- ABSOLUTE MessageCount = 0 ; Number of bytes in message
- ABSOLUTE MessageLocation = 0 ; Addr of message
- ABSOLUTE CommandCount = 0 ; Number of bytes in command
- ABSOLUTE CommandAddress = 0 ; Addr of Command
- ABSOLUTE StatusAddress = 0 ; Addr to receive status return
- ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg
- ;
- ; This is the magic component for handling scatter-gather. Each of the
- ; SG components is preceded by a script fragment which moves the
- ; necessary amount of data and jumps to the next SG segment. The final
- ; SG segment jumps back to . However, this address is the first SG script
- ; segment.
- ;
- ABSOLUTE SGScriptStartAddress = 0
- ; The following represent status interrupts we use 3 hex digits for
- ; this: 0xPRS where
- ; P:
- ABSOLUTE AFTER_SELECTION = 0x100
- ABSOLUTE BEFORE_CMD = 0x200
- ABSOLUTE AFTER_CMD = 0x300
- ABSOLUTE AFTER_STATUS = 0x400
- ABSOLUTE AFTER_DATA_IN = 0x500
- ABSOLUTE AFTER_DATA_OUT = 0x600
- ABSOLUTE DURING_DATA_IN = 0x700
- ; R:
- ABSOLUTE NOT_MSG_OUT = 0x10
- ABSOLUTE UNEXPECTED_PHASE = 0x20
- ABSOLUTE NOT_MSG_IN = 0x30
- ABSOLUTE UNEXPECTED_MSG = 0x40
- ABSOLUTE MSG_IN = 0x50
- ABSOLUTE SDTR_MSG_R = 0x60
- ABSOLUTE REJECT_MSG_R = 0x70
- ABSOLUTE DISCONNECT = 0x80
- ABSOLUTE MSG_OUT = 0x90
- ABSOLUTE WDTR_MSG_R = 0xA0
- ; S:
- ABSOLUTE GOOD_STATUS = 0x1
- ; Combinations, since the script assembler can't process |
- ABSOLUTE NOT_MSG_OUT_AFTER_SELECTION = 0x110
- ABSOLUTE UNEXPECTED_PHASE_BEFORE_CMD = 0x220
- ABSOLUTE UNEXPECTED_PHASE_AFTER_CMD = 0x320
- ABSOLUTE NOT_MSG_IN_AFTER_STATUS = 0x430
- ABSOLUTE GOOD_STATUS_AFTER_STATUS = 0x401
- ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_IN = 0x520
- ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_OUT = 0x620
- ABSOLUTE UNEXPECTED_MSG_BEFORE_CMD = 0x240
- ABSOLUTE MSG_IN_BEFORE_CMD = 0x250
- ABSOLUTE MSG_IN_AFTER_CMD = 0x350
- ABSOLUTE SDTR_MSG_BEFORE_CMD = 0x260
- ABSOLUTE REJECT_MSG_BEFORE_CMD = 0x270
- ABSOLUTE DISCONNECT_AFTER_CMD = 0x380
- ABSOLUTE SDTR_MSG_AFTER_CMD = 0x360
- ABSOLUTE WDTR_MSG_AFTER_CMD = 0x3A0
- ABSOLUTE MSG_IN_AFTER_STATUS = 0x440
- ABSOLUTE DISCONNECT_AFTER_DATA = 0x580
- ABSOLUTE MSG_IN_AFTER_DATA_IN = 0x550
- ABSOLUTE MSG_IN_AFTER_DATA_OUT = 0x650
- ABSOLUTE MSG_OUT_AFTER_DATA_IN = 0x590
- ABSOLUTE DATA_IN_AFTER_DATA_IN = 0x5a0
- ABSOLUTE MSG_IN_DURING_DATA_IN = 0x750
- ABSOLUTE DISCONNECT_DURING_DATA = 0x780
- ;
- ; Other interrupt conditions
- ;
- ABSOLUTE RESELECTED_DURING_SELECTION = 0x1000
- ABSOLUTE COMPLETED_SELECTION_AS_TARGET = 0x1001
- ABSOLUTE RESELECTION_IDENTIFIED = 0x1003
- ;
- ; Fatal interrupt conditions. If you add to this, also add to the
- ; array of corresponding messages
- ;
- ABSOLUTE FATAL = 0x2000
- ABSOLUTE FATAL_UNEXPECTED_RESELECTION_MSG = 0x2000
- ABSOLUTE FATAL_SEND_MSG = 0x2001
- ABSOLUTE FATAL_NOT_MSG_IN_AFTER_SELECTION = 0x2002
- ABSOLUTE FATAL_ILLEGAL_MSG_LENGTH = 0x2003
- ABSOLUTE DEBUG_INTERRUPT = 0x3000
- ABSOLUTE DEBUG_INTERRUPT1 = 0x3001
- ABSOLUTE DEBUG_INTERRUPT2 = 0x3002
- ABSOLUTE DEBUG_INTERRUPT3 = 0x3003
- ABSOLUTE DEBUG_INTERRUPT4 = 0x3004
- ABSOLUTE DEBUG_INTERRUPT5 = 0x3005
- ABSOLUTE DEBUG_INTERRUPT6 = 0x3006
- ;
- ; SCSI Messages we interpret in the script
- ;
- ABSOLUTE COMMAND_COMPLETE_MSG = 0x00
- ABSOLUTE EXTENDED_MSG = 0x01
- ABSOLUTE SDTR_MSG = 0x01
- ABSOLUTE SAVE_DATA_PTRS_MSG = 0x02
- ABSOLUTE RESTORE_DATA_PTRS_MSG = 0x03
- ABSOLUTE WDTR_MSG = 0x03
- ABSOLUTE DISCONNECT_MSG = 0x04
- ABSOLUTE REJECT_MSG = 0x07
- ABSOLUTE PARITY_ERROR_MSG = 0x09
- ABSOLUTE SIMPLE_TAG_MSG = 0x20
- ABSOLUTE IDENTIFY_MSG = 0x80
- ABSOLUTE IDENTIFY_MSG_MASK = 0x7F
- ABSOLUTE TWO_BYTE_MSG = 0x20
- ABSOLUTE TWO_BYTE_MSG_MASK = 0x0F
- ; This is where the script begins
- ENTRY StartUp
- StartUp:
- SELECT ATN Device_ID, Reselect
- JUMP Finish, WHEN STATUS
- JUMP SendIdentifyMsg, IF MSG_OUT
- INT NOT_MSG_OUT_AFTER_SELECTION
- Reselect:
- WAIT RESELECT SelectedAsTarget
- INT RESELECTED_DURING_SELECTION, WHEN MSG_IN
- INT FATAL_NOT_MSG_IN_AFTER_SELECTION
- ENTRY GetReselectionData
- GetReselectionData:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- INT RESELECTION_IDENTIFIED
- ENTRY GetReselectionWithTag
- GetReselectionWithTag:
- MOVE 3, ReceiveMsgAddress, WHEN MSG_IN
- INT RESELECTION_IDENTIFIED
-
- ENTRY SelectedAsTarget
- SelectedAsTarget:
- ; Basically tell the selecting device that there's nothing here
- SET TARGET
- DISCONNECT
- CLEAR TARGET
- INT COMPLETED_SELECTION_AS_TARGET
- ;
- ; These are the messaging entries
- ;
- ; Send a message. Message count should be correctly patched
- ENTRY SendMessage
- SendMessage:
- MOVE MessageCount, MessageLocation, WHEN MSG_OUT
- ResumeSendMessage:
- RETURN, WHEN NOT MSG_OUT
- INT FATAL_SEND_MSG
- ENTRY SendMessagePhaseMismatch
- SendMessagePhaseMismatch:
- CLEAR ACK
- JUMP ResumeSendMessage
- ;
- ; Receive a message. Need to identify the message to
- ; receive it correctly
- ENTRY ReceiveMessage
- ReceiveMessage:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- ;
- ; Use this entry if we've just tried to look at the first byte
- ; of the message and want to process it further
- ProcessReceiveMessage:
- JUMP ReceiveExtendedMessage, IF EXTENDED_MSG
- RETURN, IF NOT TWO_BYTE_MSG, AND MASK TWO_BYTE_MSG_MASK
- CLEAR ACK
- MOVE 1, ReceiveMsgAddress + 1, WHEN MSG_IN
- RETURN
- ReceiveExtendedMessage:
- CLEAR ACK
- MOVE 1, ReceiveMsgAddress + 1, WHEN MSG_IN
- JUMP Receive1Byte, IF 0x01
- JUMP Receive2Byte, IF 0x02
- JUMP Receive3Byte, IF 0x03
- JUMP Receive4Byte, IF 0x04
- JUMP Receive5Byte, IF 0x05
- INT FATAL_ILLEGAL_MSG_LENGTH
- Receive1Byte:
- CLEAR ACK
- MOVE 1, ReceiveMsgAddress + 2, WHEN MSG_IN
- RETURN
- Receive2Byte:
- CLEAR ACK
- MOVE 2, ReceiveMsgAddress + 2, WHEN MSG_IN
- RETURN
- Receive3Byte:
- CLEAR ACK
- MOVE 3, ReceiveMsgAddress + 2, WHEN MSG_IN
- RETURN
- Receive4Byte:
- CLEAR ACK
- MOVE 4, ReceiveMsgAddress + 2, WHEN MSG_IN
- RETURN
- Receive5Byte:
- CLEAR ACK
- MOVE 5, ReceiveMsgAddress + 2, WHEN MSG_IN
- RETURN
- ;
- ; Come here from the message processor to ignore the message
- ;
- ENTRY IgnoreMessage
- IgnoreMessage:
- CLEAR ACK
- RETURN
- ;
- ; Come here to send a reply to a message
- ;
- ENTRY SendMessageWithATN
- SendMessageWithATN:
- SET ATN
- CLEAR ACK
- JUMP SendMessage
- SendIdentifyMsg:
- CALL SendMessage
- CLEAR ATN
- IgnoreMsgBeforeCommand:
- CLEAR ACK
- ENTRY SendCommand
- SendCommand:
- JUMP Finish, WHEN STATUS
- JUMP MsgInBeforeCommand, IF MSG_IN
- INT UNEXPECTED_PHASE_BEFORE_CMD, IF NOT CMD
- MOVE CommandCount, CommandAddress, WHEN CMD
- ResumeSendCommand:
- JUMP Finish, WHEN STATUS
- JUMP MsgInAfterCmd, IF MSG_IN
- JUMP DataIn, IF DATA_IN
- JUMP DataOut, IF DATA_OUT
- INT UNEXPECTED_PHASE_AFTER_CMD
- IgnoreMsgDuringData:
- CLEAR ACK
- ; fall through to MsgInDuringData
- Entry MsgInDuringData
- MsgInDuringData:
- ;
- ; Could be we have nothing more to transfer
- ;
- JUMP Finish, WHEN STATUS
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP DisconnectDuringDataIn, IF DISCONNECT_MSG
- JUMP IgnoreMsgDuringData, IF SAVE_DATA_PTRS_MSG
- JUMP IgnoreMsgDuringData, IF RESTORE_DATA_PTRS_MSG
- INT MSG_IN_DURING_DATA_IN
- MsgInAfterCmd:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP DisconnectAfterCmd, IF DISCONNECT_MSG
- JUMP IgnoreMsgInAfterCmd, IF SAVE_DATA_PTRS_MSG
- JUMP IgnoreMsgInAfterCmd, IF RESTORE_DATA_PTRS_MSG
- CALL ProcessReceiveMessage
- INT MSG_IN_AFTER_CMD
- CLEAR ACK
- JUMP ResumeSendCommand
- IgnoreMsgInAfterCmd:
- CLEAR ACK
- JUMP ResumeSendCommand
- DisconnectAfterCmd:
- CLEAR ACK
- WAIT DISCONNECT
- ENTRY Disconnect1
- Disconnect1:
- INT DISCONNECT_AFTER_CMD
- ENTRY Disconnect2
- Disconnect2:
- ; We return here after a reselection
- CLEAR ACK
- JUMP ResumeSendCommand
- MsgInBeforeCommand:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP IgnoreMsgBeforeCommand, IF SAVE_DATA_PTRS_MSG
- JUMP IgnoreMsgBeforeCommand, IF RESTORE_DATA_PTRS_MSG
- CALL ProcessReceiveMessage
- INT MSG_IN_BEFORE_CMD
- CLEAR ACK
- JUMP SendCommand
- DataIn:
- CALL SGScriptStartAddress
- ResumeDataIn:
- JUMP Finish, WHEN STATUS
- JUMP MsgInAfterDataIn, IF MSG_IN
- JUMP DataInAfterDataIn, if DATA_IN
- INT MSG_OUT_AFTER_DATA_IN, if MSG_OUT
- INT UNEXPECTED_PHASE_AFTER_DATA_IN
- DataInAfterDataIn:
- INT DATA_IN_AFTER_DATA_IN
- JUMP ResumeDataIn
- DataOut:
- CALL SGScriptStartAddress
- ResumeDataOut:
- JUMP Finish, WHEN STATUS
- JUMP MsgInAfterDataOut, IF MSG_IN
- INT UNEXPECTED_PHASE_AFTER_DATA_OUT
- MsgInAfterDataIn:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP DisconnectAfterDataIn, IF DISCONNECT_MSG
- JUMP IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
- JUMP IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
- CALL ProcessReceiveMessage
- INT MSG_IN_AFTER_DATA_IN
- CLEAR ACK
- JUMP ResumeDataIn
- DisconnectDuringDataIn:
- CLEAR ACK
- WAIT DISCONNECT
- ENTRY Disconnect3
- Disconnect3:
- INT DISCONNECT_DURING_DATA
- ENTRY Disconnect4
- Disconnect4:
- ; we return here after a reselection
- CLEAR ACK
- JUMP ResumeSendCommand
- DisconnectAfterDataIn:
- CLEAR ACK
- WAIT DISCONNECT
- ENTRY Disconnect5
- Disconnect5:
- INT DISCONNECT_AFTER_DATA
- ENTRY Disconnect6
- Disconnect6:
- ; we return here after a reselection
- CLEAR ACK
- JUMP ResumeDataIn
- MsgInAfterDataOut:
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP DisconnectAfterDataOut, if DISCONNECT_MSG
- JUMP IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
- JUMP IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
- CALL ProcessReceiveMessage
- INT MSG_IN_AFTER_DATA_OUT
- CLEAR ACK
- JUMP ResumeDataOut
- IgnoreMsgAfterData:
- CLEAR ACK
- ; Data in and out do the same thing on resume, so pick one
- JUMP ResumeDataIn
- DisconnectAfterDataOut:
- CLEAR ACK
- WAIT DISCONNECT
- ENTRY Disconnect7
- Disconnect7:
- INT DISCONNECT_AFTER_DATA
- ENTRY Disconnect8
- Disconnect8:
- ; we return here after a reselection
- CLEAR ACK
- JUMP ResumeDataOut
- Finish:
- MOVE 1, StatusAddress, WHEN STATUS
- INT NOT_MSG_IN_AFTER_STATUS, WHEN NOT MSG_IN
- MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
- JUMP FinishCommandComplete, IF COMMAND_COMPLETE_MSG
- CALL ProcessReceiveMessage
- INT MSG_IN_AFTER_STATUS
- ENTRY FinishCommandComplete
- FinishCommandComplete:
- CLEAR ACK
- WAIT DISCONNECT
- ENTRY Finish1
- Finish1:
- INT GOOD_STATUS_AFTER_STATUS
- ENTRY Finish2
- Finish2:
|