Overview
This proves the power of Asm. This tutorial will cover the uses of the
_CreateProg (_CreateProg = 4339h) and _CreateProtProg (_CreatProtProg = 4E6Dh)
ROM calls. Both these ROM calls create programs on the TI-83 Plus. The
difference between the two ROM calls is that _CreateProg creates a program that
can be edited on the calculator and _CreateProtProg creates a program that
cannot be edited on the calculator.
Programming
This program will create an Asm Getkey program and a TIBasic program to run the
Getkey program.
.NOLIST
;This program may
look long, but most of it is the required stuff.
#define equ .equ
#define EQU .equ
#define END .end
#include "ti83PlusAsm.inc"
.LIST
.org 9D95h
B_CALL(_clrLCDFull)
B_CALL(_Homeup)
;Clear screen.
ld hl,prgmcreate
;Load the Text under the PrgmCreate label
B_CALL(_puts)
B_CALL(_Newline)
ld hl,asmcreate
;Load the Asmcreate text
B_CALL(_puts)
;Display the text
B_CALL(_zeroop1)
;Set Op1 to zero
ld hl,progname1
;the name of the prog
ld de,op1
;copy it to op1
ld bc,5
;5 chars in name
ldir
;copying name...
ld hl,241
;length of program (in bytes)
B_CALL(_createprog) ;create it
unprotected program (can be edited on calculator)
inc de
;skip 1st length byte
inc de
;skip 2nd length byte
ld hl,prog1
;program data under prog1 label (Asm program data)
ld bc,241
;program data length
ldir
;copy program data
ld hl,basiccreate
;Load text from Basiccreate label
B_CALL(_puts)
B_CALL(_zeroop1)
ld hl,progname2
;the name of the prog
ld de,op1
;copy it to op1
ld bc,7
;7 chars in name
ldir
;copying name...
ld hl,6
;length of program (in bytes)
B_CALL(_createprog) ;create it
inc de
;skip 1st length byte
inc de
;skip 2nd length byte
ld hl,prog2
;program data
ld bc,6
;program data length
ldir
;copy data
ret
progname1:
.db PROGOBJ,"ASM",0 ;"ASM" is the name of the Asm Getkey program
prog1:
;Asm program data
.db t2bytetok,tAsmPrgm,tEnter ;See Tokens section below for explanation
.db "EF4045EF5845",tEnter
.db "21EC9DEF0A45",tEnter
.db "EF7249F5EF40",tEnter
.db "45EF584521F8",tEnter
.db "9DEF0A45F1CD",tEnter
.db "BC9DEF7249EF",tEnter
.db "2E45C9F5E6F0",tEnter
.db "1F1F1F1F6F26",tEnter
.db "0011DC9DD519",tEnter
.db "7EEF0445D1F1",tEnter
.db "E60F6F260019",tEnter
.db "7EEF0445C930",tEnter
.db "313233343536",tEnter
.db "373839414243",tEnter
.db "444546507573",tEnter
.db "682061206B65",tEnter
.db "792E004B6579",tEnter
.db "20636F64653A",tEnter
.db "2000"
progname2:
.db PROGOBJ,"BASIC",0 ;Basic program name
prog2:
.db t2bytetok,tAsm,tProg,"ASM" ;Basic program data
prgmcreate:
.db "Program Creator!",0
asmcreate:
.db "Creating ASM...",0
basiccreate:
.db "Creating BASIC...",0
.end
END
If you wanted to create programs that can't be edited on the calc, replace
_createprog with _createprotprog.
New Commands
_CreateProg - Creates a program that can be edited
_CreateProtProg - Creates a program that cannot be edited
ldir - Loads data from one place to another
Tokens
The hardest thing about making program creating programs is surprisingly the
tokens. Think of the TIBasic commands Clrhome and Disp. They are tokens. So are
Cos( and Sin( and Tan( and everything else you paste to the TI's screen by
pressing a button or looking in a menu. We all know that each text character you
type is 1 byte each. How much memory does the Calculator have? Not much compared
to my computer's Hard Drive. So instead of saving the commands (Clrhome, Disp,
Cos(, Sin(, Tan(, etc.) by each character, Texas Instruments was smart and saved
each of these commands to 1 byte each. Thus, the command stored in the
calculators memory is called a Token. What!? We used tEnter, tprog, etc. in the
program! Those are the Asm names of the tokens. The "t" stands for Token. Thus
tEnter would be the equivalent of pressing Enter, or in our case, creating a new
line. For a complete list of TI-83 Plus Tokens, look in the
ti83PlusAsm.inc
include file.
Almost every TI-83 Plus Token is 1 byte with the exception of a few. This is
where even I needed help. I asked Matthew Roberts for the answer. After a few
days, Voila! He had the answer. If you look at the tokens ">" and "tAsm", they
have the same addresses in memory. This is because tAsm is a 2 byte token.
That's
why if you assemble the program with just tAsm, the output would be ">". So to
get the Asm( command instead of ">", we had to use the t2ByteTok token. This
defines the token as 2 bytes. If you want to know which tokens are 2 byte, look
in the ti83PlusAsm.inc include file under 2byteTokens.
Another thing to know about program data, you must tell the calculator exactly
how big the program it's making is. You would load that value to the bc register
because that's where the _createprog ROM call looks for the program size. How do
you know how big your program data is? Well that's easy. Count how many Tokens
and Characters you use inside quotes. Add that up and the total is your program
data size in bytes. =)
Conclusion
Again, I want to thank Matthew Roberts for his help with the 2 byte tokens.
Where would I be without him? Don't answer that. On to Checking your memory via
an Asm program!
Click to return to the site's menu... or here to get back to the tutorial's menu.