                              _Bonkers_

Level #01
                         (c) Curtis White

FREEWARE: NO SELL OF THIS MAGAZINE IS ALLOWED WITHOUT PRIOR WRITTEN
                            PERMISSION.

Use the force!

This is the first issue of the coding magazine Bonkers. Our mission is
to provide the reader with a strong background in 65XX machine language.
This magazine is intended for someone with little or no experience in
coding. 

Before we get started, I'd like to thank Coolhand and Dokken for their
help in making this the best magazine possible, thanks!


Why learn 65xx machine and assembly language? Well for several reasons.
It will allow you to code demos, games, applications, and even entire
operating systems. But more then that, many people find it to be the
most fun and rewarding thing about computers. And what you learn here
will be of benefit if you decide to code on other computers.

We hope you will enjoy reading and following each issue of Bonkers.    
                                       
                                    Signed, The Bonkers Staff

Editor: Coolhand                  < Send your opinions, thanks,
Technical Director: Dokken        < and gripes to these clowns!
Author: Light                     <


Stage #01 I turn the light off, I turn the light on.

These are the only two states the computer knows, on and off. Every
digital computer only knows these two properties. Why is that? Because
the computer uses a series of electrical pulses, and each 'location' in
the computer either has a charge or doesn't have a charge. It is easy to
represent off as the number 0 and on as the number 1. In fact, there is
a number base specifically for this; that system is binary. You may not
know that us humans use the number base 10, or the decimal base. We call
a single binary digit (recall this is either on or off) a bit. As you
would expect, a bit can only be 0 or 1. Now that is not very powerful,
until you realize that you can string these together to command the
computer to do anything you wish.

%110111 - this is 55 in binary. Note the % tells us that
          the number does not equal 110,111.

Your saying, 'duh duh duh' about now, right? Well, just keep reading! I
promise it gets better then this.

Each bit in a binary number can be given a weight so we can more easily
understand it.

     Weight: 128:64:32:16:8:4:2:1
Binary Code:   0: 0: 0: 0:0:1:0:0

Each one in the binary code is given the weight corresponding to it.

So the binary code of 00000100 = 4. Yeah, it isn't easy for us, but it's
a snap for the computer.

Here are some more examples:

     Weight:128:64:32:16:8:4:2:1
Binary Code:  1: 1: 1: 1:1:1:1:1 = 255 Decimal

     Weight:128:64:32:16:8:4:2:1
Binary Code:  1: 0: 0: 0:0:0:0:1 = 129 Decimal

     Weight:128:64:32:16:8:4:2:1
Binary Code:  0: 1: 1: 0:1:0:1:0 = 106 Decimal

Have you noticed how each bit to the left has a weight of double the
previous amount? Yep, that's important. Let's try 16 binary bits now!
You can understand why coders are always hungry...

The weight:
32768:16384:8192:4096:2048:1024:512:256:128:64:32:16:8:4:2:1
    1:    0:   1:   1:   0:   1:  0:  0:  1: 0: 0: 0:0:1:0:1

= 46212 Decimal!

Oh no! I can't even verify that on my TI-68 calculator. Guess you'd
better learn now. No fret, you will not be doing much in binary. You
just need to know that it's there.

Eight bits = 1 BYTE = 255 DECIMAL = 11111111 BINARY

Okay.. so we know a bit about binary, bah. Now, lets get into
hexadecimal, another number system, base 16.  When you represent a
binary number in hexadecimal you use a group of 4 bits or a nybble.

0000 - 0   0100-4   1000-8   1100-C    
0001 - 1   0101-5   1001-9   1101-D
0010 - 2   0110-6   1010-A   1110-E
0011 - 3   0111-7   1011-B   1111-F

Here are some examples:

        0001 1111 0100:Binary
           1    F    4:Hex
                     500:Decimal
                     
        0001 0100 0110:Binary
        1    4     6:Hex       
                     326:Decimal

When counting in hex, it goes like this:

HEX\/\/\/
1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19

Here is a table to help you when your practicing:

