
DS80C320/DS80C323 
12 of 42 
DUAL DATA POINTER 
Data memory block moves can be accelerated using the Dual Data Pointer (DPTR). The standard 8032 
DPTR is a 16-bit value that is used to address off-chip data RAM or peripherals. In the 
DS80C320/DS80C323, the standard 16-bit data pointer is called DPTR0 and is located at SFR addresses 
82h and 83h. These are the standard locations. The new DPTR is located at SFR 84h and 85h and is 
called DPTR1. The DPTR Select bit (DPS) chooses the active pointer and is located at the LSB of the 
SFR location 86h. No other bits in register 86h have any effect and are set to 0. The user switches 
between data pointers by toggling the LSB of register 86h. The increment (INC) instruction is the fastest 
way to accomplish this. All DPTR-related instructions use the currently selected DPTR for any activity. 
Therefore only one instruction is required to switch from a source to a destination address. Using the 
Dual-Data Pointer saves code from needing to save source and destination addresses when doing a block 
move. Once loaded, the software simply switches between DPTR and 1. The relevant register locations 
are as follows. 
DPL 
82h 
Low byte original DPTR 
DPH 
83h 
High byte original DPTR 
DPL1 
84h 
Low byte new DPTR 
DPH1 
85h 
High byte new DPTR 
DPS 
86h 
DPTR Select (LSB) 
Sample code listed below illustrates the saving from using the dual DPTR. The example program was 
original code written for an 8051 and requires a total of 1869 DS80C320/DS80C323 machine cycles. This 
takes 299 μs to execute at 25 MHz. The new code using the Dual DPTR requires only 1097 machine 
cycles taking 175.5 μs. The Dual DPTR saves 772 machine cycles or 123.5 μs for a 64-byte block move. 
Since each pass through the loop saves 12 machine cycles when compared to the single DPTR approach, 
larger blocks gain more efficiency using this feature. 
64-BYTE BLOCK MOVE WITHOUT DUAL DATA POINTER 
; SH and SL are high and low byte source address. 
; DH and DL are high and low byte of destination address. 
# CYCLES 
2 
3 
2 
2 
2 
2 
MOV 
MOV 
MOV 
MOV 
MOV 
MOV 
MOVE: 
; THIS LOOP IS PERFORMED THE NUMBER OF TIMES LOADED INTO R5, IN THIS EXAMPLE 64 
MOVX 
A, @DPTR 
; READ SOURCE DATA BYTE 
MOV 
R1, DPL 
; SAVE NEW SOURCE POINTER 
MOV 
R2, DPH 
; 
MOV 
DPL, R3 
; LOAD NEW DESTINATION 
MOV 
DPH, R4 
; 
MOVX 
@DPTR, A 
; WRITE DATA TO DESTINATION 
INC 
DPTR 
; NEXT DESTINATION ADDRESS 
MOV 
R3, DPL 
; SAVE NEW DESTINATION POINTER 
MOV 
R4, DPH 
; 
MOV 
DPL, R1 
; GET NEW SOURCE POINTER 
MOV 
DPH, R2 
; 
INC 
DPTR 
; NEXT SOURCE ADDRESS 
DJNZ 
R5, MOVE 
; FINISHED WITH TABLE 
R5, #64d 
DPTR, #SHSL 
R1, #SL 
R2, #SH 
R3, #DL 
R4, #DH 
; NUMBER OF BYTES TO MOVE 
; LOAD SOURCE ADDRESS 
; SAVE LOW BYTE OF SOURCE 
; SAVE HIGH BYTE OF SOURCE 
; SAVE LOW BYTE OF DESTINATION 
; SAVE HIGH BYTE OF DESTINATION 
2 
2 
2 
2 
2 
2 
3 
2 
2 
2 
2 
3 
3