siop2_script.ss revision 1.4
11.4Sis;	$NetBSD: siop2_script.ss,v 1.4 2001/10/08 21:18:58 is Exp $
21.1Sis
31.1Sis;
41.1Sis; Copyright (c) 1998 Michael L. Hitch
51.1Sis; All rights reserved.
61.1Sis;
71.1Sis; Redistribution and use in source and binary forms, with or without
81.1Sis; modification, are permitted provided that the following conditions
91.1Sis; are met:
101.1Sis; 1. Redistributions of source code must retain the above copyright
111.1Sis;    notice, this list of conditions and the following disclaimer.
121.1Sis; 2. Redistributions in binary form must reproduce the above copyright
131.1Sis;    notice, this list of conditions and the following disclaimer in the
141.1Sis;    documentation and/or other materials provided with the distribution.
151.1Sis; 3. All advertising materials mentioning features or use of this software
161.1Sis;    must display the following acknowledgement:
171.1Sis;      This product includes software developed by Michael L. Hitch.
181.1Sis; 4. The name of the author may not be used to endorse or promote products
191.1Sis;    derived from this software without specific prior written permission
201.1Sis;
211.1Sis; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
221.1Sis; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
231.1Sis; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
241.1Sis; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
251.1Sis; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
261.1Sis; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
271.1Sis; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
281.1Sis; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
291.1Sis; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
301.1Sis; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
311.1Sis;
321.1Sis
331.1Sis; NCR 53c770 script
341.1Sis;
351.1SisARCH 720
361.1Sis;
371.1SisABSOLUTE ds_Device	= 0
381.1SisABSOLUTE ds_MsgOut 	= ds_Device + 4
391.1SisABSOLUTE ds_Cmd		= ds_MsgOut + 8
401.1SisABSOLUTE ds_Status	= ds_Cmd + 8
411.1SisABSOLUTE ds_Msg		= ds_Status + 8
421.1SisABSOLUTE ds_MsgIn	= ds_Msg + 8
431.1SisABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
441.3SmhitchABSOLUTE ds_NegMsg	= ds_ExtMsg + 8
451.3SmhitchABSOLUTE ds_Data1	= ds_NegMsg + 8
461.1SisABSOLUTE ds_Data2	= ds_Data1 + 8
471.1SisABSOLUTE ds_Data3	= ds_Data2 + 8
481.1SisABSOLUTE ds_Data4	= ds_Data3 + 8
491.1SisABSOLUTE ds_Data5	= ds_Data4 + 8
501.1SisABSOLUTE ds_Data6	= ds_Data5 + 8
511.1SisABSOLUTE ds_Data7	= ds_Data6 + 8
521.1SisABSOLUTE ds_Data8	= ds_Data7 + 8
531.1SisABSOLUTE ds_Data9	= ds_Data8 + 8
541.1Sis
551.1SisABSOLUTE ok		= 0xff00
561.1SisABSOLUTE err1		= 0xff01
571.1SisABSOLUTE err2		= 0xff02
581.1SisABSOLUTE err3		= 0xff03
591.1SisABSOLUTE err4		= 0xff04
601.1SisABSOLUTE err5		= 0xff05
611.1SisABSOLUTE err6		= 0xff06
621.1SisABSOLUTE err7		= 0xff07
631.1SisABSOLUTE err8		= 0xff08
641.1SisABSOLUTE err9		= 0xff09
651.1SisABSOLUTE err10		= 0xff0a
661.3SmhitchABSOLUTE err11		= 0xff0b
671.1Sis
681.1SisENTRY	scripts
691.1SisENTRY	switch
701.1SisENTRY	wait_reselect
711.1SisENTRY	dataout
721.1SisENTRY	datain
731.3SmhitchENTRY	clear_ack
741.1Sis
751.2SisPROC	siopng_scripts:
761.1Sis
771.1Sisscripts:
781.1Sis
791.1Sis	SELECT ATN FROM ds_Device, REL(reselect)
801.1Sis;
811.1Sisswitch:
821.4Sis	MOVE GPREG | 0x10 TO GPREG
831.1Sis	JUMP REL(msgin), WHEN MSG_IN
841.1Sis	JUMP REL(msgout), IF MSG_OUT
851.1Sis	JUMP REL(command_phase), IF CMD
861.1Sis	JUMP REL(dataout), IF DATA_OUT
871.1Sis	JUMP REL(datain), IF DATA_IN
881.1Sis	JUMP REL(end), IF STATUS
891.1Sis
901.1Sis	INT err5			; Unrecognized phase
911.1Sis
921.1Sismsgin:
931.1Sis	MOVE FROM ds_MsgIn, WHEN MSG_IN
941.1Sis	JUMP REL(ext_msg), IF 0x01	; extended message
951.1Sis	JUMP REL(disc), IF 0x04		; disconnect message
961.1Sis	JUMP REL(msg_sdp), IF 0x02	; save data pointers
971.1Sis	JUMP REL(msg_rej), IF 0x07	; message reject
981.1Sis	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
991.1Sis	INT err6			; unrecognized message
1001.1Sis
1011.3Smhitchmsg_rej:
1021.3Smhitch; Do we need to interrupt host here to let it handle the reject?
1031.1Sismsg_rdp:
1041.3Smhitchclear_ack:
1051.1Sis	CLEAR ACK
1061.1Sis	CLEAR ATN
1071.1Sis	JUMP REL(switch)
1081.1Sis
1091.1Sisext_msg:
1101.1Sis	CLEAR ACK
1111.1Sis	MOVE FROM ds_ExtMsg, WHEN MSG_IN
1121.3Smhitch	JUMP REL(neg_msg), IF 0x03	; extended message might be SDTR
1131.3Smhitch	JUMP REL(neg_msg), IF 0x02	; extended message might be WDTR
1141.1Sis	int err7			; extended message not SDTR
1151.1Sis
1161.3Smhitchneg_msg:
1171.1Sis	CLEAR ACK
1181.3Smhitch	MOVE FROM ds_NegMsg, WHEN MSG_IN
1191.3Smhitch	int err11			; Let host handle the message
1201.3Smhitch; If we continue from the interrupt, the host has set up a response
1211.3Smhitch; message to be sent.  Set ATN, clear ACK, and continue.
1221.3Smhitch	SET ATN
1231.1Sis	CLEAR ACK
1241.1Sis	JUMP REL(switch)
1251.1Sis
1261.1Sisdisc:
1271.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
1281.4Sis	MOVE GPREG & 0xEF TO GPREG
1291.1Sis	CLEAR ACK
1301.1Sis	WAIT DISCONNECT
1311.1Sis
1321.1Sis	int err2			; signal disconnect w/o save DP
1331.1Sis
1341.1Sismsg_sdp:
1351.1Sis	CLEAR ACK			; acknowledge message
1361.1Sis	JUMP REL(switch), WHEN NOT MSG_IN
1371.1Sis	MOVE FROM ds_ExtMsg, WHEN MSG_IN
1381.1Sis	INT err8, IF NOT 0x04		; interrupt if not disconnect
1391.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
1401.1Sis	CLEAR ACK
1411.1Sis	WAIT DISCONNECT
1421.1Sis
1431.1Sis	INT err1			; signal disconnect
1441.1Sis
1451.1Sisreselect:
1461.1Siswait_reselect:
1471.1Sis	WAIT RESELECT REL(select_adr)
1481.1Sis	MOVE SSID & 0x8f to SFBR	; Save reselect ID
1491.1Sis	MOVE SFBR to SCRATCHA0
1501.1Sis
1511.1Sis	INT err9, WHEN NOT MSG_IN	; didn't get IDENTIFY
1521.1Sis	MOVE FROM ds_Msg, WHEN MSG_IN
1531.1Sis	INT err3			; let host know about reconnect
1541.1Sis	CLEAR ACK			; acknowlege the message
1551.1Sis	JUMP REL(switch)
1561.1Sis
1571.1Sis
1581.1Sisselect_adr:
1591.1Sis	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
1601.1Sis	INT err4, IF 0x00		; tell host if not connected
1611.1Sis	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
1621.1Sis	JUMP REL(wait_reselect)		; and try reselect again
1631.1Sis
1641.1Sismsgout:
1651.1Sis	MOVE FROM ds_MsgOut, WHEN MSG_OUT
1661.1Sis	JUMP REL(switch)
1671.1Sis
1681.1Siscommand_phase:
1691.1Sis	CLEAR ATN
1701.1Sis	MOVE FROM ds_Cmd, WHEN CMD
1711.1Sis	JUMP REL(switch)
1721.1Sis
1731.1Sisdataout:
1741.1Sis	MOVE FROM ds_Data1, WHEN DATA_OUT
1751.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1761.1Sis	MOVE FROM ds_Data2, WHEN DATA_OUT
1771.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1781.1Sis	MOVE FROM ds_Data3, WHEN DATA_OUT
1791.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1801.1Sis	MOVE FROM ds_Data4, WHEN DATA_OUT
1811.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1821.1Sis	MOVE FROM ds_Data5, WHEN DATA_OUT
1831.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1841.1Sis	MOVE FROM ds_Data6, WHEN DATA_OUT
1851.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1861.1Sis	MOVE FROM ds_Data7, WHEN DATA_OUT
1871.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1881.1Sis	MOVE FROM ds_Data8, WHEN DATA_OUT
1891.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1901.1Sis	MOVE FROM ds_Data9, WHEN DATA_OUT
1911.1Sis	CALL REL(switch)
1921.1Sis
1931.1Sisdatain:
1941.1Sis	MOVE FROM ds_Data1, WHEN DATA_IN
1951.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1961.1Sis	MOVE FROM ds_Data2, WHEN DATA_IN
1971.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1981.1Sis	MOVE FROM ds_Data3, WHEN DATA_IN
1991.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2001.1Sis	MOVE FROM ds_Data4, WHEN DATA_IN
2011.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2021.1Sis	MOVE FROM ds_Data5, WHEN DATA_IN
2031.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2041.1Sis	MOVE FROM ds_Data6, WHEN DATA_IN
2051.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2061.1Sis	MOVE FROM ds_Data7, WHEN DATA_IN
2071.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2081.1Sis	MOVE FROM ds_Data8, WHEN DATA_IN
2091.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2101.1Sis	MOVE FROM ds_Data9, WHEN DATA_IN
2111.1Sis	CALL REL(switch)
2121.1Sis
2131.1Sisend:
2141.1Sis	MOVE FROM ds_Status, WHEN STATUS
2151.1Sis	int err10, WHEN NOT MSG_IN	; status not followed by msg
2161.1Sis	MOVE FROM ds_Msg, WHEN MSG_IN
2171.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
2181.1Sis	CLEAR ACK
2191.1Sis	WAIT DISCONNECT
2201.4Sis	MOVE GPREG & 0xEF TO GPREG
2211.1Sis	INT ok				; signal completion
2221.1Sis	JUMP REL(wait_reselect)
223