Port 0 - Screen Offset

Port 0 is used for the screen offset. You can only write to this port. You can send any value between $00 and $3c. These equations show the relationship between what is sent and the resulting address. Address is the address of the Video Memory and send is the byte sent out port 0.
address = $100 * ( send + $c0 )

send =  address - $c000 
	     $100

Port 1 - Key Port

Port 1 is used for the keypresses. If you don't remember us talking about that, look back at the keypress section. I went into some pretty good detail about it.

Port 2 - Contrast

Port 2 is used to adjust the contrast. It is another write-only port. You can send any value between 0 and 31 to specify different contrast levels. Since it's a read-only port, there has to be some way of recording what we do to it. We have to save what we do with that port into _contrast ($c008). We have to check what that value is, see if it's maxed out or at the minimum. Then we send the new contrast through port 2 and save what we did to _contrast. The program Contrast.asm is an example of changing the contrast with the Up and Down keys. Here's another routine that increases the contrast if possible.
_contrast	=$c008		;where contrast is stored
contrast_port	=2		;port controlling contrast

increase_contrast:
	ld hl,_contrast		;address of contrast
	ld a,(hl)		;get contrast
	cp 31			;compare it to max
	ret z			;it was 31 so return
	inc a			;increase contrast
	ld (hl),a		;put back changes
	out (contrast_port),a	;update contrast
	ret

Port 3 - [ON] and Interrupts

Port 3 is used with the [ON] button and the LCD power. This is a read and write port. Here's a chart to tell you what the bits mean when they're either set or reset:
  Set Reset
Read: Bit 3 - [ON] key was not pressed
Bit 2 - Timer interrupt happened
Bit 1 - LCD is on
Bit 0 - [ON] interrupt happened
Bit 3 - [ON] was pressed
Bit 2 - Timer interrupt hasn't happened
Bit 1 - LCD is off
Bit 0 - [ON] interrupt hasn't happened
Write: Bit 3 - Turn LCD off
Bit 2 - Don't mask timer interrupts (200Hz)
Bit 1 - LCD status on*
Bit 0 - Don't mask [ON] key interrupts*
Bit 3 - Turn LCD on
Bit 2 - Mask timer interrupts (200Hz)
Bit 1 - LCD status off
Bit 0 - Mask [ON] key interrupts

* Don't exit to TI-OS with bits 0 or 1 reset or the calculator will freeze.

The PressOn.asm program shows how to check for [ON] being pressed like this. More on this in the On-Off Section.

	in a,(on_port)		;get status
	bit 3,a			;on's bit..reset if down
	call z,pressing		;[on] is being held
				; down now so call
				; 'pressing' routine

You can turn off the screen manually too. Note that this doesn't turn off the calculator, it merely quits refreshing the Video Memory to the screen. The TI86 will still be running in normal power mode, as opposed to low power mode when TI-OS turns if off. Details in the On-Off Section. Since the processor is executing this code fast, it will be turning on and off probably 50 times while you're pushing the [ON] button down and releasing it. You can try to slow down the processor some by having it check other stuff in the mean time or just doing other tasks instead of continually checking for the [ON] key being pressed.

turn_off:
	ld a,%00000001
	out (3),a		;turn off lcd
	halt			;wait for [on]
	ld a,%00000010
	out (3),a		;turn on lcd
        res onInterrupt,(iy+onFlags)
				;turn off the flag so
				;ti-os doesn't detect it too
	ret

Port 4 - Power Mode

Port 4 is used for the the Power Mode mainly. It's either in Normal Power Mode or Low Power Mode. This is all done with bit 0. TI-OS puts the calculator in Low Power Mode before shutting down to save battery life. If bit 0 is reset, it's in Low Power Mode; set is High Power Mode. Here's how to check if it's in low power mode.
mode_port	=4		;port to check
power_mode:
	in a,(mode_port)	;get status
	bit 0,a			;check mode
	jr z,in_low_power_mode	;is in low power mode
	ret

Port 5 - ROM Pages

See Memory and R_M Pages.

Port 6 - RAM Pages

See Memory and R_M Pages.

Port 7 - Link Port

Port 7 is used for the link port. It can be used for sound, memory expanders, or sending/receiving information. I haven't researched this area much. Check back sometime because I've ordered a second TI86 to work with.

I can direct you to Randy Gluvna's LinkRout.h or ACZ's copy Link86.asm. With this routine, you will be able to send and receive single bytes. I'm sorry for the inconvenience this may have caused.