• External Vars Tutorial 5 1
Currently:  

Author Topic: External Vars Tutorial  (Read 11266 times)

0 Members and 1 Guest are viewing this topic.

Offline Calcaholic

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 13
  • Rating: +2/-0
    • View Profile
Re: External Vars Tutorial
« Reply #15 on: February 06, 2011, 01:10:44 pm »
Thank you all; Now it's all as it should be... :)

Offline Builderboy

  • Physics Guru
  • CoT Emeritus
  • LV13 Extreme Addict (Next: 9001)
  • *
  • Posts: 5673
  • Rating: +613/-9
  • Would you kindly?
    • View Profile
Re: External Vars Tutorial
« Reply #16 on: February 06, 2011, 01:14:39 pm »
The length of appvars and programs is stored in the 2 bytes before the pointer, so using {P-2}r would give you the length :)

Offline Calcaholic

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 13
  • Rating: +2/-0
    • View Profile
Re: External Vars Tutorial
« Reply #17 on: February 06, 2011, 01:40:06 pm »
ok, that works either. :)

Offline DJ Omnimaga

  • Former TI programmer
  • CoT Emeritus
  • LV15 Omnimagician (Next: --)
  • *
  • Posts: 55846
  • Rating: +3151/-232
  • CodeWalrus founder & retired Omnimaga founder
    • View Profile
    • DJ Omnimaga Music
Re: External Vars Tutorial
« Reply #18 on: February 07, 2011, 02:05:22 pm »
I'll need to check that tutorial eventually. Getcalc function is what pretty much lead to me quitting Axe development. I never could stop being confused between both syntaxes (which is why I think there should be one command to create the appvar and a different one to read from an appvar...). Hopefully this should be useful to other people too, since a lot of the help topics being posted are about appvars.
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



Official Website |T-Shirt store | Reverbnation | Facebook | Youtube | Twitter | Spotify

Offline Builderboy

  • Physics Guru
  • CoT Emeritus
  • LV13 Extreme Addict (Next: 9001)
  • *
  • Posts: 5673
  • Rating: +613/-9
  • Would you kindly?
    • View Profile
Re: External Vars Tutorial
« Reply #19 on: February 07, 2011, 06:44:31 pm »
which is why I think there should be one command to create the appvar and a different one to read from an appvar...

Wait, i'm confused, isn't there only one command to create them and only one command to read from them? getCalc() can create them, and using a pointer can read from them?

Offline FinaleTI

  • Believe in the pony that believes in you!
  • CoT Emeritus
  • LV10 31337 u53r (Next: 2000)
  • *
  • Posts: 1830
  • Rating: +121/-2
  • Believe in the pony that believes in you!
    • View Profile
    • dmuckerman.tumblr.com
Re: External Vars Tutorial
« Reply #20 on: February 07, 2011, 06:49:38 pm »
I should probably start working on this again after the Cage Match...


Spoiler For Projects:

My projects haven't been worked on in a while, so they're all on hiatus for the time being. I do hope to eventually return to them in some form or another...

Spoiler For Pokemon TI:
Axe port of Pokemon Red/Blue to the 83+/84+ family. On hold.

Spoiler For Nostalgia:
My big personal project, an original RPG about dimensional travel and a few heroes tasked with saving the world.
Coding-wise, on hold, but I am re-working the story.

Spoiler For Finale's Super Insane Tunnel Pack of Doom:
I will be combining Blur and Collision Course into a single gamepack. On hold.

Spoiler For Nostalgia Origins: Sky's Story:
Prequel to Nostalgia. On hold, especially while the story is re-worked.

Offline squidgetx

  • Food.
  • CoT Emeritus
  • LV10 31337 u53r (Next: 2000)
  • *
  • Posts: 1881
  • Rating: +503/-17
  • rawr.
    • View Profile
Re: External Vars Tutorial
« Reply #21 on: February 12, 2011, 04:01:19 pm »
Yeah, you should ;D

