Jump to content
Sign in to follow this  
ra68gi

Getting Started With Boost Basic

Recommended Posts

Hi Guys,

 

I am new to this forum. I have used PIC BASIC PRO from melabs and BASCOM for 8051, but there is no help oruser manual for beginners in BB. I wish to start with a simple program to display binary counting on portb of any pic. This works with Bascom not with boost basic. Can any one help me with the syntax?

 

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

SUB MAIN ()

DIM X AS BYTE

TRISB = 0

DO

FOR X=0 TO 255

PORTB = X

WAIT 1

NEXT

LOOP

END SUB

 

I get error when i compile this. I dont know the delay command in BB.

 

i tried a slighty modified code, even this does not work. the modified one is as follows,

 

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

SUB MAIN ()

DIM X AS BYTE

dim i as byte

TRISB = 0

i=1

DO while i>0

FOR X=0 TO 255

PORTB = X

WAIT 1

NEXT

LOOP

END SUB

 

It shows the following errors.

 

"D:\Program Files\SourceBoost\boostbasic.pic16.exe" -t PIC16F648A _.bas

 

BoostBasic Optimizing Basic Compiler Version 6.55 Beta (for PIC16 architecture)

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

Beta version. No limitations. Expire date: 2007.01.01

 

 

_.bas

 

failure

SBTEST.BAS(5:8): error: left operand must be l-value

SBTEST.BAS(5:8): error: failed to generate expression

SBTEST.BAS(9:10): warning: local variable 'X' may be used uninitialized

SBTEST.BAS(9:8): error: left operand must be l-value

SBTEST.BAS(9:8): error: failed to generate expression

SBTEST.BAS(10:1): error: unknown identifier 'WAIT'

SBTEST.BAS(10:1): error: failed to generate expression

Failed to locate output file '_.obj'

Done

 

Failed

 

Thanks in advance.

Raghunathan

Share this post


Link to post
Share on other sites

Raghunathan,

 

Try this:

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

SUB main()
DIM X AS BYTE
dim i as byte
trisb = 0
i = 1
DO WHILE i > 0
	FOR X=0 TO 255
		portb = X
		call delay_s( 1 )
	NEXT
LOOP 
END SUB

 

Regards

Dave

Share this post


Link to post
Share on other sites
Raghunathan,

 

Try this:

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

SUB main()
    DIM X AS BYTE
    dim i as byte
    trisb = 0
    i = 1
    DO WHILE i > 0
        FOR X=0 TO 255
            portb = X
            call delay_s( 1 )
        NEXT
    LOOP 
END SUB

 

Regards

Dave

 

Thanks Dave.

 

The comilation shows success, but also has got a warning as shown below. Why is it and how can it be corrected?

 

"D:\Program Files\SourceBoost\boostbasic.pic16.exe" -t PIC16F648A _.bas

 

BoostBasic Optimizing Basic Compiler Version 6.55 Beta (for PIC16 architecture)

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

Beta version. No limitations. Expire date: 2007.01.01

 

 

_.bas

 

success

SBTEST.BAS(9:9): warning: local variable 'X' may be used uninitialized

Done

 

"WHAT I LEARNT" from the above code example.

 

BOOST BASIC COMMANDS ARE CASE SENSITIVE !

portb and trisb will work but not PORTB AND TRISB!

 

Dave, is there any setting to switch off case sensitivity?

 

Thanks,

Raghunathan.

Share this post


Link to post
Share on other sites

Raghunathan,

 

success

SBTEST.BAS(9:9): warning: local variable 'X' may be used uninitialized

Done

In this case this warning is not correct - please ignore it.
"WHAT I LEARNT" from the above code example.

 

BOOST BASIC COMMANDS ARE CASE SENSITIVE !

No true quite, keywords are not case sensitive. Function names are.
portb and trisb will work but not PORTB AND TRISB!

 

Dave, is there any setting to switch off case sensitivity?

This is not just case sensitivity, PORTB actually has a value, its is a constant which has the address of PORTB.

