From Spin1 to Spin2
JonnyMac
Posts: 9,505
I've had the opportunity to convert a lot of Spin1 to Spin2 and find myself running a bit of a routine. With more people trying the P2, I thought I'd move comments I left in another thread to make them available to a wider audience. Opinions expressed here are my own, and as ever, I appreciate your thoughtful feedback.
In most cases, moving from the P1 to the P2 doesn't involve a lot of drama. This is what I do:
- Use SaveAs to make a copy of the file with the .spin2 extension
- Add blank parenthesis to method names/calls that don't have parameters.
- Declare return value by name (after colon) for methods that return a value
P1: pub get_temp P2: pub get_temp() : tempC
- Replace/remove P1 objects/calls (e.g., I no longer need my jm_time_80.spin object)
- Use F9 to compile P2 file and work through required changes
I'm taking an online Python programming course, so I though I'd write a little utility that will hunt through a Spin1 file and look for operators and keywords that need to change -- a few P1 operators will not flag a P2 compiler error, but won't work properly, either. The Spin2 compiler will tell where a problem exists, but not how to fix it. The idea behind this little program is to provide hints. This is the output from a test.
Processing d:/programming/p1_spin/jm_max7219_demo.spin
0139 t := cnt
* (p1) cnt @Col 6 --> (p2) getct
0142 waitcnt(t += constant(100 * MS_001)) ' hold 1/10th second
* (p1) waitcnt @Col 1 --> (p2) waitct
* (p1) constant @Col 14 --> (p2) N/A
0207 prng.seed(-cnt, -cnt ~> 2, $CAFE_BABE, cnt <- 2, cnt) ' seed randomizer
* (p1) ~> @Col 22 --> (p2) sar
* (p1) <- @Col 44 --> (p2) rol
Done. 5 suggestions in 3 lines.
This is version 1, so if you're a Python programmer, please feel free to jump in and improve it -- again, I'm a newish Python programmer so it would be nice to see ideas from others.
Not everything is going to be an easy fix. The P2 doesn't have counters like the P1, so we'll have to use code or smart pins in P2 updates. There are no waitxxx instructions, so those situations will have to be dealt with differently. This doesn't look at any PASM instructions -- that's a detailed process, anyway.
Note: Remove ".txt" from end of filename before attempting to run.

Comments
I just noticed in that demo output that the program didn't detect 'cnt' in line 207. I don't know why -- and it's very late....
Fixed that problem, made some code improvements, and updated the token lists. This version is nicer -- updated output:
D:\>python p2_hints_1v2.py d:/programming/p1_spin/p1_template.spin Processing d:/programming/p1_spin/p1_template.spin 0065 term.str(string("Hello, World!", 13, 13)) ---- ^ * (p1) string( @Col 10 --> (p2) @ 0068 waitcnt(0) ---- ^ * (p1) waitcnt @Col 1 --> (p2) waitct 0090 prng.seed(-cnt, -cnt ~> 2, $CAFE_BABE, cnt <- 2, cnt) ' seed randomizer ---- ^ ^ ^ ^ ^ ^ * (p1) cnt @Col 12 --> (p2) getct * (p1) cnt @Col 18 --> (p2) getct * (p1) ~> @Col 22 --> (p2) sar * (p1) cnt @Col 40 --> (p2) getct * (p1) <- @Col 44 --> (p2) rol * (p1) cnt @Col 50 --> (p2) getct Done. 8 suggestions in 3 lines.See first post for updated listing.
Found a gotcha and changed from using two lists to a single dictionary -- this makes adding P1->P2 change suggestions much easier.
Output now looks like this:
D:\>python p2_hints_1v4.py d:/programming/p1_spin/p1_template.spin Processing d:/programming/p1_spin/p1_template.spin 0065 term.str(string("Hello, World!", 13, 13)) ---- ^ * Col 012 (p1) string( (p2) @ 0066 time.pause(100) ---- ^ * Col 003 (p1) time.pause (p2) waitms 0069 waitcnt(0) ---- ^ * Col 005 (p1) waitcnt (p2) waitct 0091 prng.seed(-cnt, -cnt ~> 2, $CAFE_BABE, cnt <- 2, cnt) ' seed randomizer ---- ^ ^ ^ ^ ^ ^ * Col 014 (p1) cnt (p2) getct() * Col 020 (p1) cnt (p2) getct() * Col 024 (p1) ~> (p2) sar * Col 042 (p1) cnt (p2) getct() * Col 046 (p1) <- (p2) rol * Col 052 (p1) cnt (p2) getct() Done. 9 suggestions in 4 lines.See first post for updated listing.
Very cool. Keep it up young fellow!