Maybe more discussion on file pointers, as well as other variable types. Also discussion on how to access an arbitrary variable (without a name string) would be nice.
Spoiler For Spoiler:
Basically, you can use free ram as your 'name string' For example, the following code is totally valid:
Copy("HI",L1+1,2)
0->{L1+3}
E15->{L1}
GetCalc(L1)->A

It does the same thing as GetCalc("appvHI")->A, but I'm sure you can think of many applications of this method instead (shells and mem readers come to mind). You can use 05 to get a program or 06 to get a protected program (instead of $15). Other prefixes you may be able to use are (taken from the SDK. also I haven't tested all of these and would be wary if you tried GetCalc'ing an application for example)
00h Real
01h List
02h Matrix
03h Equation
04h String
05h Program
06h Protected Program
07h Picture
08h Graph Database
0Bh New EQU 
0Ch Complex
0Dh Complex
14h Application
15h AppVar
17h Group
« Last Edit: February 12, 2011, 04:04:08 pm by squidgetx »

Offline DJ Omnimaga

  • Former TI programmer
  • CoT Emeritus
  • LV15 Omnimagician (Next: --)
  • *
  • Posts: 55846
  • Rating: +3151/-232
  • CodeWalrus founder & retired Omnimaga founder
    • View Profile
    • DJ Omnimaga Music
Re: External Vars Tutorial
« Reply #22 on: February 12, 2011, 07:35:25 pm »
which is why I think there should be one command to create the appvar and a different one to read from an appvar...

Wait, i'm confused, isn't there only one command to create them and only one command to read from them? getCalc() can create them, and using a pointer can read from them?
Indeed, but I feel it would be better if something else than getCalc was used to create them. Otherwise we always get confused between both syntaxes (the main reason why so many people have troubles understanding appvars)
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



Official Website |T-Shirt store | Reverbnation | Facebook | Youtube | Twitter | Spotify

Offline FinaleTI

  • Believe in the pony that believes in you!
  • CoT Emeritus
  • LV10 31337 u53r (Next: 2000)
  • *
  • Posts: 1830
  • Rating: +121/-2
  • Believe in the pony that believes in you!
    • View Profile
    • dmuckerman.tumblr.com
Re: External Vars Tutorial
« Reply #23 on: February 20, 2011, 03:01:48 pm »
Slight update, and new section thanks to what squidgetx posted.

1) Appvars and Programs
Spoiler For Spoiler:
Appvars and programs have just about the same structure when accessed through Axe. They can have names up to 8 characters in length, that do not start with a number. Appvars can contain lowercase letters in their name, and while programs can, it is more common practice for them to have all uppercase names. This is because if a program contains lowercase letters in its name, it cannot be run from the homescreen.

To access an appvar:
Code: [Select]
GetCalc("appvAPPVAR")→PointerWhere 'APPVAR' is to be substituted with the name of the appvar you want to access, and Pointer is where you want the data to point to.
For example:
Code: [Select]
GetCalc("appvAPPVAR")→AThis stores the location in RAM of the appvar APPVAR to the pointer A. You can then access data in the appvar by using pointers as you normally would.
Code: [Select]
GetCalc("appvAPPVAR")→A
1→{A}
The code above would store 1 to the first byte of the appvar APPVAR.
The code above will only work if the appvar exists and is in the RAM.

Now, if your appvar doesn't exist, you can easily create it by adding a second argument to your GetCalc() command.
Code: [Select]
GetCalc("appvAPPVAR",Size)→PointerWhere Size is the size in bytes of the appvar you want to create.

If the appvar exists, but is in the archive, there are a number of things you can do.
You could unarchive it, but if you are only going to read data from it, this is not the best way to do it.
Code: [Select]
UnArchive "appvAPPVAR"Most of the time if you do this, you'll have to end up archiving it when you're done with it.
Code: [Select]
Archive "appvAPPVAR"This can take more and more time if you haven't GarbageCollected recently, though. However, this does allow you to save your data in the archive.

If you simply want to read data from an archived appvar, then you could copy it to a file.
Code: [Select]
GetCalc("appvAPPVAR",File)Where File is the token for a Y-Var (Y0-Y9).

