_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