siop2_script.ss revision 1.8
11.8Smaya;	$NetBSD: siop2_script.ss,v 1.8 2016/12/12 15:58:44 maya 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;
161.1Sis; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
171.1Sis; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
181.1Sis; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
191.1Sis; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
201.1Sis; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
211.1Sis; NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
221.1Sis; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
231.1Sis; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
241.1Sis; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
251.1Sis; THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
261.1Sis;
271.1Sis
281.1Sis; NCR 53c770 script
291.1Sis;
301.1SisARCH 720
311.1Sis;
321.1SisABSOLUTE ds_Device	= 0
331.1SisABSOLUTE ds_MsgOut 	= ds_Device + 4
341.1SisABSOLUTE ds_Cmd		= ds_MsgOut + 8
351.1SisABSOLUTE ds_Status	= ds_Cmd + 8
361.1SisABSOLUTE ds_Msg		= ds_Status + 8
371.1SisABSOLUTE ds_MsgIn	= ds_Msg + 8
381.1SisABSOLUTE ds_ExtMsg	= ds_MsgIn + 8
391.3SmhitchABSOLUTE ds_NegMsg	= ds_ExtMsg + 8
401.3SmhitchABSOLUTE ds_Data1	= ds_NegMsg + 8
411.1SisABSOLUTE ds_Data2	= ds_Data1 + 8
421.1SisABSOLUTE ds_Data3	= ds_Data2 + 8
431.1SisABSOLUTE ds_Data4	= ds_Data3 + 8
441.1SisABSOLUTE ds_Data5	= ds_Data4 + 8
451.1SisABSOLUTE ds_Data6	= ds_Data5 + 8
461.1SisABSOLUTE ds_Data7	= ds_Data6 + 8
471.1SisABSOLUTE ds_Data8	= ds_Data7 + 8
481.1SisABSOLUTE ds_Data9	= ds_Data8 + 8
491.1Sis
501.1SisABSOLUTE ok		= 0xff00
511.1SisABSOLUTE err1		= 0xff01
521.1SisABSOLUTE err2		= 0xff02
531.1SisABSOLUTE err3		= 0xff03
541.1SisABSOLUTE err4		= 0xff04
551.1SisABSOLUTE err5		= 0xff05
561.1SisABSOLUTE err6		= 0xff06
571.1SisABSOLUTE err7		= 0xff07
581.1SisABSOLUTE err8		= 0xff08
591.1SisABSOLUTE err9		= 0xff09
601.1SisABSOLUTE err10		= 0xff0a
611.3SmhitchABSOLUTE err11		= 0xff0b
621.1Sis
631.1SisENTRY	scripts
641.1SisENTRY	switch
651.1SisENTRY	wait_reselect
661.1SisENTRY	dataout
671.1SisENTRY	datain
681.3SmhitchENTRY	clear_ack
691.1Sis
701.2SisPROC	siopng_scripts:
711.1Sis
721.1Sisscripts:
731.1Sis
741.1Sis	SELECT ATN FROM ds_Device, REL(reselect)
751.1Sis;
761.1Sisswitch:
771.4Sis	MOVE GPREG | 0x10 TO GPREG
781.1Sis	JUMP REL(msgin), WHEN MSG_IN
791.1Sis	JUMP REL(msgout), IF MSG_OUT
801.1Sis	JUMP REL(command_phase), IF CMD
811.1Sis	JUMP REL(dataout), IF DATA_OUT
821.1Sis	JUMP REL(datain), IF DATA_IN
831.1Sis	JUMP REL(end), IF STATUS
841.1Sis
851.1Sis	INT err5			; Unrecognized phase
861.1Sis
871.1Sismsgin:
881.1Sis	MOVE FROM ds_MsgIn, WHEN MSG_IN
891.1Sis	JUMP REL(ext_msg), IF 0x01	; extended message
901.1Sis	JUMP REL(disc), IF 0x04		; disconnect message
911.1Sis	JUMP REL(msg_sdp), IF 0x02	; save data pointers
921.1Sis	JUMP REL(msg_rej), IF 0x07	; message reject
931.1Sis	JUMP REL(msg_rdp), IF 0x03	; restore data pointers
941.1Sis	INT err6			; unrecognized message
951.1Sis
961.3Smhitchmsg_rej:
971.3Smhitch; Do we need to interrupt host here to let it handle the reject?
981.1Sismsg_rdp:
991.3Smhitchclear_ack:
1001.1Sis	CLEAR ACK
1011.1Sis	CLEAR ATN
1021.1Sis	JUMP REL(switch)
1031.1Sis
1041.1Sisext_msg:
1051.1Sis	CLEAR ACK
1061.1Sis	MOVE FROM ds_ExtMsg, WHEN MSG_IN
1071.3Smhitch	JUMP REL(neg_msg), IF 0x03	; extended message might be SDTR
1081.3Smhitch	JUMP REL(neg_msg), IF 0x02	; extended message might be WDTR
1091.5Sis	INT err7			; extended message not SDTR
1101.1Sis
1111.3Smhitchneg_msg:
1121.1Sis	CLEAR ACK
1131.3Smhitch	MOVE FROM ds_NegMsg, WHEN MSG_IN
1141.5Sis	INT err11			; Let host handle the message
1151.3Smhitch; If we continue from the interrupt, the host has set up a response
1161.3Smhitch; message to be sent.  Set ATN, clear ACK, and continue.
1171.3Smhitch	SET ATN
1181.1Sis	CLEAR ACK
1191.1Sis	JUMP REL(switch)
1201.1Sis
1211.1Sisdisc:
1221.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
1231.4Sis	MOVE GPREG & 0xEF TO GPREG
1241.1Sis	CLEAR ACK
1251.1Sis	WAIT DISCONNECT
1261.1Sis
1271.5Sis	INT err2			; signal disconnect w/o save DP
1281.1Sis
1291.1Sismsg_sdp:
1301.1Sis	CLEAR ACK			; acknowledge message
1311.1Sis	JUMP REL(switch), WHEN NOT MSG_IN
1321.1Sis	MOVE FROM ds_ExtMsg, WHEN MSG_IN
1331.1Sis	INT err8, IF NOT 0x04		; interrupt if not disconnect
1341.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
1351.1Sis	CLEAR ACK
1361.1Sis	WAIT DISCONNECT
1371.1Sis
1381.1Sis	INT err1			; signal disconnect
1391.1Sis
1401.1Sisreselect:
1411.1Siswait_reselect:
1421.1Sis	WAIT RESELECT REL(select_adr)
1431.1Sis	MOVE SSID & 0x8f to SFBR	; Save reselect ID
1441.1Sis	MOVE SFBR to SCRATCHA0
1451.1Sis
1461.1Sis	INT err9, WHEN NOT MSG_IN	; didn't get IDENTIFY
1471.1Sis	MOVE FROM ds_Msg, WHEN MSG_IN
1481.1Sis	INT err3			; let host know about reconnect
1491.8Smaya	CLEAR ACK			; acknowledge the message
1501.1Sis	JUMP REL(switch)
1511.1Sis
1521.1Sis
1531.1Sisselect_adr:
1541.1Sis	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
1551.1Sis	INT err4, IF 0x00		; tell host if not connected
1561.1Sis	MOVE CTEST2 & 0x40 to SFBR	; clear Sig_P
1571.1Sis	JUMP REL(wait_reselect)		; and try reselect again
1581.1Sis
1591.1Sismsgout:
1601.1Sis	MOVE FROM ds_MsgOut, WHEN MSG_OUT
1611.1Sis	JUMP REL(switch)
1621.1Sis
1631.1Siscommand_phase:
1641.1Sis	CLEAR ATN
1651.1Sis	MOVE FROM ds_Cmd, WHEN CMD
1661.1Sis	JUMP REL(switch)
1671.1Sis
1681.1Sisdataout:
1691.1Sis	MOVE FROM ds_Data1, WHEN DATA_OUT
1701.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1711.1Sis	MOVE FROM ds_Data2, WHEN DATA_OUT
1721.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1731.1Sis	MOVE FROM ds_Data3, WHEN DATA_OUT
1741.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1751.1Sis	MOVE FROM ds_Data4, WHEN DATA_OUT
1761.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1771.1Sis	MOVE FROM ds_Data5, WHEN DATA_OUT
1781.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1791.1Sis	MOVE FROM ds_Data6, WHEN DATA_OUT
1801.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1811.1Sis	MOVE FROM ds_Data7, WHEN DATA_OUT
1821.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1831.1Sis	MOVE FROM ds_Data8, WHEN DATA_OUT
1841.1Sis	CALL REL(switch), WHEN NOT DATA_OUT
1851.1Sis	MOVE FROM ds_Data9, WHEN DATA_OUT
1861.1Sis	CALL REL(switch)
1871.1Sis
1881.1Sisdatain:
1891.1Sis	MOVE FROM ds_Data1, WHEN DATA_IN
1901.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1911.1Sis	MOVE FROM ds_Data2, WHEN DATA_IN
1921.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1931.1Sis	MOVE FROM ds_Data3, WHEN DATA_IN
1941.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1951.1Sis	MOVE FROM ds_Data4, WHEN DATA_IN
1961.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1971.1Sis	MOVE FROM ds_Data5, WHEN DATA_IN
1981.1Sis	CALL REL(switch), WHEN NOT DATA_IN
1991.1Sis	MOVE FROM ds_Data6, WHEN DATA_IN
2001.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2011.1Sis	MOVE FROM ds_Data7, WHEN DATA_IN
2021.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2031.1Sis	MOVE FROM ds_Data8, WHEN DATA_IN
2041.1Sis	CALL REL(switch), WHEN NOT DATA_IN
2051.1Sis	MOVE FROM ds_Data9, WHEN DATA_IN
2061.1Sis	CALL REL(switch)
2071.1Sis
2081.1Sisend:
2091.1Sis	MOVE FROM ds_Status, WHEN STATUS
2101.5Sis	INT err10, WHEN NOT MSG_IN	; status not followed by msg
2111.1Sis	MOVE FROM ds_Msg, WHEN MSG_IN
2121.1Sis	MOVE SCNTL2 & 0x7f TO SCNTL2
2131.1Sis	CLEAR ACK
2141.1Sis	WAIT DISCONNECT
2151.4Sis	MOVE GPREG & 0xEF TO GPREG
2161.1Sis	INT ok				; signal completion
2171.1Sis	JUMP REL(wait_reselect)
218