Once the appvar is copied to a file, you can read from it like a pointer.
Code: [Select]
GetCalc("appvAPPVAR",Y0)
{Y0}→A
This would store the first byte of your appvar to the pointer A.

Once you no longer need an appvar, you can simply delete it.
Code: [Select]
DelVar "appvAPPVAR"This will only work if the appvar is in the RAM. If you copied your appvar to a file, you don't need to worry about deleting a file, as ending the program will take care of clearing the file for you. In addition, you can copy an appvar to a file that you previously used with no adverse effects.
Code: [Select]
GetCalc("appvAPPVAR",Y0)
GetCalc("appvAPPVAR2",Y0)
This would copy the appvar APPVAR to file Y0, then copy the appvar APPVAR2 to file Y0. Accessing file Y0 would then allow you to access the data in APPVAR2.

Please note that data cannot be stored to files, merely read from files.


Programs can be accessed exactly the same way as appvars, except that you use the 'prgm' token instead of the 'v' you get from [2nd]+[8] (which becomes 'appv' with the Axe Tokens).

2) Real Variables
Spoiler For Spoiler:
Accessing real vars is fairly easy to do, actually.
First, getting the pointer to a real var is:
Code: [Select]
GetCalc("varA")→PointerWhere A can be substituted with any real var, A-θ, and Pointer is the where you want the data to point to.

Now, the tricky part is accessing the data in a real var. Simply doing:
Code: [Select]
GetCalc("varA")→P
1→float{P}
will not give you proper results. In fact, it will render the variable A invalid until you overwrite it properly, whether inside or outside the Axe program.

The correct offset for accessing a real var is Pointer-2.
Code: [Select]
GetCalc("varA")→P
1→float{P-2}
This code will store one to the real var A, and you can see that now outside of the Axe program. You can store 0-65535 to real vars using Axe, as Axe only supports two byte numbers. Note: You don't need to put a r after the float command if you are storing a two byte number.
The 'var' token is the 'u' you get from [2nd]+[7] (it becomes 'var' with the Axe tokens).

3) Accessing Arbitrary Variables (courtesy of squidgetx)
Spoiler For Spoiler:
Copy("HI",L1+1,2)
0->{L1+3}
E15->{L1}
GetCalc(L1)->A

It does the same thing as GetCalc("appvHI")->A, but I'm sure you can think of many applications of this method instead (shells and mem readers come to mind). You can use 05 to get a program or 06 to get a protected program (instead of $15). Other prefixes you may be able to use are (taken from the SDK. also I haven't tested all of these and would be wary if you tried GetCalc'ing an application for example)
Data Types:
00h Real
01h List
02h Matrix
03h Equation
04h String
05h Program
06h Protected Program
07h Picture
08h Graph Database
0Bh New EQU 
0Ch Complex
0Dh Complex
14h Application
15h AppVar
17h Group

This could be taken as a little confusing, so let's break this down a little bit.


Copy("HI",L1+1,2)
This line copies the name of the variable (in this case, "HI") to L1+1.

0->{L1+3}
This line adds the null byte or terminating zero to the end of the name string starting at L1+1. Where 3 is would be the length of the variable name + 1.

E15->{L1}
This line stores the type byte of the variable to L1. In this case, it's denotating an appvar. The E means the number that follows is the hexadecimal equivalent, so any of the hex numbers from the above list would work here in place of the 15.

GetCalc(L1)->A
This uses the string you just constructed at the beginning of L1 to create the variable.


Spoiler For Projects:

My projects haven't been worked on in a while, so they're all on hiatus for the time being. I do hope to eventually return to them in some form or another...

Spoiler For Pokemon TI:
Axe port of Pokemon Red/Blue to the 83+/84+ family. On hold.

Spoiler For Nostalgia:
My big personal project, an original RPG about dimensional travel and a few heroes tasked with saving the world.
Coding-wise, on hold, but I am re-working the story.

Spoiler For Finale's Super Insane Tunnel Pack of Doom:
I will be combining Blur and Collision Course into a single gamepack. On hold.

