📄 nw8051.asm
字号:
EXTRN CODE(TOUCHRESET, TOUCHBYTE, BIT_IO)
EXTRN DATA(ROMDTA, TEMP, L0)
EXTRN BIT(SETOK, L90, FAIL)
;
; The following 8051 code implements the ROM search as shown in the
; flowchart of figure 5-3. If no DOW parts are found, or the last DOW part
; was the previous part found, the code searches for a DS1990.
;
ACCESS90:
PUSH B ; Save the B register.
CLR C ; Assume failure.
JNB SETOK, N90 ; Leave if SETUP failed.
CALL TOUCHRESET ; Issue reset pulse.
JNC N90 ; Leave if no parts on bus.
MOV A, #0FH ; Get read rom command in ACC.
CALL TOUCHBYTE ; Send command byte.
MOV B, #8 ; Prepare to read 8 bytes.
MOV TEMP, #0 ; Initialize CRC variable.
READMORE:
MOV A, #0FFH ; Prepare to read a byte.
CALL TOUCHBYTE ; Read byte.
PUSH ACC ; Save byte on stack.
CALL DOW_CRC ; Calculate cummulative CRC.
DJNZ B, READMORE ; Repeat until finished.
MOV B, #8 ; Prepare to pop 8 bytes off stack.
MOV A, TEMP ; Get CRC value in ACC.
JZ SUCCESS ; Jump if successful.
CJNE A, #53, FAILURE ; Jump if failed.
SUCCESS:
MOV R0, #ROMDTA+7 ; R0 points to last byte of ROM.
MOREPOP:
POP ACC ; Pop off byte.
MOV @R0, A ; Put byte in ROM data buffer.
DEC R0 ; Point next least sig. byte of ROM.
DJNZ B, MOREPOP ; Get next byte.
SETB C ; Indicate success.
SJMP N90 ; Leave.
FAILURE:
POP ACC ; Clean up stack.
DJNZ B, FAILURE ; Keep on going.
CLR C ; Indicate failure.
N90:
POP B ; Restore the B register.
RET ; Return to caller.
FIRST:
MOV L0, #65 ; Point rom search alg. to top.
NEXT:
CLR C ; Assume failure.
JNB SETOK, LEV ; Leave if SETUP failed.
JB L90, LEVC ; Already tried DS1990.
CALL ONEXT ; See if another DOW part on line.
JC LEV ; Leave if DOW part was found.
CALL ACCESS90 ; Look for a DS1990.
SETB L90 ; Indicate we looked for a DS1990.
SJMP LEV ; Leave.
LEVC:
CLR L90 ; Indicate next fail we can look.
CLR C ; Indicate failure.
LEV:
RET ; Return to caller.
ONEXT:
PUSH B ; Save B register.
CLR C ; Assume failure.
JB FAIL, ABORT ; Continue if not at end.
CALL TOUCHRESET ; Look for presence.
CLR A ; Zero the accumulator in case
JNC ABORT ; there is no presence.
MOV R0, #ROMDTA ; Point to first byte of Rom Data.
MOV R1, L0 ; Make copy of last unresolved dis.
MOV R2, #0 ; Initialize 8 counter.
MOV B, #64 ; Loop through all 64 bits.
MOV A, #0F0H ; Get search rom command in ACC.
CALL TOUCHBYTE ; Output command byte.
GETNBIT:
MOV A, #81H ; Send first read time slot.
CALL BIT_IO ; Read bit.
RL A ; Shift first bit left one.
CALL BIT_IO ; Send second read time slot.
JZ DIS ; Analyze disagreement.
CJNE A, #3, $+3 ; Look for error condition.
JNC ABORT ; Abort if error has occurred.
CPL ACC.0 ; Get correct bit to output in
SJMP NOSAVE ; ACC.0 and skip dis code.
DIS:
MOV A, B ; Get current location in ACC.
MOV TEMP, R1 ; Can't compare ACC and Rn.
CJNE A, TEMP, L10 ; Compare current loc. w/ last dis.
SETB ACC.0 ; Been here and sent 0, now send 1.
SJMP NOSAVE ; Send out the bit.
L10:
JNC GL ; Remain on previous path.
CLR ACC.0 ; Past last dis. fall to the right.
SJMP NZ ; Save this position in L0.
GL:
MOV A, @R0 ; Get byte of Rom Data in ACC.
NZ:
JB ACC.0, NOSAVE ; Don't fool with L0 if old bit 1.
MOV L0, B ; Save new value of L0.
NOSAVE:
CALL BIT_IO ; Send bit.
MOV C, ACC.0 ; Get bit back in carry.
MOV A, @R0 ; Get current byte in ACC.
RRC A ; Shift in new bit.
MOV @R0, A ; Save new value.
INC R2 ; Point to location for next bit.
CJNE R2, #8, DONTINC ; Byte not ready yet.
INC R0 ; R0 points to next storage loc.
MOV R2, #0 ; Reload 8 counter.
DONTINC:
DJNZ B, GETNBIT ; Repeat until all bits known.
MOV A, R1 ; Copy previous last dis. into ACC.
CJNE A, L0, $+5 ; Is this the last part ?
SETB FAIL ; Leave.
SETB C ; Indicate success.
ABORT:
POP B ; Restore B register.
RET ; Return to caller.
;
; Procedure DOW_CRC
;
; The assembly language procedure DOW_CRC given below
; calculates the cumulative CRC of all the bytes passed
; to it in the accumulator. Before it is used to calculate
; the CRC of a data stream, it should be initialized by
; setting the variable TEMP to zero. Each byte of the data
; is then placed in the accumulator and DOW_CRC is called
; to update the CRC. After all the data has been passed
; to DOW_CRC, the variable TEMP will contain the result.
;
DOW_CRC:
PUSH ACC ; Save the Accumulator.
PUSH B ; Save the B register.
PUSH ACC ; Save bits to be shifted.
MOV B, #8 ; Set to shift eight bits.
CRC_LOOP:
XRL A, TEMP ; Calculate DQIN xor CRCT0.
RRC A ; Move it to the carry.
MOV A, TEMP ; Get the last CRC value.
JNC ZERO ; Skip if DQIN xor CRCT0 = 0.
XRL A, #18H ; Update the CRC value.
ZERO:
RRC A ; Position the new CRC.
MOV TEMP, A ; Store the new CRC.
POP ACC ; Get the remaining bits.
RR A ; Position next bit in LSB.
PUSH ACC ; Save the remaining bits.
DJNZ B, CRC_LOOP ; Repeat for eight bits.
POP ACC ; Clean up the stack.
POP B ; Restore the B register.
POP ACC ; Restore the Accumulator.
RET ; Return.
END ; End of code.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -