Home | History | Annotate | Line # | Download | only in siop
oosiop.ss revision 1.1
      1 ;	$NetBSD: oosiop.ss,v 1.1 2001/12/05 18:27:13 fredette Exp $
      2 
      3 ;
      4 ; Copyright (c) 2001 Matt Fredette
      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 53c700 script
     35 ;
     36 ARCH 700
     37 ;
     38 EXTERNAL ds_Device
     39 EXTERNAL ds_MsgOut
     40 EXTERNAL ds_Cmd
     41 EXTERNAL ds_Status
     42 EXTERNAL ds_Msg
     43 EXTERNAL ds_MsgIn
     44 EXTERNAL ds_ExtMsg
     45 EXTERNAL ds_SyncMsg
     46 EXTERNAL ds_Data1
     47 
     48 
     49 ABSOLUTE ok		= 0xff00
     50 ABSOLUTE int_disc	= 0xff01
     51 ABSOLUTE int_disc_wodp	= 0xff02
     52 ABSOLUTE int_reconnect	= 0xff03
     53 ABSOLUTE int_connect	= 0xff04
     54 ABSOLUTE int_phase	= 0xff05
     55 ABSOLUTE int_msgin	= 0xff06
     56 ABSOLUTE int_extmsg	= 0xff07
     57 ABSOLUTE int_msgsdp	= 0xff08
     58 ABSOLUTE int_identify	= 0xff09
     59 ABSOLUTE int_status	= 0xff0a
     60 ABSOLUTE int_syncmsg	= 0xff0b
     61 
     62 ENTRY	scripts
     63 ENTRY	switch
     64 ENTRY	wait_reselect
     65 ENTRY	dataout
     66 ENTRY	datain
     67 ENTRY	clear_ack
     68 
     69 PROC	oosiop_script:
     70 
     71 scripts:
     72 
     73 	SELECT ATN ds_Device, reselect
     74 ;
     75 switch:
     76 	JUMP msgin, WHEN MSG_IN
     77 	JUMP msgout, IF MSG_OUT
     78 	JUMP command_phase, IF CMD
     79 	JUMP dataout, IF DATA_OUT
     80 	JUMP datain, IF DATA_IN
     81 	JUMP end, IF STATUS
     82 
     83 	INT int_phase			; Unrecognized phase
     84 
     85 msgin:
     86 	MOVE 0, ds_MsgIn, WHEN MSG_IN
     87 	JUMP ext_msg, IF 0x01		; extended message
     88 	JUMP disc, IF 0x04		; disconnect message
     89 	JUMP msg_sdp, IF 0x02		; save data pointers
     90 	JUMP msg_rej, IF 0x07		; message reject
     91 	JUMP msg_rdp, IF 0x03		; restore data pointers
     92 	INT int_msgin			; unrecognized message
     93 
     94 msg_rej:
     95 ; Do we need to interrupt host here to let it handle the reject?
     96 msg_rdp:
     97 clear_ack:
     98 	CLEAR ACK
     99 	CLEAR ATN
    100 	JUMP switch
    101 
    102 ext_msg:
    103 	CLEAR ACK
    104 	MOVE 0, ds_ExtMsg, WHEN MSG_IN
    105 	JUMP sync_msg, IF 0x03
    106 	int int_extmsg			; extended message not SDTR
    107 
    108 sync_msg:
    109 	CLEAR ACK
    110 	MOVE 0, ds_SyncMsg, WHEN MSG_IN
    111 	int int_syncmsg			; Let host handle the message
    112 ; If we continue from the interrupt, the host has set up a response
    113 ; message to be sent.  Set ATN, clear ACK, and continue.
    114 	SET ATN
    115 	CLEAR ACK
    116 	JUMP switch
    117 
    118 disc:
    119 	CLEAR ACK
    120 	WAIT DISCONNECT
    121 
    122 	int int_disc_wodp		; signal disconnect w/o save DP
    123 
    124 msg_sdp:
    125 	CLEAR ACK			; acknowledge message
    126 	JUMP switch, WHEN NOT MSG_IN
    127 	MOVE 0, ds_ExtMsg, WHEN MSG_IN
    128 	INT int_msgsdp, IF NOT 0x04	; interrupt if not disconnect
    129 	CLEAR ACK
    130 	WAIT DISCONNECT
    131 
    132 	INT int_disc			; signal disconnect
    133 
    134 reselect:
    135 wait_reselect:
    136 	WAIT RESELECT select_adr
    137 	; NB: these NOPs are CRITICAL to preserve the 1:1
    138 	; correspondence between instructions in this script
    139 	; and instructions in the osiop (53c710) script:
    140 	NOP
    141 	NOP				; reselect ID already in SFBR
    142 
    143 	INT int_identify, WHEN NOT MSG_IN
    144 	MOVE 0, ds_Msg, WHEN MSG_IN
    145 	INT int_reconnect		; let host know about reconnect
    146 	CLEAR ACK			; acknowlege the message
    147 	JUMP switch
    148 
    149 select_adr:
    150 	MOVE SCNTL1 & 0x10 to SFBR	; get connected status
    151 	INT int_connect, IF 0x00	; tell host if not connected
    152 	NOP				; Sig_P doesn't exist on the 53c700
    153 	JUMP wait_reselect		; and try reselect again
    154 
    155 msgout:
    156 	MOVE 0, ds_MsgOut, WHEN MSG_OUT
    157 	JUMP switch
    158 
    159 command_phase:
    160 	CLEAR ATN
    161 	MOVE 0, ds_Cmd, WHEN CMD
    162 	JUMP switch
    163 
    164 dataout:
    165 	MOVE 0, ds_Data1, WHEN DATA_OUT
    166 	CALL switch, WHEN NOT DATA_OUT
    167 	MOVE 0, ds_Data1, WHEN DATA_OUT
    168 	CALL switch, WHEN NOT DATA_OUT
    169 	MOVE 0, ds_Data1, WHEN DATA_OUT
    170 	CALL switch, WHEN NOT DATA_OUT
    171 	MOVE 0, ds_Data1, WHEN DATA_OUT
    172 	CALL switch, WHEN NOT DATA_OUT
    173 	MOVE 0, ds_Data1, WHEN DATA_OUT
    174 	CALL switch, WHEN NOT DATA_OUT
    175 	MOVE 0, ds_Data1, WHEN DATA_OUT
    176 	CALL switch, WHEN NOT DATA_OUT
    177 	MOVE 0, ds_Data1, WHEN DATA_OUT
    178 	CALL switch, WHEN NOT DATA_OUT
    179 	MOVE 0, ds_Data1, WHEN DATA_OUT
    180 	CALL switch, WHEN NOT DATA_OUT
    181 	MOVE 0, ds_Data1, WHEN DATA_OUT
    182 	CALL switch, WHEN NOT DATA_OUT
    183 	MOVE 0, ds_Data1, WHEN DATA_OUT
    184 	CALL switch, WHEN NOT DATA_OUT
    185 	MOVE 0, ds_Data1, WHEN DATA_OUT
    186 	CALL switch, WHEN NOT DATA_OUT
    187 	MOVE 0, ds_Data1, WHEN DATA_OUT
    188 	CALL switch, WHEN NOT DATA_OUT
    189 	MOVE 0, ds_Data1, WHEN DATA_OUT
    190 	CALL switch, WHEN NOT DATA_OUT
    191 	MOVE 0, ds_Data1, WHEN DATA_OUT
    192 	CALL switch, WHEN NOT DATA_OUT
    193 	MOVE 0, ds_Data1, WHEN DATA_OUT
    194 	CALL switch, WHEN NOT DATA_OUT
    195 	MOVE 0, ds_Data1, WHEN DATA_OUT
    196 	CALL switch, WHEN NOT DATA_OUT
    197 	MOVE 0, ds_Data1, WHEN DATA_OUT
    198 	CALL switch
    199 
    200 datain:
    201 	MOVE 0, ds_Data1, WHEN DATA_IN
    202 	CALL switch, WHEN NOT DATA_IN
    203 	MOVE 0, ds_Data1, WHEN DATA_IN
    204 	CALL switch, WHEN NOT DATA_IN
    205 	MOVE 0, ds_Data1, WHEN DATA_IN
    206 	CALL switch, WHEN NOT DATA_IN
    207 	MOVE 0, ds_Data1, WHEN DATA_IN
    208 	CALL switch, WHEN NOT DATA_IN
    209 	MOVE 0, ds_Data1, WHEN DATA_IN
    210 	CALL switch, WHEN NOT DATA_IN
    211 	MOVE 0, ds_Data1, WHEN DATA_IN
    212 	CALL switch, WHEN NOT DATA_IN
    213 	MOVE 0, ds_Data1, WHEN DATA_IN
    214 	CALL switch, WHEN NOT DATA_IN
    215 	MOVE 0, ds_Data1, WHEN DATA_IN
    216 	CALL switch, WHEN NOT DATA_IN
    217 	MOVE 0, ds_Data1, WHEN DATA_IN
    218 	CALL switch, WHEN NOT DATA_IN
    219 	MOVE 0, ds_Data1, WHEN DATA_IN
    220 	CALL switch, WHEN NOT DATA_IN
    221 	MOVE 0, ds_Data1, WHEN DATA_IN
    222 	CALL switch, WHEN NOT DATA_IN
    223 	MOVE 0, ds_Data1, WHEN DATA_IN
    224 	CALL switch, WHEN NOT DATA_IN
    225 	MOVE 0, ds_Data1, WHEN DATA_IN
    226 	CALL switch, WHEN NOT DATA_IN
    227 	MOVE 0, ds_Data1, WHEN DATA_IN
    228 	CALL switch, WHEN NOT DATA_IN
    229 	MOVE 0, ds_Data1, WHEN DATA_IN
    230 	CALL switch, WHEN NOT DATA_IN
    231 	MOVE 0, ds_Data1, WHEN DATA_IN
    232 	CALL switch, WHEN NOT DATA_IN
    233 	MOVE 0, ds_Data1, WHEN DATA_IN
    234 	CALL switch
    235 
    236 end:
    237 	MOVE 0, ds_Status, WHEN STATUS
    238 	int int_status, WHEN NOT MSG_IN	; status not followed by msg
    239 	MOVE 0, ds_Msg, WHEN MSG_IN
    240 	CLEAR ACK
    241 	WAIT DISCONNECT
    242 	INT ok				; signal completion
    243 	JUMP wait_reselect
    244