$10 - 16d   $1b - 27d  $26 - 38d
$11 - 17d   $1c - 28d  $27 - 39d
$12 - 18d   $1d - 29d  $28 - 40d
$13 - 19d   $1e - 30d  $29 - 41d
$14 - 20d   $1f - 31d  $2a - 42d
$15 - 21d   $20 - 32d  $2b - 43d
$16 - 22d   $21 - 33d  $2c - 44d
$17 - 23d   $22 - 34d  $2d - 45d
$18 - 24d   $23 - 35d  $2e - 46d
$19 - 25d   $24 - 36d  $2f - 47d
$1a - 26d   $25 - 37d  $30 - 48d
       
Useful Notation:  $ for hex numbers
                  % for binary numbers
                  d for decimal numbers


___ Power-up Time____

Questions //\\//\\//

1.      What number system do computers use?
2.      What number system do people generally use?
3.      What number system is a go-between decimal and binary?
4.      Convert %100001001 TO HEX
5.      Convert %111100001 TO DECIMAL
6.      Convert FF to Decimal
7.      Convert FA to Decimal
8.      Convert FB to Binary
9.      Convert FC to Binary

___Stage Boss___

Finish the chart up to 255 decimal! :D

Stage #01 Completed_

______Things You've Learned_____

You learned about binary, decimal, and hexadecimal. You learned how to
convert between these three popular number systems. You've gained an
understanding of the internal workings of the computer.


Stage #02 - Get Ready!


Here are some things you may already know about your computer.. but just
in case.

Ram: Random Access Memory. You can read and write to it.
Rom: Read Only Memory. You can only read from it, i.e.,
     the basic program that the computer runs when it boots.   
 IA: Interface Adapter. These is includes your SID, VIC,    
     PIA.

Inside the CPU.

I'm sure you've heard a lot about the CPU especially with all the new
chips out.  Let's see how it works for real.

Virtual View Of 65XX chip:

         PC(16 bits): Program Counter
Accumulator (8 bits): What type of name is that?!  Consider it
                      the heart of the cpu, just as the cpu
                      is the heart of the computer.
 X Register (8 bits): An indexing register, you will learn 
                      how this works soon.
 Y Register (8 bits): Another indexing register, similar
                      in function to the X Register.   
     Status Register: This will be important when we start     
                      doing compares.  

An important aspect of the computer is the layout of memory. We will not
go into much detail on this, but we need to cover it. Every location or
address in your computer contains a value of 0 to 255 or a byte. So the
location 49152 might contain the byte 155.  When we read the location
49152, we 'copy'  this value into the accumulator or another machine
language register. We might want to do this to 'paste' it somewhere
else. Can you think of some reasons we would want to do this? Well, we
might do this in a scroll or moving a stick man across the screen. Other
examples include reading the joystick, accepting input in a word
processing program, and much more!

We are almost ready to code, so we will go over two very useful machine
language instructions. LDA which means 'load accumulator', one of the
most used instructions. What is this load accumulator? Well, it 'loads'
a value from memory, like when you load a program. Hmm.. consider it a
grabber. You can reach in and grab memory from anywhere in your
computer. You do this with LDA. Look at this:

BYTE OF MEMORY=5         ACCUMULATOR=0    - before LDA
LDA Byte OF MEMORY       ACCUMULATOR=5    - after LDA

The other instruction we will look at is STA (Store Accumulator To
Address), like this:

BYTE OF MEMORY=5         ACCUMULATOR=25    - before STA
STA Byte Of Memory       Byte Of Memory=25 - after STA

If we look at LDA as the copy instruction, then STA is the paste (or
grab and drop). The accumulator serves as the clip board of sorts.

Time to jam, time to code. First, you will need a machine language
monitor. I will be using Gnome Kit 64. Since monitors are usually not
exactly the same, you will have to see what does what in your monitor
(or better use Gnome Kit 64).

.49152 LDA 49159 - Tag this, we may have to change it.
.49155 STA 49160 - Tag this..
.49158 RTS       - Returns us to Basic.              

When you type the first line in, your monitor should give you the .491XX
on the next line, and of course don't type anything after the - (those
are remarks which the monitor will not understand). If you get a '?',
then that usually means your typing something in that is wrong; enter
the line again. Notice the 'tag this'. We wanted to load in the byte
right after the end of our code and store it to the next location; so if
we had guessed where our code would end wrong, we would have had to
change it. Before you execute this, do a:

.49159 B - (we must verify what is at this location)

