Added README / Base level.
Added note on operations.
This commit is contained in:
parent
742aeb431f
commit
e22bff1289
10
README.md
Normal file
10
README.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
MAL Note
|
||||
========
|
||||
|
||||
A collection of notes relating to the MIC1 MAL language, described in the book
|
||||
**Structured Computer Organization** by **Andrew S. Tanenbaum**.
|
||||
|
||||
Pages:
|
||||
|
||||
- [./registers.md](Registers)
|
||||
- [./operations.md](Operations)
|
101
operations.md
Normal file
101
operations.md
Normal file
|
@ -0,0 +1,101 @@
|
|||
Operations in MAL
|
||||
=================
|
||||
|
||||
In MAL there is one main type of operation, and several sub-operations which can
|
||||
be attached.
|
||||
|
||||
ALU Operations
|
||||
--------------
|
||||
|
||||
There are three parts to any ALU operation...
|
||||
|
||||
### Choosing which registers to write to
|
||||
|
||||
You can write to any number of registers, as long as those registers can be
|
||||
written to. [./registers.md](See here for the distinctions between registers.)
|
||||
|
||||
The formatting for is, is simply to add any number of register names, and a
|
||||
equals sign afterwards:
|
||||
|
||||
REG1 = ... = REGN =
|
||||
|
||||
### Choosing what to set them to
|
||||
|
||||
This is the fun part. There are 64 possible ALU operations, and is increased to
|
||||
192 distinct operations when working with shifter, but a large number of them
|
||||
produce nonsense, and thus ain't available from MAL.
|
||||
|
||||
Assuming `A` is any readable register, except `H`, the following is the full
|
||||
list of operations before shifting:
|
||||
|
||||
A
|
||||
-A
|
||||
INV(A)
|
||||
A + 1
|
||||
|
||||
H
|
||||
INV(H)
|
||||
H + 1
|
||||
|
||||
A AND H
|
||||
A OR H
|
||||
A + H
|
||||
A + H + 1
|
||||
H - A
|
||||
H - 1
|
||||
|
||||
0
|
||||
1
|
||||
-1
|
||||
|
||||
It is important to notice how not all operations are equally valid for both A
|
||||
and H, for example `-A` have no `H` counterpart.
|
||||
|
||||
### Possibly do some shifting
|
||||
|
||||
The shifter is hooked directly up to the ALU output, which means that shifting
|
||||
always happens last. Shifting is added to the operations, after any other
|
||||
operation. The MIC1 only support left shifting 8, and right rotating 1:
|
||||
|
||||
<< 8
|
||||
>> 1
|
||||
|
||||
### Summary
|
||||
|
||||
It is thus possible to take several different smaller parts, and combine them
|
||||
into a large (though useless) operation like this:
|
||||
|
||||
MDR = H = MAR AND H << 8
|
||||
|
||||
Other Operations
|
||||
----------------
|
||||
|
||||
In addition to the ALU operations, some misc other operations exist. Most of
|
||||
these can be executed in the same cycle as an ALU operation.
|
||||
|
||||
Adding one or more of these to an ALU operation, can be done by separating them
|
||||
with a semicolon, like so:
|
||||
|
||||
MDR = A + 1; wr; fetch; goto(MBR)
|
||||
|
||||
Lets go over them quickly:
|
||||
|
||||
- `rd`: Reads the `MAR`th word from memory to `MDR`. `MAR` can be set same
|
||||
clock cycle.
|
||||
- `wr`: Writes `MDR` to the `MAR`th word in memory. `MAR` and `MDR` can be set
|
||||
same clock cycle.
|
||||
- `fetch`: Reads the `PC`th byte from program memory to `MBR`. `PC` can be set
|
||||
same clock cycle.
|
||||
|
||||
- `goto LABEL1`: Specifies a specific label to jump to. Equal to setting the
|
||||
BPC to the position of the label. Usable any clock cycle.
|
||||
- `if (X) goto LABEL1; else goto LABEL2`: Jumps to either label depending upon
|
||||
the value of X. X can be the virtual registers `Z` or `N`. Usable any clock
|
||||
cycle.
|
||||
|
||||
- `goto (MBR)`: Sets the BPC to the value of `MBR`. `MBR` can be loaded same
|
||||
clock cycle.
|
||||
- `goto (MBR or 0x100)`: Sets the BPC to the value of `MBR OR 0x100`. Adding
|
||||
by `0x100`, but faster. `MBR` can be loaded same clock cycle.
|
||||
|
||||
Using the last two might be tricky.
|
Loading…
Reference in New Issue
Block a user