1006
Other Calculators / Killerplayer's ASM tutorials
« on: November 27, 2006, 10:13:00 am »
Ok this is Volume 1 Lesson 1 of my EAZYASM tutorials. First off disregard all references to downloading something in the article and just download the things you need from up here. But you NEED to download Assembler, tasm80,tab, ti83plus.inc, and makefile no matter what and put those all in the same directory. And if you are programming for ion then you need ion.inc and if you are programming for mirage then you need mirage.inc
http://www.freewebs.com/omnimaga/assembler.exe
http://www.freewebs.com/omnimaga/ion.inc
http://www.freewebs.com/omnimaga/mirage.inc
http://www.freewebs.com/omnimaga/Tasm80.tab
http://www.freewebs.com/omnimaga/ti83plus.inc
Ok this is Killerplayer's tutorial and it is going to give it to you and I don't care what you think about how I do it. I will do whatever the **** I want and you have to just go with it and trust me ok?. Ok. Now on to the tutorial.
----------------------
Things you should know
----------------------
All code will be put between **************** that
e.g
************************
Assembly code goes here
************************
ok
All explanations of important stuff is put between =====================
e.g
==========================
Important stuff goes here
==========================
and that is all you need to know because the rest is just me explaining things you should know.
All chapters are put in ----------------- that
To the Assembly tutorial
-------------
UNDERSTANDING
-------------
Ok breath a sigh of relief because I am not going to make you setup your own Assembly environment I am going to give it to you. No it is not tasm becauseTASM sucks and SPASM rocks. The link is below and all you need to do is download and extract it to some place on your computer where you want to use it. To assemble something you right click on the .bat file and switch everything that says "test" with the name of yor sourcefile.
E.g
If I wrote all the code in myprog.z80 I would open up the .bat file and replace everything that says test with myprog and then save and exit. Next I would double click the .bat file and it will bring up a DOS window that tells if you have errors or not.
The screen will look like the if you have named your sourcefile test.z80
=====================================================
assembler test.z80 test.bin
Spencer's Assembler, June 2006
Pass 1 ...
Done.
Pass 2 ...
Done.
wabbit test.bin test.8xp
Picture comes up with credits
test.8xp (xxxx bytes) was successfully generated!
pause
Press any key to continue . . .
=======================================================
This screen will only appear if your source code has compiled correctly.
Ok so that is all you need to know about compiling. On to the next chapter
------------------------------------
Am I developing for a shell or TI-OS
------------------------------------
Ok just some little info is someone says something about "nostub" programming than that means the same as programming for the TI-OS.
Now ask yourself do you want to program for a shell or for the TI-OS
If you are programming for MirageOS or Ion download this.
That include ion.inc and mirageos.inc so you can develop for a shell and also it has ti83plus.inc and you need that if you want to use "bcall()" talked about later.
If you are programming for TI-OS then just delete mirage.inc and ion.inc in the previous link and vola.
now you can't just use ion.inc and expect your program to turn up in MirageOS or Ion because you need a header to make sure the shell sees the program.
Ion header needed
=============================
.nolist
#include ion.inc
#include ti83plus.inc
.list
.org progstart-2
.db $BB,$6D
ret
jr nc,start_program
.db "Test",0
start_program:
your program goes here
.end
END
==============================
Ok so you probaly don't understand that well I am going to break that down so you can understand it by commenting the source. Commenting the source is when you put a ; and then type your comment or explanation after it. You can only put a comment after a ; because that makes the compiler ignore what you write after it. Usually comments are to help you remember what you are doing if you have taken a break.
Ion header revised
==============================
.nolist ;This tells the compiler not to compile this
#include ion.inc ;This is needed for Ion programming
#include ti83plus.inc ;This is need for TI-OS programming and Ion programming
.list ;This tells the compiler to compile now
.org progstart - 2 ;this tells the compiler to start at this address
.db $BB,$6D ;This is the Asm token "AsmPrgm" and is needed always
ret ;this makes Ion detect your program
jr nc,start_program ;this tells ion at which label to start at
.db "Test",0 ; THis is the name that is displayed in Ion
start_program: ;this is the label where you told Ion to start at
your program goes here
.end ; tells compiler to stop compiling
END ; ends your program
================================
Ok so you will need to use that if you are programming for Ion. Next we will see what header we use for MirageOS
!!Note that Ion programs are also detect but MOS!!
MirageOS header
=================================
.nolist
#include mirage.inc
#include ti83plus.inc
.list
.org progstart - 2
.db $BB,$6D
ret
.db 1 ;This makes MirageOS recognizes you program
.db %00000000,%00000000 ;this is the icon that is displayed by MirageOS
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
Description:
.db "Test",0 ;This is the description displayed at the bottom of MirageOS
start_program:
program goes here
.end
END
======================================
Ok so there rele is nothing new there except .db 1 and the icon
TI-OS programming header
======================================
.nolist
#include ti83plus.inc
.list
.org progstart - 2
.db $BB,$6D
start_program:
program goes here
.end
END
=======================================
That is a very simple header right. Ok now you have headers for TI-OS and the two premiere shells for Assembly programs so let's move on now.
!!!Note: From now on if I say use Ion header and write this program that means write whatever is in the code brackets into the program goes here part and the same goes for MirageOS and TI-OS!!!
e.g
If I say
Program: Use Ion Header
************************
ld a,5
ld b,5
************************
Then it should look like this
============================
.nolist
#include ion.inc
#include ti83plus.inc
.list
.org progstart-2
.db $BB,$6D
ret
jr nc,start_program
.db "Test",0
start_program:
ld a,5
ld b,5
.end
END
=============================
Ok now we move on
--------------------------------------
Do I really need to learn some math???
--------------------------------------
Stop your whining it isn't that hard. Haha.
Your going to need to learn some number systems named "Binary" and "Hexadecimal". I am assuming you know deciaml if you understand this number 10243.
Decimal is the everyday number system so I will not explain it to you
Binary is not so let's get to it
=====================
Binary Number: 1101
So what does that equal in our everyday system DECIMAL Killerplayer.
Simply do this
Num. value| 8 | 4 | 2 | 1|
________________
Bin. value| 1 | 1 | 0 | 1 |
Ok now let's imagine 1 is on and 0 is off. So that means
Num. value 1 is on
Num. value 2 is off
Num. value 4 is on
Num. value 8 is on
So now let's add up all of the on values
1+4+8 = 13 so that means binary num. 1101 = decimal num. 13
1101 = 13
13 = 1101
Now let's say your decimal number is bigger than four digits like 8 digits
Binary Number: 11010110
Num. vaule| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
______________________________________
Bin. value| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
Ok now add up all of the on values
11010110 = 214
Ok so if you hadn't notice the num. value multiples itself by 2 as it moves to the left so if you had a 9 digit binary number then the leftmost num. value would = 128X2 and so on.
=============================
Ok so that is it for binary numbers and you should understand that pretty readily. No it is on to hexadecimal.
===============================
Ok Hexadecimal is fairly different because it has 16 numbers hence the "Hexa" prefix.
Hexadecimal "Numbers":
1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Ok woah Killerplayer you said it was numbers so what does A and B equal
I will explain that...
1=1,2=2,3=3,4=4,5=5,6=6,7=7,8=8,9=9,A=10,B=11,C=12,D=13,E=14,F=15
There you go.
So now let's convert a hexadecimal value to decimal
Hexadecimal Number: 1A3F
Num. value| 4096 | 256 | 16 | 1 |
______________________
Hex. value| 1 | A | 3 | F |
Ok so the num. value get's multiplied by 16 every time it moves to the left. Now the value in Hex. value position 1 is F. So we will do the following
F=15 so 15*1 = 15
3=3 so 3*16 = 48
A=10 so 10*256 = 2560
1=1 so 1*4096 = 4096
Let's add up all the sums 1A3F = 6719
Hexadecimal is as easy as Binary
====================================
In assembly if you are using a binary number you write %10010101 and if using hex write $1F3A and if you are using decimal there is no prefix.
Ok so this lesson is done let's get as far away as we can from numbers.
--------------------
The registers
--------------------
The registers are used for accessing data and all that great stuff that makes up a program
e.g in BASIC you have vars like the whole alphabet among others but in ASM you have "virtually" 8 registers that you can use.
===============
8 bit registers
A, B, C, D, E, F, H, L, and IX
A is like the multipurpose register that is used for almost everything
B is usually used as an 8 bit counter
C is used for interfracing with hardware ports
F is used for flags
D is multipurpose
E is multipurpose
H is multipurpose
L is multipurpose
16 bit registers
AF, BC, DE, HL, IX
HL is like register A's brother in that it is it's 16 bit counterpart
BC is like register B's brother because it is used as a 16 bit counter
DE holds the memory address of a location e.g. DEstitnation
IX is acceptable anywhere HL is but it is bigger and slower and should only be used when HL is tied up
If you store something in HL you will mess it up if you store something in L or H because 16 bit registers are just 8 bit registers are combined so jsut remember that.
==================
Person: Well how do you get stuff into those registers Killerplayer?
Me: Just use a simple function duh!!
Person: Well I didn't know that you *******
Me: Oh yeah sorry I forgot to explain it let me tell you
There is a little function and possibly the most used in any ASM program and that is
LD
Now for all you BASIC people out there you are familiar with load
====================
5->J in basic is like
source->variable
so in ASM it is
ld a,5
or
ld variable,source
====================
Ok so what are all the functions load can do
loads or ld's functions(imm8 = immediate 8 bit value imm16 = immediate 16 bit value)
====================
ld a,a
ld a,b
ld a,c
ld a,d
ld a,e
ld a,h
ld a,l
ld a,(BC)
ld a,(DE)
ld a,(HL)
ld a,(imm16)
ld a,imm8
ld b,a
ld b,b
ld b,c
ld b,d
ld b,e
ld b,h
ld b,l
ld b,(HL)
ld b,imm8
register C does everything register B does
register D does everything register B does
register E does everything register B does
register H does everything register B does
register L does everything register B does
ld bc,(imm16)
ld bc,imm16
register DE does everything register BC does
register HL does everything register HL does
ld (bc),a
ld (de),a
ld (hl),a
ld (hl),b
ld (hl),c
ld (hl),d
ld (hl),e
ld (hl),h
ld (hl),l
ld (hl),imm8
ld (imm16),a
ld (imm16),bc
ld (imm16),de
ld (imm16),hl
=========================
That is all the things that load could ever do on the TI z80 processor
You don't know what the () means but that doesn't matter right now
examples of what load can d
===========================
ld a,2 store 2 into register a
ld d,b store value in register b to register d
ld ($9240),a store value of register a to memory location
===========================
There is one thing that ld can not do and that is load 16 bit registers into 16 bit registers, but there is a way to do this. Let's say we want to load hl into de. We can't do ld de,hl. We have to do the following.
=========
ld d,h
ld e,l
=========
Ok so what values can these registers hold do they have any limits. Well yes they actually do have some limits 8bit registers can only hold values -255 to 255 and 16bit registers hold values -65536 to 65536.
!!Note registers F and AF cannot be used for ld or any instructions except a few!!
Ok so we are done with registers right now
ld d,h
ld e,l
=========
Ok so these registers have limits though.
8bit registers can hold values -256 to 256
16bit registers can hold values -65536 to 65536
Now we are done with registers basically
------------------------
Negative Numbers in ASM
------------------------
Negative Numbers are not as hard as some people may lead you to believe.
Let's imagine negative numbers in real life.
-5 = -5 right
well in ASM 0 = 0 and 0 = 256.
So let's say that we store -5 into register A then register A is actually holding
256 - 5 = 251
what happens if you put -5 into hl
65536 - 5 = 65531
so 65531 will be in register HL then
So you will need to know this. When you assemble your programs and compare numbers you can check for -5 by typing -5 but if you display the number on screen in your code and you run the program it will show 251 not -10
Ok well that is the end of Volume 1, Lesson 1 Thanks for checking out my tutorial if you have any questions then just post them. Volume 1, Lesson 2 coming soon
http://www.freewebs.com/omnimaga/make.bat
http://www.freewebs.com/omnimaga/assembler.exe
http://www.freewebs.com/omnimaga/ion.inc
http://www.freewebs.com/omnimaga/mirage.inc
http://www.freewebs.com/omnimaga/Tasm80.tab
http://www.freewebs.com/omnimaga/ti83plus.inc
Ok this is Killerplayer's tutorial and it is going to give it to you and I don't care what you think about how I do it. I will do whatever the **** I want and you have to just go with it and trust me ok?. Ok. Now on to the tutorial.
----------------------
Things you should know
----------------------
All code will be put between **************** that
e.g
************************
Assembly code goes here
************************
ok
All explanations of important stuff is put between =====================
e.g
==========================
Important stuff goes here
==========================
and that is all you need to know because the rest is just me explaining things you should know.
All chapters are put in ----------------- that
To the Assembly tutorial
-------------
UNDERSTANDING
-------------
Ok breath a sigh of relief because I am not going to make you setup your own Assembly environment I am going to give it to you. No it is not tasm because
E.g
If I wrote all the code in myprog.z80 I would open up the .bat file and replace everything that says test with myprog and then save and exit. Next I would double click the .bat file and it will bring up a DOS window that tells if you have errors or not.
The screen will look like the if you have named your sourcefile test.z80
=====================================================
Spencer's Assembler, June 2006
Pass 1 ...
Done.
Pass 2 ...
Done.
Picture comes up with credits
test.8xp (xxxx bytes) was successfully generated!
Press any key to continue . . .
=======================================================
This screen will only appear if your source code has compiled correctly.
Ok so that is all you need to know about compiling. On to the next chapter
------------------------------------
Am I developing for a shell or TI-OS
------------------------------------
Ok just some little info is someone says something about "nostub" programming than that means the same as programming for the TI-OS.
Now ask yourself do you want to program for a shell or for the TI-OS
If you are programming for MirageOS or Ion download this.
That include ion.inc and mirageos.inc so you can develop for a shell and also it has ti83plus.inc and you need that if you want to use "bcall()" talked about later.
If you are programming for TI-OS then just delete mirage.inc and ion.inc in the previous link and vola.
now you can't just use ion.inc and expect your program to turn up in MirageOS or Ion because you need a header to make sure the shell sees the program.
Ion header needed
=============================
.nolist
#include ion.inc
#include ti83plus.inc
.list
.org progstart-2
.db $BB,$6D
ret
jr nc,start_program
.db "Test",0
start_program:
your program goes here
.end
END
==============================
Ok so you probaly don't understand that well I am going to break that down so you can understand it by commenting the source. Commenting the source is when you put a ; and then type your comment or explanation after it. You can only put a comment after a ; because that makes the compiler ignore what you write after it. Usually comments are to help you remember what you are doing if you have taken a break.
Ion header revised
==============================
.nolist ;This tells the compiler not to compile this
#include ion.inc ;This is needed for Ion programming
#include ti83plus.inc ;This is need for TI-OS programming and Ion programming
.list ;This tells the compiler to compile now
.org progstart - 2 ;this tells the compiler to start at this address
.db $BB,$6D ;This is the Asm token "AsmPrgm" and is needed always
ret ;this makes Ion detect your program
jr nc,start_program ;this tells ion at which label to start at
.db "Test",0 ; THis is the name that is displayed in Ion
start_program: ;this is the label where you told Ion to start at
your program goes here
.end ; tells compiler to stop compiling
END ; ends your program
================================
Ok so you will need to use that if you are programming for Ion. Next we will see what header we use for MirageOS
!!Note that Ion programs are also detect but MOS!!
MirageOS header
=================================
.nolist
#include mirage.inc
#include ti83plus.inc
.list
.org progstart - 2
.db $BB,$6D
ret
.db 1 ;This makes MirageOS recognizes you program
.db %00000000,%00000000 ;this is the icon that is displayed by MirageOS
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
.db %00000000,%00000000
Description:
.db "Test",0 ;This is the description displayed at the bottom of MirageOS
start_program:
program goes here
.end
END
======================================
Ok so there rele is nothing new there except .db 1 and the icon
TI-OS programming header
======================================
.nolist
#include ti83plus.inc
.list
.org progstart - 2
.db $BB,$6D
start_program:
program goes here
.end
END
=======================================
That is a very simple header right. Ok now you have headers for TI-OS and the two premiere shells for Assembly programs so let's move on now.
!!!Note: From now on if I say use Ion header and write this program that means write whatever is in the code brackets into the program goes here part and the same goes for MirageOS and TI-OS!!!
e.g
If I say
Program: Use Ion Header
************************
ld a,5
ld b,5
************************
Then it should look like this
============================
.nolist
#include ion.inc
#include ti83plus.inc
.list
.org progstart-2
.db $BB,$6D
ret
jr nc,start_program
.db "Test",0
start_program:
ld a,5
ld b,5
.end
END
=============================
Ok now we move on
--------------------------------------
Do I really need to learn some math???
--------------------------------------
Stop your whining it isn't that hard. Haha.
Your going to need to learn some number systems named "Binary" and "Hexadecimal". I am assuming you know deciaml if you understand this number 10243.
Decimal is the everyday number system so I will not explain it to you
Binary is not so let's get to it
=====================
Binary Number: 1101
So what does that equal in our everyday system DECIMAL Killerplayer.
Simply do this
Num. value| 8 | 4 | 2 | 1|
________________
Bin. value| 1 | 1 | 0 | 1 |
Ok now let's imagine 1 is on and 0 is off. So that means
Num. value 1 is on
Num. value 2 is off
Num. value 4 is on
Num. value 8 is on
So now let's add up all of the on values
1+4+8 = 13 so that means binary num. 1101 = decimal num. 13
1101 = 13
13 = 1101
Now let's say your decimal number is bigger than four digits like 8 digits
Binary Number: 11010110
Num. vaule| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
______________________________________
Bin. value| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
Ok now add up all of the on values
11010110 = 214
Ok so if you hadn't notice the num. value multiples itself by 2 as it moves to the left so if you had a 9 digit binary number then the leftmost num. value would = 128X2 and so on.
=============================
Ok so that is it for binary numbers and you should understand that pretty readily. No it is on to hexadecimal.
===============================
Ok Hexadecimal is fairly different because it has 16 numbers hence the "Hexa" prefix.
Hexadecimal "Numbers":
1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Ok woah Killerplayer you said it was numbers so what does A and B equal
I will explain that...
1=1,2=2,3=3,4=4,5=5,6=6,7=7,8=8,9=9,A=10,B=11,C=12,D=13,E=14,F=15
There you go.
So now let's convert a hexadecimal value to decimal
Hexadecimal Number: 1A3F
Num. value| 4096 | 256 | 16 | 1 |
______________________
Hex. value| 1 | A | 3 | F |
Ok so the num. value get's multiplied by 16 every time it moves to the left. Now the value in Hex. value position 1 is F. So we will do the following
F=15 so 15*1 = 15
3=3 so 3*16 = 48
A=10 so 10*256 = 2560
1=1 so 1*4096 = 4096
Let's add up all the sums 1A3F = 6719
Hexadecimal is as easy as Binary
====================================
In assembly if you are using a binary number you write %10010101 and if using hex write $1F3A and if you are using decimal there is no prefix.
Ok so this lesson is done let's get as far away as we can from numbers.
--------------------
The registers
--------------------
The registers are used for accessing data and all that great stuff that makes up a program
e.g in BASIC you have vars like the whole alphabet among others but in ASM you have "virtually" 8 registers that you can use.
===============
8 bit registers
A, B, C, D, E, F, H, L, and IX
A is like the multipurpose register that is used for almost everything
B is usually used as an 8 bit counter
C is used for interfracing with hardware ports
F is used for flags
D is multipurpose
E is multipurpose
H is multipurpose
L is multipurpose
16 bit registers
AF, BC, DE, HL, IX
HL is like register A's brother in that it is it's 16 bit counterpart
BC is like register B's brother because it is used as a 16 bit counter
DE holds the memory address of a location e.g. DEstitnation
IX is acceptable anywhere HL is but it is bigger and slower and should only be used when HL is tied up
If you store something in HL you will mess it up if you store something in L or H because 16 bit registers are just 8 bit registers are combined so jsut remember that.
==================
Person: Well how do you get stuff into those registers Killerplayer?
Me: Just use a simple function duh!!
Person: Well I didn't know that you *******
Me: Oh yeah sorry I forgot to explain it let me tell you
There is a little function and possibly the most used in any ASM program and that is
LD
Now for all you BASIC people out there you are familiar with load
====================
5->J in basic is like
source->variable
so in ASM it is
ld a,5
or
ld variable,source
====================
Ok so what are all the functions load can do
loads or ld's functions(imm8 = immediate 8 bit value imm16 = immediate 16 bit value)
====================
ld a,a
ld a,b
ld a,c
ld a,d
ld a,e
ld a,h
ld a,l
ld a,(BC)
ld a,(DE)
ld a,(HL)
ld a,(imm16)
ld a,imm8
ld b,a
ld b,b
ld b,c
ld b,d
ld b,e
ld b,h
ld b,l
ld b,(HL)
ld b,imm8
register C does everything register B does
register D does everything register B does
register E does everything register B does
register H does everything register B does
register L does everything register B does
ld bc,(imm16)
ld bc,imm16
register DE does everything register BC does
register HL does everything register HL does
ld (bc),a
ld (de),a
ld (hl),a
ld (hl),b
ld (hl),c
ld (hl),d
ld (hl),e
ld (hl),h
ld (hl),l
ld (hl),imm8
ld (imm16),a
ld (imm16),bc
ld (imm16),de
ld (imm16),hl
=========================
That is all the things that load could ever do on the TI z80 processor
You don't know what the () means but that doesn't matter right now
examples of what load can d
===========================
ld a,2 store 2 into register a
ld d,b store value in register b to register d
ld ($9240),a store value of register a to memory location
===========================
There is one thing that ld can not do and that is load 16 bit registers into 16 bit registers, but there is a way to do this. Let's say we want to load hl into de. We can't do ld de,hl. We have to do the following.
=========
ld d,h
ld e,l
=========
Ok so what values can these registers hold do they have any limits. Well yes they actually do have some limits 8bit registers can only hold values -255 to 255 and 16bit registers hold values -65536 to 65536.
!!Note registers F and AF cannot be used for ld or any instructions except a few!!
Ok so we are done with registers right now
ld d,h
ld e,l
=========
Ok so these registers have limits though.
8bit registers can hold values -256 to 256
16bit registers can hold values -65536 to 65536
Now we are done with registers basically
------------------------
Negative Numbers in ASM
------------------------
Negative Numbers are not as hard as some people may lead you to believe.
Let's imagine negative numbers in real life.
-5 = -5 right
well in ASM 0 = 0 and 0 = 256.
So let's say that we store -5 into register A then register A is actually holding
256 - 5 = 251
what happens if you put -5 into hl
65536 - 5 = 65531
so 65531 will be in register HL then
So you will need to know this. When you assemble your programs and compare numbers you can check for -5 by typing -5 but if you display the number on screen in your code and you run the program it will show 251 not -10
Ok well that is the end of Volume 1, Lesson 1 Thanks for checking out my tutorial if you have any questions then just post them. Volume 1, Lesson 2 coming soon
http://www.freewebs.com/omnimaga/make.bat