411 REFERENCE · Wikibooks
TI 83 Plus Assembly/Input
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
Input
There are three ways to receive input from an assembly program on your TI-83+. The first two are ROM calls, and the last one is directly interfacing with the calculator's keypad.
The ROM calls
These are two routines called with the b_call() macro. They are both good ways to receive input.
GetKey
This routine will wait for the user to press a key, and only when the user does, will it return to the main program. What is nice about this routine is that it processes [2nd] and [Alpha] key presses for you.
Parameters: None
Returns:Key value in the accumulator
To see a list of the codes, click here
Example:
.include "ti83plus.inc"
. . .
waitForUser:
bCall(_GetKey)
; [x]Or: rst $28 \ .dw $4972
; [x]Or: bCall($4972)
cp kEnter
jr nz,waitForUser
jr continue
continue:
. . .
So, the example is a simple program that pauses execution until the user presses the [Enter] key.
GetCSC
This routine is like the GetKey routine, except for two things. The first is that, unlike the GetKey routine, it will not wait for the user to press a key. The second is that it uses a different set of key codes, which you can find here. Also, it does not process key combinations, but you can make your own parser for them.
Parameters: None
Returns:Key Code in accumulator if key was pressed, else 0 (In the accumulator).
Example:
.include "ti83plus.inc"
. . .
waitForUserCSC:
bCall(_GetCSC)
cp 0
jr z,waitForUserCSC
jr nz,continue
continue:
. . .
This example waits until ANY key is pressed.
Direct Input
Note:This is a more advanced method, because it deals directly with the keyboard driver.
The keypad of the TI 83+ calculator is divided into Seven sections. These are:
The arrow keys
[ENTER], going vertically to [CLEAR]
[(-)], going vertically to [VARS]
[.], going vertically to [DEL]
[0], going vertically to [MODE]
[STO->], going vertically to [2ND]
[Y=], going horizontally to [GRAPH]
To read a value from the keys of a group, you must first turn the group on. This is done by writing to port 1 (01 hex.).
Bit 0 - Group 1
Bit 1 - Group 2
Bit 2 - Group 3
And so on. To turn a group on, you set its designated bit to 0 (zero).
Example:
. . .
waitForUserInputDirect:
; You cannot write an actual value to one of the ports. You must forward it through the (a) register.
; Use group '1'
ld a,%11111101
out ($01),a
; Read in a value
in a,($01)
; Test bit 0 (Enter)
bit 0,a
; If true, goto continue
jr z,continue
; Else
jr waitForUserInputDirect
continue:
. . .
It does the same thing as the previous two examples. Note that this method does not require any ROM calls, and is less readable. For a list of keycodes, go here.