Author Topic: Killerplayer's ASM tutorials  (Read 4149 times)

0 Members and 1 Guest are viewing this topic.

Offline Halifax

  • LV9 Veteran (Next: 1337)
  • *********
  • Posts: 1334
  • Rating: +2/-1
    • View Profile
    • TI-Freakware
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 because TASM 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
There are 10 types of people in this world-- those that can read binary, and those that can't.

Offline tifreak

  • LV11 Super Veteran (Next: 3000)
  • ***********
  • Posts: 2708
  • Rating: +82/-3
  • My Kung Fu IS strong...
    • View Profile
    • TI-Freakware
Killerplayer's ASM tutorials
« Reply #1 on: November 27, 2006, 10:52:00 am »
Some easy reading... :)smile.gif Good job! Any chance you would allow me to host it in html format on TI-Freakware?? The 83+asm section is very much empty at the moment...
Projects: AOD Series: 75% | FFME: 80% | Pokemon: 18% | RPGSK: 60% | Star Trek: 70% | Star Trek 83+: 40% | TI-City: 5%

elfprince13

  • Guest
Killerplayer's ASM tutorials
« Reply #2 on: November 27, 2006, 11:16:00 am »
nice tutorial format, easy explanations, coupla things,

explain how the headers work, not just how they are formatted, teaching people that its "magic" is not what we want.

explain that there are other shells than MirageOS.....

base 16 is "hexadec"imal not "hexa"decimal.

while your at it explain the theory behind different radixes (numbering systems) using examples from binary, octal, decimal, hexadecimal, and then something wierd like ternary or unadecimal.

next off, explain that the z80 is little endian, this is CRITICAL.

your math on the min/max values for a register are off, ie, 8 bit registers can hold -255 OR -128-127.

add a link to a more advanced tutorial such as CoBB's Independent z80 Guide, or Sigma's 83pasm28d for the more technical audience.

Offline Halifax

  • LV9 Veteran (Next: 1337)
  • *********
  • Posts: 1334
  • Rating: +2/-1
    • View Profile
    • TI-Freakware
Killerplayer's ASM tutorials
« Reply #3 on: November 27, 2006, 11:21:00 am »
I will explain the headers more in the next volume but I will not really change anything else because I feel this tutorial is "as is" and people can find Sigma's tutorial on there own and have and said it was hard to understand so that is what drove me to write this tutorial  but yea you are right I messed up on the values
@ TI-Freakware go ahead
There are 10 types of people in this world-- those that can read binary, and those that can't.

elfprince13

  • Guest
Killerplayer's ASM tutorials
« Reply #4 on: November 27, 2006, 11:27:00 am »
aha, another thing, explain the difference between z80 commands, and assembler directives

Offline bfr

  • LV8 Addict (Next: 1000)
  • ********
  • Posts: 819
  • Rating: +4/-0
    • View Profile
    • bfr's website
Killerplayer's ASM tutorials
« Reply #5 on: November 27, 2006, 12:34:00 pm »
Looks nice :)smile.gif  I know there are a few Z80 tutorials out there, but I think a good one is needed that explains all of the basics really well for beginners and teaches whatever the other tutorials didn't teach.  

A few problems though:

1.  IX is mentioned as an 8-bit register and a 16-bit register.  

2.  You said

QUOTE

Ok so these registers have limits though.

8bit registers can hold values -256 to 256
16bit registers can hold values -65536 to 65536


I think you might want to re-check those values.  

There might be more, but I just skimmed through.

EDIT:

QuoteBegin
-->
QUOTE

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.


I guess you could say that, but it makes it seem like assembly only has 8 places to store data, at least to me.  Assembly pretty much has the entire calculator's memory, including BASIC variables.  Maybe there is a better way to put it?

Offline Halifax

  • LV9 Veteran (Next: 1337)
  • *********
  • Posts: 1334
  • Rating: +2/-1
    • View Profile
    • TI-Freakware
Killerplayer's ASM tutorials
« Reply #6 on: November 27, 2006, 02:32:00 pm »
@bfr yeah sorry about the ix thing that was wrong and also your giht about me checking the values and stuff but I didn't want to reveal to them yet about using other places to store the data because that is coming in the next tutorial so sometimes it is better to wait and see
There are 10 types of people in this world-- those that can read binary, and those that can't.

Krid

  • Guest
Killerplayer's ASM tutorials
« Reply #7 on: November 27, 2006, 07:56:00 pm »
Looks nice so far :)smile.gif I'd like to see example programs where you put the code you explained to use. (The best motivation to learn is to see the result)

Offline DJ Omnimaga

  • Clacualters are teh gr33t
  • CoT Emeritus
  • LV15 Omnimagician (Next: --)
  • *
  • Posts: 55943
  • Rating: +3154/-232
  • CodeWalrus founder & retired Omnimaga founder
    • View Profile
    • Dream of Omnimaga Music
Killerplayer's ASM tutorials
« Reply #8 on: November 28, 2006, 02:52:00 am »
wow nice, I'm pinning this topic now.

And code examples and screenshots would be good :)smile.gif

Offline Halifax

  • LV9 Veteran (Next: 1337)
  • *********
  • Posts: 1334
  • Rating: +2/-1
    • View Profile
    • TI-Freakware
Killerplayer's ASM tutorials
« Reply #9 on: November 28, 2006, 12:45:00 pm »
Haha everyone is asking for code examples, and this is all coming in due time trust me but there really if nothing to do with the commands I explained that you can "see" with out me introducing some new stuff. And yes this was actually just a beta tutorial to gauge the reactions towards its welcoming but as it seems it has been good so far then I will continue on and add screenshots

Thanks for all the suggestions though the support is really helpful!!!
There are 10 types of people in this world-- those that can read binary, and those that can't.