<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wikiti.brandonw.net/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wikiti.brandonw.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84plusfreak</id>
		<title>WikiTI - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wikiti.brandonw.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=84plusfreak"/>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Special:Contributions/84plusfreak"/>
		<updated>2026-05-09T14:52:48Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.5</generator>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User_talk:84plusfreak</id>
		<title>User talk:84plusfreak</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User_talk:84plusfreak"/>
				<updated>2006-09-14T08:33:15Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Mouse/Kbd driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;nowiki&amp;gt;*poke*&amp;lt;/nowiki&amp;gt; You could just log in from that school computer. :) There should be an option to not remember you (or rather, ignore the option TO remember you). --[[User:AndyJ|Andy Janata]] 06:43, 24 Sep 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
:These computers have so many restrictions that I can't login on any site. It doesn't support cookies and all the other stuff to remember users. --[[User:84plusfreak|84plusfreak]] 00:25, 26 Sep 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
::I hate computers like that... Thankfully all the schools I've been in (well just high school and college) aren't that restrictive. --[[User:AndyJ|Andy Janata]] 12:59, 26 Sep 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Mouse/Kbd driver ==&lt;br /&gt;
&lt;br /&gt;
I am curious, what device you were writing the driver for?  Does it pass the kbd and mouse information together in a single report?  --[[User:Dan Englender|Dan Englender]] 10:44, 11 September 2006 (PDT)&lt;br /&gt;
:It's for my own Wireless Mouse/Keyboard Combo Device, but it can be used for other Mouse/Keyboard Combo Devices as well. I'm still figuring out how it passes the information. Next week I'll be in Rome. After that I'll get back to it and finish the job. Usb8x 0.11 is helping me a lot. Btw, I know where you can find the scroll wheel data. I'll send you an email on Sourceforge with the information before I leave. --[[User:84plusfreak|84plusfreak]] 01:33, 14 September 2006 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Software:usb8x/Supported_Devices</id>
		<title>83Plus:Software:usb8x/Supported Devices</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Software:usb8x/Supported_Devices"/>
				<updated>2006-09-11T12:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Works, No Complete Driver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Most USB devices that are self-powered, or draw 100mA or less current from the USB bus should be compatible with usb8x.  Below is a list of device classes and specific devices that have been tested.  Devices that require isochronous endpoints or have an integrated USB hub are not currently compatible.&lt;br /&gt;
&lt;br /&gt;
== Internal Driver ==&lt;br /&gt;
These devices work and usb8x contains an internal driver to control them.&lt;br /&gt;
* HID Keyboard&lt;br /&gt;
* HID Mouse&lt;br /&gt;
* Mass Storage Device.  Tested with:&lt;br /&gt;
** Sandisk Cruzer&lt;br /&gt;
** Lexar JumpDrive/Secure&lt;br /&gt;
** SMI Corp USB Disk&lt;br /&gt;
* TI Silverlink&lt;br /&gt;
* Some gamepad controllers.  Tested with:&lt;br /&gt;
** Logitech Precision Gamepad&lt;br /&gt;
** [http://www.retrousb.com/nintendo.html RetroZone NES pad]&lt;br /&gt;
** [http://www.planetgamecube.com/hardArt.cfm?artid=2459 Skillz Gamecube to USB] (The company no longer seems to exist.)&lt;br /&gt;
&lt;br /&gt;
== External Driver ==&lt;br /&gt;
These devices work and an external driver exists to control them.&lt;br /&gt;
* None&lt;br /&gt;
&lt;br /&gt;
== Works, No Complete Driver ==&lt;br /&gt;
These devices have been tested to work with usb8x, but no complete driver currently exists.&lt;br /&gt;
* EMS HID Playstation 2 controller adapter&lt;br /&gt;
* Vernier EasyTemp&lt;br /&gt;
* HID Mouse/Keyboard Combo (I ([[User:84plusfreak|84plusfreak]]) am writing a driver for it.)&lt;br /&gt;
&lt;br /&gt;
== Should Work ==&lt;br /&gt;
These devices have been tested to properly initialize with usb8x, but no drivers have been attempted.&lt;br /&gt;
* Canon i850 printer&lt;br /&gt;
* Canon SD400 digital camera&lt;br /&gt;
* Motorola SURFboard cable modem&lt;br /&gt;
* Motorola V220 (can act as USB Modem)&lt;br /&gt;
* TI-84 Plus (calc&amp;lt;-&amp;gt;calc)&lt;br /&gt;
&lt;br /&gt;
== Not Compatible ==&lt;br /&gt;
These devices are not compatible with usb8x.&lt;br /&gt;
* Ezonics webcam - isochronous endpoints&lt;br /&gt;
* Netgear WG111 802.11 adapter - draws too much current?&lt;br /&gt;
* SMC 802.11b adapter - draws too much current&lt;br /&gt;
* Taurus MBT-1203 bluetooth adapter - has integrated hub&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Software:usb8x/Supported_Devices</id>
		<title>83Plus:Software:usb8x/Supported Devices</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Software:usb8x/Supported_Devices"/>
				<updated>2006-08-29T10:17:19Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Should Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Internal Driver ==&lt;br /&gt;
These devices work and usb8x contains an internal driver to control them.&lt;br /&gt;
* HID Mouse&lt;br /&gt;
* Mass Storage Device.  Tested with:&lt;br /&gt;
** Sandisk Cruzer&lt;br /&gt;
** Lexar JumpDrive/Secure&lt;br /&gt;
&lt;br /&gt;
== External Driver ==&lt;br /&gt;
These devices work and an external driver exists to control them.&lt;br /&gt;
* None&lt;br /&gt;
&lt;br /&gt;
== Works, No Driver ==&lt;br /&gt;
These devices have been tested to work with usb8x, but no complete driver currently exists.&lt;br /&gt;
* HID Keyboard&lt;br /&gt;
* TI Silverlink&lt;br /&gt;
* EMS HID Playstation 2 controller adapter&lt;br /&gt;
* Vernier EasyTemp&lt;br /&gt;
&lt;br /&gt;
== Should Work ==&lt;br /&gt;
These devices have been tested to properly initialize with usb8x, but no drivers have been attempted.&lt;br /&gt;
* Canon i850 printer&lt;br /&gt;
* Logitech Precision Gamepad&lt;br /&gt;
* Motorola SURFboard cable modem&lt;br /&gt;
* Motorola V220 (can act as USB Modem)&lt;br /&gt;
* TI-84 Plus (calc&amp;lt;-&amp;gt;calc)&lt;br /&gt;
&lt;br /&gt;
== Not Compatible ==&lt;br /&gt;
These devices are not compatible with usb8x.&lt;br /&gt;
* Ezonics webcam - isochronous endpoints&lt;br /&gt;
* SMC 802.11b adapter - draws too much current&lt;br /&gt;
* Taurus MBT-1203 bluetooth adapter - has integrated hub&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:80FF</id>
		<title>Talk:83Plus:BCALLs:80FF</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:80FF"/>
				<updated>2006-06-30T19:50:32Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I called this routine with A=7A (as written in the article) and my calculator crashed.&lt;br /&gt;
When I called it with A=00 it worked like a charm.&lt;br /&gt;
Can someone confirm this? --[[User:84plusfreak|84plusfreak]] 12:49, 30 June 2006 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:80FF</id>
		<title>Talk:83Plus:BCALLs:80FF</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:80FF"/>
				<updated>2006-06-30T19:49:39Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I called this routine with A=7A and my calculator crashed.&lt;br /&gt;
When I called it with A=00 it worked like a charm.&lt;br /&gt;
Can someone confirm this? --[[User:84plusfreak|84plusfreak]] 12:49, 30 June 2006 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BC4</id>
		<title>83Plus:Hooks:9BC4</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BC4"/>
				<updated>2006-05-30T08:35:50Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Synopsis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Hooks:By Address|9BC4 - Catalog 2 Hook]]&lt;br /&gt;
[[Category:83Plus:Hooks:By Name|Catalog 2 Hook]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Name:''' Catalog 2 Hook&lt;br /&gt;
&lt;br /&gt;
'''Hook Pointer Block Address:''' [[83Plus:RAM:9BC4|9BC4]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Enable BCALL:''' [[83Plus:BCALLs:4F8D|4F8D]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Disable BCALL:''' [[83Plus:BCALLs:4F90|4F90]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Call BCALL:''' [[83Plus:BCALLs:5059|5059]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Active Flag:''' 6, (iy + 34h)&lt;br /&gt;
&lt;br /&gt;
This is one of the two catalog hooks. For an understanding on how these hooks work, see the [[83Plus:Hooks:Catalog|combined documentation]].&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BB4</id>
		<title>83Plus:Hooks:9BB4</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BB4"/>
				<updated>2006-05-30T08:10:10Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Synopsis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Hooks:By Address|9BB4 - Catalog 1 Hook]]&lt;br /&gt;
[[Category:83Plus:Hooks:By Name|Catalog 1 Hook]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Name:''' Catalog 1 Hook&lt;br /&gt;
&lt;br /&gt;
'''Hook Pointer Block Address:''' [[83Plus:RAM:9BB4|9BB4]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Enable BCALL:''' [[83Plus:BCALLs:5044|5044]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Disable BCALL:''' [[83Plus:BCALLs:5047|5047]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Call BCALL:''' [[83Plus:BCALLs:505C|505C]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Active Flag:''' 3, (iy + 36h)&lt;br /&gt;
&lt;br /&gt;
This is one of the two catalog hooks. For an understanding on how these hooks work, see the [[83Plus:Hooks:Catalog|combined documentation]].&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BB4</id>
		<title>83Plus:Hooks:9BB4</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BB4"/>
				<updated>2006-05-30T08:09:23Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Synopsis */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Hooks:By Address|9BB4 - Catalog 1 Hook]]&lt;br /&gt;
[[Category:83Plus:Hooks:By Name|Catalog 1 Hook]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Name:''' Catalog 1 Hook&lt;br /&gt;
&lt;br /&gt;
'''Hook Pointer Block Address:''' [[83Plus:RAM:9BB4|9BB4]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Enable BCALL:''' [[83Plus:BCALLs:5044|5044]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Disable BCALL:''' [[83Plus:BCALLs:5047|5047]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Call BCALL:''' ''Unknown''&lt;br /&gt;
&lt;br /&gt;
'''Hook Active Flag:''' 3, (iy + 36h)&lt;br /&gt;
&lt;br /&gt;
This is one of the two catalog hooks. For an understanding on how these hooks work, see the [[83Plus:Hooks:Catalog|combined documentation]].&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32</id>
		<title>Z80 Routines:Security:CRC32</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32"/>
				<updated>2006-05-29T15:31:13Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Memory Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]&lt;br /&gt;
&lt;br /&gt;
== Notes from the author ==&lt;br /&gt;
&lt;br /&gt;
I (84plusfreak) made this routine on-calc.&lt;br /&gt;
If you find an error, please tell me (serninpc at gmail dot com).&lt;br /&gt;
&lt;br /&gt;
== Memory Usage ==&lt;br /&gt;
&lt;br /&gt;
These routines use RAM that is also used by the built-in MD5 routines.&lt;br /&gt;
&lt;br /&gt;
The code takes 147 bytes in your program.&lt;br /&gt;
&lt;br /&gt;
== The code ==&lt;br /&gt;
&lt;br /&gt;
=== CRC32Init ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Init:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A=0 -&amp;gt; Use 'default' Polynomial (the one used in the ZIP Format)&lt;br /&gt;
  ; A=1 -&amp;gt; Use custom Polynomial&lt;br /&gt;
  ;     -&amp;gt; DEHL=Polynomial&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8292)=Polynomial&lt;br /&gt;
  ; ($8296)=Current CRC (~($8296)=CRC32)&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,DE,HL&lt;br /&gt;
  or a&lt;br /&gt;
  jr nz,$+08&lt;br /&gt;
  ld de,$EDB8&lt;br /&gt;
  ld hl,$8320&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld d,e&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,h&lt;br /&gt;
  ld h,l&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld ($8292),de&lt;br /&gt;
  ld ($8294),hl&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  ld ($8296),hl&lt;br /&gt;
  ld ($8298),hl&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Update ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Update:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; HL -&amp;gt; Points to data&lt;br /&gt;
  ; BC -&amp;gt; Number of bytes&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8296) = Updated&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld a,b&lt;br /&gt;
  or c&lt;br /&gt;
  ret z&lt;br /&gt;
  push hl&lt;br /&gt;
  push bc&lt;br /&gt;
  ld b,(hl)&lt;br /&gt;
  call CRC32Update_Routine&lt;br /&gt;
  pop bc&lt;br /&gt;
  pop hl&lt;br /&gt;
  inc hl&lt;br /&gt;
  dec bc&lt;br /&gt;
  jr CRC32Update&lt;br /&gt;
 CRC32Update_OneByte:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A = Byte to add to CRC&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld b,a&lt;br /&gt;
 CRC32Update_Routine:&lt;br /&gt;
  ld a,($8296)&lt;br /&gt;
  xor b&lt;br /&gt;
  call CRC32TableLookup&lt;br /&gt;
  ld a,($8297)&lt;br /&gt;
  xor l&lt;br /&gt;
  ld ($8296),a&lt;br /&gt;
  ld a,($8298)&lt;br /&gt;
  xor h&lt;br /&gt;
  ld ($8297),a&lt;br /&gt;
  ld a,($8299)&lt;br /&gt;
  xor e&lt;br /&gt;
  ld ($8298),a&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld ($8299),a&lt;br /&gt;
  ret&lt;br /&gt;
 CRC32TableLookup:&lt;br /&gt;
  ld de,$0000&lt;br /&gt;
  ld h,d&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld b,8&lt;br /&gt;
 CRC32TableLookupLoop:&lt;br /&gt;
  push bc&lt;br /&gt;
  or a&lt;br /&gt;
  rr d&lt;br /&gt;
  rr e&lt;br /&gt;
  rr h&lt;br /&gt;
  rr l&lt;br /&gt;
  jr nc,CRC32TableLookupLoopEnd&lt;br /&gt;
  push hl&lt;br /&gt;
  pop bc&lt;br /&gt;
  ld hl,$8292&lt;br /&gt;
  ld a,d&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld d,a&lt;br /&gt;
  ld a,e&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,b&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld b,a&lt;br /&gt;
  ld a,c&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  ld c,a&lt;br /&gt;
  push bc&lt;br /&gt;
  pop hl&lt;br /&gt;
 CRC32TableLookupLoopEnd:&lt;br /&gt;
  pop bc&lt;br /&gt;
  djnz CRC32TableLookupLoop&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Finalize ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Finalize:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; None&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; DEHL = CRC32&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld de,($8298)&lt;br /&gt;
  ld bc,($8296)&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  push hl&lt;br /&gt;
  or a&lt;br /&gt;
  sbc hl,bc&lt;br /&gt;
  ex (sp),hl&lt;br /&gt;
  sbc hl,de&lt;br /&gt;
  ex de,hl&lt;br /&gt;
  pop hl&lt;br /&gt;
  ret&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User:84plusfreak</id>
		<title>User:84plusfreak</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User:84plusfreak"/>
				<updated>2006-05-23T15:06:40Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm Sernin van de Krol. My IRC-nick is serninpc.&lt;br /&gt;
I live in The Netherlands.&lt;br /&gt;
The timezone is GMT+01:00 and we have DST.&lt;br /&gt;
&lt;br /&gt;
I've got a TI-83+SE and a TI-84+SE.&amp;lt;br&amp;gt;&lt;br /&gt;
If you've got programs that have to be converted from BASIC to ASM/APP send me an email.&lt;br /&gt;
&lt;br /&gt;
My email is: [mailto:serninpc@gmail.com serninpc@gmail.com]&amp;lt;br&amp;gt;&lt;br /&gt;
My website is: [http://www.sernin.net/ www.sernin.net]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BAC</id>
		<title>83Plus:Hooks:9BAC</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Hooks:9BAC"/>
				<updated>2006-05-18T13:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Class 3 Functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Hooks:By_Name|Parser Hook]] [[Category:83Plus:Hooks:By_Address|9BAC - Parser Hook]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Name:''' Parser Hook&lt;br /&gt;
&lt;br /&gt;
'''Hook Pointer Block Address:''' [[83Plus:RAM:9BAC|9BAC]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Enable BCALL:''' [[83Plus:BCALLs:5026|5026]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Disable BCALL:''' [[83Plus:BCALLs:5029|5029]]&lt;br /&gt;
&lt;br /&gt;
'''Hook Call BCALL:''' ''(none known)''&lt;br /&gt;
&lt;br /&gt;
'''Hook Active Flag:''' [[83Plus:Flags:36#Bit_1|1, (iy + 36h)]]&lt;br /&gt;
&lt;br /&gt;
This hook allows you to change the behavior of the TI-BASIC parser and functions.&lt;br /&gt;
&lt;br /&gt;
== Using the Hook ==&lt;br /&gt;
These different values, passed in A, determine what the hook should do.&lt;br /&gt;
* 0: The calculator is about to parse a variable.&lt;br /&gt;
** OP1 = name of variable to be parsed.&lt;br /&gt;
** Return Z if the variable should be parsed normally.&lt;br /&gt;
* 1-3: A BASIC function has been encountered.  The various types are described below.&lt;br /&gt;
** BC identifies the particular function within the class.  For many 1-byte tokens, B is the token itself; for many others, B is the OP-number given in ti83plus.inc (although some of these are incorrect.)&lt;br /&gt;
** Return Z to run the standard function. &lt;br /&gt;
&lt;br /&gt;
=== Class 1 Functions ===&lt;br /&gt;
&lt;br /&gt;
Class 1 tokens all take some positive number of arguments (zero arguments is a syntax error.)  These are separated by commas, or in the case of binary operators, by the operator itself. All of the arguments are evaluated before the function is.&lt;br /&gt;
&lt;br /&gt;
The arguments are placed on the FPS in &amp;quot;reverse&amp;quot; order.  That is to say, the earliest argument read is deepest in the stack. The final argument is in OP1.  The total number of arguments is passed in HL.&lt;br /&gt;
&lt;br /&gt;
Any of the following data types may be used (except where prohibited by syntax rules): Real, List, Matrix, Equation, String, Complex, Complex List.  Real numbers are stored on the stack as floating-point. Complex numbers are stored as two consecutive stack entries or in OP1 and OP2 (see the SDK documentation for Push/Pop OP1/3/5.)  Other data types are stored as variable names.&lt;br /&gt;
&lt;br /&gt;
A hook may do any of the following:&lt;br /&gt;
* Leave all arguments as is, and return Z.&lt;br /&gt;
* Modify arguments, or add or remove them while updating HL appropriately, and return Z.&lt;br /&gt;
* Remove all arguments from the FPS, place the result of your computation in OP1, and return NZ.&lt;br /&gt;
* Remove all arguments from the FPS, reset [[83Plus:Flags:07#Bit0|numOP1,(iy+ParsFlag2)]], and return NZ.  (This is generally preferable if you are not returning a useful value, as it will preserve Ans.)&lt;br /&gt;
&lt;br /&gt;
=== Class 2 Functions ===&lt;br /&gt;
&lt;br /&gt;
These include most &amp;quot;programming&amp;quot; commands.  No arguments are parsed.&lt;br /&gt;
&lt;br /&gt;
You may, if you are prepared to face the consequences, attempt to read the arguments yourself.  The undocumented B_CALL [[83Plus:BCALLs:4B73|IncFetch]] can be useful in doing so.&lt;br /&gt;
&lt;br /&gt;
If you return Z, the parser will run the function normally.  If you return NZ, the parser will continue execution from where you left off.&lt;br /&gt;
&lt;br /&gt;
=== Class 3 Functions ===&lt;br /&gt;
&lt;br /&gt;
If very little is known about class 2, less is known about class 3.  Tenatively, it looks like the class 2 functions that you would expect to be class 1 have class 3 secondary callbacks.&lt;br /&gt;
&lt;br /&gt;
It looks like the parameters are stored in OP1 and the FPS as in class 1 and the number of arguments is stored at [[83Plus:RAM:9661|9661]]. HL is the same as (OPS) and should be saved.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
=== Prevent running prgmEXEC ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;ParserHook:&lt;br /&gt;
        .db 83h             ; Required for all hooks&lt;br /&gt;
        or a                ; Which condition?&lt;br /&gt;
        jr nz,ReturnZ&lt;br /&gt;
        ld hl,EXECStr       ; Check whether our string&lt;br /&gt;
        ld de,OP1+1         ; matches the name to be run.&lt;br /&gt;
        call CompStrs       ; Will return NZ if they don't match&lt;br /&gt;
        jr nz,ReturnZ&lt;br /&gt;
        or 1&lt;br /&gt;
        ret&lt;br /&gt;
ReturnZ:&lt;br /&gt;
        cp a&lt;br /&gt;
        ret&lt;br /&gt;
EXECStr:&lt;br /&gt;
        .db &amp;quot;EXEC&amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
CompStrs:&lt;br /&gt;
        ld a,(de)&lt;br /&gt;
        cp (hl)&lt;br /&gt;
        ret nz&lt;br /&gt;
        inc de&lt;br /&gt;
        inc hl&lt;br /&gt;
        or a&lt;br /&gt;
        jr nz,CompStrs&lt;br /&gt;
        ret&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Random sin function ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;ParserHook:&lt;br /&gt;
        .db 83h             ; Required for all hooks&lt;br /&gt;
        or a                ; Which condition?&lt;br /&gt;
        ret z&lt;br /&gt;
        push hl&lt;br /&gt;
        ld hl,0C2C2h        ; Is it the sin( token?&lt;br /&gt;
        sbc hl,bc&lt;br /&gt;
        pop hl&lt;br /&gt;
        jr nz,ReturnZ&lt;br /&gt;
        dec hl&lt;br /&gt;
        B_CALL _DeallocFPS  ; free unused parameters&lt;br /&gt;
        B_CALL _Random&lt;br /&gt;
        or 1                ; set NZ&lt;br /&gt;
        ret&lt;br /&gt;
ReturnZ:&lt;br /&gt;
        cp a&lt;br /&gt;
        ret&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Credits and Contributions ==&lt;br /&gt;
* '''Brandon Sterner:''' Analysis, and the Symbolic source code.&lt;br /&gt;
* '''Michael Vincent:''' The Omnicalc source code.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32</id>
		<title>Z80 Routines:Security:CRC32</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32"/>
				<updated>2006-05-16T09:58:47Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]&lt;br /&gt;
&lt;br /&gt;
== Notes from the author ==&lt;br /&gt;
&lt;br /&gt;
I (84plusfreak) made this routine on-calc.&lt;br /&gt;
If you find an error, please tell me (serninpc at gmail dot com).&lt;br /&gt;
&lt;br /&gt;
== Memory Usage ==&lt;br /&gt;
&lt;br /&gt;
These routines use RAM that is also used by the built-in MD5 routines.&lt;br /&gt;
&lt;br /&gt;
The code takes 149 bytes in your program.&lt;br /&gt;
&lt;br /&gt;
== The code ==&lt;br /&gt;
&lt;br /&gt;
=== CRC32Init ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Init:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A=0 -&amp;gt; Use 'default' Polynomial (the one used in the ZIP Format)&lt;br /&gt;
  ; A=1 -&amp;gt; Use custom Polynomial&lt;br /&gt;
  ;     -&amp;gt; DEHL=Polynomial&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8292)=Polynomial&lt;br /&gt;
  ; ($8296)=Current CRC (~($8296)=CRC32)&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,DE,HL&lt;br /&gt;
  or a&lt;br /&gt;
  jr nz,$+08&lt;br /&gt;
  ld de,$EDB8&lt;br /&gt;
  ld hl,$8320&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld d,e&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,h&lt;br /&gt;
  ld h,l&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld ($8292),de&lt;br /&gt;
  ld ($8294),hl&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  ld ($8296),hl&lt;br /&gt;
  ld ($8298),hl&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Update ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Update:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; HL -&amp;gt; Points to data&lt;br /&gt;
  ; BC -&amp;gt; Number of bytes&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8296) = Updated&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld a,b&lt;br /&gt;
  or c&lt;br /&gt;
  ret z&lt;br /&gt;
  push hl&lt;br /&gt;
  push bc&lt;br /&gt;
  ld b,(hl)&lt;br /&gt;
  call CRC32Update_Routine&lt;br /&gt;
  pop bc&lt;br /&gt;
  pop hl&lt;br /&gt;
  inc hl&lt;br /&gt;
  dec bc&lt;br /&gt;
  jr CRC32Update&lt;br /&gt;
 CRC32Update_OneByte:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A = Byte to add to CRC&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld b,a&lt;br /&gt;
 CRC32Update_Routine:&lt;br /&gt;
  ld a,($8296)&lt;br /&gt;
  xor b&lt;br /&gt;
  call CRC32TableLookup&lt;br /&gt;
  ld a,($8297)&lt;br /&gt;
  xor l&lt;br /&gt;
  ld ($8296),a&lt;br /&gt;
  ld a,($8298)&lt;br /&gt;
  xor h&lt;br /&gt;
  ld ($8297),a&lt;br /&gt;
  ld a,($8299)&lt;br /&gt;
  xor e&lt;br /&gt;
  ld ($8298),a&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld ($8299),a&lt;br /&gt;
  ret&lt;br /&gt;
 CRC32TableLookup:&lt;br /&gt;
  ld de,$0000&lt;br /&gt;
  ld h,d&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld b,8&lt;br /&gt;
 CRC32TableLookupLoop:&lt;br /&gt;
  push bc&lt;br /&gt;
  or a&lt;br /&gt;
  rr d&lt;br /&gt;
  rr e&lt;br /&gt;
  rr h&lt;br /&gt;
  rr l&lt;br /&gt;
  jr nc,CRC32TableLookupLoopEnd&lt;br /&gt;
  push hl&lt;br /&gt;
  pop bc&lt;br /&gt;
  ld hl,$8292&lt;br /&gt;
  ld a,d&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld d,a&lt;br /&gt;
  ld a,e&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,b&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld b,a&lt;br /&gt;
  ld a,c&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  ld c,a&lt;br /&gt;
  push bc&lt;br /&gt;
  pop hl&lt;br /&gt;
 CRC32TableLookupLoopEnd:&lt;br /&gt;
  pop bc&lt;br /&gt;
  djnz CRC32TableLookupLoop&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Finalize ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Finalize:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; None&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; DEHL = CRC32&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld de,($8298)&lt;br /&gt;
  ld bc,($8296)&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  push hl&lt;br /&gt;
  or a&lt;br /&gt;
  sbc hl,bc&lt;br /&gt;
  ex (sp),hl&lt;br /&gt;
  sbc hl,de&lt;br /&gt;
  ex de,hl&lt;br /&gt;
  pop hl&lt;br /&gt;
  ret&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Category:Z80_Routines:Security</id>
		<title>Category:Z80 Routines:Security</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Category:Z80_Routines:Security"/>
				<updated>2006-05-16T09:53:37Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Z80 Routines|Security Routines]]&lt;br /&gt;
This is the list of all routines related to security (e.g. hash, encryption) in WikiTI.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32</id>
		<title>Z80 Routines:Security:CRC32</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32"/>
				<updated>2006-05-16T09:52:19Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: wikified&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]&lt;br /&gt;
&lt;br /&gt;
== Notes from the author ==&lt;br /&gt;
&lt;br /&gt;
I (84plusfreak) made this routine on-calc.&lt;br /&gt;
If you find an error, please tell me (serninpc at gmail dot com).&lt;br /&gt;
&lt;br /&gt;
== The code ==&lt;br /&gt;
&lt;br /&gt;
=== CRC32Init ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Init:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A=0 -&amp;gt; Use 'default' Polynomial (the one used in the ZIP Format)&lt;br /&gt;
  ; A=1 -&amp;gt; Use custom Polynomial&lt;br /&gt;
  ;     -&amp;gt; DEHL=Polynomial&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8292)=Polynomial&lt;br /&gt;
  ; ($8296)=Current CRC (~($8296)=CRC32)&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,DE,HL&lt;br /&gt;
  or a&lt;br /&gt;
  jr nz,$+08&lt;br /&gt;
  ld de,$EDB8&lt;br /&gt;
  ld hl,$8320&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld d,e&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,h&lt;br /&gt;
  ld h,l&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld ($8292),de&lt;br /&gt;
  ld ($8294),hl&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  ld ($8296),hl&lt;br /&gt;
  ld ($8298),hl&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Update ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Update:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; HL -&amp;gt; Points to data&lt;br /&gt;
  ; BC -&amp;gt; Number of bytes&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8296) = Updated&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld a,b&lt;br /&gt;
  or c&lt;br /&gt;
  ret z&lt;br /&gt;
  push hl&lt;br /&gt;
  push bc&lt;br /&gt;
  ld b,(hl)&lt;br /&gt;
  call CRC32Update_Routine&lt;br /&gt;
  pop bc&lt;br /&gt;
  pop hl&lt;br /&gt;
  inc hl&lt;br /&gt;
  dec bc&lt;br /&gt;
  jr CRC32Update&lt;br /&gt;
 CRC32Update_OneByte:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A = Byte to add to CRC&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld b,a&lt;br /&gt;
 CRC32Update_Routine:&lt;br /&gt;
  ld a,($8296)&lt;br /&gt;
  xor b&lt;br /&gt;
  call CRC32TableLookup&lt;br /&gt;
  ld a,($8297)&lt;br /&gt;
  xor l&lt;br /&gt;
  ld ($8296),a&lt;br /&gt;
  ld a,($8298)&lt;br /&gt;
  xor h&lt;br /&gt;
  ld ($8297),a&lt;br /&gt;
  ld a,($8299)&lt;br /&gt;
  xor e&lt;br /&gt;
  ld ($8298),a&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld ($8299),a&lt;br /&gt;
  ret&lt;br /&gt;
 CRC32TableLookup:&lt;br /&gt;
  ld de,$0000&lt;br /&gt;
  ld h,d&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld b,8&lt;br /&gt;
 CRC32TableLookupLoop:&lt;br /&gt;
  push bc&lt;br /&gt;
  or a&lt;br /&gt;
  rr d&lt;br /&gt;
  rr e&lt;br /&gt;
  rr h&lt;br /&gt;
  rr l&lt;br /&gt;
  jr nc,CRC32TableLookupLoopEnd&lt;br /&gt;
  push hl&lt;br /&gt;
  pop bc&lt;br /&gt;
  ld hl,$8292&lt;br /&gt;
  ld a,d&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld d,a&lt;br /&gt;
  ld a,e&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,b&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld b,a&lt;br /&gt;
  ld a,c&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  ld c,a&lt;br /&gt;
  push bc&lt;br /&gt;
  pop hl&lt;br /&gt;
 CRC32TableLookupLoopEnd:&lt;br /&gt;
  pop bc&lt;br /&gt;
  djnz CRC32TableLookupLoop&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
=== CRC32Finalize ===&lt;br /&gt;
&lt;br /&gt;
 CRC32Finalize:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; None&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; DEHL = CRC32&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld de,($8298)&lt;br /&gt;
  ld bc,($8296)&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  push hl&lt;br /&gt;
  or a&lt;br /&gt;
  sbc hl,bc&lt;br /&gt;
  ex (sp),hl&lt;br /&gt;
  sbc hl,de&lt;br /&gt;
  ex de,hl&lt;br /&gt;
  pop hl&lt;br /&gt;
  ret&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32</id>
		<title>Z80 Routines:Security:CRC32</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Z80_Routines:Security:CRC32"/>
				<updated>2006-05-16T09:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Z80 Routines:Security|CRC32]][[Category:Z80 Routines|CRC32]]&lt;br /&gt;
I (84plusfreak) made this routine on-calc.&lt;br /&gt;
If you find an error, please tell me (serninpc at gmail dot com).&lt;br /&gt;
&lt;br /&gt;
==CRC32Init==&lt;br /&gt;
&lt;br /&gt;
 CRC32Init:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A=0 -&amp;gt; Use 'default' Polynomial (the one used in the ZIP Format)&lt;br /&gt;
  ; A=1 -&amp;gt; Use custom Polynomial&lt;br /&gt;
  ;     -&amp;gt; DEHL=Polynomial&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8292)=Polynomial&lt;br /&gt;
  ; ($8296)=Current CRC (~($8296)=CRC32)&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,DE,HL&lt;br /&gt;
  or a&lt;br /&gt;
  jr nz,$+08&lt;br /&gt;
  ld de,$EDB8&lt;br /&gt;
  ld hl,$8320&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld d,e&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,h&lt;br /&gt;
  ld h,l&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld ($8292),de&lt;br /&gt;
  ld ($8294),hl&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  ld ($8296),hl&lt;br /&gt;
  ld ($8298),hl&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
==CRC32Update==&lt;br /&gt;
&lt;br /&gt;
 CRC32Update:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; HL -&amp;gt; Points to data&lt;br /&gt;
  ; BC -&amp;gt; Number of bytes&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; ($8296) = Updated&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld a,b&lt;br /&gt;
  or c&lt;br /&gt;
  ret z&lt;br /&gt;
  push hl&lt;br /&gt;
  push bc&lt;br /&gt;
  ld b,(hl)&lt;br /&gt;
  call CRC32Update_Routine&lt;br /&gt;
  pop bc&lt;br /&gt;
  pop hl&lt;br /&gt;
  inc hl&lt;br /&gt;
  dec bc&lt;br /&gt;
  jr CRC32Update&lt;br /&gt;
 CRC32Update_OneByte:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; A = Byte to add to CRC&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld b,a&lt;br /&gt;
 CRC32Update_Routine:&lt;br /&gt;
  ld a,($8296)&lt;br /&gt;
  xor b&lt;br /&gt;
  call CRC32TableLookup&lt;br /&gt;
  ld a,($8297)&lt;br /&gt;
  xor l&lt;br /&gt;
  ld ($8296),a&lt;br /&gt;
  ld a,($8298)&lt;br /&gt;
  xor h&lt;br /&gt;
  ld ($8297),a&lt;br /&gt;
  ld a,($8299)&lt;br /&gt;
  xor e&lt;br /&gt;
  ld ($8298),a&lt;br /&gt;
  ld a,d&lt;br /&gt;
  ld ($8299),a&lt;br /&gt;
  ret&lt;br /&gt;
 CRC32TableLookup:&lt;br /&gt;
  ld de,$0000&lt;br /&gt;
  ld h,d&lt;br /&gt;
  ld l,a&lt;br /&gt;
  ld b,8&lt;br /&gt;
 CRC32TableLookupLoop:&lt;br /&gt;
  push bc&lt;br /&gt;
  or a&lt;br /&gt;
  rr d&lt;br /&gt;
  rr e&lt;br /&gt;
  rr h&lt;br /&gt;
  rr l&lt;br /&gt;
  jr nc,CRC32TableLookupLoopEnd&lt;br /&gt;
  push hl&lt;br /&gt;
  pop bc&lt;br /&gt;
  ld hl,$8292&lt;br /&gt;
  ld a,d&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld d,a&lt;br /&gt;
  ld a,e&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld e,a&lt;br /&gt;
  ld a,b&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  inc hl&lt;br /&gt;
  ld b,a&lt;br /&gt;
  ld a,c&lt;br /&gt;
  xor (hl)&lt;br /&gt;
  ld c,a&lt;br /&gt;
  push bc&lt;br /&gt;
  pop hl&lt;br /&gt;
 CRC32TableLookupLoopEnd:&lt;br /&gt;
  pop bc&lt;br /&gt;
  djnz CRC32TableLookupLoop&lt;br /&gt;
  ret&lt;br /&gt;
&lt;br /&gt;
==CRC32Finalize==&lt;br /&gt;
&lt;br /&gt;
 CRC32Finalize:&lt;br /&gt;
  ;Inputs:&lt;br /&gt;
  ; None&lt;br /&gt;
  ;Outputs:&lt;br /&gt;
  ; DEHL = CRC32&lt;br /&gt;
  ;Destroys:&lt;br /&gt;
  ; AF,BC,DE,HL&lt;br /&gt;
  ld de,($8298)&lt;br /&gt;
  ld bc,($8296)&lt;br /&gt;
  ld hl,$FFFF&lt;br /&gt;
  push hl&lt;br /&gt;
  or a&lt;br /&gt;
  sbc hl,bc&lt;br /&gt;
  ex (sp),hl&lt;br /&gt;
  sbc hl,de&lt;br /&gt;
  ex de,hl&lt;br /&gt;
  pop hl&lt;br /&gt;
  ret&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:BCALLs:4522</id>
		<title>83Plus:BCALLs:4522</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:BCALLs:4522"/>
				<updated>2006-05-09T07:59:08Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:BCALLs:By Name:Display|WPutSEOL]] [[Category:83Plus:BCALLs:By Name|WPutSEOL]] [[Category:83Plus:BCALLs:By Address|4522 - WPutSEOL]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Official Name:''' WPutSEOL&lt;br /&gt;
&lt;br /&gt;
'''BCALL Address:''' 4522&lt;br /&gt;
&lt;br /&gt;
Displays a string, putting an ellipsis (an ...) on the end of row if needed.&lt;br /&gt;
&lt;br /&gt;
=== Inputs ===&lt;br /&gt;
* HL = String to display.&lt;br /&gt;
&lt;br /&gt;
=== Outputs ===&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
=== Destroys ===&lt;br /&gt;
''Unknown''&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
None&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
  ld hl,str&lt;br /&gt;
  ld de,OP1&lt;br /&gt;
  ld bc,17&lt;br /&gt;
  ldir&lt;br /&gt;
  ld hl,OP1&lt;br /&gt;
  B_CALL WPutSEOL&lt;br /&gt;
  ret&lt;br /&gt;
 str: db &amp;quot;TextTextTextText&amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
== Credits and Contributions ==&lt;br /&gt;
* '''Kirk Meyer:''' For hinting on the use of this B_CALL.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:4522</id>
		<title>Talk:83Plus:BCALLs:4522</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:4522"/>
				<updated>2006-05-06T12:50:09Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; This B_CALL never returns to the caller, when you exit the application&lt;br /&gt;
 it will return to the homescreen like it normally does.&lt;br /&gt;
Um... what?  [[User:FloppusMaximus|FloppusMaximus]] 08:53, 5 May 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I think he copied the layout from the [[83Plus:BCALLs:4C51|ExecuteApp]] page and forgot to change the last part.--[[User:84plusfreak|84plusfreak]] 05:50, 6 May 2006 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:4522</id>
		<title>Talk:83Plus:BCALLs:4522</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:BCALLs:4522"/>
				<updated>2006-05-06T12:49:56Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; This B_CALL never returns to the caller, when you exit the application&lt;br /&gt;
 it will return to the homescreen like it normally does.&lt;br /&gt;
Um... what?  [[User:FloppusMaximus|FloppusMaximus]] 08:53, 5 May 2006 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I think he copied the layout from the [[83Plus:BCALLs:4C51|ExecuteApp]] page and forgot to change the last part.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender</id>
		<title>User talk:Dan Englender</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender"/>
				<updated>2005-11-02T14:20:04Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* USB Mouse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi, I'm Dan.&lt;br /&gt;
&lt;br /&gt;
== Page 0 Calls -&amp;gt; Maybe we could create a new section? ==&lt;br /&gt;
&lt;br /&gt;
Hi Dan,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I made a page about page 0 calls. (like CALL 2EEE)&lt;br /&gt;
&lt;br /&gt;
Maybe you could create a new section for it?&lt;br /&gt;
&lt;br /&gt;
It seems to be a source of much functions.&lt;br /&gt;
&lt;br /&gt;
Thanks for your time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sernin van de Krol&lt;br /&gt;
&lt;br /&gt;
---[[User:84plusfreak|84plusfreak]] 09:01, 7 Jun 2005 (PDT)&lt;br /&gt;
: Discussion moved [[Talk:83Plus:OS:Page_0_Calls|here]] --[[User:Dan Englender|Dan Englender]] 15:15, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
== USB Mouse ==&lt;br /&gt;
&lt;br /&gt;
Can I have that App? And the instructions for connecting the mouse? ---[[User:84plusfreak|84plusfreak]] 05:22, 28 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
:The app as currently written is not very useful for anything other than a mouse demo or reading standard descriptors.  Source will be up soon though, once I clean it up and start working on a driver layer.  As for connecting the mouse, you just need to get some sort of adaptor or cable with a mini-A plug on one end, and a standard A female on the other end.  I'm using the Gold-X Quick Connect 5 in 1 set, but I think there are other options on the market too. --[[User:Dan Englender|Dan Englender]] 13:49, 28 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
:: Wal*mart has a universal cable for $15. --[[User:AndyJ|AndyJ]] 14:54, 28 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
::: I live in The Netherlands, so the Wal*mart is a little bit too far away. ;-) --[[User:84plusfreak|84plusfreak]] 06:20, 2 Nov 2005 (PST)&lt;br /&gt;
&lt;br /&gt;
To whoever felt to need to add my last name to my user page: *shrug*&lt;br /&gt;
:yeah... User pages should only be edited by the user to whom it belongs.... [[User:AndyJ|Andy Janata]] 18:02, 31 Oct 2005 (PST)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User:84plusfreak</id>
		<title>User:84plusfreak</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User:84plusfreak"/>
				<updated>2005-10-12T15:12:23Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Added website */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm Sernin van de Krol.&lt;br /&gt;
&lt;br /&gt;
I live in The Netherlands.&lt;br /&gt;
&lt;br /&gt;
The timezone is GMT+01:00 and we have DST.&lt;br /&gt;
&lt;br /&gt;
I've got a TI-83+SE and a TI-84+SE.&lt;br /&gt;
&lt;br /&gt;
If you've got programs that have to be converted from BASIC to ASM/APP send me an email.&lt;br /&gt;
&lt;br /&gt;
My email is: [mailto:serninpc@gmail.com serninpc@gmail.com]&lt;br /&gt;
&lt;br /&gt;
My website is: [http://www.sernin.net/ www.sernin.net]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User_talk:84plusfreak</id>
		<title>User talk:84plusfreak</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User_talk:84plusfreak"/>
				<updated>2005-09-26T07:25:10Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;nowiki&amp;gt;*poke*&amp;lt;/nowiki&amp;gt; You could just log in from that school computer. :) There should be an option to not remember you (or rather, ignore the option TO remember you). --[[User:AndyJ|Andy Janata]] 06:43, 24 Sep 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
:These computers have so many restrictions that I can't login on any site. It doesn't support cookies and all the other stuff to remember users. --[[User:84plusfreak|84plusfreak]] 00:25, 26 Sep 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User:213.132.169.38</id>
		<title>User:213.132.169.38</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User:213.132.169.38"/>
				<updated>2005-09-23T08:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Computer at my school --[[User:84plusfreak|84plusfreak]] 01:03, 23 Sep 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User:84plusfreak</id>
		<title>User:84plusfreak</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User:84plusfreak"/>
				<updated>2005-09-10T09:07:08Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Added my timezone&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I'm Sernin van de Krol.&lt;br /&gt;
&lt;br /&gt;
I live in The Netherlands.&lt;br /&gt;
&lt;br /&gt;
The timezone is GMT+01:00 and we have DST.&lt;br /&gt;
&lt;br /&gt;
I've got a TI-83+SE and a TI-84+SE.&lt;br /&gt;
&lt;br /&gt;
If you've got programs that have to be converted from BASIC to ASM/APP send me an email.&lt;br /&gt;
&lt;br /&gt;
My email is: [mailto:serninpc@gmail.com serninpc@gmail.com]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:How_BCALLs_work</id>
		<title>83Plus:OS:How BCALLs work</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:How_BCALLs_work"/>
				<updated>2005-09-10T09:05:36Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:OS_Information|How BCALLs work]]&lt;br /&gt;
Sorry, this article isn't very well written. It would be good if someone else could maybe look at the TI-OS code a bit and explain this better.&lt;br /&gt;
&lt;br /&gt;
BCALLs are the way to call TI-OS ROM routines, and also the way that the branch table works in multi-page apps. A BCALL is the RST 28h instruction, with a 16-bit number after it which is used to identify which routine it is calling.&lt;br /&gt;
&lt;br /&gt;
If the first bit (bit 15) of the number is set, this is what the OS does:&lt;br /&gt;
&lt;br /&gt;
*It resets bit 15&lt;br /&gt;
*It adds 0x4000 to the number&lt;br /&gt;
*It maps page 1F/3F/7F* into memory space 4000-7FFF&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit 15 is reset and bit 14 is set, this is what the OS does:&lt;br /&gt;
&lt;br /&gt;
*It resets bit 14&lt;br /&gt;
*It adds 0x4000 to the number&lt;br /&gt;
*It maps page 1B/3B/7B** into memory space 4000-7FFF&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit 15 and 14 are both reset, it is treated as a multipage app branch, which is explained in the TI developer's guide.&lt;br /&gt;
&lt;br /&gt;
Once the OS has mapped the appropriate page into 4000-7FFF, it uses the number in memory as a pointer into this page. In page 1B and 1F there are lists of vectors for the actual ROM routines. The vectors are 3 bytes, the first two bytes are a memory address and the next byte is the page that the routine is on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*1F for the TI-83 Plus, 3F for the TI-84 Plus and 7F for the TI-83 Plus Silver Edition &amp;amp; the TI-84 Plus Silver Edition.&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**1B for the TI-83 Plus, 3B for the TI-84 Plus and 7B for the TI-83 Plus Silver Edition &amp;amp; the TI-84 Plus Silver Edition.&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:How_BCALLs_work</id>
		<title>83Plus:OS:How BCALLs work</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:How_BCALLs_work"/>
				<updated>2005-09-10T09:03:36Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Added page numbers for 84+ &amp;amp; SE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sorry, this article isn't very well written. It would be good if someone else could maybe look at the TI-OS code a bit and explain this better.&lt;br /&gt;
&lt;br /&gt;
BCALLs are the way to call TI-OS ROM routines, and also the way that the branch table works in multi-page apps. A BCALL is the RST 28h instruction, with a 16-bit number after it which is used to identify which routine it is calling.&lt;br /&gt;
&lt;br /&gt;
If the first bit (bit 15) of the number is set, this is what the OS does:&lt;br /&gt;
&lt;br /&gt;
*It resets bit 15&lt;br /&gt;
*It adds 0x4000 to the number&lt;br /&gt;
*It maps page 1F/3F/7F* into memory space 4000-7FFF&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit 15 is reset and bit 14 is set, this is what the OS does:&lt;br /&gt;
&lt;br /&gt;
*It resets bit 14&lt;br /&gt;
*It adds 0x4000 to the number&lt;br /&gt;
*It maps page 1B/3B/7B** into memory space 4000-7FFF&lt;br /&gt;
&lt;br /&gt;
Otherwise, if bit 15 and 14 are both reset, it is treated as a multipage app branch, which is explained in the TI developer's guide.&lt;br /&gt;
&lt;br /&gt;
Once the OS has mapped the appropriate page into 4000-7FFF, it uses the number in memory as a pointer into this page. In page 1B and 1F there are lists of vectors for the actual ROM routines. The vectors are 3 bytes, the first two bytes are a memory address and the next byte is the page that the routine is on.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*1F for the TI-83 Plus, 3F for the TI-84 Plus and 7F for the TI-83 Plus Silver Edition &amp;amp; the TI-84 Plus Silver Edition.&amp;lt;/nowiki&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**1B for the TI-83 Plus, 3B for the TI-84 Plus and 7B for the TI-83 Plus Silver Edition &amp;amp; the TI-84 Plus Silver Edition.&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:84_Plus_USB_Information</id>
		<title>83Plus:OS:84 Plus USB Information</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:84_Plus_USB_Information"/>
				<updated>2005-07-01T12:28:32Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Port 5B */  typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:I moved this page from Talk:83Plus:BCALLs:5254 to here because it seems to fit better. Please note that this is still a work in progress, and don't take the information as gold. I figured having an option for a Talk page for this would outweigh the moving of it. For the time being, we'll leave the data formatted as-is, since it's still nicely done. --[[User:AndyJ|AndyJ]] 07:44, 27 May 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, I've started this talk page to post information about the 84 Plus USB.  This isn't the ideal place, since not all of this stuff has to do with entry point 5254, but it'll have to do.  If anyone else would like to contribute any information or thoughts, please do so.  Much of this data has been discovered by analyzing how the EasyData application interacts with the EasyTemp probe.  --[[User:Dan Englender|Dan Englender]] 22:32, 23 May 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Easy Data ==&lt;br /&gt;