portb is a variable (something we can assign a value to), it reside at the address PORTB.

 

I hope that makes some sense.

 

Regards

Dave

Share this post


Link to post
Share on other sites
Raghunathan,

 

success

SBTEST.BAS(9:9): warning: local variable 'X' may be used uninitialized

Done

In this case this warning is not correct - please ignore it.
"WHAT I LEARNT" from the above code example.

 

BOOST BASIC COMMANDS ARE CASE SENSITIVE !

No true quite, keywords are not case sensitive. Function names are.
portb and trisb will work but not PORTB AND TRISB!

 

Dave, is there any setting to switch off case sensitivity?

This is not just case sensitivity, PORTB actually has a value, its is a constant which has the address of PORTB.

portb is a variable (something we can assign a value to), it reside at the address PORTB.

 

I hope that makes some sense.

 

Regards

Dave

 

Hi Dave,

Next i tried running the above code with LED block (simulator), but got the following error!

 

Debugging...

 

Can't load file 'SBTEST.cod'

 

What could be the problem?

 

Raghunathan

Share this post


Link to post
Share on other sites

Raghunathan,

 

Next i tried running the above code with LED block (simulator), but got the following error!

 

Debugging...

 

Can't load file 'SBTEST.cod'

 

What could be the problem?

Sound like its not been compiled and linked, its the linking process that creates the .hex and cod/coff (debug files).

Try using the 'B' (Build) button on the tool bar. It complies what needs compiling and link the code.

 

Regards

Dave

Share this post


Link to post
Share on other sites
Raghunathan,

 

Next i tried running the above code with LED block (simulator), but got the following error!

 

Debugging...

 

Can't load file 'SBTEST.cod'

 

What could be the problem?

Sound like its not been compiled and linked, its the linking process that creates the .hex and cod/coff (debug files).

Try using the 'B' (Build) button on the tool bar. It complies what needs compiling and link the code.

 

Regards

Dave

 

I tried the build and got the following errors

 

Building...

BoostBasic Optimizing Basic Compiler Version 6.55 Beta (for PIC16 architecture)

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

Beta version. No limitations. Expire date: 2007.01.01

 

 

_.bas

 

success

SBTEST.BAS(9:9): warning: local variable 'X' may be used uninitialized

BoostLink Optimizing Linker Version 6.55

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

 

 

 

Failure

Couldn't find function/label by name:main

 

Exit code was -2.

Removing target: SBTEST.hex

Failed to locate output file 'SBTEST.hex'

Done

 

Failed

Share this post


Link to post
Share on other sites
Raghunathan,

 

Next i tried running the above code with LED block (simulator), but got the following error!

 

Debugging...

 

Can't load file 'SBTEST.cod'

 

What could be the problem?

Sound like its not been compiled and linked, its the linking process that creates the .hex and cod/coff (debug files).

Try using the 'B' (Build) button on the tool bar. It complies what needs compiling and link the code.

 

Regards

Dave

Dave,

Iam sorry. Now i got it right. I had written SUB MAIN() in my code and when i changed it to SUB main() it worked.

Thanks

Raghunathan.

Share this post


Link to post
Share on other sites

Hi Dave,

 

I have a few doubts regarding the simulator. Dave, can i not see the values of variables and register change when i press the run key? I can only see the LEDs change in the LED block. Yes it does change when i step thro' the code but not when i run. Again i don't understand the watch plug in. I see only a white screen. I presume it is meant for watching the variables declared by us in the program, but i can't type anything on to it either.

 

Dave, do we have a list of commands for Boost Basic or can we use the same used in Boost C? I don't know C but will take try with Boost C.

 

Raghunathan.

Share this post


Link to post
Share on other sites
I have a few doubts regarding the simulator. Dave, can i not see the values of variables and register change when i press the run key? I can only see  the LEDs change in the LED block. Yes it does change when i step thro' the code but not when i run. Again i don't understand the watch plug in. I see only a white screen. I presume it is meant for watching the variables declared by us in the program, but i can't type anything on to it either.
You can add variables to the watch window by righ clicking on it and selecting add.

 

