#
# Copyright (c) 1995 Berkeley Software Design, Inc.  All rights reserved.
# The Berkeley Software Design Inc. software License Agreement specifies
# the terms and conditions for redistribution.
#
#	BSDI $Id: ncr_selector,v 2.1 1995/05/26 23:01:56 karels Exp $
# 
	i_ssid_invalid	= 0x1000 - 1
	i_bogusreselect	= 0x1000 - 2

	slot_stopper	= 0x80
	slot_valid	= 0x01
	slot_newwork	= 0x02
	slot_done	= 0x04


wait4work:
	reselect newwork;
findtarget:
	mv ssid sfbr;
	jmp data 0x80 mask 0x80 si_valid;
	int i_ssid_invalid;	#single initiator
si_restart:
	mv scratcha0 sfbr;
si_valid:
	jmp data 0x01 mask 0x01 odd;
	jmp data 0x00 mask 0x07 t0selected;
	jmp data 0x02 mask 0x07 t2selected;
	jmp data 0x04 mask 0x07 t4selected;
	memmv 4 t6addr seladdr;
	jmp selectit;
odd:
	jmp data 0x01 mask 0x07 t1selected;
	jmp data 0x03 mask 0x07 t3selected;
	jmp data 0x05 mask 0x07 t5selected;
	memmv 4 t7addr scratcha;
	jmp selectit;

t0selected:
	memmv 4 t0addr seladdr;
	jmp selectit;

t1selected:
	memmv 4 t1addr seladdr;
	jmp selectit;
t2selected:
	memmv 4 t2addr seladdr;
	jmp selectit;
t3selected:
	memmv 4 t3addr seladdr;
	jmp selectit;
t4selected:
	memmv 4 t4addr seladdr;
	jmp selectit;
t5selected:
	memmv 4 t5addr seladdr;

selectit:
seladdr = . + 4
	memmv 4 0 scratcha;
	mv scratcha0 sfbr;
	int not data slot_valid mask slot_valid i_bogusreselect;
	memmv 4 seladdr scratcha;
	add 4 scratcha0;
	add carry 0 scratcha1;
	memmv 4 scratcha seladdr1;
seladdr1 = . + 4
	memmv  4 0 scratcha;
	add 8 scratcha0;			#reselect is second entry
	add carry 0 scratcha1;
callit:
	mv scratcha0 sfbr;
	mv sfbr temp0;
	mv scratcha1 sfbr;
	mv sfbr temp1;
	mv scratcha2 sfbr;
	mv sfbr temp2;
	mv scratcha3 sfbr;
	mv sfbr temp3;
	ret;


newwork:			#see if we can find something to do
	mv ctest2 sfbr;
	memmv 4 t0addr scanaddr;
loop:
scanaddr = . + 4
	memmv 4 0 scratcha;
	mv scratcha0 sfbr;
	jmp data slot_newwork mask slot_newwork foundnew;
	jmp data slot_stopper mask slot_stopper wait4work;
	memmv 4 scanaddr scratcha;
	add 16 scratcha0;
	add carry 0 scratcha1;
	memmv 4 scratcha scanaddr;
	jmp loop;

foundnew:
	memmv 4 scanaddr update1;
	and 0xff - slot_newwork scratcha0;	#turn off nework flag
update1 = . + 8
	memmv 4 scratcha 0;
	memmv 4 scanaddr scratcha;
	add 4 scratcha0;
	add carry 0 scratcha1;
	memmv 4 scratcha foundaddr;
foundaddr = . + 4
	memmv 4 0 scratcha;
	memmv 4 scratcha scratchb;
	jmp callit;

#
# t?addrs must be in order. Device driver counts
# on it.
#

t0addr:		. = . + 4
t1addr:		. = . + 4
t2addr:		. = . + 4
t3addr:		. = . + 4
t4addr:		. = . + 4
t5addr:		. = . + 4
t6addr:		. = . + 4
t7addr:		. = . + 4
physaddr: 	. = . + 4
zero:		. = . + 4
eot:

