Read But How Do It Know? - the Basic Principles of Computers for Everyone Online
Authors: J Clark Scott
The display adapter spends most of its time painting the screen. The only other thing it has to do is to accept commands from the I/O Bus that will change the contents of the display adapter RAM. When the program running in the CPU needs to change what’s on the screen, it will use the I/O OUT command to select the display adapter, and then send a display adapter RAM address and then a byte of data to store at that address. Then as the adapter continues to repaint the screen, the new data will appear on the screen at the appropriate spot.
The display adapter RAM is built differently than the RAM in our computer. It keeps the input and output functions separate. The inputs of all storage locations are connected to the input bus, and the outputs of all storage locations are connected to the output bus, but the input bus and the output bus are kept separate. Then there are two separate memory address registers, one for input and one for output. The input MAR has a grid that only selects which byte will be ‘set,’ and the output MAR has a separate grid that only selects which byte will be ‘enabled.’
With this setup, the screen and the display RAM can both be continuously scanned using only the output MAR and the enable bit. When the I/O Bus is used to write into the display RAM, it uses only the input MAR and the set bit.
This is how the display adapter creates an image on the screen. Because of the way it works, there is an interesting relationship between which bits in the display RAM correspond to which pixels on the screen. As it scans the first eight pixels of the top line, it uses the individual bits of byte 0 of its RAM to turn the pixels on or off. As it scans the second eight pixels, it uses the individual bits of byte 1 of its RAM, etc. It takes 40 bytes of RAM to draw the first line, and so the last eight pixels, which are numbered 312 through 319, come from RAM byte 39. The second row uses byte 40 to draw its first 8 pixels, etc.
If you want to write letters and numbers on the screen, how do you do it? If you put the ASCII code for ‘A’ into a byte in the display RAM, you will just get eight pixels in a row where one is off, then one is on, then five are off and the last one is on. That’s not what an ‘A’ should look like.
There is a solution for this, and it involves…
Another Code
When you want to print or display written language, you need to translate the ASCII code into something that is readable by a live person. We have a code, 0100 0101, that appears on the ASCII code table next to the letter ‘E.’ But how does the computer turn 0100 0101 into a readable ‘E’?
We have a display screen, but the screen is a just a grid of pixels, there are no human readable ‘E’s in anything we have described so far. In order to get an ‘E’ on the screen, there has to be something that makes that shape that we recognize as a letter of the alphabet.
Therefore, we need another code. This code is really about little pictures made out of dots. For each character that we want to be able to draw on the screen, we need a little picture of that character. If you take a grid 8 pixels wide and 8 pixels high, you could decide which pixels had to be on to make a little picture that looks like the character that you want to draw on the screen, like this:
If you turn this picture into ons and offs, you could store it in eight bytes. If there are 100 different characters that you want to be able to display on the screen, then you’d need 100 different little pictures like this, and it would require 800 bytes of RAM to store it. Our little computer only has a 256 byte RAM, so this would be a good time to imagine that larger version that we described earlier.
These 800 bytes are a type of code known as a “font.”
If you want to make a character appear in a certain place on the screen, you need to choose the correct little picture from the font, and then use I/O instructions to copy the eight bytes of the picture to the proper bytes in the display adapter’s RAM.
If the pictures in our font are arranged in the same order as the ASCII code table, then we can use the numeric value of an ASCII code to find the corresponding picture within the font. The ASCII code for ‘E’ is 0100 0101. If you apply the binary number code to the same pattern of ones and zeros, you get the decimal number 69. ‘E’ then, is the 69
th
code in ASCII, and the picture of an ‘E’ will be the 69
th
picture within the font. Since there are eight bytes in each picture, you multiply the 69 by 8, and that tells you that the picture for ‘E’ will be the eight bytes starting at address 552.
Now we need to know where to copy these bytes to in the display RAM. Lets say that we want to display an ‘E’ at the very top left of the screen. Where are the bits that turn on the pixels that we are interested in? Well, the first line is easy, it is the first eight bits of the display RAM, Address 0. So we use a series of OUT instructions to copy RAM address 552 to display RAM address 0. Now, where is the second line in the display RAM? The display paints all 320 bits of the top row before it moves down to the second row. That means that it uses 40 bytes on each row, so the top row uses bytes 0-39. That means that the second byte of the picture of ‘E’ at RAM address 553 needs to be written at address 40 in the display RAM. Similarly, the third through eighth bytes get written at bytes 80, 120, 160, 200, 240 and 280. When you have done all of that, you would then see a complete ‘E’ on the screen. If you wanted to write an ‘X’ on the screen right next to the ‘E’, you would locate the eight bytes in the font for ‘X’ and copy them into display RAM bytes 1, 41, 81, 121, 161, 201, 241 and 281. If you need 27 ‘E’s on your screen, you just copy the one ‘E’ in your font to 27 different places in the display RAM.
Of course, this seems like a lot of work just to make a single letter appear on the screen. The program that does this would need a loop of instructions that calculates the first ‘from’ and ‘to’ addresses, then issues the appropriate OUT instructions to copy the first byte to the display RAM. Then the loop would repeat, updating both addresses each time, until all eight bytes had been copied to the appropriate places. We’re not going to write this program, but it could easily be a 50 instruction program that has to loop around eight times before it’s finished. That means that it could take 400 instruction cycles just to put one character on the screen! If you drew 1000 characters on the screen, that might take 400,000 instruction cycles. On the other hand, that’s still only about one quarter of one percent of what this computer can do in one second.
This just goes to show you why computers need to be so fast. The individual things that they do are so small, that it takes a huge number of steps to get anything done at all.
The Final Word on Codes
We have seen several codes used in our computer. Each one was designed for a specific purpose. Individual coded messages are put in bytes, and moved around and used to get things done.
The bytes do not ‘know’ which code was used to choose the pattern that they contain. There is nothing in the byte itself that tells you which code it is supposed to be.
Certain parts of the computer are built with various codes in mind. In the ALU, the adder and comparator are built to treat bytes as though they contain values encoded with the binary number code. So are the Memory Address Register and the Instruction Address Register.
The Instruction Register is built to treat its contents as though it contains values encoded with the Instruction Code.
The Display adapter RAM bits are just ons or offs for individual pixels. Pictures and fonts are strings of bytes that will result in something that can be recognized by a person when it is organized, and the brightnesses are set, by the wiring of a display adapter and screen.
The ASCII code table does not appear anywhere inside the computer because there is no way to represent a letter of the alphabet except by using a code.
The only places where ASCII gets converted between characters and the code for the character, are in the peripherals. When you press ‘E’ on the keyboard, you get the ASCII code for an ‘E.’ When you send the ASCII code for an ‘E’ to a printer, it prints the letter ‘E.’ The people who build these peripherals have an ASCII code table in front of them, and when they build a keyboard, the switch under the fourth button in the second row, which has the letter ‘E’ printed on it, is wired up to the proper bus wires to produce the code that appears next to the letter ‘E’ on the ASCII code table.
An ‘E’ is the fifth letter of an alphabet used by people to represent sounds and words in the process of writing down their spoken language. The only ‘E’s in the computer are the one on the keyboard and the ones that appear on the screen. All the ‘E’s that are in bytes are just the code that appears next to the ‘E’ on an ASCII code table. They are not ‘E’s, there is no way to put an ‘E’ in a computer. Even if you put a picture of an ‘E’ in a computer, it isn’t actually an ‘E’ until it is displayed on the screen. That’s when a person can look at it and say “That’s an E.”
Bytes are dumb. They just contain patterns of ons and offs. If a byte contains 0100 0101, and you send it to the printer, it will print the letter ‘E.’ If you send it to the Instruction Register, the computer will execute a Jump instruction. If you send it to the Memory Address Register, it will select byte number 69 of the RAM. If you send it to one side of the Adder, it will add 69 to whatever is on the other side of the Adder. If you send it to the display screen, it will set three pixels on and five pixels off.
Each of these pieces of the computer is designed with a code in mind, but once it is built, the mind is gone and even the code is gone. It just does what it was designed to do.
There is no limit to the codes that can be invented and used in a computer. Programmers invent new codes all the time. Like the cash register in the fast food restaurant mentioned earlier, somewhere in that machine is a bit that means ‘include French fries.’
The Disk
Most computers have a disk. This is simply another peripheral that is attached to the I/O bus. The disk’s mission is very simple; it can do two things. You can send it bytes, which it will store, or you can tell it to send back some bytes, which were stored previously.
There are two reasons that most computers have a disk. First, they have the ability to store a huge number of bytes, many times greater than the Computer’s RAM. The CPU can only execute programs that are in RAM, it can only manipulate bytes that are in RAM. But there is never enough RAM to store all of the things that you may want to do with your computer. And so a disk will hold everything, and when you want to do one thing, the bytes on the disk for that one thing will be copied into RAM and used. Then when you want to do something different, the bytes for the new activity will be copied from the disk into the same area of RAM that had been used for the first activity.
The second reason that computers have disks, is that the bytes stored on the disk do not disappear when you turn the power off. The RAM loses its settings when you turn the computer off, when you turn it back on, all bytes are 0000 0000, but the disk retains everything that has been written on it.