The plugins update continously, other windows do not until the simulator is stopped. You can have the other windows periodically updated by pressing the little camera button on the tool bar.

 

Dave, do we have a list of commands for Boost Basic or can we use the same used in Boost C?

The Boost Basic manual contains a description of the language. There is not much in the way of library code if thats what you are after <_<

 

Regards

Dave

Share this post


Link to post
Share on other sites

Hi Dave,

Boost basic has really got a nice simulator. I was able to watch the led block plugin, the assemly code window and the variable window update as the code was stepped thro'/ run. One problem i found was the the variables showed error when ever it encountered the delay command while i stepped thro' the code. With the program running the variables kept on showing error. Why does this happen?

 

Is it possible to get the assembly code screen in the debug mode to full size so that i can watch more lines?

 

At the bottom of the window there is the tick window . Does it indicate system frequency ie. crystal freq/4 ?

 

I found that the tick starts with a value of 44us. Why is it ? Also i found that to execute the basic command trisb=0 it takes 12us , i=1 takes 12us, do while i>0 takes 16us. Does it take so long. Is the the basic code execution in synch with the tick indicated below?

 

You have got really nice plugins but i would also like to have a plain 7-segment display without the bcd conversion. preferably common cathode.

 

What i meant by Boost basic commands are library function like

 

1. delay_ms

2. LCD (Single line lcd command for a string of characters)

3. serial_out or put ( for software serial communication)

4.lookup_table

5. I2C read

6. I2C write

7. Hserial (hard ware serial communication)

