### Author Topic: Routines  (Read 190582 times)

0 Members and 1 Guest are viewing this topic.

#### ztrumpet

• The Rarely Active One
• CoT Emeritus
• LV13 Extreme Addict (Next: 9001)
• Posts: 5712
• Rating: +364/-4
• If you see this, send me a PM. Just for fun.
##### Re: Routines
« Reply #495 on: December 14, 2010, 04:02:23 pm »
That looks neat!  Nice routine Sir!
If I'm wrong, please correct me!
Unfinished Projects:
 Elmgon 14% Basic Movement Demo Homescreen Game Pack 80% Basic Latest Release Cube Droid Saves the Galaxy 65% Axe Demo Detonate 70% Axe
Completed Projects:
Exodus | Midnight |Drifter | Axe Snake | Jump! | Factory Theta | Spider | Plot Drop | Papi Jump | Numb3rs | Nibbler | Boost | Duel Tile Map Editor | Homescreen Map Editor | Key Group Check | Oasis

#### Runer112

• Project Author
• LV11 Super Veteran (Next: 3000)
• Posts: 2289
• Rating: +639/-31
##### Re: Routines
« Reply #496 on: December 14, 2010, 05:50:10 pm »
I believe I posted some normal sorting routines a while ago, but there are probably many more times when a linked sort is in order. So here are two linked sorting libraries. LSORTBLB sorts a list of bytes whereas LSORTWLB sorts a list of words, and both are linked to a list of words (which will typically be pointers). These routines allow you to sort objects based on certain attributes.

The general syntax for a sort call:
Code: [Select]
sub(___, Pointer to list of values to sort, Pointer to list of words to rearrange based on sort, Number of bytes to sort)Note: If you are sorting bytes, the last argument will be the number of values to sort. If you are sorting words, the last argument will be the number of values times 2.

Routines in LSORTBLB:
• SBA - Sort bytes in ascending order
• SBD - Sort bytes in descending order

Routines in LSORTWLB:
• SWA - Sort words in ascending order
• SWD - Sort words in descending order

As an example, say your program was managing 256 objects, and each object has 4 bytes of data: [x position, y position, x velocity, y velocity]. You have a list of pointers to the objects located at P. Let's say you want to sort the objects in this list by descending x velocity.
Code: [Select]
.Move attributes to be sorted by to a sequential section of memoryFor(A,0,255){{A*2+P}+2}→{A+L₁}End.Sortsub(SBD,L₁,P,256)
« Last Edit: December 14, 2010, 06:09:46 pm by Runer112 »

#### DJ Omnimaga

• Former TI programmer
• CoT Emeritus
• LV15 Omnimagician (Next: --)
• Posts: 55858
• Rating: +3151/-232
• CodeWalrus founder & retired Omnimaga founder
##### Re: Routines
« Reply #497 on: December 15, 2010, 12:47:04 am »
Oh a sorting routine? Nice! This might be handy eventually if I was to work on an item menu like Illusiat 13
In case you are wondering where I went, I left Omni back in 2015 to form CodeWalrus due to various reasons explained back then, but I stopped calc dev in 2016 and am now mostly active on the CW Discord server at https://discord.gg/cuZcfcF

#### ztrumpet

• The Rarely Active One
• CoT Emeritus
• LV13 Extreme Addict (Next: 9001)
• Posts: 5712
• Rating: +364/-4
• If you see this, send me a PM. Just for fun.
##### Re: Routines
« Reply #498 on: December 15, 2010, 04:45:07 pm »
Wow, that looks nice!  Great job.
If I'm wrong, please correct me!
Unfinished Projects:
 Elmgon 14% Basic Movement Demo Homescreen Game Pack 80% Basic Latest Release Cube Droid Saves the Galaxy 65% Axe Demo Detonate 70% Axe
Completed Projects:
Exodus | Midnight |Drifter | Axe Snake | Jump! | Factory Theta | Spider | Plot Drop | Papi Jump | Numb3rs | Nibbler | Boost | Duel Tile Map Editor | Homescreen Map Editor | Key Group Check | Oasis

