COURS 2.TXT
****************************************************************** * * * 68000 ASSEMBLY COURSE ON ATARI ST * * * * by The Ferocious Rabbit (from 44E) * * * * Lesson Number 2 * * * ****************************************************************** THE 'MAGIC' NUMBERS Let's first understand in a simple way how a computer works by placing ourselves in the following situation: we need to send messages to a person with whom we are separated (for example, messages at night between distant people). We have a flashlight, which we can turn on or off, that's it. We can give 2 messages: 1) the flashlight is off (e.g., everything is fine) 2) the flashlight is on (e.g., here come the police!) Let's delve into the 2 states of the flashlight: On Off which boils down to: Power On No power or: Power? YES NO Power value? 1 0 Tests will be noted as 0 or 1 depending on the flashlight being on or off. Since we are rich, we buy a 2nd flashlight. So, we have 4 message possibilities: FLASHLIGHT 1 FLASHLIGHT 2 Off Off On Off Off On On On Counting with 3,4,5,6 ... flashlights, we realize that it is possible to find a simple relationship between the number of flashlights and the number of possibilities. Number of possibilities = 2 to the power of the number of flashlights. So, we get the following table: Remarks are just there to give you a hint! Flashlights Possibilities Remarks 1 2 2 4 3 8 There are 8-bit computers ... 4 16 and 16 bits... 5 32 The ST is a 16/32 bits 6 64 Amstrad CPC... 64!! 7 128 or Commodore 128? 8 256 In computing, the character coding (letters, numbers, etc., using ASCII) allows for 256 characters! 9 512 A 520 has 512 KB of memory, and Amstrad sells a PC1 512. 10 1024 The memory size of my 1040! 11 2048 That of my brother's Mega 2 12 4096 That of a Mega 4. Also the number of displayable colors with an Amiga. etc... 16 65536 In GFA, an array cannot have more than 65536 elements. If my 4 flashlights are off (0000), I am at possibility 0. If they are all on (1111), I am at 15 (because from 0 to 15 makes 16), so 0000 --> 0 and 1111 --> 15. So, I have a book of 16 pages giving the possibilities of the 16 possible lighting configurations, and my correspondent has the same. How do I send him the message from page 13? Since the smallest digit is on the right (we note digits in order hundreds, tens, units), let's arrange the flashlights. Flashlight number: 4 3 2 1 a) I have only one flashlight (the 1st one); it's on, so I get the value 1. (I can only get 0 or 1) b) I have 2 flashlights (1 and 2), both on, I get the 4th possibility. So, I have the value 3 (since I count the values 0,1, 2, and 3, which makes 4). Since flashlight 1 is at most the value 1, I deduce that flashlight 2 is alone worth a maximum of 2. In fact, flashlight 1 on --> value 1 flashlight 2 on --> value 2 So, both on together --> value 3 = 4 possibilities. Flashlight number: 4 3 2 1 'increase' 8 4 2 1 To send the message 13, I need to turn on flashlight 4 (value of 8), flashlight 3 (value of 4), and flashlight 1 (value of 1). Flashlight 4 3 2 1 Flashlight state 1 1 0 1 Value 8 + 4 + 0 + 1 = 13 So, we are counting in binary. In decimal: dec means 10, because a digit can take 10 values (from 0 to 9). In binary: bi = two because each digit can only take 2 values (0 or 1). Computing is an Anglo-Saxon field. A 'binary digit' in English is called a 'BIT'! So, a bit can be 0 or 1. It is the smallest computing unit because the correspondent to whom we send messages is, in fact, a computer. Instead of turning on flashlights, we put current on a wire or not. An 8-bit computer has 8 wires on which current is placed or not! To send messages, we will prepare flashlights with small switches, and when our flashlights are ready, we will turn on the main switch to send the current and thus turn on the intended flashlights at once. Through our 'flashlights', we will send messages to the heart of the machine (in the case of the ST, it is a Motorola 68000 microprocessor) which has been manufactured to respond in a certain way to different messages. So, we prepare our flashlights, and then we turn them on. We have 16 flashlights because the Motorola 68000 is a 16-bit microprocessor. Here is a 'program' (i.e., a sequence of orders) as it is at the level of turning on or off the current on the 16 wires. All the way to the left is the value of wire 16, and to the right is the value of wire 1. 0 = no current on the wire, 1 = current. The microprocessor is surrounded by multiple drawers (memory cells), and among the orders it can execute are 'go get what's in that drawer' or 'go put this in that drawer'. Each drawer is identified by an address (like each house), i.e., by a number. So, we will tell the microprocessor: go get what's at address 24576, add to it what's at address 24578, and put the result at address 24580. We could replace 'at address' with 'at the address'. Let's turn on the 16 flashlights accordingly; this gives: 0011000000111000 0110000000000000 1101000001111000 0110000000000010 0011000111000000 0110000000000100 A single glance is enough; it's a total mess! How do we make sense of a program like this? If we forget to turn on a single flashlight, it won't work anymore, and finding the error in such a listing, good luck! It's a mess!!! So, we have the option to represent this not in binary but in decimal. Unfortunately, the conversion is not convenient, and anyway, we end up with large numbers (visually, because their size as a number doesn't change, of course!) For example, the 3rd line gives 53368. So, let's convert differently by separating our binary numbers into groups of 4 bits. VOCABULARY NOTE: We will speak only English. All abbreviations in computer science are abbreviations of English words or expressions. Reading them in French requires memorizing their meaning. By reading them as they SHOULD be read (in English), these expressions give their definition. One example is T$, which is systematically read as T dollar! However, $ is not, in this case, the abbreviation for dollar but for string. So, T$ must be read AND PRONOUNCED as T string. String meaning 'chain' in English, T is therefore a string of characters. Obviously, reading T dollar means absolutely nothing! The only interest is that it amuses Douglas, the joyful Brit who programs with me! One binary unit is called a BIT (binary digit). 4 units form a NIBBLE. 8 units form a byte (which we will call by its English name, BYTE). 16 units form a word (WORD). 32 units form a long word (LONG WORD). Let's go back to our conversion by grouping our 16 flashlights (so our WORD) into groups of 4 (so into NIBBLES). 0011 0000 0011 1000 These 4 nibbles form our first word. Let's count the possible values for a single nibble. Nibble state 0000 value 0 0001 value 1 0010 value 2 0011 value 3 0100 value 4 0101 value 5 etc.. 1010 value 10 STOP it's over! 10 is 1 and 0, but we've already used them! Well, yes, but apart from 0,1,2,3,4,5,6,7,8,9, we don't have much at our disposal... Well, there's the alphabet! So, let's write 10 with A, 11 with B, 12 with C, 13/D, 14/E, and 15 with F. So, there are 16 digits in our new system (from 0 to F). 'Dec' means 10, and 'Hex' means 6 (a hexagon), so Hex + Dec = 16. Decimal = having 10 digits (0 to 9), hexadecimal = having 16! Our program becomes hexadecimal: $3038 $6000 $D078 $6002 $31C0 $6004 Clearer, but it's not there yet. NOTE: To differentiate between a binary number and a decimal or hexadecimal number, by convention, a binary number will be preceded by %, a hexadecimal number by $, and there will be nothing in front of a decimal number. So, $11 does not equal 11 in decimal but 17. Let's think a little. In fact, we wrote: 'Go get what's there' 'at address $6000' 'add to it what's' 'at address $6002' 'put the result' 'at address $6004' The microprocessor can, of course, pick from the thousands of memory cells in the machine, but it also has some on itself (small pockets, so to speak, in which it temporarily stores things it will need quickly). It has 17 pockets: 8 in which it can put data, and 9 in which it can put addresses. Data = DATA and address = ADDRESS, these pockets will be identified by D0, D1, D2,... D7, and by A0, A1,... A7, and A7' (we will see later why it's not A8, and the differences between these types of pockets). NOTE: The phenomenon of on/off and the same for ALL current computers. The number of 'pockets' is specific to the Motorola 68000. So, the same number of 'pockets' on an Amiga or a Macintosh since they also have a Motorola 68000. On a PC or a CPC, the characteristics (number of flashlights that can be turned on simultaneously, number of 'pockets'...) are different, but the principle is the same. It's either on OR off. Let's modify our 'text', which now becomes. 'move into your pocket D0' 'what you will find at address $6000' 'add to what you have in your pocket D0' 'what you will find at address $6002' 'put the result of the operation' 'at address $6004' The machine is very limited, as by design, the result of the operation in the 3rd line will go into D0 itself, overwriting what is already there. To keep the value that was there, it would be necessary to copy it, for example, into pocket D1! Moving is called in English MOVE Adding is called in English ADD Our program becomes MOVE what is at $6000 into D0 ADD what is at $6002 to D0 MOVE what is now in D0 to $6004 That is: MOVE $6000,D0 ADD $6002,D0 MOVE D0,$6004 We have just written a program in machine language. The fundamental difference with a program in any other language is that here, each line corresponds to ONLY ONE operation of the microprocessor, whereas PRINT "HELLO" will make it do a lot. It is obvious that our BASIC, being a 'mechanical' translator, has a translation that is likely to be approximate, and, although effective, it uses many more instructions (for the microprocessor) than are actually needed. It is also worth having a fond thought for the first programmers of the 68000 who initially created a program with 1s and 0s, a program that only translated hexadecimal numbers into binaries before transmitting them to the machine. They then created, in hexadecimal, programs translating instructions like MOVE, ADD, etc., into binary... It was then enough to group several instructions of this type under another name (not directly understood by the machine) and to create the corresponding translators, thus creating 'advanced' languages (PASCAL, C, BASIC...) So, we are going to be interested in programming or rather in the transmission of orders to the 68000 Motorola. How many orders can it execute? Only 56!!! (with variations, but still not many). Research (at a level far too high for us!) has indeed shown that it is faster to have few instructions doing little each and therefore executing quickly one after the other, rather than having many instructions (the microprocessor likely losing time searching for the one it was asked to do) or complex instructions. Work to be done: reread all this at least twice and then take a break to clear your mind before reading the rest. ADVICE: do not start the next part right away. Digest EVERYTHING that is written, as understanding every detail will serve you. A lamp, it's not much, but one burnt out and you will understand the mess it brings. Here, it's the same. The smallest thing not understood and you won't understand anything in the following. But if everything is understood, the following will be just as easy, and above all, logical.
Back to ASM_Tutorial