// variable definitions
// b0 used in bit tests

symbol	temp=b7			// data being passed
symbol	templ=b8		// data being passed
symbol	temph=b9		// data being passed
symbol	cntr=b10		// bit counter
symbol	ctemp=b11		// temp counter
symbol	rtemp=b12		// temp zero counter
symbol	byte0=b21
symbol	byte1=b22
symbol	byte2=b23
symbol	byte3=b24
symbol	byte4=b25
symbol	byte5=b26
symbol	byte6=b27
symbol	byte7=b28
symbol	bytenum=b29
symbol	bitnum=b30
symbol	A=b31
symbol	B=b32
symbol	LD=b33
symbol  D=b34
symbol	RV=b35
symbol	RBI=b36
symbol	DM=b37

START:	call SEARCH
	serout 7,n1200,("That is all",13,10)
	pause 10000
	goto START
SEARCH:	call FIRST
SEARCH1:if RV=0 then SEARCH3
	temph=byte0/16 : templ=byte0//16 : call PRNT
	temph=byte1/16 : templ=byte1//16 : call PRNT
	temph=byte2/16 : templ=byte2//16 : call PRNT
	temph=byte3/16 : templ=byte3//16 : call PRNT
	temph=byte4/16 : templ=byte4//16 : call PRNT
	temph=byte5/16 : templ=byte5//16 : call PRNT
	temph=byte6/16 : templ=byte6//16 : call PRNT
	temph=byte7/16 : templ=byte7//16 : call PRNT
	serout 7,n1200,(13,10)
SEARCH2:
	if D=1 then SEARCHX
SEARCH3:
	if LD=0 and D=0 then NODEVICE
	call SECOND : goto SEARCH1
SEARCHX:return
NODEVICE:
	serout 7,n1200,("No Device",13,10)
	goto SEARCHX
PRNT:	temp=templ : call LOOK
	templ=temp : temp=temph : call LOOK
	temph=temp : serout 7,n1200,(temph,templ," ") : return
LOOK:
	Lookup temp,(48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70),temp
	return

FIRST:	LD=0 : D=0
SECOND:	RV=0
	if D<>1 then RESET
	D=0 : return
RESET:	call RESET_P
	if temp=0 then NONE
	RBI=1 : DM=0
	temp=$F0 : cntr=8 : call W_B
QUERY:	cntr=1 : call R_B : b0=temp : A=bit7
	cntr=1 : call R_B : b0=temp : B=bit7
	if A=B then SAME
	call PUT
PICK:	call GET
	bit0=A : temp=b0 : cntr=1 : call W_B
	RBI=RBI+1
	if RBI<=64 then QUERY
	LD=DM 
	if LD<>0 then MORE
	D=1
MORE:	RV=1 : return
SAME:
	if A=0 then FIGHT
NONE:
	LD=0 : return
FIGHT:
	if RBI<>LD then LET0
	A=1 : call PUT : goto PICK
LET0:
	if RBI<LD then CHK0
	A=0 : call PUT
MARK:
	DM=RBI : goto PICK
CHK0:
	call GET
	if A=0 then MARK
	goto PICK
PUT:	BITNUM=RBI-1
	BYTENUM=BITNUM/8
	BITNUM=BITNUM//8
	call	B02BYTE
	call	BIT2A
	call	BYTE2B0
	return

B02BYTE: branch BYTENUM,(BNUM0,BNUM1,BNUM2,BNUM3,BNUM4,BNUM5,BNUM6,BNUM7)
BNUM0:	b0=BYTE0 : return
BNUM1:	b0=BYTE1 : return
BNUM2:	b0=BYTE2 : return
BNUM3:	b0=BYTE3 : return
BNUM4:	b0=BYTE4 : return
BNUM5:	b0=BYTE5 : return
BNUM6:	b0=BYTE6 : return
BNUM7:	b0=BYTE7 : return
BIT2A: branch BITNUM,(NUM0,NUM1,NUM2,NUM3,NUM4,NUM5,NUM6,NUM7)
NUM0:	bit0=A : return
NUM1:	bit1=A : return
NUM2:	bit2=A : return
NUM3:	bit3=A : return
NUM4:	bit4=A : return
NUM5:	bit5=A : return
NUM6:	bit6=A : return
NUM7:	bit7=A : return
BYTE2B0: branch BYTENUM,(PNUM0,PNUM1,PNUM2,PNUM3,PNUM4,PNUM5,PNUM6,PNUM7)
PNUM0:	BYTE0=b0 : return
PNUM1:	BYTE1=b0 : return
PNUM2:	BYTE2=b0 : return
PNUM3:	BYTE3=b0 : return
PNUM4:	BYTE4=b0 : return
PNUM5:	BYTE5=b0 : return
PNUM6:	BYTE6=b0 : return
PNUM7:	BYTE7=b0 : return

GET:	BITNUM=RBI-1
	BYTENUM=BITNUM/8
	BITNUM=BITNUM//8
	call	B02BYTE
	call	A2BIT
	return
A2BIT: branch BITNUM,(GBIT0,GBIT1,GBIT2,GBIT3,GBIT4,GBIT5,GBIT6,GBIT7)
GBIT0:	A=bit0 : return
GBIT1:	A=bit1 : return
GBIT2:	A=bit2 : return
GBIT3:	A=bit3 : return
GBIT4:	A=bit4 : return
GBIT5:	A=bit5 : return
GBIT6:	A=bit6 : return
GBIT7:	A=bit7 : return

Listing 1This program, written in PicBASIC, searches the 1-wire bus and reports every device’s unique ID number. It uses the assembly routines from Part 1.