Welcome to the Parallax Discussion Forums, sign-up to participate.

# basic pasm

Posts: 393
I am attempting to learn pasm. Does anyone have a good explanation outside of dasilva and other who do not teach basics, about multiplication and division in pasm with an easy explanation?

Thanks
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”

• Posts: 393
The entry and exit in the propeller manual is not intuitive
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”
• Posts: 22,900
There are no multiply and divide instructions in Prop 1. If you need to multiply by a small constant, you can use shifts and adds like:
```Mult10  mov   Answer,X   ‘ Multiply X by 10
shl   Answer,#1   ‘ Multiply by 2 for 10
```
If you need to multiply by a variable, use a multiply subroutine. All division is done by subroutine.

Yes, call and return are not intuitive, but they are simple and done with a jump/return (JMPRET) and jump (JMP) instruction. The assembler also has the CALL and RETURN “macros” to simplify the work.

The JMPRET instruction sets the program counter to the source address of the instruction effectively doing a jump operation. As a “side effect”, it stores the old contents of the program counter (the “return address”) in the source address portion of the long/instruction at the destination address of the JMPRET. If that long/instruction is a JMP instruction, it works to provide a “return” to just after the CALL or JMPRET. If that long/instruction is a JMPRET instruction, you have a mechanism for doing coroutines (an advanced topic).
• Posts: 2,691
Hi Pilot0315,

PASM is slightly different from normal assemblers, like everything on the P1 is slightly different form other MCs.

DeSilva is very deep in the details, to begin with it might be better to just look thru the proptool examples.|

But you asked for basics and I will try to explain some small hurdles you have to take, mentally.

First of all, in opposite to other MCs your PASM program does NOT run in HUB ram, it gets just loaded from there into the COG and the copy in COG ram gets executed.

Second concept to wrap your head around is that each COG ram location is also a register. So in opposite to other MCs you do not have some x registers and a ram for executing code, you are basically executing your code inside of your 512 registers.

So every instruction in your source code ends up in a ram location you are able to access as a register also. That leads to interesting possibilities for self modifying code, often used to save space.

The next hurdle is that the P1 does neither has a stack nor a stack-pointer-register.

CALL and RET simulate a one level stack by effectively saving the return address at the ram/register of the RET instruction when the CALL gets executed. Works perfectly well but recursion is not supported and needs to be handled different.

Like Mike Green said the JMPRET instruction does all the magic, but it is more easy to use CALL and RET until you have thee need to use JMPRET direct.

I am not sure if this is what you called entry and exit, but there is some other concept to wrap your head around.

In other MCs you call a assembler routine from say your basic program and then return to your program after the assembler routine finished.

With the P1 one usually works completely different. You start a assembler-blob in a COG running in a endless loop, checking some HUB-address used as a Mailbox between parallel running processes.

Your main program writes a command into the mailbox and does what it usually does or waits for a answer from the second process if needed.

The PASM-Program in the second COG/process now reads the command in the mailbox, does what needs to be done and
confirms via the mailbox the result.

So the entry is basically starting the parallel running COG and the exit would be to stop that parallel running COG.

Any 'call' to use the parallel running COG is usually done by using HUB addresses as Mailbox, known to caller and callee.

Writing this down it seems to be very complicated, but in fact it is a very simple way to handle real parallel processes, compared to time-slices used with interrupts.

One has just to - hmm - do things a little bit different on the Propeller, but then it shines...

Mike
I am just another Code Monkey.
A determined coder can write COBOL programs in any language. -- Author unknown.
Press any key to continue, any other key to quit

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this post are to be interpreted as described in RFC 2119.
• Posts: 393
I tried the above code and get zeros
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”
• Posts: 1,537
I wrote my first PASM object with the help of Graham Stabler's tutorials. I had a tough time finding the link. There are more tutorials but this tutorial is a good start.
https://forums.parallax.com/discussion/94027/assembly-step-by-step/p1
Larry

If the grass is greener on the other side...it's time to water your lawn.
• Posts: 1,474
edited 2018-08-12 - 14:55:15
There is an excellent work by Sridhar Anandakrishnan called "Propeller Programming in Assembly, Spin and C. Was a lean pub originally, but that version is no longer available. The new version is from A press and amazon. Runs from Spin, pasm, then C. The C chapter also gets into inlining PASM in C and the other stuff. Very strong recommendation.
Ordnung ist das halbe Leben
I gave up on that half long ago.........
• Posts: 393
Frank, I have the Sridhar book found it online. Helpful but still complex for the beginning stuff.
I am in in touch with Sridhar, he seems to be a nice guy and is trying to help.

Trying to understand the basic math of multiply and division etc. If you or anyone has a good simple explanation of the add, sub shift methods that would be great.
Bit shifting math was so long ago!!!

Thanks
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”
• Posts: 4,066
There is an excellent work by Sridhar Anandakrishnan called "Propeller Programming in Assembly, Spin and C.

Thanks for this information - I had not heard of this book.
Whit+

"We keep moving forward, opening new doors, and doing new things, because we're curious and curiosity keeps leading us down new paths." - Walt Disney
• Posts: 393
Sridhar's book does not really start at the very beginning.

He assumes like many others that they are talking to engineers who have had experience in ASSEMBLY like IBM. I took that class 30 years ago plus. So I have to start over.
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”
• Posts: 1,474
I would agree to a point. I don't have a CS degree and have played with various assemblers over the years, from 8080/Z80, AN/UYK7 and 20 as well as 370 assembler and all the fun stuff that goes along with that. The subject of data compression is not really a trivial subject either. I think his main reach will be those with enough spin under them to realize there are things that need to be faster or more compact. Also, he touches (ok, lightly evangelizes) for a method called test driven development.

I have found the book to be very useful, but if someone does not have a bit of pasm, they can still gain a lot from this book as a tutorial AND a guide to what you may need to research in the forums or parallax documents. There was a rather fiery thread a few years ago that if you filter the slag, has quite a bit of gold in it from the best of the best at that time. But then again, assembler is not for the novice. In any hardware. As someone else said on the forums, they have never seen a CS101 using assembler. If someone wants a skill bad enough, they will do what they need to acquire said skill..........IM(not so)HO
Ordnung ist das halbe Leben
I gave up on that half long ago.........
• Posts: 393
I go back to the IBM 1130 and 360/370 days. Plus the HP 200C. That's a long time ago in a galaxy far, far away.

BTW Alles ist in orgnung!
“Light thinks it travels faster than anything but it is wrong. No matter how fast light travels, it finds the darkness has always got there first, and is waiting for it.”
“You only live twice:
Once when you are born
And once when you look death in the face”
• Posts: 1,474
Don't know about this one The IBM strong in him it is. To look back on JCL without an allergic reaction .......
Ordnung ist das halbe Leben
I gave up on that half long ago.........
• Posts: 22,363
edited 2018-08-19 - 23:43:20
pilot0315 wrote:
I go back to the IBM 1130 ...
Then you're in luck! Calling subroutines in PASM is very much like it was done in the 1130. A return address is stuffed into the code when the call is executed. A jump to that address performs the return. The only significant difference is that, in the 1130, the return address was stuffed into the first word of the subroutine, and execution proceeded beginning with the next word. In the Propeller a call to subr stuffs the return address into the ret instruction (just another jmp #) at location subr_ret.

-Phil
Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away. -Antoine de Saint-Exupery
• Posts: 1,060
The SDS 900 series (and big brother 9300) stored the return address (and the overflow bit) in the first word of the subroutine.

This led to obvious problems when calling sub-routines from the background and an interrupt (or from multiple interrupts). You had to
```Int   LDA  Sub      save return
STA  MySave
BRM  Sub
LDA  MySave   restore
STA  Sub
```

Of course, this isn't a problem with Prop PASM since it does't have interrupts.
Re-inventing the wheel is not a waste of time if, when you are done, you understand why it is round.
• Posts: 2,691
.
I am just another Code Monkey.
A determined coder can write COBOL programs in any language. -- Author unknown.
Press any key to continue, any other key to quit

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this post are to be interpreted as described in RFC 2119.
• Posts: 8,251
The SDS 900 series (and big brother 9300) stored the return address (and the overflow bit) in the first word of the subroutine.

This led to obvious problems when calling sub-routines from the background and an interrupt (or from multiple interrupts). You had to
```Int   LDA  Sub      save return
STA  MySave
BRM  Sub
LDA  MySave   restore
STA  Sub
```

Of course, this isn't a problem with Prop PASM since it does't have interrupts.

IIRC the IBM1401 SPS did the same thing, although I am basing that on using a 1401 emulator that was running on a Collins 8400 system.
In science there is no authority. There is only experiment.
Life is unpredictable. Eat dessert first.