Difference between revisions of "Offscrpt"

From WikiTI
Jump to: navigation, search
(Documented important copying bug)
Line 1: Line 1:
OFFSCRPT is an appvar used by the TI-OS to run an assembly program when the calculator turns off. There is also another appvar called ONSCRPT that runs code when the calculator powers on. ONSCRPT is less stable than OFFSCRPT, and it is possible to do what ONSCRPT does using an OFFSCRPT appvar. The TI-OS runs the code in the appvar from $8001.
+
OFFSCRPT is an appvar used by the TI-OS to run an assembly program when the calculator turns off. There is also another appvar called ONSCRPT that runs code when the calculator powers on. ONSCRPT is less stable than OFFSCRPT, and it is possible to do what ONSCRPT does using an OFFSCRPT appvar.
  
 
Some applications that use this appvar are:
 
Some applications that use this appvar are:
Line 10: Line 10:
  
 
To install an OFFSCRPT appvar, a program or application must create the appvar with bcall(_createappvar) and set bit 1 of (iy+33h) to indicate that an OFFSCRPT appvar is installed. To uninstall the OFFSCRPT, the OFFSCRPT appvar must be deleted or bit 1 of (iy+33h) must be reset, or both.
 
To install an OFFSCRPT appvar, a program or application must create the appvar with bcall(_createappvar) and set bit 1 of (iy+33h) to indicate that an OFFSCRPT appvar is installed. To uninstall the OFFSCRPT, the OFFSCRPT appvar must be deleted or bit 1 of (iy+33h) must be reset, or both.
 +
 +
== Variable Format ==
 +
 +
Looking at the OS's implementation of these, there's an important bug to be aware of. When reading the size header of the appvar to know how many bytes to copy, the pointer is never actually incremented past the second byte of the size. So the correct number of bytes are copied to appData, but the bytes copied start one byte before the actual appvar data. So the first byte copied and executed is the high size byte, and the last byte of the appvar isn't copied at all.
 +
 +
For those creating an ONSCRPT or OFFSCRPT variable, this means a couple things:
 +
* Use an origin of appData+1.
 +
* Add an extra byte at the end.
 +
* Be aware that if your variable is larger than 255 bytes, besides the expected problems of running past the end of appData and into other RAM areas, the first byte executed will no longer be a nop. Plan accordingly.
 
[[Category:83Plus:OS Information|Offscrpt]]
 
[[Category:83Plus:OS Information|Offscrpt]]

Revision as of 12:25, 30 January 2016

OFFSCRPT is an appvar used by the TI-OS to run an assembly program when the calculator turns off. There is also another appvar called ONSCRPT that runs code when the calculator powers on. ONSCRPT is less stable than OFFSCRPT, and it is possible to do what ONSCRPT does using an OFFSCRPT appvar.

Some applications that use this appvar are:

  • CalcUtil
  • DoorsCS
  • TI's Startup App
  • zStart
  • Krolypto

These applications use a getKey hook to run something on startup (like the ONSCRPT appvar, but more stable).

To install an OFFSCRPT appvar, a program or application must create the appvar with bcall(_createappvar) and set bit 1 of (iy+33h) to indicate that an OFFSCRPT appvar is installed. To uninstall the OFFSCRPT, the OFFSCRPT appvar must be deleted or bit 1 of (iy+33h) must be reset, or both.

Variable Format

Looking at the OS's implementation of these, there's an important bug to be aware of. When reading the size header of the appvar to know how many bytes to copy, the pointer is never actually incremented past the second byte of the size. So the correct number of bytes are copied to appData, but the bytes copied start one byte before the actual appvar data. So the first byte copied and executed is the high size byte, and the last byte of the appvar isn't copied at all.

For those creating an ONSCRPT or OFFSCRPT variable, this means a couple things:

  • Use an origin of appData+1.
  • Add an extra byte at the end.
  • Be aware that if your variable is larger than 255 bytes, besides the expected problems of running past the end of appData and into other RAM areas, the first byte executed will no longer be a nop. Plan accordingly.