?? dss_aisr.s62
字號:
;; Copyright 2000 by Texas Instruments Incorporated.; All rights reserved. Property of Texas Instruments Incorporated.; Restricted rights to use, duplicate or disclose this code are; granted through contract.; U.S. Patent Nos. 5,283,900 5,392,448;; "@(#) DSP/BIOS 4.00 03-27-00 (barracuda-e08)";
; ======== dss_aisr.s62 ========
;
.include c62.h62
.include hwi.h62
.include pip.h62
.include dss.h62
DRR .set 0x018c0000 ; Data Receive Register McBSP 0
DXR .set 0x018c0004 ; Data Transmit Register McBSP 0
.bss rtxDone,4,4 ; Allocate temp variable in .bss to
; allow loads via b14. No cinit record
; needed because ISR writes to this
; location before it reads it.
.text
.global _DSS_isr, rtxDone, rxErr, txErr
;
; ====== _DSS_aisr ======
;
_DSS_isr:
stw a0,*b15--[2] ; push temp registers
stw a1,*b15--[2]
stw a2,*b15--[2]
stw b1,*b15--[2]
stw b2,*b15--[2]
; rxDone = 0, txDone = 0
zero a2
; if (DSS_rxCnt) {
ldw *+b14(_DSS_rxCnt),b1
nop 4
[!b1] b rxErr ; process rx error
; *DSS_rxPtr++ = *DRR;
[b1] mvkl DRR,a1 ; load address of serial port DRR
[b1] mvkh DRR,a1
[b1] ldw *a1,a1 ; read word from DRR
||[b1] ldw *+b14(_DSS_rxPtr),b1 ; load DSS_rxPtr
[b1] ldw *+b14(_DSS_rxCnt),b2 ; load DSS_rxCnt
nop 3
stw a1,*b1++ ; store DRR at *DSS_rxPtr, auto
; increment DSS_rxPtr
stw b1,*+b14(_DSS_rxPtr) ; store updated DSS_rxPtr
; DSS_rxCnt--;
sub b2,1,b2 ; decrement DSS_rxCnt
stw b2,*+b14(_DSS_rxCnt) ; store updated DSS_rxCnt
; if (DSS_rxCnt == 0) {
; rxDone = 1;
; }
; }
[!b2] mvk 1,a2
checkTx:
; if (DSS_txCnt) {
ldw *+b14(_DSS_txCnt),b1
nop 4
[!b1] b txErr ; process tx error
; *DXR = *DSS_txPtr++;
[b1] ldw *+b14(_DSS_txPtr),b1 ; load DSS_txPtr
[b1] ldw *+b14(_DSS_txCnt),b2 ; load DSS_txCnt
nop 3
ldw *b1++,a0 ; load word pointed to by DSS_txPtr
; autoincrement DSS_txPtr
stw b1,*+b14(_DSS_txPtr) ; store updated DSS_txPtr
mvkl DXR,a1 ; load address of serial port DXR
mvkh DXR,a1
; DSS_txCnt--;
sub b2,1,b2 ; decrement DSS_txCnt
nop ; wait for 'ldw' (above) to complete
and 0xfffffffe,a0,a0 ; clear lsb to avoid AIC reprogram
stw a0,*a1 ; write word to DXR
stw b2,*+b14(_DSS_txCnt) ; store updated DSS_txCnt
; if (DSS_txCnt == 0) {
; txDone = 1;
; }
; }
[!b2] or 2,a2,a2
checkDn:
; if ((rxDone | txDone) == 0) {
[a2] b Done ; if rxDone or txDone do Done processing
stw a2,*+b14(rtxDone) ; store done flags into memory
; return; /* return from interrupt */
; }
[!a2] ldw *++b15[2],b2 ; restore temp registers
[!a2] ldw *++b15[2],b1
[!a2] ldw *++b15[2],a2
[!a2] ldw *++b15[2],a1
b irp ; return from interrupt
ldw *++b15[2],a0
nop 4
Done:
ldw *++b15[2],b2 ; restore temp registers
ldw *++b15[2],b1
ldw *++b15[2],a2
ldw *++b15[2],a1
ldw *++b15[2],a0
nop 4
HWI_enter C62_ABTEMPS, 0, 0xffff, 0
; if (rxDone) {
ldw *+b14(rtxDone),b0 ; load done flags from memory
nop 4
and b0,1,b0 ; check if rxDone set
[!b0] b txDone
nop 3
; PIP_put(&DSS_rxPipe);
[b0] mvkl _DSS_rxPipe,a4 ; load pipe address
[b0] mvkh _DSS_rxPipe,a4
PIP_put
; DSS_rxPrime();
; }
b _DSS_rxPrime
mvkl txDone,b3 ; set return pointer to come back here
mvkh txDone,b3
nop 3
txDone:
; if (txDone) {
ldw *+b14(rtxDone),b0 ; load done flags from memory
nop 4
and b0,2,b0 ; check if txDone set
[!b0] b allDone
nop 3
; PIP_free(&DSS_txPipe);
[b0] mvkl _DSS_txPipe,a4 ; load pipe address
[b0] mvkh _DSS_txPipe,a4
PIP_free
; DSS_txPrime();
; }
b _DSS_txPrime
mvkl allDone,b3 ; set return pointer to come back here
mvkh allDone,b3
nop 3
allDone:
HWI_exit C62_ABTEMPS, 0, 0xffff, 0
rxErr:
; dummy = *DRR;
mvkl DRR,a1 ; load address of serial port DRR
mvkh DRR,a1
ldw *a1,a1 ; read word from DRR
|| ldw *+b14(_DSS_error),b1 ; load DSS_error value
b checkTx ; start return to primary ISR code
nop 3
; DSS_error |= 1;
or b1,1,b1 ; DSS_error has now arrived
stw b1,*+b14(_DSS_error) ; save new value of DSS_error
txErr:
; *DXR = 0;
mvkl DXR,a1 ; load address of serial port DXR
mvkh DXR,a1
|| zero b1
stw b1,*a1 ; write to DXR
ldw *+b14(_DSS_error),b1 ; load DSS_error value
b checkDn ; start return to primary ISR code
nop 3
; DSS_error |= 2;
or b1,2,b1 ; DSS_error has now arrived
stw b1,*+b14(_DSS_error) ; save new value of DSS_error
.end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -