R
Randy Day
I'm having trouble getting my head around this.
I want to add a two-byte offset to TBLPTR to
read a large table. I tried to:
add the low byte to TBLPTRL
inc TBLPTRH if carry is true
inc TBLPTRU if carry is true again
add the high byte to TBLPTRH
inc TBLPTRU if carry is true
Without the code between the comments, the
routine returns the first word in TABLE0
properly. What am I missing?
TABLE_TO_TEMP
MOVLW LOW TABLE0
MOVWF TBLPTRL
MOVLW HIGH TABLE0
MOVWF TBLPTRH
MOVLW UPPER TABLE0
MOVWF TBLPTRU
RLCF TEMPLO ; multiply offset by
RLCF TEMPHI ; 2 for word-size data
; ======== calculate offset into table
MOVF TEMPLO
ADDWF TBLPTRL, 1 ; changes from 7A to 7F
; when templo=0x00. WTF?!?
BTFSC STATUS, C ; did we wrap?
CALL INCTABLE ; inc hi/upper
MOVF TEMPHI
ADDWF TBLPTRH, 1 ; add high byte
BTFSC STATUS, C ; did we wrap?
INCF TBLPTRU ; inc upper
; ======== perform read; put data in TEMP vars
TBLRD*+
MOVFF TABLAT, TEMPLO
TBLRD*
MOVFF TABLAT, TEMPHI
RETURN
INCTABLE
INCF TBLPTRH ; inc high byte
BTFSC STATUS, C ; did we wrap again?
INCF TBLPTRU ; if so, inc upper
RETURN
TABLE0 dw 0xAABB, 0xCCDD, 0xEEFF, 0xFFAB, 0x0004, 0x0005, 0x0006,
0x0007 ; etc.
I want to add a two-byte offset to TBLPTR to
read a large table. I tried to:
add the low byte to TBLPTRL
inc TBLPTRH if carry is true
inc TBLPTRU if carry is true again
add the high byte to TBLPTRH
inc TBLPTRU if carry is true
Without the code between the comments, the
routine returns the first word in TABLE0
properly. What am I missing?
TABLE_TO_TEMP
MOVLW LOW TABLE0
MOVWF TBLPTRL
MOVLW HIGH TABLE0
MOVWF TBLPTRH
MOVLW UPPER TABLE0
MOVWF TBLPTRU
RLCF TEMPLO ; multiply offset by
RLCF TEMPHI ; 2 for word-size data
; ======== calculate offset into table
MOVF TEMPLO
ADDWF TBLPTRL, 1 ; changes from 7A to 7F
; when templo=0x00. WTF?!?
BTFSC STATUS, C ; did we wrap?
CALL INCTABLE ; inc hi/upper
MOVF TEMPHI
ADDWF TBLPTRH, 1 ; add high byte
BTFSC STATUS, C ; did we wrap?
INCF TBLPTRU ; inc upper
; ======== perform read; put data in TEMP vars
TBLRD*+
MOVFF TABLAT, TEMPLO
TBLRD*
MOVFF TABLAT, TEMPHI
RETURN
INCTABLE
INCF TBLPTRH ; inc high byte
BTFSC STATUS, C ; did we wrap again?
INCF TBLPTRU ; if so, inc upper
RETURN
TABLE0 dw 0xAABB, 0xCCDD, 0xEEFF, 0xFFAB, 0x0004, 0x0005, 0x0006,
0x0007 ; etc.