^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) ; Script for the NCR (or symbios) 53c700 and 53c700-66 chip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ; Copyright (C) 2001 James.Bottomley@HansenPartnership.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) ;;-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) ;; This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ;; it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) ;; the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) ;; (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) ;; This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ;; GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ;; You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ;; along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ;;-----------------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) ; This script is designed to be modified for the particular command in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ; operation. The particular variables pertaining to the commands are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ABSOLUTE Device_ID = 0 ; ID of target for command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ABSOLUTE MessageCount = 0 ; Number of bytes in message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ABSOLUTE MessageLocation = 0 ; Addr of message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ABSOLUTE CommandCount = 0 ; Number of bytes in command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ABSOLUTE CommandAddress = 0 ; Addr of Command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ABSOLUTE StatusAddress = 0 ; Addr to receive status return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) ABSOLUTE ReceiveMsgAddress = 0 ; Addr to receive msg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ; This is the magic component for handling scatter-gather. Each of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ; SG components is preceded by a script fragment which moves the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ; necessary amount of data and jumps to the next SG segment. The final
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) ; SG segment jumps back to . However, this address is the first SG script
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) ; segment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ABSOLUTE SGScriptStartAddress = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ; The following represent status interrupts we use 3 hex digits for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ; this: 0xPRS where
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ; P:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ABSOLUTE AFTER_SELECTION = 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ABSOLUTE BEFORE_CMD = 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ABSOLUTE AFTER_CMD = 0x300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ABSOLUTE AFTER_STATUS = 0x400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ABSOLUTE AFTER_DATA_IN = 0x500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ABSOLUTE AFTER_DATA_OUT = 0x600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ABSOLUTE DURING_DATA_IN = 0x700
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ; R:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ABSOLUTE NOT_MSG_OUT = 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ABSOLUTE UNEXPECTED_PHASE = 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ABSOLUTE NOT_MSG_IN = 0x30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ABSOLUTE UNEXPECTED_MSG = 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ABSOLUTE MSG_IN = 0x50
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ABSOLUTE SDTR_MSG_R = 0x60
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ABSOLUTE REJECT_MSG_R = 0x70
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ABSOLUTE DISCONNECT = 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ABSOLUTE MSG_OUT = 0x90
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ABSOLUTE WDTR_MSG_R = 0xA0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ; S:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ABSOLUTE GOOD_STATUS = 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ; Combinations, since the script assembler can't process |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) ABSOLUTE NOT_MSG_OUT_AFTER_SELECTION = 0x110
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ABSOLUTE UNEXPECTED_PHASE_BEFORE_CMD = 0x220
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ABSOLUTE UNEXPECTED_PHASE_AFTER_CMD = 0x320
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ABSOLUTE NOT_MSG_IN_AFTER_STATUS = 0x430
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ABSOLUTE GOOD_STATUS_AFTER_STATUS = 0x401
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_IN = 0x520
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ABSOLUTE UNEXPECTED_PHASE_AFTER_DATA_OUT = 0x620
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) ABSOLUTE UNEXPECTED_MSG_BEFORE_CMD = 0x240
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ABSOLUTE MSG_IN_BEFORE_CMD = 0x250
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ABSOLUTE MSG_IN_AFTER_CMD = 0x350
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) ABSOLUTE SDTR_MSG_BEFORE_CMD = 0x260
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ABSOLUTE REJECT_MSG_BEFORE_CMD = 0x270
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) ABSOLUTE DISCONNECT_AFTER_CMD = 0x380
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ABSOLUTE SDTR_MSG_AFTER_CMD = 0x360
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ABSOLUTE WDTR_MSG_AFTER_CMD = 0x3A0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) ABSOLUTE MSG_IN_AFTER_STATUS = 0x440
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) ABSOLUTE DISCONNECT_AFTER_DATA = 0x580
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) ABSOLUTE MSG_IN_AFTER_DATA_IN = 0x550
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ABSOLUTE MSG_IN_AFTER_DATA_OUT = 0x650
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ABSOLUTE MSG_OUT_AFTER_DATA_IN = 0x590
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ABSOLUTE DATA_IN_AFTER_DATA_IN = 0x5a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ABSOLUTE MSG_IN_DURING_DATA_IN = 0x750
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ABSOLUTE DISCONNECT_DURING_DATA = 0x780
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) ; Other interrupt conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) ABSOLUTE RESELECTED_DURING_SELECTION = 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) ABSOLUTE COMPLETED_SELECTION_AS_TARGET = 0x1001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) ABSOLUTE RESELECTION_IDENTIFIED = 0x1003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) ; Fatal interrupt conditions. If you add to this, also add to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) ; array of corresponding messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ABSOLUTE FATAL = 0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ABSOLUTE FATAL_UNEXPECTED_RESELECTION_MSG = 0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ABSOLUTE FATAL_SEND_MSG = 0x2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) ABSOLUTE FATAL_NOT_MSG_IN_AFTER_SELECTION = 0x2002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ABSOLUTE FATAL_ILLEGAL_MSG_LENGTH = 0x2003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ABSOLUTE DEBUG_INTERRUPT = 0x3000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) ABSOLUTE DEBUG_INTERRUPT1 = 0x3001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ABSOLUTE DEBUG_INTERRUPT2 = 0x3002
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ABSOLUTE DEBUG_INTERRUPT3 = 0x3003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ABSOLUTE DEBUG_INTERRUPT4 = 0x3004
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ABSOLUTE DEBUG_INTERRUPT5 = 0x3005
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ABSOLUTE DEBUG_INTERRUPT6 = 0x3006
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) ; SCSI Messages we interpret in the script
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ABSOLUTE COMMAND_COMPLETE_MSG = 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) ABSOLUTE EXTENDED_MSG = 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ABSOLUTE SDTR_MSG = 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) ABSOLUTE SAVE_DATA_PTRS_MSG = 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) ABSOLUTE RESTORE_DATA_PTRS_MSG = 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ABSOLUTE WDTR_MSG = 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ABSOLUTE DISCONNECT_MSG = 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ABSOLUTE REJECT_MSG = 0x07
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ABSOLUTE PARITY_ERROR_MSG = 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) ABSOLUTE SIMPLE_TAG_MSG = 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) ABSOLUTE IDENTIFY_MSG = 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ABSOLUTE IDENTIFY_MSG_MASK = 0x7F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ABSOLUTE TWO_BYTE_MSG = 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ABSOLUTE TWO_BYTE_MSG_MASK = 0x0F
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) ; This is where the script begins
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) ENTRY StartUp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) StartUp:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) SELECT ATN Device_ID, Reselect
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) JUMP SendIdentifyMsg, IF MSG_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) INT NOT_MSG_OUT_AFTER_SELECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) Reselect:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) WAIT RESELECT SelectedAsTarget
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) INT RESELECTED_DURING_SELECTION, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) INT FATAL_NOT_MSG_IN_AFTER_SELECTION
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ENTRY GetReselectionData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) GetReselectionData:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) INT RESELECTION_IDENTIFIED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ENTRY GetReselectionWithTag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) GetReselectionWithTag:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) MOVE 3, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) INT RESELECTION_IDENTIFIED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) ENTRY SelectedAsTarget
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) SelectedAsTarget:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ; Basically tell the selecting device that there's nothing here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) SET TARGET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) CLEAR TARGET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) INT COMPLETED_SELECTION_AS_TARGET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ; These are the messaging entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) ; Send a message. Message count should be correctly patched
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ENTRY SendMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) SendMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) MOVE MessageCount, MessageLocation, WHEN MSG_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ResumeSendMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) RETURN, WHEN NOT MSG_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) INT FATAL_SEND_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) ENTRY SendMessagePhaseMismatch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) SendMessagePhaseMismatch:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) JUMP ResumeSendMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ; Receive a message. Need to identify the message to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) ; receive it correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) ENTRY ReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) ReceiveMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) ; Use this entry if we've just tried to look at the first byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) ; of the message and want to process it further
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) ProcessReceiveMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) JUMP ReceiveExtendedMessage, IF EXTENDED_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) RETURN, IF NOT TWO_BYTE_MSG, AND MASK TWO_BYTE_MSG_MASK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) MOVE 1, ReceiveMsgAddress + 1, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) ReceiveExtendedMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) MOVE 1, ReceiveMsgAddress + 1, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) JUMP Receive1Byte, IF 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) JUMP Receive2Byte, IF 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) JUMP Receive3Byte, IF 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) JUMP Receive4Byte, IF 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) JUMP Receive5Byte, IF 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) INT FATAL_ILLEGAL_MSG_LENGTH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) Receive1Byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) MOVE 1, ReceiveMsgAddress + 2, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) Receive2Byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) MOVE 2, ReceiveMsgAddress + 2, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) Receive3Byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) MOVE 3, ReceiveMsgAddress + 2, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) Receive4Byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) MOVE 4, ReceiveMsgAddress + 2, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) Receive5Byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) MOVE 5, ReceiveMsgAddress + 2, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) ; Come here from the message processor to ignore the message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) ENTRY IgnoreMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) IgnoreMessage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) RETURN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) ; Come here to send a reply to a message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) ENTRY SendMessageWithATN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) SendMessageWithATN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) SET ATN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) JUMP SendMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) SendIdentifyMsg:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) CALL SendMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) CLEAR ATN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) IgnoreMsgBeforeCommand:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) ENTRY SendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) SendCommand:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) JUMP MsgInBeforeCommand, IF MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) INT UNEXPECTED_PHASE_BEFORE_CMD, IF NOT CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) MOVE CommandCount, CommandAddress, WHEN CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) ResumeSendCommand:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) JUMP MsgInAfterCmd, IF MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) JUMP DataIn, IF DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) JUMP DataOut, IF DATA_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) INT UNEXPECTED_PHASE_AFTER_CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) IgnoreMsgDuringData:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) ; fall through to MsgInDuringData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) Entry MsgInDuringData
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) MsgInDuringData:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) ; Could be we have nothing more to transfer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) JUMP DisconnectDuringDataIn, IF DISCONNECT_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) JUMP IgnoreMsgDuringData, IF SAVE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) JUMP IgnoreMsgDuringData, IF RESTORE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) INT MSG_IN_DURING_DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) MsgInAfterCmd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) JUMP DisconnectAfterCmd, IF DISCONNECT_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) JUMP IgnoreMsgInAfterCmd, IF SAVE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) JUMP IgnoreMsgInAfterCmd, IF RESTORE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) CALL ProcessReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) INT MSG_IN_AFTER_CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) JUMP ResumeSendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) IgnoreMsgInAfterCmd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) JUMP ResumeSendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) DisconnectAfterCmd:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) WAIT DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) ENTRY Disconnect1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) Disconnect1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) INT DISCONNECT_AFTER_CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ENTRY Disconnect2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) Disconnect2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) ; We return here after a reselection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) JUMP ResumeSendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) MsgInBeforeCommand:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) JUMP IgnoreMsgBeforeCommand, IF SAVE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) JUMP IgnoreMsgBeforeCommand, IF RESTORE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) CALL ProcessReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) INT MSG_IN_BEFORE_CMD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) JUMP SendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) DataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) CALL SGScriptStartAddress
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) ResumeDataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) JUMP MsgInAfterDataIn, IF MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) JUMP DataInAfterDataIn, if DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) INT MSG_OUT_AFTER_DATA_IN, if MSG_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) INT UNEXPECTED_PHASE_AFTER_DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) DataInAfterDataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) INT DATA_IN_AFTER_DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) JUMP ResumeDataIn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) DataOut:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) CALL SGScriptStartAddress
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) ResumeDataOut:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) JUMP Finish, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) JUMP MsgInAfterDataOut, IF MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) INT UNEXPECTED_PHASE_AFTER_DATA_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) MsgInAfterDataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) JUMP DisconnectAfterDataIn, IF DISCONNECT_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) JUMP IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) JUMP IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) CALL ProcessReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) INT MSG_IN_AFTER_DATA_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) JUMP ResumeDataIn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) DisconnectDuringDataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) WAIT DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ENTRY Disconnect3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) Disconnect3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) INT DISCONNECT_DURING_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) ENTRY Disconnect4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) Disconnect4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) ; we return here after a reselection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) JUMP ResumeSendCommand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) DisconnectAfterDataIn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) WAIT DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) ENTRY Disconnect5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) Disconnect5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) INT DISCONNECT_AFTER_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) ENTRY Disconnect6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) Disconnect6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) ; we return here after a reselection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) JUMP ResumeDataIn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) MsgInAfterDataOut:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) JUMP DisconnectAfterDataOut, if DISCONNECT_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) JUMP IgnoreMsgAfterData, IF SAVE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) JUMP IgnoreMsgAfterData, IF RESTORE_DATA_PTRS_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) CALL ProcessReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) INT MSG_IN_AFTER_DATA_OUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) JUMP ResumeDataOut
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) IgnoreMsgAfterData:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) ; Data in and out do the same thing on resume, so pick one
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) JUMP ResumeDataIn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) DisconnectAfterDataOut:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) WAIT DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) ENTRY Disconnect7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) Disconnect7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) INT DISCONNECT_AFTER_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) ENTRY Disconnect8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) Disconnect8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) ; we return here after a reselection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) JUMP ResumeDataOut
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) Finish:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) MOVE 1, StatusAddress, WHEN STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) INT NOT_MSG_IN_AFTER_STATUS, WHEN NOT MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) MOVE 1, ReceiveMsgAddress, WHEN MSG_IN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) JUMP FinishCommandComplete, IF COMMAND_COMPLETE_MSG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) CALL ProcessReceiveMessage
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) INT MSG_IN_AFTER_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) ENTRY FinishCommandComplete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) FinishCommandComplete:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) CLEAR ACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) WAIT DISCONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) ENTRY Finish1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) Finish1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) INT GOOD_STATUS_AFTER_STATUS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ENTRY Finish2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) Finish2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)