The USB entry points that Easy Data uses are:&lt;br /&gt;
 5254&lt;br /&gt;
 5257&lt;br /&gt;
 525A&lt;br /&gt;
 525D&lt;br /&gt;
 5260&lt;br /&gt;
&lt;br /&gt;
These routines return carry flag with an error code in A on failure, or no carry on success.  On success they return BC=(9C16), DE=(9C1A), and HL=(9C18).  9C16 = Vendor ID.  9C18 = Device ID.  9C1A = ????.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The entry points seem to be called only on initialization and quit.  On initialization 5254 then 525D are called, and then 525A six times.  On quit, 5254, then 5260, then 5257 are called.&lt;br /&gt;
&lt;br /&gt;
=== 5254 BCALL ===&lt;br /&gt;
The 5254 entry point seems to take a callback address to be passed in A (page) and HL (address).  That callback address appears to be called on quit, after 5257 is called.&lt;br /&gt;
&lt;br /&gt;
=== 5260 and 5257 BCALLs ===&lt;br /&gt;
The 5260 and 5257 entry points are called right after each other in the code, and don't seem to take any input.  I guess they're some kind of USB shut down.  5260 doesn't do much of anything other than set 9C1E to 0000.  5257 plays with the ports some, and then clears the callback address.  Since the call back address gets called, I'm assuming it must also call the callback address somewhere in there.&lt;br /&gt;
&lt;br /&gt;
=== 525A BCALL ===&lt;br /&gt;
525A takes a pointer to a structure in HL.  9C1C will be set to the structure pointer.  Some checks on port 4C and 8F are done at teh beginning of this call.  A data segment of value: 21 09 0002 0000 0800 will be sent through the control data port.  This cooresponds to Host to Device's endpoint, vendor type, set configuration.&lt;br /&gt;
&lt;br /&gt;
=== 525D BCALL ===&lt;br /&gt;
525D takes a pointer to a structure in HL.  The 525D entry point first checks to see if bit 3 of port 4C and bits 0 and 2 of port 8F are set.  If they are not, it returns failure.  These bits are not set by, say, plugging in the hardware.  They are set, however, after 5254 has been called.  After checking these bits, 9C1E is set to the passed structure pointer.  If this value is zero, the routine will return failure.  A value of 1 will be stored to HL+2, then a value of 1 will be output to port 8E, a value of 20h to port 94h, and success will be returned.&lt;br /&gt;
&lt;br /&gt;
=== 5290 BCALL ===&lt;br /&gt;
A BCALL to 5290 alone is enough to turn on the LED on EasyTemp.  (Though it turns on to a strange orange color which is never seen during EasyData execution).  It must do some sort of USB initialization type stuff.  If bit 3,(iy+41) is set, 5290 will fail.  So this must either be a USB-already-initialized flag, or a Don't-Use-USB flag I guess.&lt;br /&gt;
&lt;br /&gt;
This BCALL appears to do the following:&lt;br /&gt;
# Do stuff&lt;br /&gt;
# Request the device descriptor with a maximum size of 8 bytes.&lt;br /&gt;
# Issue a Set Address Request, with an address of 2&lt;br /&gt;
# Request the device descriptor again, this time with a 18 byte maximum data size.&lt;br /&gt;
# Check device description for an appropriate TI or Vernier device and quit if not found.&lt;br /&gt;
# Do stuff&lt;br /&gt;
&lt;br /&gt;
Why are there two device descriptor requests?  Presumably so that the calculator can check the peripheral's max packet size (which is in the first 8 bytes), so that it will know how to segmentize further traffic.&lt;br /&gt;
&lt;br /&gt;
=== 5293 BCALL ===&lt;br /&gt;
This BCALL is enough to to turn the LED off on EasyTemp.  It's called by 5260.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
The callback routine appears to recieve some kind of input in B.  I'm not sure what yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I'm, err, not exactly clear at this point how the app actually gets the temperature data from the EasyTemp probe, as the entry point seem to only be called on init and quit.  The callback routine seemed a likely candidate, but it's not that either.  Maybe there's something going on in the interrupt that I'm not aware of.  Or maybe there are some more entry points used that I missed. ------- I'm now pretty sure that EasyData gets data through the 9C1E structure's callback which I believe returns data retrieved from an interrupt transfer in the OS's interrupt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EasyData is automatically started when you plug the EasyTemp into the USB port if: The current app is Home Screen, a program is not currently executing, and EasyTemp is loaded on the calculator.  EasyTemp is searched for via the app header table below.&lt;br /&gt;
&lt;br /&gt;
==4087 Header==&lt;br /&gt;
The calculator knows to run EasyData when the Probe is plugged in because it includes a special header at address 4087h.&lt;br /&gt;
The format is as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; db 096h, 0E2h, 00h, 01h&lt;br /&gt;
 dw TablePtr&lt;br /&gt;
.....&lt;br /&gt;
TablePtr:&lt;br /&gt;
 dw 1, TableEntryType, DataPtr&lt;br /&gt;
.....&lt;br /&gt;
DataPtr:   ;This is the EasyData data&lt;br /&gt;
 db 03h, 80h, 03h, 00h, 0F7h, 08h, 02h, 00h&lt;br /&gt;
 db      80h, 03h, 00h, 0F7h, 08h, 03h, 00h&lt;br /&gt;
 db      80h, 03h, 00h, 0F7h, 08h, 04h, 00h&lt;br /&gt;
 db 00h, 00h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
