Tutorial 14
User Input via Key pad

Overview

For those of you who have had experience with TI-83 Asm programming, you will note that the below program looks familiar. That's because it is the exact same program from tutorial 7 in James Matthew's Asmguru! This proves that TI-83 Asm programs will run on a TI-83 Plus with just a few minor changes. Therefore I assume no responsibility for writing this program, just porting it. This program takes user input from the TI's key pad to move a dot about the screen. Sort of like a small sprite! This program uses Getkey(Tutorial 8) call. Only this time we've narrowed the area in which getkey scans the keyboard to the Arrow keys and the clear key.

Programming

Here we go...

#define B_CALL(xxxx)	rst 28h \ .dw xxxx		
#define B_JUMP(xxxx)	call 50h \ .dw xxxx	

_RunIndicOff	= 4570h
_IPoint		= 47E3h
_getkey		= 4972h
_clrlcdfull		= 4540h
_homeup		= 4558h

#DEFINE kLeft       02h
#DEFINE kRight      01h
#DEFINE kUp         03h
#DEFINE kDown       04h     ;All these guys are hex code
#DEFINE kEnter      05h     ;for keys on the Ti-keyboard.
#DEFINE kClear      09h

.org 9D95h
	
	B_CALL(_clrLCDFull)	;Clear the screen.
	ld b,47
	ld c,47
	ld d,1			;Set D to 1.
	B_CALL(_IPoint)		 
	B_CALL(_runIndicOff)	;Turn off run indicator.
GetKey:
	B_CALL(_getKey)		;Asked for a key.
	cp kLeft		;Compare key with code for left.
	jp z,Left		;If equals 0, go to left.
	cp kRight			
	jp z,Right
	cp kUp
	jp z,Up
	cp kDown
	jp z,Down
	cp kClear
	jp z,Quit
	jp GetKey
Left:
	ld d,0			;Set D to 0.
	B_CALL(_IPoint)		
	dec b			;Decrement B
	jp Draw
Right:
	ld d,0
	B_CALL(_IPoint)
	inc b
	jp Draw
Up:	
	ld d,0
	B_CALL(_IPoint)
	inc c
	jp Draw
Down:
	ld d,0
	B_CALL(_IPoint)
	dec c
	jp Draw
Draw:
	ld d,1
	B_CALL(_IPoint)
	jp GetKey		;Repeat
Quit:
	ret			;Return to OS.
.end
END

Note: You may want to set your calc's graph to ZInteger because ZStandard may interfere with the axis.

New Commands

cp - Compares with accumulator. jr - The ASM equivalent to If xx then jump to xxxxxx jp - Same as above, except very different _ipoint - Turns a point on/off/switch or tests.

What's the difference between Call and jp/jr? Call is a z80 instruction that jumps to a sub-routine, a label with specified calls and instructions. What about jp/jr? Well I'm going to let James Matthews explain that.

What is the difference between jr and jp? There is one massive difference. JR is a relative jump - meaning, when TASM compiles it, the instruction for the Z80 simply tells it how many bytes forward or backward to jump. Thus, jr has a limited range. jp on the other hand is an absolute jump - tells the Z80 the address to jump to. The advantage of JR over JP is the file size is smaller and faster once compiled. (Thank you to Mindless Productions for this information.) Harper told me that jr is a small jump (up to 128 bytes), and jp is a large jump (up to 32K- the whole RAM, basically!).

- James Matthews

Conclusion

Not yet comftorable with Registers? Take a look at Andy S.' 83 Asm tutorials in Tutorial 4! Or look in tutorial 17 in this help file.Now let's get moving!

Tutorial 15