These asm instructions are converted from Microchip C30
and were also tested in MikroE C PRO for dsPIC.
One of the routines is
Code: Select all
'//state 0: wait for data in transmit buffer, check if transmission may begin
'//Cycles is 23
sub procedure dvpSTX_S0
'/*
' register vpBank *slot asm("w5");
' register unsigned int portSelect asm("w4");
' register unsigned int portInput asm("w3");
' register unsigned int pinMask asm("w2");
' if (slot->vpUart.nmUartFlag) { //data to transmit?
' portSelect = slot->vpUart.nmUartHSPort;
' pinMask = slot->vpUart.nmUartHSPin;
' if (pinMask) { //hardware handshake (CTS input) used
' portInput = PORTB;
' if (portSelect & 0x02) portInput = PORTC;
' if (slot->vpUart.nmUartHSInvert) portInput = ~portInput;
' if (portSelect & 0x01) pinMask <<= 8;
' if (portInput & pinMask) //CTS asserted, transmission may begin
' slot->statePtr = &dvpSTX_S4; //next state
' }
' else { //no hardware handshake, transmission may begin
' slot->statePtr = &dvpSTX_S4; //next state
' }
' }
' else { //wait for data in transmit buffer
' if (slot->vpUart.nmUartHead != slot->vpUart.nmUartTail) { //buffer not empty
' slot->vpUart.nmUartFlag = 1; //mark transmitter busy
' slot->statePtr = &dvpSTX_S1; //next state
' slot->vpUart.nmUartDataH &= 0x7F; //setup startbit (true mode)
' }
' }
'*/
'//manually optimized assembly of above C code
asm
;UARTCOUNT = 0x00
;UARTDIVIDE = 0x01
;UARTDATAH = 0x02
;UARTDATAL = 0x03
;UARTDATAS = 0x04
;UARTFORMAT = 0x05
;UARTINVERT = 0x00
;UARTHSINVERT = 0x01
;UARTFLAG = 0x02
;UARTBITS11 = 0x03
;UARTDATA7 = 0x04
;UARTUNUSED = 0x05
;UARTEVEN = 0x06
;UARTODD = 0x07
;UARTBAUD = 0x06
;UARTSTOPBITS = 0x07
;UARTHEAD = 0x08
;UARTTAIL = 0x09
;UARTBUFFERH = 0x0A
;UARTBUFFERL = 0x0B
;UARTPORT = 0x0C
;UARTPIN = 0x0D
;UARTHSPORT = 0x0E
;UARTHSPIN = 0x0F
;STATEPTR = 0x10
;NEXTVP = 0x12
;INPORT = 0x14
;INPIN = 0x16
;OUTPORT = 0x18
;OUTPIN = 0x1A
mov.b [w5+UARTFORMAT],w2; //if (slot->vpUart.nmUartFlag) { //data to transmit?
btss w2,#UARTFLAG;
bra _dvpSTX_S0b;
mov.w [w5+UARTHSPORT],w4; // portSelect = slot->vpUart.nmUartHSPort;
lsr w4,#8,w3; // pinMask = slot->vpUart.nmUartHSPin;
cp0.b w3; // if (pinMask) { //hardware handshake (CTS input) used
bra z,_dvpSTX_S0a;
mov.w PORTB,w1; // portInput = PORTB;
btsc w4,#1; // if (portSelect & 0x02)
mov.w PORTC,w1; // portInput = PORTC;
btsc w2,#UARTHSINVERT; // if (slot->vpUart.nmUartHSInvert)
com.w w1,w1; // portInput = ~portInput;
btsc w4,#0; // if (portSelect & 0x01)
sl w3,#8,w3; // pinMask <<= 8;
and.w w1,w3,w0; // if (portInput & pinMask) //CTS asserted, transmission may begin
bra z,_dvpSTX_S0c; // slot->statePtr = &dvpSTX_S4; //next state
;// }
_dvpSTX_S0a:; // else { //no hardware handshake, transmission may begin
mov.w #handle(_dvpSTX_S4),w0; // slot->statePtr = &dvpSTX_S4; //next state
mov.w w0,[w5+STATEPTR]; // }
bra _dvpSTX_S0c; //}
_dvpSTX_S0b:; //else { //wait for data in transmit buffer
mov.b [w5+UARTHEAD],w0; // if (slot->vpUart.nmUartHead != slot->vpUart.nmUartTail) { //buffer not empty
mov.b [w5+UARTTAIL],w1;
sub.b w0,w1,w0;
bra z,_dvpSTX_S0c;
bset w2,#UARTFLAG; // slot->vpUart.nmUartFlag = 1; //mark transmitter busy
mov.b w2,[w5+UARTFORMAT];
mov.w #handle(_dvpSTX_S1),w0; // slot->statePtr = &dvpSTX_S1; //next state
mov.w w0,[w5+STATEPTR];
mov.b [w5+UARTDATAH],w0; // slot->vpUart.nmUartDataH &= 0x7F; //setup startbit (true mode)
bclr w0,#7; // }
mov.b w0,[w5+UARTDATAH]; //}
_dvpSTX_S0c:;
end asm
end sub
Code: Select all
_dvpSTX_S0:
;RGBWSv0_01p.mbas,183 :: sub procedure dvpSTX_S0
;RGBWSv0_01p.mbas,244 :: mov.b [w5+UARTFORMAT],w2; //if (slot->vpUart.nmUartFlag) { //data to transmit?
0x02C6 0x97F975 MOV.B [W5+-1], W2
;RGBWSv0_01p.mbas,264 :: bra _dvpSTX_S0c; //}
0x02C8 0x370001 BRA _dvpSTX_S0c
;RGBWSv0_01p.mbas,276 :: mov.b w0,[w5+UARTDATAH]; //}
0x02CA 0x9FFAF0 MOV.B W0, [W5+-1]
;RGBWSv0_01p.mbas,277 :: _dvpSTX_S0c:;
_dvpSTX_S0c:
;RGBWSv0_01p.mbas,278 :: end asm
L_end_dvpSTX_S0:
0x02CC 0x060000 RETURN
; end of _dvpSTX_S0
I also like to know why I can't declare asm constants like
UARTCOUNT = 0x00
I had to comment these out as they give Invalid asm instruction error.
regards peter