In theory, the Table should be terminated with a 0000 word.  It does not appear that EasyData does this.&lt;br /&gt;
&lt;br /&gt;
=== Header Table Entries ===&lt;br /&gt;
The TableEntryType value can be one of the follow:&lt;br /&gt;
*1 - This type is checked for in what seems to be unused OS code.  There's a string &amp;quot;IsDevice&amp;quot; that is used in conjunction with it.  Perhaps it's an unimplemented feature, or perhaps it's debug code that's not active in the release OS.  Your guess is as good as mine.&lt;br /&gt;
*2 - This is for the library functions used by OpenLib and ExecLib&lt;br /&gt;
*3 - This is for the USB auto-launch, as used by EasyData&lt;br /&gt;
&lt;br /&gt;
=== USB Data Table ===&lt;br /&gt;
If the TableEntryType is 3, then the data will be USB data and will be formatted as follows:  The first byte will be the number of entries in the USB data table.  Then, each entry, starts with a byte.  Not sure what that is.  Then comes a word.  Not really sure what that is either.  But weird things happen if the high byte is not 00.  And it appears that if the low byte is 01, only the vendor ID will be checked, if it's 03, the vendor ID and the product ID will be checked.  If it's something else, well, something else happens.  if the low byte was 03, then the next word will be the vendor ID, and the following word will be the product ID.  If both of these match a connected USB device, then the app will launch.&lt;br /&gt;
&lt;br /&gt;
=== FindSpecialAppHeader BCALL ===&lt;br /&gt;
The 50EF BCALL reads the 4087 Header.  It is used by the OS.  Returns SCF on failure, NC on success.  On success, returns in HL the read table value.  App name in OP1. Input DE is passed as the table entry to look for.  Input A holds whether to look at certain app, or all apps.  A = 0 means start at the first app, and search until you find an app with the appropriate header.  A = 1 means start searching after the app in OP1.  This would be used after the first success returned by A=0, to search the entire app list.  A=2 means search only the app named in OP1.&lt;br /&gt;
&lt;br /&gt;
=== 5263 BCALL ===&lt;br /&gt;
The 5263 BCALL reads the 4087 Header.  it is used by the OS.  This appears to be very similar to the above entry point, except that it searches all the pages by number, instead of searching by name.  Input DE = header type to find.  Output C on failure, NC on success.  HL = table entry value.  (appSearchPage) = page it was found on.  This only finds the first instance of the header type.&lt;br /&gt;
&lt;br /&gt;
=== 5266 BCALL ===&lt;br /&gt;
This allows you to continue a search you started with the 5263 BCALL.  Input page in B.&lt;br /&gt;
&lt;br /&gt;
=== 5269 BCALL ===&lt;br /&gt;
The 5269 BCALL is used by the OS after determining that an app with the USB special app header exists.  In general, this entry point seems to compare the values in the USB app header data table with the values at 9C16, 9C18, and 9C1A.  Some kind of ID I guess?  In specific, it's actually very convoluted and strange code.  Input is HL -&amp;gt; data table, A = page.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Ports 55h and 56h are initially polled in the interrupt routine to determine USB activity.  If activity is detected, 4Dh, 82h, 84h, 86h, 8Fh, 91h, and others may be polled as well.&lt;br /&gt;
&lt;br /&gt;
=== Port 4C ===&lt;br /&gt;
Some sort of status port.  Values of 1A or 5A and 12 or 52 mean something.  Default value is 22.  Some of the host routines make sure bit 3 is set.&lt;br /&gt;
&lt;br /&gt;
=== Port 4D ===&lt;br /&gt;
Some sort of status port.  Bit 4 is set if a type A cable is plugged in.  The high nibble appears to be A if nothing is plugged in, and 6 while connected to the computer.  The port is checked bit-wise, but I haven't quite figured out how the rest of the bits function yet.  I'm as yet unsure whether the values of this port are set based on external events alone, or also influenced by stuff going on in the interrupt.  Will check with interrupts disabled later.  There is a routine that is called when the bit 1 port 56 event occurs which first waits for bit 6,4D to be reset (which seems like the standard condition after a peripheral has been plugged in).  It then does some outputs to ports 3A, 39, 4C, and 8F; after which it waits for bit 6,4D to be set (which seems like the standard condition after a peripheral has been initialized).  This doesn't exactly clarify what bit 6 actually means though.&lt;br /&gt;
&lt;br /&gt;
=== Port 55 ===&lt;br /&gt;
This port determines whether there's USB activity for the interrupt routine to take notice of.  If any of the first five bits of the port are reset, that means something's happening in USB land.  &lt;br /&gt;
*bit 0 - Not sure.  Only seems to happen with peripheral.&lt;br /&gt;
*bit 1 - ???? (not checked by OS)&lt;br /&gt;
*bit 2 - Check port 56 for details on what event has happened&lt;br /&gt;
*bit 3 - ???? (not checked by OS)&lt;br /&gt;
*bit 4 - Data waiting?  Or read for data?  Or something like this.&lt;br /&gt;
&lt;br /&gt;
=== Port 56 ===&lt;br /&gt;
The default value for port 56h is 00.  If bit 2 of port 55 is reset in the interrupt routine, this port should be checked to see what event occured.  Each set bit indicates a particular event:&lt;br /&gt;
* bit 0 - I've seen this bit set while playing around, but the OS doesn't use it.&lt;br /&gt;
* bit 1 - Something to do with peripheral initialization?&lt;br /&gt;
* bit 2 - ??&lt;br /&gt;
* bit 3 - ??&lt;br /&gt;
* bit 4 - Plug-in, calc-as-host&lt;br /&gt;
* bit 5 - Unplug, calc-as-host&lt;br /&gt;
* bit 6 - Plug-in, calc-as-peripheral&lt;br /&gt;
* bit 7 - Unplug, calc-as-peripheral&lt;br /&gt;
&lt;br /&gt;
=== Port 5B ===&lt;br /&gt;
Used a lot in initialization type code, this output port takes either a value of 0 or 1.  Wish I had a clue what it was for.&lt;br /&gt;
&lt;br /&gt;
=== Port 80 ===&lt;br /&gt;
This input/output port holds the address for the device.  Valid both when acting as peripheral and when acting as host.  (Though the calculator always assigns address 2 when acting as host.)&lt;br /&gt;
&lt;br /&gt;
=== Port 82 ===&lt;br /&gt;
Bit 0 might get set to indicate that the previously sent instruction from port 91h is complete/done, or something along those lines.  Reading this port a background port monitor messes up USB connections, so reading the port probably resets it.&lt;br /&gt;
&lt;br /&gt;
=== Port 86 ===&lt;br /&gt;
Some sort of status port.  Seems to generally hold a value of 0.  Bits 5 or 7 being set seems to be an error condition.  Other bits may or may not be error conditions, though it's beginning to look like they'll all errors or abort-conditions of some kind.&lt;br /&gt;
&lt;br /&gt;
=== Port 87 ===&lt;br /&gt;
It's not clear to me what this port is, specifically.  However, outputting a value of F7h appears to imply that calculator-as-peripheral has an address.  FF has no address.&lt;br /&gt;
&lt;br /&gt;
=== Port 8C ===&lt;br /&gt;
The low byte of the 15-bit frame counter.  It is automatically incremented.  I haven't timed it, but in theory it should be incremented about once per millisecond.&lt;br /&gt;
&lt;br /&gt;
=== Port 8D ===&lt;br /&gt;
The high byte of the 15-bit frame counter.  See port 8C.&lt;br /&gt;
&lt;br /&gt;
=== Port 8E ===&lt;br /&gt;
This input/output port designates current endpoint to read from/transfer to.  Can be 0-15.&lt;br /&gt;
&lt;br /&gt;
=== Port 8F ===&lt;br /&gt;
Values of 1 or 3 are outputted to this port.  I have no clue what they mean.  After USB init, on read, it seems to be some sort of status.  Bit 2 being set appears to imply calculator-as-host, reset seems to imply calculator-as-peripheral.&lt;br /&gt;
&lt;br /&gt;
=== Port 91 ===&lt;br /&gt;
This output port seems to send some kind of command to the USB controller.  Port 82h seems to indicate when the command is ready.  Output values from host and/or peripheral:&lt;br /&gt;
*02 - Wants to send data packet previously outputed via port A0, but there are more packets to come (&amp;lt;- Not correct.  They may not be more packets.  Not sure of details.) (periph)&lt;br /&gt;
*0A - Wants to send the data packet previously outputted via port A0.(host/periph)&lt;br /&gt;
*20 - Wants to read a data packet for port A0 (send an in packet).  (host)&lt;br /&gt;
*40 - Done reading data on port A0. (send an ack?) (periph)&lt;br /&gt;
*42 - Done reading data on port A0.  (Send an ack?) (host)&lt;br /&gt;
*48 - Done reading data on port A0.  (send an ack?) (periph)&lt;br /&gt;
*60 - No data to send.  (Send NAK?) (host/periph)&lt;br /&gt;
On read, bits 2 or 4 being set indicate an error state.  Bit 2 might be NAK specifically.&lt;br /&gt;
&lt;br /&gt;
=== Port 93 ===&lt;br /&gt;
This might setup the max packet size for interrupt and bulk pipes.&lt;br /&gt;
&lt;br /&gt;
=== Port 94 ===&lt;br /&gt;
Seems to indicate, among other things, whether there's data ready to be read from port A1.&lt;br /&gt;
&lt;br /&gt;
=== Port 98 ===&lt;br /&gt;
If the description of port 9A is even remotely right, then this port has a good chance of being the same thing, but for outgoing pipes.&lt;br /&gt;
&lt;br /&gt;
=== Port 99 ===&lt;br /&gt;
While I'm making things up, if ports 98, 9A, and 9B are all correct, then maybe this is the interrupt interval for setup of outgoing interrupt pipes and 9B is incoming interrupt pipes.  *shrug*&lt;br /&gt;
&lt;br /&gt;
=== Port 9A ===&lt;br /&gt;
OK, this is quite a strech, long shot, guess, etc; but here are some possibilities for this port:  This might set up incoming pipes.  The high nibble might define the type of pipe.  2 would be bulk, and 3 would be interrupt.  That might make 1 isochronous, but I'm not going to go there.  The low nibble might be which pipe to map the current endpoint to.  This cooresponds to the port in the AX range.  So 21 would map an incoming bulk pipe to port A1h.  Or, that could all be completely nonsense.  &lt;br /&gt;
&lt;br /&gt;
=== Port 9B ===&lt;br /&gt;
This might setup the poll interval for an interrupt endpoint.  Or it might not.  Just a thought.&lt;br /&gt;
&lt;br /&gt;
=== Port A0 ===&lt;br /&gt;
I believe this is a/the data input/output port.  Control transfer port?&lt;br /&gt;
&lt;br /&gt;
=== Port A1 ===&lt;br /&gt;
Unhappily, there appears to be multiple data I/O ports.  This is another.  Interrupt transfer port?&lt;br /&gt;
&lt;br /&gt;
=== Port A2 ===&lt;br /&gt;
Port A2 has decided to join the club of data I/O ports.  Bulk transfer port?  (Shot in the dark...)&lt;br /&gt;
&lt;br /&gt;
== RAM ==&lt;br /&gt;
=== 9C13/9C14 ===&lt;br /&gt;
9C13 is the page, and 9C14 is the address of a callback routine.  It is set by the 5254 BCALL, and called at various times.  I'm not really sure what the callback routine is for yet.&lt;br /&gt;
&lt;br /&gt;
=== 9C16 ===&lt;br /&gt;
This is where the vendor ID is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C18 ===&lt;br /&gt;
This is where the product ID is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C1A ===&lt;br /&gt;
This is where the device release number is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C1C ===&lt;br /&gt;
A pointer to another structure.  Similar to 9C1E.  Output control transfers?&lt;br /&gt;
&lt;br /&gt;
=== 9C1E ===&lt;br /&gt;
A pointer to some sort of structure.  First word of structure is a pointer to some sort of receive buffer.  Reads from port A1 may be stored here.  Perhaps for interrupt transfers?  Offset 2 of structure is a byte value.  Offset 3 of structure is a callback page and address&lt;br /&gt;
&lt;br /&gt;
=== 9C26 ===&lt;br /&gt;
Byte value representing device state (calc as peripheral)&lt;br /&gt;
*0 = Device in default state&lt;br /&gt;
*1 = Device in addressed state&lt;br /&gt;
*2 = Device in configured state&lt;br /&gt;
&lt;br /&gt;
=== 9C27 ===&lt;br /&gt;
Another byte denoting something about the current state or operation.  A value of 1 might imply a host-&amp;gt;periph communication and a value of 2 might imply a periph-&amp;gt;host communication.&lt;br /&gt;
&lt;br /&gt;
=== 9C28 ===&lt;br /&gt;
Some kind of value denoting either the current state or current operation.  The 5290 reoutine initially sets this to 1, though may later change the value.  Is used to determine a lot of conditional code in various routines, especially stuff going on in the interrupt.&lt;br /&gt;
&lt;br /&gt;
=== 9C29 ===&lt;br /&gt;
This is an 8 byte output buffer&lt;br /&gt;
&lt;br /&gt;
=== 9C31 ===&lt;br /&gt;
This is an input buffer of undetermined length.  Possibly 64 bytes.&lt;br /&gt;
&lt;br /&gt;
=== 9C75 ===&lt;br /&gt;
A flag byte of some sort.  Bits 5, 6, and 7 appear to be used.  Bit 6 reset might indicate that an 84P is connected as a peripheral, set might indicate a Vernier (or perhaps &amp;quot;other&amp;quot;) peripheral.  Bit seven set might indicate that a Set Address request was just received.&lt;br /&gt;
&lt;br /&gt;
=== 9C77 ===&lt;br /&gt;
Used by the OS to hold the offset in the descriptor table of the descriptor to return.&lt;br /&gt;
&lt;br /&gt;
=== 9C78 ===&lt;br /&gt;
Used by the OS to keep track of how many bytes it needs to send for USB device request replies.&lt;br /&gt;
&lt;br /&gt;
== Flags ==&lt;br /&gt;
Flag byte 41 appears to be the main USB flag.  Bit 0 of byte 43 is also used for something related.&lt;br /&gt;
&lt;br /&gt;
=== 2,(iy+40) ===&lt;br /&gt;
If this flag is set, the 82/83 page set might be used for data storage when reading from port A2.&lt;br /&gt;
&lt;br /&gt;
=== 0,(iy+41) ===&lt;br /&gt;
If this flag is set, it will cause a certain part of USB code to abort.  This is the code that is called from the interrupt routine when port 55h is 0Fh, and port 56h is 00h.  This flag is set in an odd piece of code that loops around an output to port 0A2h.  It reads the data to output, however, from RAM pages 02h and 03h.  Will have to look into in more detail later.&lt;br /&gt;
&lt;br /&gt;
=== 2,(iy+41) ===&lt;br /&gt;
This flag is set after loading the values of 9C16, 9C18, and 9C1A.  But then it's reset if the VID/PID is 0451, E00F.  *shrug*  In BCALL 5254, it is reset after the bcall to 5290.  This bit is checked in Mon, I think.&lt;br /&gt;
&lt;br /&gt;
=== 3,(iy+41) ===&lt;br /&gt;
If this is set the BCALL 5290 will immediately terminate.  Set in Init if device is E00F.  At end of init, if flag is set, screen will turn on and be refreshed.&lt;br /&gt;
&lt;br /&gt;
=== 5,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.  This bit is checked in Mon, I think.&lt;br /&gt;
&lt;br /&gt;
=== 6,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.&lt;br /&gt;
&lt;br /&gt;
=== 7,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.&lt;br /&gt;
&lt;br /&gt;
== 84 as peripheral USB device requests ==&lt;br /&gt;
This section describes the various USB commands that the calculator, acting as a peripheral, will accept.  If the calculator receives commands that are not defined below, or if one of the checks designated as &amp;quot;makes sure&amp;quot; fails, it will set 9C84 to FF, and send a value of 60 out endpoint 0.  NAK?  Stall?&lt;br /&gt;
&lt;br /&gt;
=== Host to Device @ Device (0) ===&lt;br /&gt;
These are commands in the host to device direction, with the device (as opposed to endpoint or interface) as the recipient.&lt;br /&gt;
&lt;br /&gt;
==== Clear Feature (1) ====&lt;br /&gt;
When it receives a 0, 1 Clear Feature command, the calculator first makes sure that an address has been set (9C26 != 0).  It also makes sure that the rest of the USB packet is not all zeros, for whatever reason.  If processing is completed successfully, a value of 48 will be sent out port 91.  WValues accepted as follows:&lt;br /&gt;
*1 - According to the USB spec this is Device Remote Wakeup.  Sets 9C76 to 0.&lt;br /&gt;
*3 - Undefined according to USB spec, but this acts the same as 0,1,1 above.&lt;br /&gt;
*5 - Undefined according to USB spec, this makes sure 9C74 is zero, sets 9C73 to zero, and 9C75 to 1.&lt;br /&gt;
&lt;br /&gt;
==== Set Feature (3) ====&lt;br /&gt;
When it receives a 3 Set Feature command, the calculator checks that the rest of the packet is not all zeros.  It accepts the following wValues:&lt;br /&gt;
*1 - As per USB Spec, Sets Device Remote Wakeup.  Sets 9C76 to 2&lt;br /&gt;
*3 - Sets 9C73 to 1.&lt;br /&gt;
*4 - Sets 9C74 to 1.&lt;br /&gt;
*5 - Makes sure 9C74 is 0, and then sets 9C73 to 0 and 9C75 to 1.&lt;br /&gt;
&lt;br /&gt;
==== Set Address (5) ====&lt;br /&gt;
Sets 9C86 to FF.  Sets 9C71 to the received address value.  (This will later be loaded to port 80).  Sets bit 7 of 9C75 (which will indicate later to load the value to port 80).  Outputs a value of 1 to port 5B.  Outputs a value of 7F to port 87.&lt;br /&gt;
&lt;br /&gt;
==== Set Configuration (9) ====&lt;br /&gt;
Makes sure the device is currently in the address or configured states.  Accepts wValues as follows:&lt;br /&gt;
* 0 - This will return the device to the address state.  Sets 9C26 appropriatly and then outputs 1 to port 5B and FF to port 87.&lt;br /&gt;
* 1 - Sets the calculator configuration 1, setting 9C26 appropriatly.  Sets endpoint (8E) to 1, outputs 8 to port 90, 48 to port 91, 0 to port 92, 8 to port 93, 90 to port 94, and 0 to port 95.  Then sets endpoint to 2, and repeats port outputs.&lt;br /&gt;
&lt;br /&gt;
=== Host to Device @ Endpoint (2) ===&lt;br /&gt;
&lt;br /&gt;
==== Clear Feature (1) ====&lt;br /&gt;
Clear halt?&lt;br /&gt;
&lt;br /&gt;
==== Set Feature (3) ====&lt;br /&gt;
Set halt?&lt;br /&gt;
&lt;br /&gt;
=== Device @ Device to Host (80) ===&lt;br /&gt;
&lt;br /&gt;
==== Get Status (0) ====&lt;br /&gt;
Makes sure device is not in the default state.  Makes sure packet data is not all zero (possibly with TIOS bug).  Makes sure wLength is 2.  If 9C76 is 2, responds with two bytes at offset of D5 from descriptor table.  Otherwise responds with offset D6.  The data seems to be 0,0 either way.&lt;br /&gt;
&lt;br /&gt;
==== Get Descriptor (6) ====&lt;br /&gt;
Returns the requested descriptor.  This is complicated.  I'll fill in the details later.&lt;br /&gt;
&lt;br /&gt;
==== Get Configuration (8) ====&lt;br /&gt;
Makes sure packet isn't all zeros.  Makes sure wLength is 1.  If currently in address state, returns 00.  Otherwise returns 01.&lt;br /&gt;
&lt;br /&gt;
=== Device @ Interface to Host (81) ===&lt;br /&gt;
&lt;br /&gt;
==== Get Status (0) ====&lt;br /&gt;
Makes sure the device is not in the default state.  Makes sure packet is not all zeros.  Makes sure wIndex is 0 and wLength is 2.  Responds with 0,0.&lt;br /&gt;
&lt;br /&gt;
==== Get Interface(A) ====&lt;br /&gt;
I'm pretty sure this code is buggy, as it make sure that the device is in the default state, when it ought to be in the configured state.  Anyway, after making sure of that and making sure wIndex and wLength are 1, it returns 0.&lt;br /&gt;
&lt;br /&gt;
=== Device @ Endpoint to Host (82) ===&lt;br /&gt;
&lt;br /&gt;
==== Get Status (0) ====&lt;br /&gt;
Details later...&lt;br /&gt;
&lt;br /&gt;
== In Other News ==&lt;br /&gt;
&lt;br /&gt;
=== Stuff ===&lt;br /&gt;
* At some point, TI checks for USB devices VID: 045A, PID: E003, E008, and E00F.  It seems to return &amp;quot;ok&amp;quot; on E008 and E003, and error on E00F.  E008 is the 84P SE.  E003 is the 84P.  No clue what E00F is.  Perhaps the Viewscreen connector?&lt;br /&gt;
* I have successfully connected my calculator and digital camera, and retrieved the Product ID and Vendor ID from the camera.  Yay :)&lt;br /&gt;
* The EasyTemp is an HID device.  Haven't figured out the protocol yet.&lt;br /&gt;
* For the ever curious: if you have both the serial and USB links connected, the calculator will choose to use the USB link.&lt;br /&gt;
* I don't know exactly how much current the calculator can provide, but it can definitely provide enough to power an optical mouse.  I managed to turn the mouse on from the calculator, and everything seemed to work fine.&lt;br /&gt;
&lt;br /&gt;
=== Port Monitor ===&lt;br /&gt;
I've written a [http://wikiti.denglend.net/stuff/portmon.8xk Port Monitor] that's been useful for figuring out what some of the ports do.  It may be useful for others, but it's not extensively tested, so beware.  &amp;quot;Setup Hook&amp;quot; records port data through the USB hook.  &amp;quot;Setup Int&amp;quot; records data through an IM2 interrupt (will only take a new sample if a port in the requested range has changed).  &amp;quot;Disable Mon&amp;quot; will Stop either the interrupt or hook monitor.  &amp;quot;Exec Code&amp;quot; allows you to execute a BCALL or hex code, presumably while one of the monitors is running.  Exec program isn't implemented yet.  &amp;quot;View Data&amp;quot; allows you to view all the data by sample.  &amp;quot;View Changes&amp;quot; allows you to view the data by port, only showing ports that had data changes.  In future revisions I may add more monitor triggers through other hooks.  Oh, it doesn't read from ports 82 or A0, as these will cause problems with USB activity.  The interrupt doesn't read from ports 8C or 8D because these are just counter ports and throw off the sampling.&lt;br /&gt;
&lt;br /&gt;
=== Mouse ===&lt;br /&gt;
So, I've successfully written an HID Mouse driver.  One that, amazingly enough, actually works, with both corded and wireless optical mice.  Video proof for disbelievers: [http://wikiti.denglend.net/stuff/mouse.avi mouse.avi (7MB)].  Source code will be going on SourceForge sometime in the near future.&lt;br /&gt;
&lt;br /&gt;
=== USB Protocol ===&lt;br /&gt;
This PC&amp;lt;-&amp;gt;calc (and presumably calc&amp;lt;-&amp;gt;calc) USB protocol is different than the serial protocol.  The first word is always 0000.  The next word is, MSB first, the size of the packet minus 5.&lt;br /&gt;
A data packet of 05E000 seems to be an ack packet and can be sent in either direction.&lt;br /&gt;
&lt;br /&gt;
=== Presentation Link ===&lt;br /&gt;
The presentation link, conjectured to be the E00F device (and E00E for the 89 version) appears to request 16 byte packets?  If someone can get ahold of one of these to confirm that, it would be wonderful.&lt;br /&gt;
&lt;br /&gt;
[[Category:83Plus:OS_Information|84 Plus USB Information]]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:68</id>
		<title>83Plus:Ports:68</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:68"/>
				<updated>2005-07-01T12:19:02Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:45]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 48.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:67</id>
		<title>83Plus:Ports:67</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:67"/>
				<updated>2005-07-01T12:18:37Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:45]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 47.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:66</id>
		<title>83Plus:Ports:66</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:66"/>
				<updated>2005-07-01T12:18:19Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:45]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 46.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:65</id>
		<title>83Plus:Ports:65</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:65"/>
				<updated>2005-07-01T12:18:01Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:45]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 45.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:64</id>
		<title>83Plus:Ports:64</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:64"/>
				<updated>2005-07-01T12:17:37Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:41]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 44.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:63</id>
		<title>83Plus:Ports:63</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:63"/>
				<updated>2005-07-01T12:17:24Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:41]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 43.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:62</id>
		<title>83Plus:Ports:62</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:62"/>
				<updated>2005-07-01T12:17:06Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:41]]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:62</id>
		<title>83Plus:Ports:62</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:62"/>
				<updated>2005-07-01T12:16:54Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:42]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 42.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:61</id>
		<title>83Plus:Ports:61</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:61"/>
				<updated>2005-07-01T12:16:41Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:41]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 41.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Ports:60</id>
		<title>83Plus:Ports:60</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Ports:60"/>
				<updated>2005-07-01T12:15:33Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[83Plus:Ports:40]]&lt;br /&gt;
&lt;br /&gt;
This port is a mirror of port 40.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender</id>
		<title>User talk:Dan Englender</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender"/>
				<updated>2005-06-28T12:22:37Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: USB Mouse&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi, I'm Dan.&lt;br /&gt;
