|
|
|
|
|
by kunai
4873 days ago
|
|
So essentially, this is writing an application in machine code? This is so fascinating I'm starting to get palpitations. I've always wanted to know how to program in machine code. I've looked through the web countless times in search of something like this, and haven't ever found it, until now. Thanks for the great insight. This kind of stuff makes C/C++ look like stuff for total newbies. Getting this close to the hardware really is quite mind-boggling. |
|
1) Decide which processor you want to program. I'm going to use a Z80, since that's one I'm familiar with.
2) Get hold of a good book, making sure it includes a section that exhaustively describes each instruction and the machine code for each. Eg. "Programming the Z80" by Rodnay Zaks. The microprocessor's datasheet will generally do if your familiar with other processors.
3) Read the book, cover to cover.
4) Make three vertical columns on a sheet of paper.
5) Write your program, in assembly language, in the middle column. Use alphanumeric labels (label means variable name) for all addresses.
6) Decide at what address you want your program to start (the origin)
7) Write the numeric address in the left hand column, next to the first instruction.
8) Look up the machine code, for the instruction in the middle column, in the Zaks book.
9) Write the machine code in the right hand column.
10) Add the length of the instruction (# bytes) that you have just written down to the address, and write the answer on the next row of the left hand column. You might have to leave labels in place for instructions that refer to parts of the program that you have not yet assembled.
11) Repeat from step 8, until the entire program has been assembled.
12) Go back and fill in the numerical addresses for any addresses that are still labels.
13) Now you have to get the program in memory. We're going to assume that a programming language, such as BASIC is available. The alternative is a keypad with address/data entry functions and a method to get an initial value into the program counter.
14) Create a big array, in BASIC, with all the numbers from the right hand column.
15) Write a loop which POKES each numeric value into memory, starting from the origin address.
16) Transfer execution to the origin address, using the a USR(nnnn) instruction, where nnnn is the origin address.
17) Hopefully your program works, but if not, make changes and go back to step 4 until your program works.
Enjoy! In time, the process gets quicker, as you eventually remember the machine code for the the most common instructions and don't have to refer to the book.
If you're writing timing critical code, have a fourth column, in which you record the number of clock cycles for each instruction to execute, and sum those numbers to determine execution time. If you have a target execution time, you will need to add/remove instructions to achieve the target.