• Guest
##### Re: Routines
« Reply #499 on: December 15, 2010, 05:18:06 pm »
Draw an elliptical shape like an oval/circle

Code: [Select]
For(A,0,255sin(A)//W->Scos(A)//H->Cpxl-on(X+S,Y-CEnd
W = Width inverse, the smaller the value, the wider the circle.  16 draws with outward radius of ~10 pixels
H = Height inverse, the smaller the value, the taller the circle.  16 draws with outward radius of ~10 pixels
A = used in for statement as the intermediate "angle"
S = intermediate sine value
C = intermediate cosine value
X = Elliptical center X
Y = Elliptical center Y
« Last Edit: December 15, 2010, 05:18:43 pm by Ashbad »

#### nemo

• LV9 Veteran (Next: 1337)
• Posts: 1203
• Rating: +95/-11
##### Re: Routines
« Reply #500 on: December 15, 2010, 05:25:31 pm »
Code: [Select]
For(A,0,255pxl-on(sin(A)//W+X,Y-(cos(A)//H)Endyay optimization

• Guest
##### Re: Routines
« Reply #501 on: December 15, 2010, 05:27:12 pm »
yay

funny thing is, until I wrote the routine and looked up what a sine and cosine is, I had NO IDEA what they did

I mean, I used before in Alg honors last year, but it was the last chapter for honors only, which was a crash course of trig basics

..and we just used the sin/cos functions like once and were never told what they did
« Last Edit: December 15, 2010, 05:28:06 pm by Ashbad »

#### Runer112

• Project Author
• LV11 Super Veteran (Next: 3000)
• Posts: 2289
• Rating: +639/-31
##### Re: Routines
« Reply #502 on: December 15, 2010, 07:04:38 pm »
Code: [Select]
For(A,0,255pxl-on(sin(A)//W+X,Y-(cos(A)//H)Endyay optimization

Code: [Select]
256→AWhile Pxl-On(sin(A)//W+X,sin(A+64)//H+Y)A-1→AEnd
Good fight

And just a note: Unless you absolutely want width and height to be inverted, multiplying instead of signed dividing is probably better. The multiplication routine is smaller and faster than the signed division routine.
« Last Edit: December 15, 2010, 07:06:21 pm by Runer112 »

#### Deep Toaster

• So much to do, so much time, so little motivation
• LV13 Extreme Addict (Next: 9001)
• Posts: 8215
• Rating: +758/-15
##### Re: Routines
« Reply #503 on: December 15, 2010, 07:09:05 pm »
Code: [Select]
257While -1→APxl-On(sin(A)//W+X,sin(A+64)//H+Y)AEnd
Even better

#### Runer112

• Project Author
• LV11 Super Veteran (Next: 3000)
• Posts: 2289
• Rating: +639/-31
##### Re: Routines
« Reply #504 on: December 15, 2010, 07:16:02 pm »
Ah how did I not see that!

#### Deep Toaster

• So much to do, so much time, so little motivation
• LV13 Extreme Addict (Next: 9001)
• Posts: 8215
• Rating: +758/-15
##### Re: Routines
« Reply #505 on: December 15, 2010, 07:18:16 pm »
Code: [Select]
257While -1→APxl-On(sin()//W+X,sin(A+64)//H+Y)AEnd
I should stop.

#### DJ Omnimaga

• Former TI programmer
• CoT Emeritus
• LV15 Omnimagician (Next: --)
• Posts: 55858
• Rating: +3151/-232
• CodeWalrus founder & retired Omnimaga founder
##### Re: Routines
« Reply #506 on: December 16, 2010, 04:29:06 am »
Nice routine guys!
In case you are wondering where I went, I left Omni back in 2015 to form CodeWalrus due to various reasons explained back then, but I stopped calc dev in 2016 and am now mostly active on the CW Discord server at https://discord.gg/cuZcfcF

#### Runer112

• Project Author
• LV11 Super Veteran (Next: 3000)
• Posts: 2289
• Rating: +639/-31
##### Re: Routines
« Reply #507 on: December 19, 2010, 10:43:15 pm »
FinaleTI was wondering how he could do some basic operations on 3-byte numbers, namely addition, subtraction, and decimal display. It took me a while to get it all working, but I wrote an Axe library to do all of the above. And while I was at it, because it would only require minor modifications to this code, I wrote a similar library to perform those three operations on 4-byte numbers. No longer shall Axe be limited to 2 bytes! (At least regarding addition, subtraction, and decimal display)

Anyways, the two libraries are very similar. They accept inputs in the form of pointers to the 3- or 4-byte numbers you want to operate on and have the same three functions:
• Subtraction: sub(SUB, Pointer to first argument, Pointer to second argument, Pointer to store answer to)
• Decimal display: Disp Pointer to number to display sub(DEC) - Note that this does not return a string of a fixed length padded on the left with spaces like the usual Disp ►Dec. The string returned has any leading zeros clipped and consists only of the number itself.

To include the library in your program, have the library you want present on your calculator and insert a line reading ":prgmLIB3BYTE" or ":prgmLIB4BYTE" in the subroutine section of your code. The syntax for the commands is also included as comments under each function in the library source files, so you can look there if you need a refresher.

NOTE: The decimal display routine uses OP4-OP5 for scratch memory and OP6 to store the resulting string, so if you're wondering why any data you store there is mysteriously being corrupted, that's why.

EDIT: I just realized there was a slight flaw with my code. But I fixed it and reuploaded the two libraries before anyone could download them (I think). That's why the "by Runer112" is on the end of the filenames, I wasn't sure what else to add.
« Last Edit: December 20, 2010, 02:53:11 am by Runer112 »

#### DJ Omnimaga

• Former TI programmer
• CoT Emeritus
• LV15 Omnimagician (Next: --)
• Posts: 55858
• Rating: +3151/-232
• CodeWalrus founder & retired Omnimaga founder
##### Re: Routines
« Reply #508 on: December 19, 2010, 10:50:45 pm »
Hmm question, you say pointer to first argument, but I assume this grabs 3 numbers starting there, right? Just wondering. Also does the routine allows you to display such number without adding/substracting? I am curious since this might be useful for games where money or scores can go above 65536, for example.
In case you are wondering where I went, I left Omni back in 2015 to form CodeWalrus due to various reasons explained back then, but I stopped calc dev in 2016 and am now mostly active on the CW Discord server at https://discord.gg/cuZcfcF

#### Runer112

• Project Author
• LV11 Super Veteran (Next: 3000)
• Posts: 2289
• Rating: +639/-31
##### Re: Routines
« Reply #509 on: December 19, 2010, 10:56:20 pm »
Yes and yes. The arguments should be pointers to where you store the values, not the actual values, because the actual values wouldn't fit in Axe's 2-byte value system. For instance, if you had a 4-byte number spanning variables A-B in memory and a 4-byte number spanning variables C-D, you could add the two values and store the result in A-B like so:
Code: [Select]
sub(ADD,°C,°A,)(Note the trick employed here. You can do this if you are adding two values and storing the result back into one of the values. Enter the pointer to the value that should serve as both an argument and the answer as the second argument and then leave the third argument blank.)

The display routines can display any number that you can fit in the 3 or 4 bytes of data: 0-16777215 for the 3-byte library and 0-4294967295 for the 4-byte library.

EDIT: Here's a little program I whipped up using the 4-byte library, showing its capabilities. It pases 65536 with ease, but unfortunately it can only go up to about 4 billion. You might recognize the pattern...
(Note that the actual routines run a lot faster than this, I manually set it to iterate only twice per second)

You can look at the source for an example of how to use the commands.
« Last Edit: December 20, 2010, 02:53:43 am by Runer112 »