&lt;br /&gt;
== Page 0 Calls -&amp;gt; Maybe we could create a new section? ==&lt;br /&gt;
&lt;br /&gt;
Hi Dan,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I made a page about page 0 calls. (like CALL 2EEE)&lt;br /&gt;
&lt;br /&gt;
Maybe you could create a new section for it?&lt;br /&gt;
&lt;br /&gt;
It seems to be a source of much functions.&lt;br /&gt;
&lt;br /&gt;
Thanks for your time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sernin van de Krol&lt;br /&gt;
&lt;br /&gt;
---[[User:84plusfreak|84plusfreak]] 09:01, 7 Jun 2005 (PDT)&lt;br /&gt;
: Discussion moved [[Talk:83Plus:OS:Page_0_Calls|here]] --[[User:Dan Englender|Dan Englender]] 15:15, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
== USB Mouse ==&lt;br /&gt;
&lt;br /&gt;
Can I have that App? And the instructions for connecting the mouse? ---[[User:84plusfreak|84plusfreak]] 05:22, 28 Jun 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33</id>
		<title>83Plus:Flags:33</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33"/>
				<updated>2005-06-20T12:22:35Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Bit 0 */ fixed link text&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Flags:By Address|33]]&lt;br /&gt;
[[Category:83Plus:Flags:By Name|sysHookFlg0]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Flag Byte:''' 33h&lt;br /&gt;
&lt;br /&gt;
'''Known Names:''' sysHookFlg0&lt;br /&gt;
&lt;br /&gt;
== Bit Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Bit 0 ===&lt;br /&gt;
'''Unofficial Name:''' Run ONSCRPT&lt;br /&gt;
&lt;br /&gt;
You must also set [[83Plus:Flags:08|4,(iy+8)]] to run ONSCRPT.&lt;br /&gt;
&lt;br /&gt;
=== Bit 1 ===&lt;br /&gt;
'''Unofficial Name:''' Run OFFSCRPT&lt;br /&gt;
&lt;br /&gt;
=== Bit 2 ===&lt;br /&gt;
'''Unofficial Name:''' External recall queue&lt;br /&gt;
&lt;br /&gt;
If this bit is set, the recall queue is in &amp;quot;external&amp;quot; mode.  In this mode, data is read from an external RAM area, as opposed to &amp;quot;internal&amp;quot; recall mode, in which data is read directly from the buffer gap.  See [[83Plus:OS:Recall_Queue|OS Recall Queue]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Bit 3 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Override&lt;br /&gt;
&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled.&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Active Flag (bit 4).&lt;br /&gt;
&lt;br /&gt;
=== Bit 4 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Active&lt;br /&gt;
&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Override Flag (bit 3).&lt;br /&gt;
&lt;br /&gt;
=== Bit 5 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 6 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 7 ===&lt;br /&gt;
{{Unknown-flag}}&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33</id>
		<title>83Plus:Flags:33</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33"/>
				<updated>2005-06-20T12:21:17Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Bit Overview */ bit 0&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Flags:By Address|33]]&lt;br /&gt;
[[Category:83Plus:Flags:By Name|sysHookFlg0]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Flag Byte:''' 33h&lt;br /&gt;
&lt;br /&gt;
'''Known Names:''' sysHookFlg0&lt;br /&gt;
&lt;br /&gt;
== Bit Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Bit 0 ===&lt;br /&gt;
'''Unofficial Name:''' Run ONSCRPT&lt;br /&gt;
&lt;br /&gt;
You must also set [[83Plus:Flags:08]] to run ONSCRPT.&lt;br /&gt;
&lt;br /&gt;
=== Bit 1 ===&lt;br /&gt;
'''Unofficial Name:''' Run OFFSCRPT&lt;br /&gt;
&lt;br /&gt;
=== Bit 2 ===&lt;br /&gt;
'''Unofficial Name:''' External recall queue&lt;br /&gt;
&lt;br /&gt;
If this bit is set, the recall queue is in &amp;quot;external&amp;quot; mode.  In this mode, data is read from an external RAM area, as opposed to &amp;quot;internal&amp;quot; recall mode, in which data is read directly from the buffer gap.  See [[83Plus:OS:Recall_Queue|OS Recall Queue]] for more information.&lt;br /&gt;
&lt;br /&gt;
=== Bit 3 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Override&lt;br /&gt;
&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled.&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Active Flag (bit 4).&lt;br /&gt;
&lt;br /&gt;
=== Bit 4 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Active&lt;br /&gt;
&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Override Flag (bit 3).&lt;br /&gt;
&lt;br /&gt;
=== Bit 5 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 6 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 7 ===&lt;br /&gt;
{{Unknown-flag}}&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:Recall_Queue</id>
		<title>83Plus:OS:Recall Queue</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:Recall_Queue"/>
				<updated>2005-06-17T12:47:54Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: PRGM Editor Warning&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:OS Information|OS Recall Queue]]&lt;br /&gt;
''Recall Queue''&lt;br /&gt;
&lt;br /&gt;
The recall queue can be used to output on the homescreen after quitting an application or inside an hook. The tokens will be inserted as soon as the homescreen becomes visible and editable for the user. If this is used in the program editor the OS crashes.&lt;br /&gt;
&lt;br /&gt;
Here's how it works:&lt;br /&gt;
*Copy the data you want tios to recall into a saferam area that isn't erased before you return to the home screen. The data should be in the same form as they would be in a program (eg t3,tdecpt,t1,t4)&lt;br /&gt;
*Put the location of the first byte of data in [[83Plus:RAM:86D9|rclQueue]]. You need to add one to this value if you use it inside a keyhook(I didn't test any other hooks but I guess this also applies to them) Thus if you would copy the data to appbackupscreen the code would be the following (outside a keyhook):&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;ld hl,appbackupscreen&lt;br /&gt;
ld (rclQueue),hl&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
*Put the location of the last byte of data +1 in 86DBh. Thus if you would copy the data to appbackupscreen and the data would be two bytes large, the code would be the following:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;ld hl,appbackupscreen+2 ;+1 is the location of the last byte&lt;br /&gt;
ld (86DBh),hl&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
*Now you only have to set the following two flags and return/bjump back to tios.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;set 7,(IY+0Eh)&lt;br /&gt;
set 2,(IY+33h)&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33</id>
		<title>83Plus:Flags:33</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:Flags:33"/>
				<updated>2005-06-17T12:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:Flags:By Address|33]]&lt;br /&gt;