8. ADC ( a to d conversion0

9. Button ( button command with debounce)

10. Branch

11. PWM ( generates pwm on pin)

 

I would also like to have a list of math operators, for ex.

Division / ?

remainder // ?

Shift

rotate

cose

sine

sqr

bitwise operators ?

comparison, logical operators?

long?

single?

 

Those pertaining to Boost basic and not VB in general.

 

A good list of library will make life easy. I dont see any reason why one should spend a lot of time rediscovering and creating these libs oneself when many of the commercial compilers have already got.

 

Raghunathan

Share this post


Link to post
Share on other sites

ra68gi,

Boost basic has really got a nice simulator. I was able to watch the led block plugin, the assemly code window and the variable window update as the code was stepped thro'/ run. One problem i found was the the variables showed error when ever it encountered the delay command while i stepped thro' the code. With the program running the variables kept on showing error. Why does this happen?

Only global and local variables that belong to the function the execution is currently in can be displayed. This is because you could have one function that calls another, both could have a variable 'i', so correct one to display is the one that corresponds with the current function.

 

Is it possible to get the assembly code screen in the debug mode to full size so that i can watch more lines?
Drag the edge of it to make it wider.

Drag the bottom of it to make it taller.

 

At the bottom of the window there is the tick window . Does it indicate system frequency ie. crystal freq/4 ?
The ticks are the number of clock cycles, they are freqency independant.

 

I found that the tick starts with a value of 44us. Why is it ?
This is because you are skipping over startup code, Settings->Options->Debugger, uncheck skip over startup code.

 

Also i found that to execute the basic command trisb=0 it takes 12us , i=1 takes 12us, do while i>0 takes 16us. Does it take so long. Is the the basic code execution in synch with the tick indicated below?
The times are in ticks, it depends what clock frequency you use how long they take to execute. Remember that on a PIC each opcode takes 4 (a few take 8) clocks cycles to executed.

 

You have got really nice plugins but i would also like to have a plain 7-segment display without the bcd conversion. preferably common cathode.
Please post on the Enhancements Requests Forum.

 

What i meant by Boost basic commands are library function like

 

1. delay_ms

2. LCD (Single line lcd command for a string of characters)

3. serial_out or put ( for software serial communication)

4.lookup_table

5. I2C read

6. I2C write

7. Hserial (hard ware serial communication)

8. ADC  ( a to d conversion0

9. Button ( button command with debounce)

10. Branch

11. PWM ( generates pwm on pin)

Some of this code already exists here:

http://www.sourceboost.com/Products/BoostB...xampleCode.html

 

I would also like to have a list of math operators, for ex.

Division  /  ?

remainder  //  ?

Shift

rotate

cose

sine

sqr

bitwise operators ?

comparison, logical operators?

long?

single?

 

Those pertaining to Boost basic and not VB in general.

 

A good list of library will make life easy. I dont see any reason why one should spend a lot of time rediscovering and creating these libs oneself when many of the commercial compilers have already got.

As always there is room for some improvement.

You are right that the library code is sparse, any volunteers??

 

Regards

Dave

Share this post


Link to post
Share on other sites
As always there is room for some improvement.

You are right that the library code is sparse, any volunteers??

 

Regards

Dave

 

Hi Dave,

I would love to contribute in making the library, but i don't know asm right now, so i don't think i can be of much help. I can probably write simple basic programs for led, keys, key pad, 7-segment display, serial communication, spi, i2c,with the already existing lib, some stepper motor, servo motor example, simple robot project like a line tracking robot etc. If that's going to be useful i may be of some use. Please let me know.

 

Regarding Programming...

 

Do we have gosub and return commands in BB? In PIC BASIC and BASCOM we have gosub's directed to specific lables, which ends with a return statement.

I have written a sample code using BB style of using subroutines.

 

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

 

sub main ()

trisb = 0

DO while true

call BINARY_COUNT ()

LOOP

end sub

sub BINARY_COUNT ()

dim x as byte

FOR x=0 TO 255

portb = x

call delay_ms(30)

NEXT x

end sub

 

Is this the only way to GO...?

 

Raghunathan

Share this post


Link to post
Share on other sites
I would love to contribute in making the library, but  i don't know asm right now, so i don't think i can be of much help. I can probably write simple basic programs for led, keys, key pad, 7-segment display, serial communication, spi, i2c,with the already existing lib, some stepper motor, servo motor example, simple robot project like a line tracking robot etc. If that's going to be useful i may be of some use. Please let me know.
You don't need to know asm to right libraries, it can be done in C (or in fact BoostBasic, but that doesn't work at the moment). Some of the existing library code should be useable already. We do need to press forwards and get it working with BoostBasic. Send a mail to support@sourceboost.com and we can start discussions.

 

Regarding Programming...

 

Do we have gosub and return commands in BB? In PIC BASIC and BASCOM we have gosub's directed to specific lables, which ends with a return statement.

I have written a sample code using BB style of using subroutines.

 

#pragma DATA    _CONFIG,  _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

 

sub main ()

trisb = 0

DO while true

call BINARY_COUNT () 

LOOP

end sub

sub BINARY_COUNT ()

dim x as byte

FOR x=0 TO 255

portb = x

call delay_ms(30)

NEXT x

end sub

 

Is this the only way to GO...?

Yes, thats the way to go.

We have tried to make BoostBasic a much more structured BASIC, so we didn't add support for gosub and return. Instead you need call a function.

 

Regards

Dave

Share this post


Link to post
Share on other sites

[.

You don't need to know asm to right libraries, it can be done in C (or in fact BoostBasic, but that doesn't work at the moment). Some of the existing library code should be useable already. We do need to press forwards and get it working with BoostBasic. Send a mail to support@sourceboost.com and we can start discussions.

 

Hi Dave,

I have written a program for a line tracking robot, which is driven by 2 continuous servo motor. It has a line tracking sensor which detects a black line on a white surface and sends a signal to portb.0. The microcontroller sees this black line and turns the servo in such a way as to get off the black line. once outside the black line it tries to get back and so on . In this way it moves forward following the black track.

If you are interested i can send the schematic and mpeg of the working model and you may post it on your web site. Please let me know.

 

In one of the previous threads tim had asked for pulsout command.

I tried to create a lib for for it in BB as call pulseout(pin,duration). I found my code space or memory space increases by using lib. Is it some thing we need to pay for. for using easy to use lib?

 

code for line tracking robot

 

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

sub main()

trisb=1

portb=0

do while true

if portb.0=0 then 'read the line tracking sensor. if the sensor outs a zero, then the

call right_servo() 'sensor is over the black line & so rotate the right servo.

else 'if portb.0 is a one, then the sensor is over the white surface & so

call left_servo() 'make the left servo motor to rotate.

end if

loop 'do it all again

end sub

sub right_servo() 'driving a continuous rotation servo motor with 1.5ms pulse with a

dim x as byte 'period of 50hz to 60hz will stop the motor while 2ms pulse will make

for x= 0 to 2 'it rotate in clockwise & 1ms pulse anticlockwise.

portb.4=1

call delay_10us(150)

portb.4=0

portb.5=1

call delay_ms(2)

portb.5=0

call delay_ms(18) 'This delay keeps the pulse frequency at around 50hz.

next x

end sub

sub left_servo()

dim x as byte

for x=0 to 2

portb.4=1

call delay_ms(1)

portb.4=0

portb.5=1

call delay_10us(150)

portb.5=0

call delay_ms(18)

next x

end sub

 

Building...

BoostBasic Optimizing Basic Compiler Version 6.55 Beta (for PIC16 architecture)

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

Beta version. No limitations. Expire date: 2007.01.01

 

 

_.bas

 

success

BoostLink Optimizing Linker Version 6.55

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

 

Caution: argument of 'delay_10us' calls must have a value of 1 or more

Building CASM file

 

Memory Usage Report

===================

RAM available:256 bytes, used:3 bytes (1.2%), free:253 bytes (98.8%),

Heap size:253 bytes, Heap max single alloc:95 bytes

ROM available:4096 words, used:92 words (2.3%), free:4004 words (97.7%)

 

 

Successful

Done

 

The same program with Pulseout(pin, duration) command

 

#pragma DATA _CONFIG, _WDT_OFF & _HS_OSC & _LVP_OFF & _CP_OFF & _PWRTE_OFF

sub main()

trisb=1

portb=0

do while true

if portb.0=0 then 'read the line tracking sensor. if the sensor outs a zero, then the

call right_servo() 'sensor is over the black line & so rotate the right servo.

else 'if portb.0 is a one, then the sensor is over the white surface & so

call left_servo() 'make the left servo motor to rotate.

end if

loop 'do it all again

end sub

sub right_servo() 'driving a continuous rotation servo motor with 1.5ms pulse with a

dim x as byte 'period of 50hz to 60hz will stop the motor while 2ms pulse will make

for x= 0 to 2 'it rotate in clockwise & 1ms pulse anticlockwise.

call pulseout(4,150)

call pulseout(5,200)

call delay_ms(18) 'This delay keeps the pulse frequency at around 50hz.

next x

end sub

sub left_servo()

dim x as byte

for x=0 to 2

call pulseout(4,100)

call pulseout(5,150)

call delay_ms(18)

next x

end sub

 

sub pulseout(pin as byte, duration as byte)

dim pin as byte

dim duration as byte

if pin=0 then

portb.0=1

elseif pin=1 then

portb.1=1

elseif pin=2 then

portb.2=1

elseif pin=3 then

portb.3=1

elseif pin=4 then

portb.4=1

elseif pin=5 then

portb.5=1

elseif pin=6 then

portb.6=1

elseif pin=7 then

portb.7=1

end if

call delay_10us(duration)

if pin=0 then

portb.0=0

elseif pin=1 then

portb.1=0

elseif pin=2 then

portb.2=0

elseif pin=3 then

portb.3=0

elseif pin=4 then

portb.4=0

elseif pin=5 then

portb.5=0

elseif pin=6 then

portb.6=0

elseif pin=7 then

portb.7=0

end if

end sub

 

Building...

BoostBasic Optimizing Basic Compiler Version 6.55 Beta (for PIC16 architecture)

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

Beta version. No limitations. Expire date: 2007.01.01

 

 

_.bas

 

success

BoostLink Optimizing Linker Version 6.55

http://www.sourceboost.com

Copyright© 2004-2006 Pavel Baranov

Copyright© 2004-2006 David Hobday

 

 

Caution: argument of 'delay_10us' calls must have a value of 1 or more

Building CASM file

 

Memory Usage Report

===================

RAM available:256 bytes, used:5 bytes (2.0%), free:251 bytes (98.0%),

Heap size:251 bytes, Heap max single alloc:95 bytes

ROM available:4096 words, used:184 words (4.5%), free:3912 words (95.5%)

 

 

Successful

Done

 

Regards

Raghunathan

Share this post


Link to post
Share on other sites
have written a program for a line tracking robot, which is driven by 2 continuous servo motor. It has a line tracking sensor which detects a black line on a white surface and sends a signal to portb.0. The microcontroller sees this black line and turns the servo in such a way as to get off the black line. once outside the black line it tries to get back and so on . In this way it moves forward following the black track.

If you are interested i can send the schematic and mpeg of the working model and you may post it on your web site. Please let me know.

A complete project with schematic would be good to add to the code samples page, so please supply it.

 

In one of the previous threads tim had asked for pulsout command.

I tried to create a lib for for it in BB as call pulseout(pin,duration). I found my code space or memory space increases by using lib. Is it some thing we need to pay for. for using easy to use lib?

Using calling a library function should add no more overhead than calling a function in your code. It made be that the code in the library is not as efficient. You would need to look in the library source code to determine that.

 

Please use the [ CODE ] [ /CODE ] tags to post code, these maintain the formating whihc makes it much easier to read code.

sub main()
   trisb=1
   portb=0
   do while true 
       if portb.0=0 then 'read the line tracking sensor. if the sensor outs a zero, then the
           call right_servo() 'sensor is over the black line & so rotate the right servo.
       else 'if portb.0 is a one, then the sensor is over the white surface & so 
           call left_servo() 'make the left servo motor to rotate.
       end if
   loop 'do it all again
end sub

 

Regards

Dave

Share this post


Link to post
Share on other sites

Dave,

How do i set the watch dog timer in BB? will the compiler automatically reset the WDT. When i set the #pragma with the WDT_ON i don't see any increment in code compiled. So do we have to manually reset it? And if its ON what is the prescaler assigned to?

 

#pragma DATA _CONFIG, _WDT_ON & _XT_OSC & _LVP_OFF & _CP_OFF & _PWRTE_ON

 

I think PWRTE is power on reset. Am i right? And what if its ON? I generally keep it ON in the PIC basic compiler.

 

Raghunathan

Share this post


Link to post
Share on other sites
How do i set the watch dog timer in BB? will the compiler automatically reset the WDT.
No.
When i set the #pragma with the WDT_ON i don't see any increment in code compiled. So do we have to manually reset it?
Yes.
And if its ON what is the prescaler assigned to?
Depends how you have configured it, may vary depending on exactly which device you are refering to.

 

#pragma DATA _CONFIG, _WDT_ON & _XT_OSC & _LVP_OFF & _CP_OFF & _PWRTE_ON

 

I think PWRTE is power on reset. Am i right?

Yep.
And what if its ON? I generally keep it ON in the PIC basic compiler.
It ensures a cleaning (but longer) reset. Also having PWRTE on causes problems it you use ICD2.

 

Regards

Dave

Share this post


Link to post
Share on other sites
A complete project with schematic would be good to add to the code samples page, so please supply it.

 

Hi Dave,

I have mailed the schematic, code and a writeup to support@sourceboost.com. I have also sent a mpeg file of the working robot in action.

 

Regards

Raghunathan.

Share this post


Link to post
Share on other sites
A complete project with schematic would be good to add to the code samples page, so please supply it.

 

Hi Dave,

I have mailed the schematic, code and a writeup to support@sourceboost.com. I have also sent a mpeg file of the working robot in action.

 

Regards

Raghunathan.

 

Hello Dave,

Did you receive my mail?

Raghunathan.

Share this post


Link to post
Share on other sites

Your content will need to be approved by a moderator

Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×