Annotation of sys/dev/microcode/siop/osiop.ss, Revision 1.1
1.1 ! nbrk 1: ; $OpenBSD: osiop.ss,v 1.1 2003/01/08 02:11:38 krw Exp $
! 2: ; $NetBSD: osiop.ss,v 1.1 2001/04/30 04:47:51 tsutsui Exp $
! 3:
! 4: ;
! 5: ; Copyright (c) 1995 Michael L. Hitch
! 6: ; All rights reserved.
! 7: ;
! 8: ; Redistribution and use in source and binary forms, with or without
! 9: ; modification, are permitted provided that the following conditions
! 10: ; are met:
! 11: ; 1. Redistributions of source code must retain the above copyright
! 12: ; notice, this list of conditions and the following disclaimer.
! 13: ; 2. Redistributions in binary form must reproduce the above copyright
! 14: ; notice, this list of conditions and the following disclaimer in the
! 15: ; documentation and/or other materials provided with the distribution.
! 16: ; 3. All advertising materials mentioning features or use of this software
! 17: ; must display the following acknowledgement:
! 18: ; This product includes software developed by Michael L. Hitch.
! 19: ; 4. The name of the author may not be used to endorse or promote products
! 20: ; derived from this software without specific prior written permission
! 21: ;
! 22: ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 23: ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 24: ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 25: ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 26: ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 27: ; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 28: ; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 29: ; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 30: ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 31: ; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 32: ;
! 33:
! 34: ; NCR 53c710 script
! 35: ;
! 36: ARCH 710
! 37: ;
! 38: ABSOLUTE ds_Device = 0
! 39: ABSOLUTE ds_MsgOut = ds_Device + 8
! 40: ABSOLUTE ds_Cmd = ds_MsgOut + 8
! 41: ABSOLUTE ds_Status = ds_Cmd + 8
! 42: ABSOLUTE ds_Msg = ds_Status + 8
! 43: ABSOLUTE ds_MsgIn = ds_Msg + 8
! 44: ABSOLUTE ds_ExtMsg = ds_MsgIn + 8
! 45: ABSOLUTE ds_SyncMsg = ds_ExtMsg + 8
! 46: ABSOLUTE ds_Data1 = ds_SyncMsg + 8
! 47: ABSOLUTE ds_Data2 = ds_Data1 + 8
! 48: ABSOLUTE ds_Data3 = ds_Data2 + 8
! 49: ABSOLUTE ds_Data4 = ds_Data3 + 8
! 50: ABSOLUTE ds_Data5 = ds_Data4 + 8
! 51: ABSOLUTE ds_Data6 = ds_Data5 + 8
! 52: ABSOLUTE ds_Data7 = ds_Data6 + 8
! 53: ABSOLUTE ds_Data8 = ds_Data7 + 8
! 54: ABSOLUTE ds_Data9 = ds_Data8 + 8
! 55: ABSOLUTE ds_Data10 = ds_Data9 + 8
! 56: ABSOLUTE ds_Data11 = ds_Data10 + 8
! 57: ABSOLUTE ds_Data12 = ds_Data11 + 8
! 58: ABSOLUTE ds_Data13 = ds_Data12 + 8
! 59: ABSOLUTE ds_Data14 = ds_Data13 + 8
! 60: ABSOLUTE ds_Data15 = ds_Data14 + 8
! 61: ABSOLUTE ds_Data16 = ds_Data15 + 8
! 62: ABSOLUTE ds_Data17 = ds_Data16 + 8
! 63:
! 64:
! 65: ABSOLUTE ok = 0xff00
! 66: ABSOLUTE int_disc = 0xff01
! 67: ABSOLUTE int_disc_wodp = 0xff02
! 68: ABSOLUTE int_reconnect = 0xff03
! 69: ABSOLUTE int_connect = 0xff04
! 70: ABSOLUTE int_phase = 0xff05
! 71: ABSOLUTE int_msgin = 0xff06
! 72: ABSOLUTE int_extmsg = 0xff07
! 73: ABSOLUTE int_msgsdp = 0xff08
! 74: ABSOLUTE int_identify = 0xff09
! 75: ABSOLUTE int_status = 0xff0a
! 76: ABSOLUTE int_syncmsg = 0xff0b
! 77:
! 78: ENTRY scripts
! 79: ENTRY switch
! 80: ENTRY wait_reselect
! 81: ENTRY dataout
! 82: ENTRY datain
! 83: ENTRY clear_ack
! 84:
! 85: PROC osiop_script:
! 86:
! 87: scripts:
! 88:
! 89: SELECT ATN FROM ds_Device, REL(reselect)
! 90: ;
! 91: switch:
! 92: JUMP REL(msgin), WHEN MSG_IN
! 93: JUMP REL(msgout), IF MSG_OUT
! 94: JUMP REL(command_phase), IF CMD
! 95: JUMP REL(dataout), IF DATA_OUT
! 96: JUMP REL(datain), IF DATA_IN
! 97: JUMP REL(end), IF STATUS
! 98:
! 99: INT int_phase ; Unrecognized phase
! 100:
! 101: msgin:
! 102: MOVE FROM ds_MsgIn, WHEN MSG_IN
! 103: JUMP REL(ext_msg), IF 0x01 ; extended message
! 104: JUMP REL(disc), IF 0x04 ; disconnect message
! 105: JUMP REL(msg_sdp), IF 0x02 ; save data pointers
! 106: JUMP REL(msg_rej), IF 0x07 ; message reject
! 107: JUMP REL(msg_rdp), IF 0x03 ; restore data pointers
! 108: INT int_msgin ; unrecognized message
! 109:
! 110: msg_rej:
! 111: ; Do we need to interrupt host here to let it handle the reject?
! 112: msg_rdp:
! 113: clear_ack:
! 114: CLEAR ACK
! 115: CLEAR ATN
! 116: JUMP REL(switch)
! 117:
! 118: ext_msg:
! 119: CLEAR ACK
! 120: MOVE FROM ds_ExtMsg, WHEN MSG_IN
! 121: JUMP REL(sync_msg), IF 0x03
! 122: int int_extmsg ; extended message not SDTR
! 123:
! 124: sync_msg:
! 125: CLEAR ACK
! 126: MOVE FROM ds_SyncMsg, WHEN MSG_IN
! 127: int int_syncmsg ; Let host handle the message
! 128: ; If we continue from the interrupt, the host has set up a response
! 129: ; message to be sent. Set ATN, clear ACK, and continue.
! 130: SET ATN
! 131: CLEAR ACK
! 132: JUMP REL(switch)
! 133:
! 134: disc:
! 135: CLEAR ACK
! 136: WAIT DISCONNECT
! 137:
! 138: int int_disc_wodp ; signal disconnect w/o save DP
! 139:
! 140: msg_sdp:
! 141: CLEAR ACK ; acknowledge message
! 142: JUMP REL(switch), WHEN NOT MSG_IN
! 143: MOVE FROM ds_ExtMsg, WHEN MSG_IN
! 144: INT int_msgsdp, IF NOT 0x04 ; interrupt if not disconnect
! 145: CLEAR ACK
! 146: WAIT DISCONNECT
! 147:
! 148: INT int_disc ; signal disconnect
! 149:
! 150: reselect:
! 151: wait_reselect:
! 152: WAIT RESELECT REL(select_adr)
! 153: MOVE LCRC to SFBR ; Save reselect ID
! 154: MOVE SFBR to SCRATCH0
! 155:
! 156: INT int_identify, WHEN NOT MSG_IN
! 157: MOVE FROM ds_Msg, WHEN MSG_IN
! 158: INT int_reconnect ; let host know about reconnect
! 159: CLEAR ACK ; acknowlege the message
! 160: JUMP REL(switch)
! 161:
! 162: select_adr:
! 163: MOVE SCNTL1 & 0x10 to SFBR ; get connected status
! 164: INT int_connect, IF 0x00 ; tell host if not connected
! 165: MOVE CTEST2 & 0x40 to SFBR ; clear Sig_P
! 166: JUMP REL(wait_reselect) ; and try reselect again
! 167:
! 168: msgout:
! 169: MOVE FROM ds_MsgOut, WHEN MSG_OUT
! 170: JUMP REL(switch)
! 171:
! 172: command_phase:
! 173: CLEAR ATN
! 174: MOVE FROM ds_Cmd, WHEN CMD
! 175: JUMP REL(switch)
! 176:
! 177: dataout:
! 178: MOVE FROM ds_Data1, WHEN DATA_OUT
! 179: CALL REL(switch), WHEN NOT DATA_OUT
! 180: MOVE FROM ds_Data2, WHEN DATA_OUT
! 181: CALL REL(switch), WHEN NOT DATA_OUT
! 182: MOVE FROM ds_Data3, WHEN DATA_OUT
! 183: CALL REL(switch), WHEN NOT DATA_OUT
! 184: MOVE FROM ds_Data4, WHEN DATA_OUT
! 185: CALL REL(switch), WHEN NOT DATA_OUT
! 186: MOVE FROM ds_Data5, WHEN DATA_OUT
! 187: CALL REL(switch), WHEN NOT DATA_OUT
! 188: MOVE FROM ds_Data6, WHEN DATA_OUT
! 189: CALL REL(switch), WHEN NOT DATA_OUT
! 190: MOVE FROM ds_Data7, WHEN DATA_OUT
! 191: CALL REL(switch), WHEN NOT DATA_OUT
! 192: MOVE FROM ds_Data8, WHEN DATA_OUT
! 193: CALL REL(switch), WHEN NOT DATA_OUT
! 194: MOVE FROM ds_Data9, WHEN DATA_OUT
! 195: CALL REL(switch), WHEN NOT DATA_OUT
! 196: MOVE FROM ds_Data10, WHEN DATA_OUT
! 197: CALL REL(switch), WHEN NOT DATA_OUT
! 198: MOVE FROM ds_Data11, WHEN DATA_OUT
! 199: CALL REL(switch), WHEN NOT DATA_OUT
! 200: MOVE FROM ds_Data12, WHEN DATA_OUT
! 201: CALL REL(switch), WHEN NOT DATA_OUT
! 202: MOVE FROM ds_Data13, WHEN DATA_OUT
! 203: CALL REL(switch), WHEN NOT DATA_OUT
! 204: MOVE FROM ds_Data14, WHEN DATA_OUT
! 205: CALL REL(switch), WHEN NOT DATA_OUT
! 206: MOVE FROM ds_Data15, WHEN DATA_OUT
! 207: CALL REL(switch), WHEN NOT DATA_OUT
! 208: MOVE FROM ds_Data16, WHEN DATA_OUT
! 209: CALL REL(switch), WHEN NOT DATA_OUT
! 210: MOVE FROM ds_Data17, WHEN DATA_OUT
! 211: CALL REL(switch)
! 212:
! 213: datain:
! 214: MOVE FROM ds_Data1, WHEN DATA_IN
! 215: CALL REL(switch), WHEN NOT DATA_IN
! 216: MOVE FROM ds_Data2, WHEN DATA_IN
! 217: CALL REL(switch), WHEN NOT DATA_IN
! 218: MOVE FROM ds_Data3, WHEN DATA_IN
! 219: CALL REL(switch), WHEN NOT DATA_IN
! 220: MOVE FROM ds_Data4, WHEN DATA_IN
! 221: CALL REL(switch), WHEN NOT DATA_IN
! 222: MOVE FROM ds_Data5, WHEN DATA_IN
! 223: CALL REL(switch), WHEN NOT DATA_IN
! 224: MOVE FROM ds_Data6, WHEN DATA_IN
! 225: CALL REL(switch), WHEN NOT DATA_IN
! 226: MOVE FROM ds_Data7, WHEN DATA_IN
! 227: CALL REL(switch), WHEN NOT DATA_IN
! 228: MOVE FROM ds_Data8, WHEN DATA_IN
! 229: CALL REL(switch), WHEN NOT DATA_IN
! 230: MOVE FROM ds_Data9, WHEN DATA_IN
! 231: CALL REL(switch), WHEN NOT DATA_IN
! 232: MOVE FROM ds_Data10, WHEN DATA_IN
! 233: CALL REL(switch), WHEN NOT DATA_IN
! 234: MOVE FROM ds_Data11, WHEN DATA_IN
! 235: CALL REL(switch), WHEN NOT DATA_IN
! 236: MOVE FROM ds_Data12, WHEN DATA_IN
! 237: CALL REL(switch), WHEN NOT DATA_IN
! 238: MOVE FROM ds_Data13, WHEN DATA_IN
! 239: CALL REL(switch), WHEN NOT DATA_IN
! 240: MOVE FROM ds_Data14, WHEN DATA_IN
! 241: CALL REL(switch), WHEN NOT DATA_IN
! 242: MOVE FROM ds_Data15, WHEN DATA_IN
! 243: CALL REL(switch), WHEN NOT DATA_IN
! 244: MOVE FROM ds_Data16, WHEN DATA_IN
! 245: CALL REL(switch), WHEN NOT DATA_IN
! 246: MOVE FROM ds_Data17, WHEN DATA_IN
! 247: CALL REL(switch)
! 248:
! 249: end:
! 250: MOVE FROM ds_Status, WHEN STATUS
! 251: int int_status, WHEN NOT MSG_IN ; status not followed by msg
! 252: MOVE FROM ds_Msg, WHEN MSG_IN
! 253: CLEAR ACK
! 254: WAIT DISCONNECT
! 255: INT ok ; signal completion
! 256: JUMP REL(wait_reselect)
CVSweb