📄 53c700.scr
字号:
; 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 commandABSOLUTE MessageCount = 0 ; Number of bytes in messageABSOLUTE MessageLocation = 0 ; Addr of messageABSOLUTE CommandCount = 0 ; Number of bytes in commandABSOLUTE CommandAddress = 0 ; Addr of CommandABSOLUTE StatusAddress = 0 ; Addr to receive status returnABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg;; This is the magic component for handling scatter-gather. Each of the; SG components is preceeded 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 = 0x100ABSOLUTE BEFORE_CMD = 0x200ABSOLUTE AFTER_CMD = 0x300ABSOLUTE AFTER_STATUS = 0x400ABSOLUTE AFTER_DATA_IN = 0x500ABSOLUTE AFTER_DATA_OUT = 0x600ABSOLUTE DURING_DATA_IN = 0x700; R:ABSOLUTE NOT_MSG_OUT = 0x10ABSOLUTE UNEXPECTED_PHASE = 0x20ABSOLUTE NOT_MSG_IN = 0x30ABSOLUTE UNEXPECTED_MSG = 0x40ABSOLUTE MSG_IN = 0x50ABSOLUTE SDTR_MSG_R = 0x60ABSOLUTE REJECT_MSG_R = 0x70ABSOLUTE DISCONNECT = 0x80ABSOLUTE MSG_OUT = 0x90ABSOLUTE WDTR_MSG_R = 0xA0; S:ABSOLUTE GOOD_STATUS = 0x1; Combinations, since the script assembler can't process |ABSOLUTE NOT_MSG_OUT_AFTER_SELECTION = 0x110ABSOLUTE UNEXPECTED_PHASE_BEFORE_CMD = 0x220ABSOLUTE UNEXPECTED_PHASE_AFTER_CMD = 0x320ABSOLUTE NOT_MSG_IN_AFTER_STATUS = 0x430ABSOLUTE GOOD_STATUS_AFTER_STATUS = 0x401ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_IN = 0x520ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_OUT = 0x620ABSOLUTE UNEXPECTED_MSG_BEFORE_CMD = 0x240ABSOLUTE MSG_IN_BEFORE_CMD = 0x250ABSOLUTE MSG_IN_AFTER_CMD = 0x350ABSOLUTE SDTR_MSG_BEFORE_CMD = 0x260ABSOLUTE REJECT_MSG_BEFORE_CMD = 0x270ABSOLUTE DISCONNECT_AFTER_CMD = 0x380ABSOLUTE SDTR_MSG_AFTER_CMD = 0x360ABSOLUTE WDTR_MSG_AFTER_CMD = 0x3A0ABSOLUTE MSG_IN_AFTER_STATUS = 0x440ABSOLUTE DISCONNECT_AFTER_DATA = 0x580ABSOLUTE MSG_IN_AFTER_DATA_IN = 0x550ABSOLUTE MSG_IN_AFTER_DATA_OUT = 0x650ABSOLUTE MSG_OUT_AFTER_DATA_IN = 0x590ABSOLUTE DATA_IN_AFTER_DATA_IN = 0x5a0ABSOLUTE MSG_IN_DURING_DATA_IN = 0x750ABSOLUTE DISCONNECT_DURING_DATA = 0x780;; Other interrupt conditions; ABSOLUTE RESELECTED_DURING_SELECTION = 0x1000ABSOLUTE COMPLETED_SELECTION_AS_TARGET = 0x1001ABSOLUTE RESELECTION_IDENTIFIED = 0x1003;; Fatal interrupt conditions. If you add to this, also add to the; array of corresponding messages;ABSOLUTE FATAL = 0x2000ABSOLUTE FATAL_UNEXPECTED_RESELECTION_MSG = 0x2000ABSOLUTE FATAL_SEND_MSG = 0x2001ABSOLUTE FATAL_NOT_MSG_IN_AFTER_SELECTION = 0x2002ABSOLUTE FATAL_ILLEGAL_MSG_LENGTH = 0x2003ABSOLUTE DEBUG_INTERRUPT = 0x3000ABSOLUTE DEBUG_INTERRUPT1 = 0x3001ABSOLUTE DEBUG_INTERRUPT2 = 0x3002ABSOLUTE DEBUG_INTERRUPT3 = 0x3003ABSOLUTE DEBUG_INTERRUPT4 = 0x3004ABSOLUTE DEBUG_INTERRUPT5 = 0x3005ABSOLUTE DEBUG_INTERRUPT6 = 0x3006;; SCSI Messages we interpret in the script;ABSOLUTE COMMAND_COMPLETE_MSG = 0x00ABSOLUTE EXTENDED_MSG = 0x01ABSOLUTE SDTR_MSG = 0x01ABSOLUTE SAVE_DATA_PTRS_MSG = 0x02ABSOLUTE RESTORE_DATA_PTRS_MSG = 0x03ABSOLUTE WDTR_MSG = 0x03ABSOLUTE DISCONNECT_MSG = 0x04ABSOLUTE REJECT_MSG = 0x07ABSOLUTE PARITY_ERROR_MSG = 0x09ABSOLUTE SIMPLE_TAG_MSG = 0x20ABSOLUTE IDENTIFY_MSG = 0x80ABSOLUTE IDENTIFY_MSG_MASK = 0x7FABSOLUTE TWO_BYTE_MSG = 0x20ABSOLUTE TWO_BYTE_MSG_MASK = 0x0F; This is where the script beginsENTRY StartUpStartUp: SELECT ATN Device_ID, Reselect JUMP Finish, WHEN STATUS JUMP SendIdentifyMsg, IF MSG_OUT INT NOT_MSG_OUT_AFTER_SELECTIONReselect: WAIT RESELECT SelectedAsTarget INT RESELECTED_DURING_SELECTION, WHEN MSG_IN INT FATAL_NOT_MSG_IN_AFTER_SELECTION ENTRY GetReselectionDataGetReselectionData: MOVE 1, ReceiveMsgAddress, WHEN MSG_IN INT RESELECTION_IDENTIFIED ENTRY GetReselectionWithTagGetReselectionWithTag: MOVE 3, ReceiveMsgAddress, WHEN MSG_IN INT RESELECTION_IDENTIFIED ENTRY SelectedAsTargetSelectedAsTarget:; 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 SendMessageSendMessage: MOVE MessageCount, MessageLocation, WHEN MSG_OUTResumeSendMessage: RETURN, WHEN NOT MSG_OUT INT FATAL_SEND_MSG ENTRY SendMessagePhaseMismatchSendMessagePhaseMismatch: CLEAR ACK JUMP ResumeSendMessage;; Receive a message. Need to identify the message to; receive it correctly ENTRY ReceiveMessageReceiveMessage: 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 furtherProcessReceiveMessage: 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 RETURNReceiveExtendedMessage: 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_LENGTHReceive1Byte: CLEAR ACK MOVE 1, ReceiveMsgAddress + 2, WHEN MSG_IN RETURNReceive2Byte: CLEAR ACK MOVE 2, ReceiveMsgAddress + 2, WHEN MSG_IN RETURNReceive3Byte: CLEAR ACK MOVE 3, ReceiveMsgAddress + 2, WHEN MSG_IN RETURNReceive4Byte: CLEAR ACK MOVE 4, ReceiveMsgAddress + 2, WHEN MSG_IN RETURNReceive5Byte: CLEAR ACK MOVE 5, ReceiveMsgAddress + 2, WHEN MSG_IN RETURN;; Come here from the message processor to ignore the message; ENTRY IgnoreMessageIgnoreMessage: CLEAR ACK RETURN;; Come here to send a reply to a message; ENTRY SendMessageWithATNSendMessageWithATN: SET ATN CLEAR ACK JUMP SendMessageSendIdentifyMsg: CALL SendMessage CLEAR ATNIgnoreMsgBeforeCommand: CLEAR ACK ENTRY SendCommandSendCommand: JUMP Finish, WHEN STATUS JUMP MsgInBeforeCommand, IF MSG_IN INT UNEXPECTED_PHASE_BEFORE_CMD, IF NOT CMD MOVE CommandCount, CommandAddress, WHEN CMDResumeSendCommand: JUMP Finish, WHEN STATUS JUMP MsgInAfterCmd, IF MSG_IN JUMP DataIn, IF DATA_IN JUMP DataOut, IF DATA_OUT INT UNEXPECTED_PHASE_AFTER_CMDIgnoreMsgDuringData: CLEAR ACK ; fall through to MsgInDuringDataEntry MsgInDuringDataMsgInDuringData:;; 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_INMsgInAfterCmd: 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 ResumeSendCommandIgnoreMsgInAfterCmd: CLEAR ACK JUMP ResumeSendCommandDisconnectAfterCmd: CLEAR ACK WAIT DISCONNECT ENTRY Disconnect1Disconnect1: INT DISCONNECT_AFTER_CMD ENTRY Disconnect2Disconnect2:; We return here after a reselection CLEAR ACK JUMP ResumeSendCommandMsgInBeforeCommand: 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 SendCommandDataIn: CALL SGScriptStartAddressResumeDataIn: 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_INDataInAfterDataIn: INT DATA_IN_AFTER_DATA_IN JUMP ResumeDataInDataOut: CALL SGScriptStartAddressResumeDataOut: JUMP Finish, WHEN STATUS JUMP MsgInAfterDataOut, IF MSG_IN INT UNEXPECTED_PHASE_AFTER_DATA_OUTMsgInAfterDataIn: 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 ResumeDataInDisconnectDuringDataIn: CLEAR ACK WAIT DISCONNECT ENTRY Disconnect3Disconnect3: INT DISCONNECT_DURING_DATA ENTRY Disconnect4Disconnect4:; we return here after a reselection CLEAR ACK JUMP ResumeSendCommandDisconnectAfterDataIn: CLEAR ACK WAIT DISCONNECT ENTRY Disconnect5Disconnect5: INT DISCONNECT_AFTER_DATA ENTRY Disconnect6Disconnect6:; we return here after a reselection CLEAR ACK JUMP ResumeDataInMsgInAfterDataOut: 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 ResumeDataOutIgnoreMsgAfterData: CLEAR ACK; Data in and out do the same thing on resume, so pick one JUMP ResumeDataInDisconnectAfterDataOut: CLEAR ACK WAIT DISCONNECT ENTRY Disconnect7Disconnect7: INT DISCONNECT_AFTER_DATA ENTRY Disconnect8Disconnect8:; we return here after a reselection CLEAR ACK JUMP ResumeDataOutFinish: 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 FinishCommandCompleteFinishCommandComplete: CLEAR ACK WAIT DISCONNECT ENTRY Finish1Finish1: INT GOOD_STATUS_AFTER_STATUS ENTRY Finish2Finish2:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -