from the selected FIFO
for ( i = EP2_PACKET_SIZE; i > 0; i-- )
{
while(USB0ADR & 0x80); // Wait for BUSY->'0' (data ready)
// *ptr++ = USB0DAT; // Copy data byte
*ptr = USB0DAT; // Separating dereference and increment results better Asm code
ptr++;
}
USB0ADR = 0; // Clear auto-read
}
//------------ Asm subroutine -------------
//-------------- FIFO_RW.h ----------------
/*
* FIFO_RW.h
*/
#ifndef _FIFO_RW_
#define _FIFO_RW_
extern void FIFO_Read_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr );
extern void FIFO_Read_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr );
extern void FIFO_Read_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr );
extern void FIFO_Write_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr );
extern void FIFO_Write_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr );
extern void FIFO_Write_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr );
#endif
;-------------- FIFO_RW.a51 ----------------
; FIFO_RW.a51 generated from FIFO_RW.c
;
; void FIFO_Read_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr );
; void FIFO_Read_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr );
; void FIFO_Read_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr );
; void FIFO_Write_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr );
; void FIFO_Write_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr );
; void FIFO_Write_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr );
$NOMOD51
$include (c8051f320.inc) ; Include register definition file.
NAME FIFO_RW
?PR?_FIFO_Read_idata?FIFO_RW SEGMENT CODE
?PR?_FIFO_Read_pdata?FIFO_RW SEGMENT CODE
?PR?_FIFO_Read_xdata?FIFO_RW SEGMENT CODE
?PR?_FIFO_Write_idata?FIFO_RW SEGMENT CODE
?PR?_FIFO_Write_pdata?FIFO_RW SEGMENT CODE
?PR?_FIFO_Write_xdata?FIFO_RW SEGMENT CODE
PUBLIC _FIFO_Read_idata
PUBLIC _FIFO_Read_pdata
PUBLIC _FIFO_Read_xdata
PUBLIC _FIFO_Write_idata
PUBLIC _FIFO_Write_pdata
PUBLIC _FIFO_Write_xdata
; void FIFO_Read_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr )
RSEG ?PR?_FIFO_Read_idata?FIFO_RW
_FIFO_Read_idata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ rdFi_ret ; return;
MOV A,R7 ; USB0ADR = fifo_adr | 0xC0;
ORL A,#0C0H ; Set auto-read and initiate first read
MOV USB0ADR,A ; set FIFO address
MOV R0,AR3 ; R0 = ptr;
rdFi_loop:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,rdFi_loop
MOV A,USB0DAT ; *ptr++ = USB0DAT;
MOV @R0,A
INC R0
DJNZ R5,rdFi_loop ; loop n times
CLR A ; Clear auto-read
MOV USB0ADR,A
rdFi_ret:
RET
; END OF _FIFO_Read_idata
; void FIFO_Write_idata( BYTE fifo_adr, BYTE n, BYTE idata * ptr )
RSEG ?PR?_FIFO_Write_idata?FIFO_RW
_FIFO_Write_idata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ wtFi_ret ; return;
MOV R0,AR3 ; R0 = ptr;
wtFi_loop1:
MOV A,USB0ADR ; Wait for BUSY->'0'
JB ACC.7,wtFi_loop1
MOV A,R7 ; Set address (mask out bits7-6)
ANL A,#03FH
MOV USB0ADR,A
wtFi_loop2:
MOV A,@R0 ; USB0DAT = *ptr++
MOV USB0DAT,A
INC R0
wtFi_loop3:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,wtFi_loop3
DJNZ R5,wtFi_loop2 ; loop n times
wtFi_ret:
RET
; END OF _FIFO_Write_idata
; void FIFO_Read_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr )
RSEG ?PR?_FIFO_Read_pdata?FIFO_RW
_FIFO_Read_pdata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ rdFp_ret ; return;
MOV A,R7 ; USB0ADR = fifo_adr | 0xC0;
ORL A,#0C0H ; Set auto-read and initiate first read
MOV USB0ADR,A ; set FIFO address
MOV R0,AR3 ; R0 = ptr;
rdFp_loop:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,rdFp_loop
MOV A,USB0DAT ; *ptr++ = USB0DAT;
MOVX @R0,A
INC R0
DJNZ R5,rdFp_loop ; loop n times
CLR A ; Clear auto-read
MOV USB0ADR,A
rdFp_ret:
RET
; END OF _FIFO_Read_pdata
; void FIFO_Write_pdata( BYTE fifo_adr, BYTE n, BYTE pdata * ptr )
RSEG ?PR?_FIFO_Write_pdata?FIFO_RW
_FIFO_Write_pdata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ wtFp_ret ; return;
MOV R0,AR3 ; R0 = ptr;
wtFp_loop1:
MOV A,USB0ADR ; Wait for BUSY->'0'
JB ACC.7,wtFp_loop1
MOV A,R7 ; Set address (mask out bits7-6)
ANL A,#03FH
MOV USB0ADR,A
wtFp_loop2:
MOVX A,@R0 ; USB0DAT = *ptr++
MOV USB0DAT,A
INC R0
wtFp_loop3:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,wtFp_loop3
DJNZ R5,wtFp_loop2 ; loop n times
wtFp_ret:
RET
; END OF _FIFO_Write_pdata
; void FIFO_Read_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr )
RSEG ?PR?_FIFO_Read_xdata?FIFO_RW
_FIFO_Read_xdata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ rdFx_ret ; return;
MOV A,R7 ; USB0ADR = fifo_adr | 0xC0;
ORL A,#0C0H ; Set auto-read and initiate first read
MOV USB0ADR,A ; set FIFO address
MOV DPL,R3 ; DPTR = ptr;
MOV DPH,R2
rdFx_loop:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,rdFx_loop
MOV A,USB0DAT ; *ptr++ = USB0DAT;
MOVX @DPTR,A
INC DPTR
DJNZ R5,rdFx_loop ; loop n times
CLR A ; Clear auto-read
MOV USB0ADR,A
rdFx_ret:
RET
; END OF _FIFO_Read_xdata
; void FIFO_Write_xdata( BYTE fifo_adr, BYTE n, BYTE xdata * ptr )
RSEG ?PR?_FIFO_Write_xdata?FIFO_RW
_FIFO_Write_xdata:
USING 0
;---- Variable n assigned to Register 'R5' ----
;---- Variable fifo_adr assigned to Register 'R7' ----
MOV A,R5 ; if (n == 0)
JZ wtFx_ret ; return;
MOV DPL,R3 ; DPTR = ptr;
MOV DPH,R2
wtFx_loop1:
MOV A,USB0ADR ; Wait for BUSY->'0'
JB ACC.7,wtFx_loop1
MOV A,R7 ; Set address (mask out bits7-6)
ANL A,#03FH
MOV USB0ADR,A
wtFx_loop2:
MOVX A,@DPTR ; USB0DAT = *ptr++
MOV USB0DAT,A
INC DPTR
wtFx_loop3:
MOV A,USB0ADR ; Wait for BUSY->'0' (data ready)
JB ACC.7,wtFx_loop3
DJNZ R5,wtFx_loop2 ; loop n times
wtFx_ret:
RET
; END OF _FIFO_Write_xdata
END