Spoiler For Nostalgia Origins: Sky's Story:
Prequel to Nostalgia. On hold, especially while the story is re-worked.

Offline Elsewhere

  • LV2 Member (Next: 40)
  • **
  • Posts: 26
  • Rating: +5/-1
    • View Profile
Re: External Vars Tutorial
« Reply #24 on: February 20, 2011, 11:05:05 pm »
So, should this work or is there something I missed?
Code: [Select]
:!If GetCalc("appvPOLSC")
:GetCalc("appvPOLSC",37)->N
:For(A,0,37)
:0->{N+A}
:End
:End
:GetCalc("appvPOLSC")->N
:For(A,0,37)
:!If {N+A}
:.(do something)
:Else
:.(do something else)
:End
:End
What it should do is either load from an existing appvar or create the appvar, and then store it to N for reading. All it does is fail to create the appvar (and I've made sure there was enough RAM, as well as tested on Wabbit). After running the program, the calculator will load the PRGM menu really slowly and will eventually crash on something. Anyway, I've been staring blankly at these lines of code for too long. Any insight would be appreciated. :P

Offline Deep Toaster

  • So much to do, so much time, so little motivation
  • Administrator
  • LV13 Extreme Addict (Next: 9001)
  • *************
  • Posts: 8209
  • Rating: +758/-15
    • View Profile
    • ClrHome
Re: External Vars Tutorial
« Reply #25 on: February 20, 2011, 11:07:34 pm »
For(A,0,36). If it's For(A,0,37) you're storing 38 bytes of memory, the last of which probably messes up the size byte of one of the programs (which would be really really bad :P).
« Last Edit: February 20, 2011, 11:07:55 pm by Deep Thought »




Offline Elsewhere

  • LV2 Member (Next: 40)
  • **
  • Posts: 26
  • Rating: +5/-1
    • View Profile
Re: External Vars Tutorial
« Reply #26 on: February 20, 2011, 11:49:40 pm »
Hm, nothing seemed to change. ???
Is there something else I did wrong?

Offline Deep Toaster

  • So much to do, so much time, so little motivation
  • Administrator
  • LV13 Extreme Addict (Next: 9001)
  • *************
  • Posts: 8209
  • Rating: +758/-15
    • View Profile
    • ClrHome
Re: External Vars Tutorial
« Reply #27 on: February 21, 2011, 12:29:33 am »
Did you change both the For( statements?




Offline Elsewhere

  • LV2 Member (Next: 40)
  • **
  • Posts: 26
  • Rating: +5/-1
    • View Profile
Re: External Vars Tutorial
« Reply #28 on: February 21, 2011, 12:40:36 am »
Yeah, and then when it didn't work I added ample length to the created appvar and it still didn't work.

Offline FinaleTI

  • Believe in the pony that believes in you!
  • CoT Emeritus
  • LV10 31337 u53r (Next: 2000)
  • *
  • Posts: 1830
  • Rating: +121/-2
  • Believe in the pony that believes in you!
    • View Profile
    • dmuckerman.tumblr.com
Re: External Vars Tutorial
« Reply #29 on: February 21, 2011, 04:33:06 pm »
When you typed the "appv" in the name, did you type "appv" with lowercase letters or did you use the appv symbol Axe gives you when you press 2nd and 8?
You need to use the 2nd and 8 key combo to get the appv token (it's a lowercase v symbol normally) to properly reference an appvar.


Spoiler For Projects:

My projects haven't been worked on in a while, so they're all on hiatus for the time being. I do hope to eventually return to them in some form or another...

Spoiler For Pokemon TI:
Axe port of Pokemon Red/Blue to the 83+/84+ family. On hold.

Spoiler For Nostalgia:
My big personal project, an original RPG about dimensional travel and a few heroes tasked with saving the world.
Coding-wise, on hold, but I am re-working the story.

Spoiler For Finale's Super Insane Tunnel Pack of Doom:
I will be combining Blur and Collision Course into a single gamepack. On hold.

Spoiler For Nostalgia Origins: Sky's Story:
Prequel to Nostalgia. On hold, especially while the story is re-worked.