// 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 devices unique ID number. It uses the assembly routines from Part 1.