It will give you a list of numbers. The first number will be what's
stored at 49159; the next number will be 49160. We are moving 49159 to
49160, so make sure they are different. If not, then type over the
number that is there and press return. Now, we will 'run' the code with
an sys 49152. After doing this, you should have your cursor back with no
apparent change. Now type .49159 b. Did the location of 49160 change? It
should have. If it didn't, then check your typing.

Let's try something else as well. We are now going to disassemble what
we just now coded! Type.. .49152 b. You should get something like:

.49152 b 173 7 192 141 8

The 173 is the op-code for lda absolute (we will learn 'immediate', and
other modes later on). 7 is the low byte of 49152, and 192 is the high
byte of 49152. Notice how the low byte is first and the high byte is
second. This is called low byte, high byte order; you should remember
this, as it's an important feature of the 65xx architecture. Wait, your
saying how in the world does 7, 192 = 49152 (multiply 192*256 and add 7,
te da!).

Make sure your understanding everything as we are going over it, because
we are walking now - soon we will be flying.

The task...

Suppose we were walking down the street and someone came up and said "I
can't type, when I type - I get so excited that I always type the words
in backwards; here's a million dollars, fix this!". Well, we won't code
a general application (yet), but we can code a specific example.

First, a quick diversion. We need to know how screen memory works.
Briefly, screen memory starts at 1024 and goes through 2023.  By placing
any of the screen codes in these locations, we can form letters and, in
turn, make entire words. It's arranged in a matrix of 40 columns by 25
rows. Reading any of these locations tells us the character at that
particular location; writing any of these locations will place the
character at that location. For reference, 1024 is the first location
which is located in the upper left hand corner of the screen. This would
be column 0 and row 0. Column 1 and row 0 would place you at location
1025. Row 1, Column 1 would be location 1065. The character placed there
will be dependent on how the value correlates to the screen codes.

If your still not sure how screen memory works, consult the screen
location table in any of several popular c64 programming books. Okay,
now back to our million dollar program.

.49152 LDA 1024 - Grab value at 1024
.49155 LDX 1025 - Grab value into 1025
.49158 LDY 1026 - Grab value at 1026
.49161 STA 1026 - Drop value into 1026
.49164 STX 1025 - Drop value into 1025, no change
.49167 STY 1024 - Drop value into 1024
.49170 RTS

;type 'rac' in the upper left hand corner of the screen.

When you execute the code, you should get 'car'. Notice the four new
instructions, LDY, STY, LDX, STX. Can you guess what these do? Well, if
you said LDY (load memory into y register), STY (store y register to
memory), LDX (load memory into x register), and STX (store x register to
memory), then you are precisely right. These four new instructions work
just as LDA and STA do. In fact, just as there is an accumulator, there
are X and Y registers. For now, we can consider each of these having the
same properties, but we will learn the unique properties of each of
these various registers in the coming Levels.

___ Power-up Time ____

Questions //\\//\\//

1.      What instructions can we use to 'grab' or load values 
        from memory into our registers?
2.      What instructions can we use to 'drop' or store
        information to memory?
3.      Write a machine language program to copy your name from
        somewhere on the screen to another place on the screen.
4.      Write a machine language program to read in a word or
        words and paste them vertically down the screen.

___Stage Boss___

Code a machine language program to read in your name (from screen memory
or otherwise) and copy it to the screen. Try at least four ways. If you
really feel up to it, do six!

Like geometric shapes, circles, boxes, lines, - oops, no more ideas.
Hint, you may need to look at the layout of screen memory.

Stage #02 Completed_

______Things You've Learned_____

Well, you have learned a lot in this stage. You worked with the monitor.
You learned about loading (lda,ldy,ldx) and storing to memory
(sta,sty,stx). You created a million dollar program and experimented
with screen memory. 

_____Level #01 Completed_____

That's right, it's the end for this first issue of Bonkers. We will try
to release on a very regular basis, hopefully, every week or at least
every other week. And since we are a current magazine, if you have any
questions, then you can always drop us an email or check us on IRC,
channel #c-64. Where can you get the latest issue of Bonkers? Well, from
any of the staff, or from Bonkers web page at
http://soho.ios.com/~coolhnd/bonkers/planet.htm.

We hope you've enjoyed this issue, I know I've enjoyed writing it. Now
go code! And grab the next issue of Bonkers, it'll be here before your
socks start stinking, I promise.

                                           Bonkers Staff
