***************************************************************** * Protocol of the TI89 calculator * * Documentation by Romain Lievin <rlievin@mail.com> * * programmer of TiLP: http://lpg.ticalc.org/prj_tilp * * Begin: 15/08/1999 * * Last update: 09/12/2001 * * Latest version of this doc can be found at * * http://lpg.ticalc.org/prj_tilp/download/docs * ***************************************************************** Note: - all values are in hexadecimal format or in character format. - all 2-byte words are LSB first and MSB next, so {5B 01} = 015B. ?? = unknown (I do not know what these values represent) XX = an appropriate value Xl = the least significant part of the value Xh = the most significant part of the value 0) Remark ========= This calculator has the silent link capability. The only calculators which have this capability are TI83, 83+, 86, 89, 92 and 92+. When a calculator has not the silent link capability, the computer behaves as a calculator. I) The hardware protocol ======================== For more informations, see 'Protocol_hard.txt' in the hard directory of this documentation. You will find documentation as well as schematics and routines. II) The software protocol ========================= 2.1) Packets ------------ The transmission of data between the TI calculator and the PC is made by packets. A packet has the following format: Offset Length Sortcuts Description -------------------------------------------------------- 0 1 MID Machine ID 1 1 CID Command ID 2 2 Pl Packet length of data in bytes if data attached 4 n DATA Data if attached 4+n 2 CHK Checksum if data attached. The checksum is the sum of all bytes of data (CHK <-> {Cl Ch}). The checksum tells the receiving machine if the data in a packet with data was received correctly. It is actually the least significant 16 bits of the sum of all data bytes. Be careful, the datalength word can be different of 0 without data and checksum . Indeed, this word is an information. Example: PC: 08 68 00 00 PC request if the TI is OK (RDY) TI: 98 56 00 01 TI reply that it is not OK (NOK/NAK) PC: 08 09 XX XX ready to receive XX XX bytes (CTS) PC: 08 09 FF FF PC ready to receive TI: 98 09 00 00 TI wait data (CONT) Else, this a normal packet. Example: +--Machine ID=Computer linked to TI-92 | +--Command ID=Skip/Exit | | +--Data length=0001 bytes | | | +--Data=01 (Exit pressed) | | / \ | Checksum=0001 A typical packet would be: 09 36 01 00 01 01 00 Packets can have up to 65535 bytes in the Data part. Note: FLASHed TI89 have a reply different of basic TI89. Instead of replying 98 56 00 XX, a flashed TI89 reply 98 56 04 XX. 2.2) Machine ID --------------- The Machine ID byte identifies the machine so the calculator can decide whether or not to accept the transmission. Here are the possible values: +---------------+-------------------------------+ | Machine ID | Description | +---------------+-------------------------------+ | 00 | PC -> TI?? (*) | | 08 | PC -> TI89 | | 98 | TI89 -> PC or TI89 -> TI89 | +---------------+-------------------------------+ (*) used for checking if TI has been FLASHed 2.3) Command ID --------------- The command ID byte specifies the type of packet that it is. Legend: * means there is data attached. # means the device id is ignored with this command. $ means it's a silent command. +----+-----+------------+----------------------------------------------------+ | ID | --- | Shortcuts | Description | +----+-----+------------+----------------------------------------------------+ | 06 | *-- | VAR | Includes a std variable header (used in receiving) | | 09 | --- | CTS | Used to signal OK to send a variable | | 15 | *-- | XDP/DATA | Xmit Data Packet (pure data) | | 36 | *-- | SKIP/EXIT | Skip/exit - used when duplicate name is found | | 56 | --- | ACK/OK | Acknowledgment | | 5A | --- | ERR | Checksum error: send last packet again | | 68 | --- | RDY | Check whether TI is ready | | 6D | --$ | SCR | Request screenshot | | 87 | --- | direct CMD | Direct command (for remote control for instance) | | 92 | --- | EOT/DONE | End Of Transmission: no more variables to send | | A2 | *-$ | REQ | Request variable - includes a standard variable | | C9 | *-$ | RTS | Request to send - includes a padded variable header| +----+-----+------------+----------------------------------------------------+ 2.4) The variable header format (0x06) -------------------------------------- A variable header or 'var header' is used whenever an information must be tranmitted. The variable header is the data of a packet when the command is 06. The variable header is up to 14 bytes long. It has the following format: +-------+-------+-------+---------------------------------------+ | Offset| Length| Short | Description | +-------+-------+-------+---------------------------------------+ | 0 | 1 | MID | Machine ID | | 1 | 1 | CID | Command ID, 06 in this case | | 2 | 2 | Pl | Packet length (LL-HH) | | 2 | 2 | Dl | Data length (LL LH HL HH) | | 3 | 1 | Ty | Variable Type (see next paragraph) | | 4 | 1 | Nl | Name length (0..8) | | 5 | n | Name | Name (not zero-terminated) | | 6+n | 2 | CHK | Checksum | +-------+-------+-------+---------------------------------------+ HHHLLHLL is the size of the var in memory (real size + 2; the '2' is due to the fact that a data part take x bytes + 2 bytes of length of variable). This is the value we can see in the VAR-LINK menu. If the header is describing a memory backup, the variable header will take the following format: Ty=1D, Nl=04 and name=1.11 2.5) Request (0xA2) ------------------- A request is used whenever the computer request an action. The format of a request is the same as the variable header format but the data length is zero and the varname is not completed by space characters. It has the following format: +-------+-------+-------+---------------------------------------+ | Offset| Length| Short | Description | +-------+-------+-------+---------------------------------------+ | 0 | 1 | MID | Machine ID | | 1 | 1 | CID | Command ID, A2 in this case | | 2 | 2 | Pl | Packet length (LL-HH) | | 2 | 2 | Dl | Data length (00 00 00 00) | | 3 | 1 | Ty | Variable Type (see next paragraph) | | 4 | 1 | Nl | Name length (0..8) | | 5 | n | Name | Name (not zero-terminated) | | 6+n | 2 | CHK | Checksum | +-------+-------+-------+---------------------------------------+ For a directory list, the request type is Ty=19 and the name length is zero. Other particular request types: 1D: backup 1A: dir (directory list) 1B: local dir 1F: directory 2.6) Data part format (0x15) ---------------------------- A data part is used whenever data or a variable content must be transmit. The data part is same as in memory. It has the following format: +-------+-------+-------+---------------------------------------+ | Offset| Length| Short | Description | +-------+-------+-------+---------------------------------------+ | 0 | 1 | MID | Machine ID | | 1 | 1 | CID | Command ID, 15 in this case | | 2 | 2 | Pl | Packet length (LL-HH) | | 2 | 2 | Dl | Data length (00 00 00 00) | | 3 | n | Data | Data | | 6+n | 2 | CHK | Checksum | +-------+-------+-------+---------------------------------------+ where HHLL is the length of the variable (real size). When a directory list or a backup is made, the data part format is different. See the corresponding section. 2.7) Variable types and file extensions --------------------------------------- Type of the variable: +----+--------------------------+-------+-------+ | 00 | expression | EXPR | .89e | | 04 | list | LIST | .89l | | 06 | matrix | MAT | .89m | | 0A | data | DATA | .89c | | 0B | text | TEXT | .89t | | 0C | string | STR | .89s | | 0D | graphic data base | GDB | .89d | | 0E | figure | FIG | .89a | | 10 | picture | PIC | .89i | | 12 | program | PRGM | .89p | | 13 | function | FUNC | .89f | | 14 | macro made by Geometry | MAC | .89x | | 1F | directory | DIR | | | 21 | assembler | ASM | .89z | | 22 | ID list | | | | 23 | AMS (Operating System) | | .89u | | 24 | FLASH application | FLASH | .89k | +----+--------------------------+-------+-------+ Files which have the ".89u" extension are OS upgrades (Advanced Mathematic Software, AMS). III) Data transfers =================== 3.1) Handshaking ---------------- In the most cases, the protocol is the following. * In sending (PC -> TI): 1 - PC: VAR or RTS var header (name, type, ...) 2 - TI: ACK continue 3 - TI: CTS wait data 4 - PC: ACK continue 5 - PC: XDP data part 6 - TI: ACK continue 7 - PC: EOT end of transmission 8 - TI: ACK end of transfert If they are several variables, repeat the 1 to 7 steps. * In receiving (TI -> PC): 1 - PC: REQ request variable 2 - TI: ACK continue 3 - TI: VAR var header 4 - PC: ACK continue 5 - PC: CTS wait data 6 - TI: ACK continue 7 - TI: XDP data part 8 - PC: ACK end of transfer 9 - TI: EOT end of transmission 0 - PC: ACK acknowledge 3.2) Calc-to-calc "manual" variable transfers --------------------------------------------- To do... 3.3) "Silent" link capability ----------------------------- TI incorporated a "Silent Link" capability into the TI-83, TI-86, and TI-92. It allows you to send and receive variables from the calculator without putting the calculator in link mode. The only drawback is that the silent send function automatically overwrites any data already in that variable on the calculator. Therefore, any program that incorporates this capability must also check to make sure this doesn't happen. The next paragraph use the silent link capability... 3.4) The remote control/command ------------------------------- PC: 08 87 LL HH send code of the key (HHLL) TI: 98 56 00 00 TI reply OK The key word is the code of the key. This code is in section B8 to B12 of the French user's manual or page 384 and next of the US manual. For example: see remote.txt 3.5) The screen dump -------------------- PC: 08 6D 00 00 PC request a screen dump TI: 98 56 00 00 TI reply OK 98 15 00 0F <... 0x0F00=3840 bytes of data terminated by the checksum ...> CHK (1 word) PC: 08 56 PC reply OK The screen of the TI calculator is a matrix of 239 columms and 128 rows of pixels. So, there are 240x128=30720 pixels -> 3840 bytes. 240=30x8 bits -> 30 bytes and 128=16x8 bits -> 16 bytes. So, 30x128=3840 and 3840x8=30720 bits. But, for the TI89, only the 160x100 upper rectangle is visible. The remaining bytes are usable (in assembler for instance) but they are not visible. For example: see screen.txt 3.6) Receiving a backup ----------------------- Indeed, receiving a backup is a group of all variables of the calculator. So, it is necessary to make a directory list in order to have the list of variables to receive. 3.7) Sending a backup --------------------- First step: PC: 08 06 0A 00 00 00 00 00 1D 04 send a backup m a i n CHK TI: 98 56 00 00 OK 98 09 00 00 wait data PC: 08 56 00 00 OK 08 92 00 00 End of transmission TI: 98 56 00 00 OK Second step: PC: 08 C9 .. .. LL LH HL HH Ty Nl name of the variable to send <full name of the var> ?? CHK TI: 98 56 00 00 OK 98 09 00 00 wait data PC: 08 56 00 00 OK 08 15 .. .. 00 00 00 00 HH LL send the content of the var <...data...> CHK TI: 98 56 00 00 OK PC: 08 92 00 00 End of transmission TI: 98 56 00 00 OK Remark: Ty can be equal to 1D (normal), 26 (locked) or 27 (archived). Repeat the second step as long as there are some variables to transmit. Once terminated, it is obvious that TI does not restart unlike a TI92. For example, see sbackup1.txt (begin) and sbackup2.txt (end). 3.8) Directory list ------------------- PC: 08 A2 06 00 00 00 00 Fl 1A 00 39 00 request a dir. list TI: 98 56 00 00 OK 98 06 0B 00 6C 01 00 0E 1A 04 m a i n 03 CHK ??? (do not change) PC: 08 56 00 00 OK 08 09 00 00 wait data TI: 98 56 00 00 OK 98 15 .. .. <... data ...> CHK listing of the folders PC: 08 56 00 00 OK TI: 98 92 00 00 EOT PC: 08 56 00 00 OK Fl is a filter. For example, if Fl=0B (TEXT variable), the data part returns all the folders and all the text variables. The data part contains the list of all the folders without the variables that they attached them. The data part has the following format: 00 00 00 00 < 8 characters completed by NULL characters > Ty Lk LL LH HL HH < 8 characters completed by NULL characters > Ty Lk LL LH HL HH ... < 8 characters completed by NULL characters > Ty Lk LL LH HL HH CHK Ty is the type of the variable. See 2.5) Lk shows if the variable is locked or archived: 00 = nothing, 01 = locked and 03 = archived LL LH HL HH is the size of the variable in memory. Apparently, the HH byte is used but for what ??? If the variable is a directory then I do not know what this number represents. Next, it is necessary to request the variables contained in a folder for each folder. Example for the 'bode' directory: PC: 08 A2 .. .. 00 00 00 1B 1A 04 b o d e CHK request a dir list TI: 98 56 00 00 OK 98 06 .. .. ?? ?? ?? ?? 1A 04 m a i n ?? CHK ??? (do not change) PC: 08 56 00 00 OK 08 09 FF FF wait data TI: 98 56 00 00 OK 98 15 .. .. <... data ...> CHK PC: 98 56 00 00 OK TI: 98 92 00 00 EOT PC: 08 56 00 00 OK The data part format has the same format as above but it contains the list of the variable name. For example, see dir_list.txt 3.9) Receiving a variable ------------------------- PC: 08 A2 .. .. 00 00 00 00 request a var with a full Ty Nl <Name of the variable> CHK pathname TI: 98 56 00 00 (*) OK 98 06 .. .. LL LH HL HH Ty Nl TI reply the local name <Name of the variable> 00 CHK of the variable PC: 08 56 00 00 OK 08 09 FF FF wait data TI: 98 56 00 00 OK 98 15 .. .. 00 00 00 00 HH LL TI send the content <... data ...> CHK of the variable PC: 08 56 00 00 OK TI: 98 92 00 00 End of transmission PC: 08 56 00 00 OK (*) If the TI reply 98 56 00 xx where xx is different of 00, the variable requested do not exist. For example, see r_var.txt 3.10) Sending a variable ------------------------ There is two ways to send a variable: with its full path or only its name. If is there only its name, the variable is recorded in the current directory. PC: 08 06 .. .. LL LH HL HH Ty Nl send <... Name of the variable (local or full)...> the 00 CHK variable TI: 98 56 00 00 OK 98 09 00 00 wait data PC: 08 56 00 00 OK 08 15 .. .. 00 00 00 00 HH LL send the content <... data ... > CHK of the variable TI: 98 56 00 00 OK PC: 08 92 00 00 end of transmission TI: 98 56 00 00 OK For example, see s_var.txt If several variables must be transmitted, see 2.4). 3.11) Checking FLASH -------------------- PC: 00 68 00 00 TI: 98 56 00 10 TI has not been FLASHed (AMS1.00) or TI: 98 56 04 10 TI has been FLASHed (AMS2.05) This is 00, not 98 !!! 3.12) The ID list ----------------- Indeed, the request is as if the TI requested the IDLIST variable. Ty=22 and Nl=00 PC: 08 A2 06 00 00 00 00 00 request the IDlist Ty Nl 22 00 TI: 98 56 00 00 OK 98 06 0D 00 12 00 00 00 Ty 06 TI reply the local name <IDLIST> 00 CHK of the variable PC: 08 56 00 00 OK 08 09 00 00 wait data TI: 98 56 00 00 OK 98 15 16 00 00 00 00 00 01 00 TI send the IDlist: 0E 00 30 33 30 36 39 44 31 42 "03069-D1BA3-FFAB" 41 33 46 46 41 42 CHK PC: 08 56 00 00 OK TI: 98 92 00 00 End of transmission PC: 08 56 00 00 OK 3.13) The FLASHing ------------------ Here, Ty=24 for FLASH applications, Ty=23 for Advanced Mathematic Software upgrade (AMS). If an AMS upgraded is sent, there is no name field and Nl=00 <name> is the name of the FLASH app or 'basecode' for AMS. First step: PC: 08 C9 XX XX LL LH HL HH Ty Nl <name> CL CH send a FLASH application with FLASH size and FLASH application name Second step: -> TI: 98 56 00 00 OK 98 09 00 00 TI reply the header size PC: 08 56 00 00 OK 08 15 00 00 <... 64 Kb of data ...> Cl Ch send a 64Kb data block TI: 98 56 00 00 OK PC: 08 78 00 00 -> The part between arrows must be repeated until there is no entire block to transmit. Once all the blocks has been transmitted, you have to transmit the last block with the remaining data as above but it is necessary to send the sequence below instead of the '08 78 00 00' final sequence: PC: 08 92 00 00 end of transmission TI: 98 56 00 00 OK which finally give: -> TI: 98 56 00 00 OK 98 09 XL XH TI reply the header size PC: 08 56 00 00 OK 08 15 Xl Xh <... 64 Kb of data ...> Cl Ch send a 64Kb data block TI: 98 56 00 00 OK PC: 08 92 00 00 end of transmission TI: 98 56 00 00 OK IV) The different variable formats ================================== About the variable format, I have written another doc about this topic. See the var_format archive.Download Driver Pack
After your driver has been downloaded, follow these simple steps to install it.
Expand the archive file (if the download file is in zip or rar format).
If the expanded file has an .exe extension, double click it and follow the installation instructions.
Otherwise, open Device Manager by right-clicking the Start menu and selecting Device Manager.
Find the device and model you want to update in the device list.
Double-click on it to open the Properties dialog box.
From the Properties dialog box, select the Driver tab.
Click the Update Driver button, then follow the instructions.
Very important: You must reboot your system to ensure that any driver updates have taken effect.
For more help, visit our Driver Support section for step-by-step videos on how to install drivers for every file type.