[[Category:83Plus:Flags:By Name|sysHookFlg0]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Flag Byte:''' 01h&lt;br /&gt;
&lt;br /&gt;
'''Known Names:''' sysHookFlg0&lt;br /&gt;
&lt;br /&gt;
== Bit Overview ==&lt;br /&gt;
&lt;br /&gt;
=== Bit 0 ===&lt;br /&gt;
'''Unofficial Name:''' Run ONSCRPT&lt;br /&gt;
&lt;br /&gt;
=== Bit 1 ===&lt;br /&gt;
'''Unofficial Name:''' Run OFFSCRPT&lt;br /&gt;
&lt;br /&gt;
=== Bit 2 ===&lt;br /&gt;
'''Unofficial Name:''' Recall queue waiting&lt;br /&gt;
&lt;br /&gt;
If this bit is set, there's data in the [[83Plus:OS:Recall_Queue|OS Recall Queue]].&lt;br /&gt;
&lt;br /&gt;
=== Bit 3 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Override&lt;br /&gt;
&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled.&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Active Flag (bit 4).&lt;br /&gt;
&lt;br /&gt;
=== Bit 4 ===&lt;br /&gt;
'''Unofficial Name:''' Link Activity Hook Active&lt;br /&gt;
&lt;br /&gt;
If this flag is reset, the [[83Plus:Hooks:9B78|Link Activity Hook]] is disabled&lt;br /&gt;
If this flag is set, the [[83Plus:Hooks:9B78|Link Activity Hook]] is enabled or disabled depending on the Override Flag (bit 3).&lt;br /&gt;
&lt;br /&gt;
=== Bit 5 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 6 ===&lt;br /&gt;
{{Unknown-flag}}&lt;br /&gt;
&lt;br /&gt;
=== Bit 7 ===&lt;br /&gt;
{{Unknown-flag}}&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:Small_Edit_Buffers</id>
		<title>83Plus:OS:Small Edit Buffers</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:Small_Edit_Buffers"/>
				<updated>2005-06-17T12:34:22Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: _SmallEditCxPutaway&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:OS Information|Small Edit Buffers]]&lt;br /&gt;
The TI-OS offers a number of undocumented B_CALLs and B_JUMPs that allow for input to be performed using the small font. Perhaps the best example of these functions is TI's Conics app, which uses them for inputting the variables for the relations. You can use the small edit routines for either one-line input (which scrolls left to right), or multi-line input (which will scroll up/down, wrapping text like on the homescreen.)&lt;br /&gt;
&lt;br /&gt;
The following entry points are used with the small editing routines:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;_InitSmallEditBox		EQU	4CDBh&lt;br /&gt;
_InitSmallEditBoxOP1		EQU	4D38h&lt;br /&gt;
_InitSmallEditBoxVar		EQU	4D35h&lt;br /&gt;
_InitSmallEditLine		EQU	4CA5h&lt;br /&gt;
_InitSmallEditLineOP1		EQU	4D32h&lt;br /&gt;
_InitSmallEditLineVar		EQU	4D2Fh&lt;br /&gt;
_ReleaseSEdit			EQU	4CA2h&lt;br /&gt;
_SmallEditCxErrorEP		EQU	4CC6h&lt;br /&gt;
_SmallEditCxMain		EQU	4CABh&lt;br /&gt;
_SmallEditCxPPutaway		EQU	4CC3h&lt;br /&gt;
_SmallEditCxPutaway		EQU	4CC0h&lt;br /&gt;
_SmallEditCxRedisp		EQU	4CBAh&lt;br /&gt;
_SmallEditCxSizeWind		EQU	4D2Ch&lt;br /&gt;
_StartSmallEdit			EQU	4CA8h&lt;br /&gt;
_StartSmallEditReturn		EQU	4E1Fh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Customization of the small edit buffer occurs by setting up certain areas of the RAM, with their equates listed below. Interestingly, all of these equates fall between ramCode and ramCodeEnd.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;SmallEditCancelParse		EQU	8194h&lt;br /&gt;
SmallEditColumnLeft		EQU	8177h&lt;br /&gt;
SmallEditColumnRight		EQU	8179h&lt;br /&gt;
SmallEditRow			EQU	8178h&lt;br /&gt;
SmallEditRowCount		EQU	81B7h&lt;br /&gt;
SmallEditPromptString		EQU	81CCh&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To begin an edit session, you first must setup some of the settings in RAM. All of the small edit routines require the following to be set:&lt;br /&gt;
&lt;br /&gt;
'''SmallEditCancelParse:''' Set to 03h if you do not want the small edit routines to parse the string typed, set to anything else for automatic parsing. This will be discussed later.&lt;br /&gt;
&lt;br /&gt;
'''SmallEditColumnLeft:''' The leftmost column for the small edit buffer.&lt;br /&gt;
&lt;br /&gt;
'''SmallEditColumnRight:''' The rightmost column. If the text would extend past this point, the edit routines will automatically handle scrolling.&lt;br /&gt;
&lt;br /&gt;
'''SmallEditRow:''' The row (in pixels, from the top of the screen) for the first row of the edit buffer.&lt;br /&gt;
&lt;br /&gt;
'''SmallEditPromptString:''' The string to display. This is analogous to the first string argument for the Input command in TI-BASIC. SmallEditPromptString should contain the length, in characters, and SmallEditPromptString + 1 should contain the actual string. If you don't want a string, simply set SmallEditPromptString to zero.&lt;br /&gt;
&lt;br /&gt;
Also, if you are doing multi-line input (&amp;quot;box&amp;quot; input), then you must also set SmallEditRowCount, which is the number of rows to use for editing.&lt;br /&gt;
&lt;br /&gt;
Once the various settings in RAM are setup, you must then B_CALL one of the Init entrypoints. There are six of them, with their names describing exactly what behaviors should occur, the format being _InitSmallEdit[Type][WhatToEdit]. Type is either line, which is for one line input, or Box, which does multi-line. WhatToEdit describes what should appear in the edit buffer by default. If WhatToEdit isn't there (either _InitSmallEditLine or _InitSmallEditBox), then the edit buffer is initially empty. If WhatToEdit is Var, the contents of the variable given in OP1 is used. If WhatToEdit is OP1, then OP1 is treated as a real and converted to a string, the resulting string then is placed in the edit buffer.&lt;br /&gt;
&lt;br /&gt;
The following actions are taken by the _InitSmallEdit entry points:&lt;br /&gt;
&lt;br /&gt;
* An edit buffer is opened on the &amp;quot;text_buf&amp;quot; equation, with the contents requested (if any) placed inside.&lt;br /&gt;
* The prompt string and contents of the edit buffer are displayed based on the settings in RAM and the form of InitSmallEdit called.&lt;br /&gt;
* Monitor vectors are installed to prepare for the editing. The previous monitor vectors are backed up. I believe appFlags is not touched.&lt;br /&gt;
&lt;br /&gt;
Once the small edit buffer is open, you perform the actual editing by B_CALLing _StartSmallEdit. This entrypoint saves the return page / address combination for the B_CALL to RAM, and then passes control to Mon, and editing starts.&lt;br /&gt;
&lt;br /&gt;
Editing is completed by pressing Enter or 2nd+Quit, and if you are doing line input, then also up or down. _StartSmallEdit returns with A being the key pressed that caused the edit session to complete. If you didn't disable parsing, parsing will occur (a system error is thrown if a parse error occurs), with OP1 (and maybe OP2 in the case of complex results) containing the result. Otherwise, OP1 contains the name of &amp;quot;text_buf&amp;quot;, which is:&lt;br /&gt;
&lt;br /&gt;
EquObj, 0&lt;br /&gt;
&lt;br /&gt;
Notes about _StartSmallEdit:&lt;br /&gt;
&lt;br /&gt;
* appBackUpScreen is used when backing up the image during a cxPPutAway for restoration during cxRedisp.&lt;br /&gt;
* Switching to other contexts (say by doing 2nd+Mem, 2) can cause unexpected behaviors. TI's Conics app uses a keyhook to disable various keys that open menus that contain problematic items (the memory, stat and program menus are blocked entirely, for example.)&lt;br /&gt;
* 2nd-Off also causes problems. Conics handles this by installing it's own monitor vectors, as mentioned later.&lt;br /&gt;
* If a parse error occurs, you can call this again to continue input, but it appears some internal states are messed up, so errors are always thrown (at least if we're asking it to parse for us.) If anyone can clear this up, tell me!&lt;br /&gt;
&lt;br /&gt;
Once you are done with the edit buffer, B_CALL ReleaseSEdit. This closes the edit buffer, and restores the original monitor vectors. You must do this under all conditions.&lt;br /&gt;
&lt;br /&gt;
There is an extra B_CALL _StartSmallEditReturn, which is a very odd and not very useful routine. When you B_CALL _StartSmallEdit, the top three items on the stack (placed there by the B_CALL routine itself) are popped off (and stored at 818Bh for the curious), and the SP is then saved (saved to 9D88h.) This is used so StartSmallEdit can actually return (the sp is restored, the values are pushed back, and the OS then does ret.) _StartSmallEditReturn basically restores the SP to what it was before you B_CALLed _StartSmallEdit. Incidently, this also changes the same pieces of RAM where _StartSmallEdit saved the return location, so if you were to call _StartSmallEditReturn in a hook (key hook for example), the edit session may continue, but when it's done, _StartSmallEdit will return to the op-code after where you B_CALLed _StartSmallEditReturn!&lt;br /&gt;
&lt;br /&gt;
Notes about Conic's use of the small edit routines:&lt;br /&gt;
&lt;br /&gt;
* A _GetKey hook is used for disabling various keys that open uneeded menus. Also, the softkeys are also implemented with this hook. If the user presses Graph for example, the hook sets an internal flag and changes the key to kEnter. This causes the small edit to finish (_StartSmallEdit returns), at which point the app then checks the internal flag to see if extra actions should be taken.&lt;br /&gt;
* Conics installs it's own monitor vectors before calling _StartSmallEdit (but after it calls one of the _InitSmallEdit routines.) This allows it to get putaway notification to cleanly handle 2nd+Off. It's cxMain, cxPPutaway and cxRedisp handlers simply B_JUMP to _SmallEditCxMain, _SmallEditCxPPutaway, and _SmallEditCxRedisp for handling. _SmallEditCxErrorEP an _SmallEditCxSizeWind can also be used for the same purpose. (thanks to mmartin for this info!) _SmallEditCxPutaway loads SP from 9D88h, pushes three saved items on the stack and does a ret. Which is the routine used to return in the _StartSmallEdit B_CALL.&lt;br /&gt;
* Conics parses text_buf manually by setting the SmallEditCancelParse byte, and then calling ParseInp with an error handler.&lt;br /&gt;
&lt;br /&gt;
== Credits and Contributions ==&lt;br /&gt;
* '''mmartin:''' For helping figure out some of the extra B_JUMPs&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:RAM:965B</id>
		<title>83Plus:RAM:965B</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:RAM:965B"/>
				<updated>2005-06-17T08:28:35Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:RAM:By_Name|basic_start]] [[Category:83Plus:RAM:By_Address|965B - basic_start]]&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
'''Official Name:''' no official name, calling it basic_start for now&lt;br /&gt;
&lt;br /&gt;
'''Memory Address:''' 965Bh&lt;br /&gt;
&lt;br /&gt;
'''Length:''' 2 bytes.&lt;br /&gt;
&lt;br /&gt;
This is the start address of the currently executing TI-Basic program. &lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:84_Plus_USB_Information</id>
		<title>83Plus:OS:84 Plus USB Information</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:84_Plus_USB_Information"/>
				<updated>2005-06-15T11:20:43Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: /* Stuff */ 'are' changed to 'is'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:I moved this page from Talk:83Plus:BCALLs:5254 to here because it seems to fit better. Please note that this is still a work in progress, and don't take the information as gold. I figured having an option for a Talk page for this would outweigh the moving of it. For the time being, we'll leave the data formatted as-is, since it's still nicely done. --[[User:AndyJ|AndyJ]] 07:44, 27 May 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
OK, I've started this talk page to post information about the 84 Plus USB.  This isn't the ideal place, since not all of this stuff has to do with entry point 5254, but it'll have to do.  If anyone else would like to contribute any information or thoughts, please do so.  Much of this data has been discovered by analyzing how the EasyData application interacts with the EasyTemp probe.  --[[User:Dan Englender|Dan Englender]] 22:32, 23 May 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Easy Data ==&lt;br /&gt;
The USB entry points that Easy Data uses are:&lt;br /&gt;
 5254&lt;br /&gt;
 5257&lt;br /&gt;
 525A&lt;br /&gt;
 525D&lt;br /&gt;
 5260&lt;br /&gt;
&lt;br /&gt;
These routines return carry flag with an error code in A on failure, or no carry on success.  On success they return BC=(9C16), DE=(9C1A), and HL=(9C18).  9C16 = Vendor ID.  9C18 = Device ID.  9C1A = ????.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The entry points seem to be called only on initialization and quit.  On initialization 5254 then 525D are called, and then 525A six times.  On quit, 5254, then 5260, then 5257 are called.&lt;br /&gt;
&lt;br /&gt;
=== 5254 BCALL ===&lt;br /&gt;
The 5254 entry point seems to take a callback address to be passed in A (page) and HL (address).  That callback address appears to be called on quit, after 5257 is called.&lt;br /&gt;
&lt;br /&gt;
=== 5260 and 5257 BCALLs ===&lt;br /&gt;
The 5260 and 5257 entry points are called right after each other in the code, and don't seem to take any input.  I guess they're some kind of USB shut down.  5260 doesn't do much of anything other than set 9C1E to 0000.  5257 plays with the ports some, and then clears the callback address.  Since the call back address gets called, I'm assuming it must also call the callback address somewhere in there.&lt;br /&gt;
&lt;br /&gt;
=== 525A BCALL ===&lt;br /&gt;
525A takes a pointer to a structure in HL.  9C1C will be set to the structure pointer.  Some checks on port 4C and 8F are done at teh beginning of this call.  A data segment of value: 21 09 0002 0000 0800 will be sent through the control data port.  This cooresponds to Host to Device's endpoint, vendor type, set configuration.&lt;br /&gt;
&lt;br /&gt;
=== 525D BCALL ===&lt;br /&gt;
525D takes a pointer to a structure in HL.  The 525D entry point first checks to see if bit 3 of port 4C and bits 0 and 2 of port 8F are set.  If they are not, it returns failure.  These bits are not set by, say, plugging in the hardware.  They are set, however, after 5254 has been called.  After checking these bits, 9C1E is set to the passed structure pointer.  If this value is zero, the routine will return failure.  A value of 1 will be stored to HL+2, then a value of 1 will be output to port 8E, a value of 20h to port 94h, and success will be returned.&lt;br /&gt;
&lt;br /&gt;
=== 5290 BCALL ===&lt;br /&gt;
A BCALL to 5290 alone is enough to turn on the LED on EasyTemp.  (Though it turns on to a strange orange color which is never seen during EasyData execution).  It must do some sort of USB initialization type stuff.  If bit 3,(iy+41) is set, 5290 will fail.  So this must either be a USB-already-initialized flag, or a Don't-Use-USB flag I guess.&lt;br /&gt;
&lt;br /&gt;
This BCALL appears to do the following:&lt;br /&gt;
# Do stuff&lt;br /&gt;
# Request the device descriptor with a maximum size of 8 bytes.&lt;br /&gt;
# Issue a Set Address Request, with an address of 2&lt;br /&gt;
# Request the device descriptor again, this time with a 18 byte maximum data size.&lt;br /&gt;
# Check device description for an appropriate TI or Vernier device and quit if not found.&lt;br /&gt;
# Do stuff&lt;br /&gt;
&lt;br /&gt;
Why are there two device descriptor requests?  Presumably so that the calculator can check the peripheral's max packet size (which is in the first 8 bytes), so that it will know how to segmentize further traffic.&lt;br /&gt;
&lt;br /&gt;
=== 5293 BCALL ===&lt;br /&gt;
This BCALL is enough to to turn the LED off on EasyTemp.  It's called by 5260.&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
&lt;br /&gt;
The callback routine appears to recieve some kind of input in B.  I'm not sure what yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I'm, err, not exactly clear at this point how the app actually gets the temperature data from the EasyTemp probe, as the entry point seem to only be called on init and quit.  The callback routine seemed a likely candidate, but it's not that either.  Maybe there's something going on in the interrupt that I'm not aware of.  Or maybe there are some more entry points used that I missed. ------- I'm now pretty sure that EasyData gets data through the 9C1E structure's callback which I believe returns data retrieved from an interrupt transfer in the OS's interrupt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EasyData is automatically started when you plug the EasyTemp into the USB port if: The current app is Home Screen, a program is not currently executing, and EasyTemp is loaded on the calculator.  EasyTemp is searched for via the app header table below.&lt;br /&gt;
&lt;br /&gt;
==4087 Header==&lt;br /&gt;
The calculator knows to run EasyData when the Probe is plugged in because it includes a special header at address 4087h.&lt;br /&gt;
The format is as follows:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; db 096h, 0E2h, 00h, 01h&lt;br /&gt;
 dw TablePtr&lt;br /&gt;
.....&lt;br /&gt;
TablePtr:&lt;br /&gt;
 dw 1, TableEntryType, DataPtr&lt;br /&gt;
.....&lt;br /&gt;
DataPtr:   ;This is the EasyData data&lt;br /&gt;
 db 03h, 80h, 03h, 00h, 0F7h, 08h, 02h, 00h&lt;br /&gt;
 db      80h, 03h, 00h, 0F7h, 08h, 03h, 00h&lt;br /&gt;
 db      80h, 03h, 00h, 0F7h, 08h, 04h, 00h&lt;br /&gt;
 db 00h, 00h&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
In theory, the Table should be terminated with a 0000 word.  It does not appear that EasyData does this.&lt;br /&gt;
&lt;br /&gt;
=== Header Table Entries ===&lt;br /&gt;
The TableEntryType value can be one of the follow:&lt;br /&gt;
*1 - This type is checked for in what seems to be unused OS code.  There's a string &amp;quot;IsDevice&amp;quot; that is used in conjunction with it.  Perhaps it's an unimplemented feature, or perhaps it's debug code that's not active in the release OS.  Your guess is as good as mine.&lt;br /&gt;
*2 - This is for the library functions used by OpenLib and ExecLib&lt;br /&gt;
*3 - This is for the USB auto-launch, as used by EasyData&lt;br /&gt;
&lt;br /&gt;
=== USB Data Table ===&lt;br /&gt;
If the TableEntryType is 3, then the data will be USB data and will be formatted as follows:  The first byte will be the number of entries in the USB data table.  Then, each entry, starts with a byte.  Not sure what that is.  Then comes a word.  Not really sure what that is either.  But weird things happen if the high byte is not 00.  And it appears that if the low byte is 01, only the vendor ID will be checked, if it's 03, the vendor ID and the product ID will be checked.  If it's something else, well, something else happens.  if the low byte was 03, then the next word will be the vendor ID, and the following word will be the product ID.  If both of these match a connected USB device, then the app will launch.&lt;br /&gt;
&lt;br /&gt;
=== FindSpecialAppHeader BCALL ===&lt;br /&gt;
The 50EF BCALL reads the 4087 Header.  It is used by the OS.  Returns SCF on failure, NC on success.  On success, returns in HL the read table value.  App name in OP1. Input DE is passed as the table entry to look for.  Input A holds whether to look at certain app, or all apps.  A = 0 means start at the first app, and search until you find an app with the appropriate header.  A = 1 means start searching after the app in OP1.  This would be used after the first success returned by A=0, to search the entire app list.  A=2 means search only the app named in OP1.&lt;br /&gt;
&lt;br /&gt;
=== 5263 BCALL ===&lt;br /&gt;
The 5263 BCALL reads the 4087 Header.  it is used by the OS.  This appears to be very similar to the above entry point, except that it searches all the pages by number, instead of searching by name.  Input DE = header type to find.  Output C on failure, NC on success.  HL = table entry value.  (appSearchPage) = page it was found on.  This only finds the first instance of the header type.&lt;br /&gt;
&lt;br /&gt;
=== 5266 BCALL ===&lt;br /&gt;
This allows you to continue a search you started with the 5263 BCALL.  Input page in B.&lt;br /&gt;
&lt;br /&gt;
=== 5269 BCALL ===&lt;br /&gt;
The 5269 BCALL is used by the OS after determining that an app with the USB special app header exists.  In general, this entry point seems to compare the values in the USB app header data table with the values at 9C16, 9C18, and 9C1A.  Some kind of ID I guess?  In specific, it's actually very convoluted and strange code.  Input is HL -&amp;gt; data table, A = page.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Ports 55h and 56h are initially polled in the interrupt routine to determine USB activity.  If activity is detected, 4Dh, 82h, 84h, 86h, 8Fh, 91h, and others may be polled as well.&lt;br /&gt;
&lt;br /&gt;
=== Port 4C ===&lt;br /&gt;
Some sort of status port.  Values of 1A or 5A and 12 or 52 mean something.  Default value is 22.&lt;br /&gt;
&lt;br /&gt;
=== Port 4D ===&lt;br /&gt;
Some sort of status port.  Bit 4 is set if a type A cable is plugged in.  The high nibble appears to be A if nothing is plugged in, and 6 while connected to the computer.  The port is checked bit-wise, but I haven't quite figured out how the rest of the bits function yet.  I'm as yet unsure whether the values of this port are set based on external events alone, or also influenced by stuff going on in the interrupt.  Will check with interrupts disabled later.  There is a routine that is called when the bit 1 port 56 event occurs which first waits for bit 6,4D to be reset (which seems like the standard condition after a peripheral has been plugged in).  It then does some outputs to ports 3A, 39, 4C, and 8F; after which it waits for bit 6,4D to be set (which seems like the standard condition after a peripheral has been initialized).  This doesn't exactly clarify what bit 6 actually means though.&lt;br /&gt;
&lt;br /&gt;
=== Port 55 ===&lt;br /&gt;
This port determines whether there's USB activity for the interrupt routine to take notice of.  If any of the first five bits of the port are reset, that means something's happening in USB land.  &lt;br /&gt;
*bit 0 - Not sure.  Only seems to happen with peripheral.&lt;br /&gt;
*bit 1 - ???? (not checked by OS)&lt;br /&gt;
*bit 2 - Check port 56 for details on what event has happened&lt;br /&gt;
*bit 3 - ???? (not checked by OS)&lt;br /&gt;
*bit 4 - Data waiting?  Or read for data?  Or something like this.&lt;br /&gt;
&lt;br /&gt;
=== Port 56 ===&lt;br /&gt;
The default value for port 56h is 00.  If bit 2 of port 55 is reset in the interrupt routine, this port should be checked to see what event occured.  Each set bit indicates a particular event:&lt;br /&gt;
* bit 0 - ??&lt;br /&gt;
* bit 1 - Something to do with peripheral initialization?&lt;br /&gt;
* bit 2 - ??&lt;br /&gt;
* bit 3 - ??&lt;br /&gt;
* bit 4 - Peripheral plug-in&lt;br /&gt;
* bit 5 - Peripheral unplug&lt;br /&gt;
* bit 6 - PC plug-in&lt;br /&gt;
* bit 7 - PC unplug&lt;br /&gt;
&lt;br /&gt;
=== Port 82 ===&lt;br /&gt;
Bit 0 of this input port might be reset when device is busy.  Reading this port a background port monitor messes up USB connections, so reading the port probably resets it.&lt;br /&gt;
&lt;br /&gt;
=== Port 86 ===&lt;br /&gt;
Some sort of status port.  Seems to generally hold a value of 0.  Bits 5 or 7 being set seems to be an error condition.  Other bits may or may not be error conditions, though it's beginning to look like they'll all errors or abort-conditions of some kind.&lt;br /&gt;
&lt;br /&gt;
=== Port 8C ===&lt;br /&gt;
When the USB port is initialized, this port counts from 00 to FF at some fast frequency (anyone feel like timing it?)  When it overflows it increments the value of port 8D.&lt;br /&gt;
&lt;br /&gt;
=== Port 8D ===&lt;br /&gt;
When the USB port is initialized, this port is an overflow counter, that is incremented when port 8C overflows.  Only the bottom three bits are active.  The frequency is something along the lines of 1/5 of a second, measured by eyeballing only.&lt;br /&gt;
&lt;br /&gt;
=== Port 8E ===&lt;br /&gt;
This output port might designate the type of transfer.  00 might be control, 01 might be interrupt, 02 might be bulk.  The read value is whatever was previously set by a write.&lt;br /&gt;
&lt;br /&gt;
=== Port 8F ===&lt;br /&gt;
Values of 1 or 3 are outputted to this port.  I have no clue what they mean.  After USB init, on read, it seems to be some sort of status.  Bit 2 being set appears to imply calculator-as-host, reset seems to imply calculator-as-peripheral.&lt;br /&gt;
&lt;br /&gt;
=== Port 91 ===&lt;br /&gt;
This output port might control transfer of some tokens, e.g. ACK, IN, OUT.  On read, bits 2 or 4 being set might indicate an error state.&lt;br /&gt;
&lt;br /&gt;
=== Port A0 ===&lt;br /&gt;
I believe this is a/the data input/output port.  Control transfer port?&lt;br /&gt;
&lt;br /&gt;
=== Port A1 ===&lt;br /&gt;
Unhappily, there appears to be multiple data I/O ports.  This is another.  Interrupt transfer port?&lt;br /&gt;
&lt;br /&gt;
=== Port A2 ===&lt;br /&gt;
Port A2 has decided to join the club of data I/O ports.  Bulk transfer port?  (Shot in the dark...)&lt;br /&gt;
&lt;br /&gt;
== RAM ==&lt;br /&gt;
=== 9C13/9C14 ===&lt;br /&gt;
9C13 is the page, and 9C14 is the address of a callback routine.  It is set by the 5254 BCALL, and called at various times.  I'm not really sure what the callback routine is for yet.&lt;br /&gt;
&lt;br /&gt;
=== 9C16 ===&lt;br /&gt;
This is where the vendor ID is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C18 ===&lt;br /&gt;
This is where the product ID is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C1A ===&lt;br /&gt;
This is where the device release number is stored.  It is populated by at least the 5290 BCALL, and perhaps others.&lt;br /&gt;
&lt;br /&gt;
=== 9C1C ===&lt;br /&gt;
A pointer to another structure.  Similar to 9C1E.  Output control transfers?&lt;br /&gt;
&lt;br /&gt;
=== 9C1E ===&lt;br /&gt;
A pointer to some sort of structure.  First word of structure is a pointer to some sort of receive buffer.  Reads from port A1 may be stored here.  Perhaps for interrupt transfers?  Offset 2 of structure is a byte value.  Offset 3 of structure is a callback page and address&lt;br /&gt;
&lt;br /&gt;
=== 9C27 ===&lt;br /&gt;
Another byte denoting something about the current state or operation.  A value of 1 might imply a host-&amp;gt;periph communication and a value of 2 might imply a periph-&amp;gt;host communication.&lt;br /&gt;
&lt;br /&gt;
=== 9C28 ===&lt;br /&gt;
Some kind of value denoting either the current state or current operation.  The 5290 reoutine initially sets this to 1, though may later change the value.  Is used to determine a lot of conditional code in various routines, especially stuff going on in the interrupt.&lt;br /&gt;
&lt;br /&gt;
=== 9C29 ===&lt;br /&gt;
This is an 8 byte output buffer&lt;br /&gt;
&lt;br /&gt;
=== 9C31 ===&lt;br /&gt;
This is an input buffer of undetermined length.  Possibly 64 bytes.&lt;br /&gt;
&lt;br /&gt;
=== 9C75 ===&lt;br /&gt;
A flag byte of some sort.  Bits 5, 6, and 7 appear to be used.&lt;br /&gt;
&lt;br /&gt;
=== 9C77 ===&lt;br /&gt;
Used by the OS to hold the offset in the descriptor table of the descriptor to return.&lt;br /&gt;
&lt;br /&gt;
=== 9C78 ===&lt;br /&gt;
Used by the OS to keep track of how many bytes it needs to send for descriptor replies.&lt;br /&gt;
&lt;br /&gt;
== Flags ==&lt;br /&gt;
Flag byte 41 appears to be the main USB flag.  Bit 0 of byte 43 is also used for something related.&lt;br /&gt;
&lt;br /&gt;
=== 0,(iy+41) ===&lt;br /&gt;
If this flag is set, it will cause a certain part of USB code to abort.  This is the code that is called from the interrupt routine when port 55h is 0Fh, and port 56h is 00h.  This flag is set in an odd piece of code that loops around an output to port 0A2h.  It reads the data to output, however, from RAM pages 02h and 03h.  Will have to look into in more detail later.&lt;br /&gt;
&lt;br /&gt;
=== 2,(iy+41) ===&lt;br /&gt;
This flag is set after loading the values of 9C16, 9C18, and 9C1A.  But then it's reset if the VID/PID is 0451, E00F.  *shrug*  In BCALL 5254, it is reset after the bcall to 5290.&lt;br /&gt;
&lt;br /&gt;
=== 3,(iy+41) ===&lt;br /&gt;
If this is set the BCALL 5290 will immediately terminate.  Set in Init if device is E00F.  At end of init, if flag is set, screen will turn on and be refreshed.&lt;br /&gt;
&lt;br /&gt;
=== 5,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.&lt;br /&gt;
&lt;br /&gt;
=== 6,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.&lt;br /&gt;
&lt;br /&gt;
=== 7,(iy+41) ===&lt;br /&gt;
Reset somewhere in USB code.  Not sure what it is.&lt;br /&gt;
&lt;br /&gt;
== In Other News ==&lt;br /&gt;
&lt;br /&gt;
=== Stuff ===&lt;br /&gt;
* At some point, TI checks for USB devices VID: 045A, PID: E003, E008, and E00F.  It seems to return &amp;quot;ok&amp;quot; on E008 and E003, and error on E00F.  E008 is the 84P SE.  E003 is the 83P.  No clue what E00F is.  Perhaps the Viewscreen connector?&lt;br /&gt;
* I have successfully connected my calculator and digital camera, and retrieved the Product ID and Vendor ID from the camera.  Yay :)&lt;br /&gt;
* I think EasyTemp is an HID device.  I wish I could connect it to my computer to be sure.&lt;br /&gt;
&lt;br /&gt;
=== Port Monitor ===&lt;br /&gt;
I've written a [http://wikiti.denglend.net/stuff/portmon.8xk Port Monitor] that's been useful for figuring out what some of the ports do.  It may be useful for others, but it's not extensively tested, so beware.  &amp;quot;Setup Hook&amp;quot; records port data through the USB hook.  &amp;quot;Setup Int&amp;quot; records data through an IM2 interrupt (will only take a new sample if a port in the requested range has changed).  &amp;quot;Disable Mon&amp;quot; will Stop either the interrupt or hook monitor.  &amp;quot;Exec Code&amp;quot; allows you to execute a BCALL or hex code, presumably while one of the monitors is running.  Exec program isn't implemented yet.  &amp;quot;View Data&amp;quot; allows you to view all the data by sample.  &amp;quot;View Changes&amp;quot; allows you to view the data by port, only showing ports that had data changes.  In future revisions I may add more monitor triggers through other hooks.  Oh, it doesn't read from ports 82 or A0, as these will cause problems with USB activity.  The interrupt doesn't read from ports 8C or 8D because these are just counter ports and throw off the sampling.&lt;br /&gt;
&lt;br /&gt;
[[Category:83Plus:OS_Information|84 Plus USB Information]]&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:OS:Page_0_Calls</id>
		<title>Talk:83Plus:OS:Page 0 Calls</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:OS:Page_0_Calls"/>
				<updated>2005-06-08T10:37:57Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; If you add an offset to that number and call it, you will always call the same function.&lt;br /&gt;
&lt;br /&gt;
Is this true? I guess I've never seen this before, but it would be quite nice if it is. Anyways, we need to think up a way for naming pages (our usual address method won't work here.)&lt;br /&gt;
&lt;br /&gt;
Ideas? Anyways, just pile all our info into this single page for now (no point in making a bunch of pages and then having to revise stuff later.) --[[User:JasonM|JasonM]] 10:05, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
I don't see a problem with creating a new 'namespace' for these, so long as there really is a semi-OS-independent way to use them.  Remember, though, that they are not intended to be used by apps -- if they were, they'd be B_CALLs.  And I really don't want to see programs manually garbage-collecting whenever they feel like it!  ([[User:FloppusMaximus]], too lazy to log in) 11:18, 7 Jun 2005 (PDT)&lt;br /&gt;
: I suppose we could create a new namespace and have the page name be the offset from the beginning of the &amp;quot;table&amp;quot;.  I also didn't know that it was consistent between all OS versions (though I don't think we can be '''sure''' that it will stay this way in the future, even if it has been until now), but if it's consistent between all current OS versions, then I suppose it's worth documenting.  Keep in mind that many of these calls mirror BCALLs, and if so, the pages should be linked.  --[[User:Dan Englender|Dan Englender]] 15:11, 7 Jun 2005 (PDT)&lt;br /&gt;
:By the way, anyone got a good idea for the name of the namespace?  --[[User:Dan Englender|Dan Englender]] 15:54, 7 Jun 2005 (PDT)&lt;br /&gt;
::How about 83Plus:Page0Calls? :-) Also, how sure are we that the offsets being constant is an intended design? --[[User:JasonM|JasonM]] 19:12, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::The 84-Plus has different offsets. ---[[User:84plusfreak|84plusfreak]] 03:37, 8 Jun 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=Talk:83Plus:OS:Page_0_Calls</id>
		<title>Talk:83Plus:OS:Page 0 Calls</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=Talk:83Plus:OS:Page_0_Calls"/>
				<updated>2005-06-08T10:37:40Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; If you add an offset to that number and call it, you will always call the same function.&lt;br /&gt;
&lt;br /&gt;
Is this true? I guess I've never seen this before, but it would be quite nice if it is. Anyways, we need to think up a way for naming pages (our usual address method won't work here.)&lt;br /&gt;
&lt;br /&gt;
Ideas? Anyways, just pile all our info into this single page for now (no point in making a bunch of pages and then having to revise stuff later.) --[[User:JasonM|JasonM]] 10:05, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
I don't see a problem with creating a new 'namespace' for these, so long as there really is a semi-OS-independent way to use them.  Remember, though, that they are not intended to be used by apps -- if they were, they'd be B_CALLs.  And I really don't want to see programs manually garbage-collecting whenever they feel like it!  ([[User:FloppusMaximus]], too lazy to log in) 11:18, 7 Jun 2005 (PDT)&lt;br /&gt;
: I suppose we could create a new namespace and have the page name be the offset from the beginning of the &amp;quot;table&amp;quot;.  I also didn't know that it was consistent between all OS versions (though I don't think we can be '''sure''' that it will stay this way in the future, even if it has been until now), but if it's consistent between all current OS versions, then I suppose it's worth documenting.  Keep in mind that many of these calls mirror BCALLs, and if so, the pages should be linked.  --[[User:Dan Englender|Dan Englender]] 15:11, 7 Jun 2005 (PDT)&lt;br /&gt;
:By the way, anyone got a good idea for the name of the namespace?  --[[User:Dan Englender|Dan Englender]] 15:54, 7 Jun 2005 (PDT)&lt;br /&gt;
::How about 83Plus:Page0Calls? :-) Also, how sure are we that the offsets being constant is an intended design? --[[User:JasonM|JasonM]] 19:12, 7 Jun 2005 (PDT)&lt;br /&gt;
&lt;br /&gt;
The 84-Plus has different offsets. ---[[User:84plusfreak|84plusfreak]] 03:37, 8 Jun 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender</id>
		<title>User talk:Dan Englender</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=User_talk:Dan_Englender"/>
				<updated>2005-06-07T16:01:03Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Page 0 Calls -&amp;gt; Maybe we could create a new section?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi, I'm Dan.&lt;br /&gt;
&lt;br /&gt;
== Page 0 Calls -&amp;gt; Maybe we could create a new section? ==&lt;br /&gt;
&lt;br /&gt;
Hi Dan,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I made a page about page 0 calls. (like CALL 2EEE)&lt;br /&gt;
&lt;br /&gt;
Maybe you could create a new section for it?&lt;br /&gt;
&lt;br /&gt;
It seems to be a source of much functions.&lt;br /&gt;
&lt;br /&gt;
Thanks for your time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sernin van de Krol&lt;br /&gt;
&lt;br /&gt;
---[[User:84plusfreak|84plusfreak]] 09:01, 7 Jun 2005 (PDT)&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls</id>
		<title>83Plus:OS:Page 0 Calls</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls"/>
				<updated>2005-06-07T16:00:00Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Corrected pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:OS_Information|Page 0 Calls]]&lt;br /&gt;
&lt;br /&gt;
The address of the first page 0 call is saved at 44FB on page 1B,3B or 7B. (Depending on your device)&lt;br /&gt;
&lt;br /&gt;
If you add an offset to that number and call it, you will always call the same function.&lt;br /&gt;
&lt;br /&gt;
For example: Adding 10b6 to the number read from 44FB on page 1B/3B/7B gives you the address of the function that returns the last 4 digits of the Calc-ID.&lt;br /&gt;
&lt;br /&gt;
Another one: The offset for GCing is 032A.&lt;br /&gt;
&lt;br /&gt;
This call has the following inputs:&lt;br /&gt;
 A=Type, B=Confirmation&lt;br /&gt;
 &lt;br /&gt;
 A = 0 -&amp;gt; GC&lt;br /&gt;
 A = 1 -&amp;gt; Defrag&lt;br /&gt;
 A = 3 -&amp;gt; ?&lt;br /&gt;
 A = 4 -&amp;gt; ?&lt;br /&gt;
 A = 5 -&amp;gt; ?&lt;br /&gt;
 A = 6 -&amp;gt; ?&lt;br /&gt;
 B = 0 -&amp;gt; No confirmation&lt;br /&gt;
 B = 1 -&amp;gt; Ask user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maybe one of the staff members could create a section which contains page 0 calls.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls</id>
		<title>83Plus:OS:Page 0 Calls</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls"/>
				<updated>2005-06-07T15:57:26Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Added category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:83Plus:OS_Information|Page 0 Calls]]&lt;br /&gt;
&lt;br /&gt;
The address of the first page 0 call is saved at 44FB on page 1F,3F or 7F. (Depending on your device)&lt;br /&gt;
&lt;br /&gt;
If you add an offset to that number and call it, you will always call the same function.&lt;br /&gt;
&lt;br /&gt;
For example: Adding 10b6 to the number read from 44FB on page 1F/3F/7F gives you the address of the function that returns the last 4 digits of the Calc-ID.&lt;br /&gt;
&lt;br /&gt;
Another one: The offset for GCing is 032A.&lt;br /&gt;
&lt;br /&gt;
This call has the following inputs:&lt;br /&gt;
 A=Type, B=Confirmation&lt;br /&gt;
 &lt;br /&gt;
 A = 0 -&amp;gt; GC&lt;br /&gt;
 A = 1 -&amp;gt; Defrag&lt;br /&gt;
 A = 3 -&amp;gt; ?&lt;br /&gt;
 A = 4 -&amp;gt; ?&lt;br /&gt;
 A = 5 -&amp;gt; ?&lt;br /&gt;
 A = 6 -&amp;gt; ?&lt;br /&gt;
 B = 0 -&amp;gt; No confirmation&lt;br /&gt;
 B = 1 -&amp;gt; Ask user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maybe one of the staff members could create a section which contains page 0 calls.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	<entry>
		<id>https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls</id>
		<title>83Plus:OS:Page 0 Calls</title>
		<link rel="alternate" type="text/html" href="https://wikiti.brandonw.net/index.php?title=83Plus:OS:Page_0_Calls"/>
				<updated>2005-06-07T15:56:36Z</updated>
		
		<summary type="html">&lt;p&gt;84plusfreak: Page 0 Calls -&amp;gt; Maybe we could create a new section?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The address of the first page 0 call is saved at 44FB on page 1F,3F or 7F. (Depending on your device)&lt;br /&gt;
&lt;br /&gt;
If you add an offset to that number and call it, you will always call the same function.&lt;br /&gt;
&lt;br /&gt;
For example: Adding 10b6 to the number read from 44FB on page 1F/3F/7F gives you the address of the function that returns the last 4 digits of the Calc-ID.&lt;br /&gt;
&lt;br /&gt;
Another one: The offset for GCing is 032A.&lt;br /&gt;
&lt;br /&gt;
This call has the following inputs:&lt;br /&gt;
 A=Type, B=Confirmation&lt;br /&gt;
 &lt;br /&gt;
 A = 0 -&amp;gt; GC&lt;br /&gt;
 A = 1 -&amp;gt; Defrag&lt;br /&gt;
 A = 3 -&amp;gt; ?&lt;br /&gt;
 A = 4 -&amp;gt; ?&lt;br /&gt;
 A = 5 -&amp;gt; ?&lt;br /&gt;
 A = 6 -&amp;gt; ?&lt;br /&gt;
 B = 0 -&amp;gt; No confirmation&lt;br /&gt;
 B = 1 -&amp;gt; Ask user&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maybe one of the staff members could create a section which contains page 0 calls.&lt;/div&gt;</summary>
		<author><name>84plusfreak</name></author>	</entry>

	</feed>