home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Commodore Free 6
/
Commodore_Free_Issue_06_2007_Commodore_Computer_Club.d64
/
t.Hexfiles
< prev
next >
Wrap
Text File
|
2023-02-26
|
6KB
|
213 lines
u
THE HEX FILES - PART 1
Written by Jason Kelk
A few people out there have expressed
an interest in learning machine code.
And after all, if you want to write
successful games, demos or utilities
it is the best language to learn,
albeit a bit unfriendly. The main
problem with machine code is its
simplicity. There, I bet that confused
you a bit eh? What I mean is that
almost anything can be done in a
single BASIC command can take a bit
more work in machine language but at a
greatly increased speed.
Right, that's the intro over with so
lets start looking at some commands.
The first one I've decided to explain
is RTS. RTS is short for ReTurn from
Subroutine and its job in life is just
like the BASIC return command.
So why am I explaining it first? Well,
if you just use it without subroutines
it also acts like the end command and
for the purposes of this course we
will be using RTS to finish our code.
So why does it have such a short name?
That's due to the fact that all
assembly language commands are only
three letters long! Now, if you were
to just put the command RTS into an
assembler and try to run it all that
would happen is the "READY." message
would come up. Dull, huh?
For the next bit I need to explain a
bit about the workings of the C64;
imagine in your mind for a moment a
long line of little boxes and that
each box has a number on it from 0 to
65,535. A good example is box number
1,024 which controls the character at
the top left of the screen.
If you type POKE1024,1 and press
return the letter A appears at the top
left of the C64's display over
whatever happened to be there. All of
these boxes can hold a number from 0
to 255 (a byte). In the same way, box
53,280 controls the border colour of
the screen so for example POKE53280,4
will put colour four into the border
making it go purple.
But to do this in machine code is a
little more complex. First off, all
numbers are stored in hex, which is
base 16. We all count in base 10
(mainly due to that being the number
of fingers most of us have to count
with) but base 16 is a little more
tricky. You count to 9 as normal, but
instead of saying 10 you use the
letter A.
Similarly you would use B to represent
11, C for 12 and so on until F (which
is 15) when you would finally use 10
(pronounced "one zero" or "one oh").
But in hex 10 is 16 which would be
incredibly confusing so from here on
any hex number will have a dollar sign
in front of it to say which base its
in, for example $64.
So why do we have to use hex? The
benefits will become apparent later on
but as it's a good habit to think in
hex we will start now to get everybody
used to the idea and move on to our
next two commands, which are Load
Decimal Accumulator, or LDA for short,
and STore Accumulator, STA to its
friends. LDA is machine code's
equivalent of a cross between the LET
and PEEK commands, so LDA #$04 is the
same as LET A=4. But LDA can also be
used for reading the contents of those
little memory boxes we discussed
earlier, so if we were to use LDA
$C000
we would be putting whatever was in
location $C000 (box 49,152) into A.
The use of the # tells our C64 that we
are giving it a direct number to put
into A and without the # the C64 will
read what is in box 4 in the memory
instead.STA is the reverse, it can put
whatever is in A back into a memory
box. So STA will put whatever A
contains into box $0400 (or 1,024,
which is the top left of the screen
remember?). A good example would be:ii
lda #$04
sta $d020
rts
Basically this is the same as the
"POKE53280,4" command we saw earlier
and shows you what I meant by the
simplicity. One simple BASIC command
takes two in machine code for this
particular job and each step has to be
followed. Now an example of the second
version of LDA:
lda $d021
sta $d020
rts
Now this is slightly different. The
first command reads from 53,281 (the
screen colour, which is normally dark
blue) and then the second puts that
colour into 53,280 (the border colour
again) so basically this will turn the
border the same colour as the screen!
So this is the same as
POKE53280,PEEK(53281).
BASIC programmers will be wondering
why we are always using A and not
another letter for the variable. The
reason is that A is not just a
variable in this context, its the
Accumulator. But we do have two other
letters available and they are X and
Y, known technically as the X and Y
registers. Both can be used in a
similar way to A in that:
ldx #$04
stx $d020
rts
Will do the same thing as the first
example and replacing LDX with LDY and
STX with STY will also work. The X and
Y do have a couple of different
features which will be covered in
detail later, but one incredibly
useful thing they can do is add or
subtract 1 from their contents in a
flash! This trick is done with the INX
and DEX commands for the X register
and INY and DEY for the Y. So how do
we use them? Time for another example
methinks:
ldx #$04
dex
stx $d020
rts
This looks similar to the previous
example, but the result of running it
would be to make the border turn cyan!
What actually happens is that first X
is given the number 4 to look after.
Then we tell it to go down by 1 with
the DEX command leaving it with 3.
Finally X is told to put it's number
into the border colour but because it
only holds a 3 now the colour is
different. I bet you can't guess which
colour 3 makes!
INX will have the reverse effect to
DEX so replacing one with the other in
the above example will cause X to end
up holding a 5 so this time the border
would be dark green. The Y register is
exactly the same, so replacing all of
the references to X with Y in the
example will still work and produce
the exact same result.That's all for
this first instalment, but if you want
to head on to the next part I'll show
you what to do with an accumulator,
two registers and an old washing up
liquid bottle. If you have any
questions about this article or
machine code, email me and I'll do the
business with the shooters. Erm, try
to help
Continues Next Issue
Written by Jason Kelk
(Published with Permission)
http://www.oldschool-gaming.com/
...end...