Store (Direct) |
store END, RX |
Stores the data from RX in the memory pointed by END |
110001|RX|xxx|xxx|x END |
Load (Direct) |
load RX, END |
Reads the data pointed by END and stores in RX |
110000|RX|xxx|xxx|x END |
STOREI (Indirect) |
storei RX, RY |
Stores the data from RX in the memory pointed by RY |
111101|RX|RY|xxx|x |
LOADI (Indirect) |
loadi RX, RY |
Reads the data pointed by RY and stores in RX |
111100|RX|RY|xxx|x |
LOADN (Immediatly) |
loadn RX, #NR |
Stores #NR in RX |
111000|RX|xxx|xxx|x NR |
| MOV |
mov RX, RY |
Stores the data from RY in RX |
110011|RX|RY|xx|x0 |
| MOV |
mov RX, SP |
Stores the data from SP in RX |
110011|RX|xxx|xx|01 |
| MOV |
mov SP, RX |
Stores the data from RX in SP |
110011|RX|xxx|xx|11 |
| ADD |
add RX, RY, RZ |
Stores result of RY + RZ in RX |
100000|RX|RY|RZ|0 |
| ADDC |
addc RX, RY, RZ |
Stores result of RY + RZ + Carry in RX |
100000|RX|RY|RZ|1 |
| SUB |
sub RX, RY, RZ |
Stores result of RY - RZ in RX |
100001|RX|RY|RZ|0 |
| SUBC |
subc RX, RY, RZ |
Stores result of RY - RZ + Carry in RX |
100001|RX|RY|RZ|1 |
| MULT |
mult RX, RY, RZ |
Stores result of RY * RZ in RX |
100010|RX|RY|RZ|0 |
| MULTC |
multc RX, RY, RZ |
Stores result of RY * RZ + Carry in RX |
100010|RX|RY|RZ|1 |
| DIV |
div RX, RY, RZ |
Stores result of RY / RZ in RX |
100011|RX|RY|RZ|0 |
| DIVC |
divc RX, RY, RZ |
Stores result of RY / RZ + Carry in RX |
100011|RX|RY|RZ|1 |
| INC |
inc RX |
Increases the value of RX by one |
100100|RX|0|xxx|xxx |
| DEC |
dec RX |
Decreases the value of RX by one |
100100|RX|1|xxx|xxx |
| MOD |
mod RX, RY, RZ |
Stores result of RY % RZ in RX |
100101|RX|RY|RZ|x |
| AND |
and RX, RY, RZ |
Stores result of RY & RZ in RX |
010010|RX|RY|RZ|x |
| OR |
or RX, RY, RZ |
Stores result of RY | RZ in RX |
010011|RX|RY|RZ|x |
| XOR |
xor RX, RY, RZ |
Stores result of RY ^ RZ in RX |
010100|RX|RY|RZ|x |
| NOT |
not RX, RY |
Stores result of !RY in RX |
010101|RX|RY|xxx|x |
| ROTL |
rotl RX, N |
Rotates RX left N times |
010000|RX|10x|NNN|N |
| ROTR |
rotr RX, N |
Rotates RX right N times |
010000|RX|11x|NNN|N |
| SHIFTL0 |
shitl0 RX, N |
Shifts RX to the left N times filling with 0 |
010000|RX|000|NNN|N |
| SHIFTL1 |
shitl1 RX, N |
Shifts RX to the left N times filling with 1 |
010000|RX|001|NNN|N |
| SHIFTR0 |
shitr0 RX, N |
Shifts RX to the right N times filling with 0 |
010000|RX|010|NNN|N |
| SHIFTR1 |
shitr1 RX, N |
Shifts RX to the right N times filling with 1 |
010000|RX|011|NNN|N |
| CMP |
cmp RX, RY |
Stores to the Flag Register the result of RX = RY, RX > RY, and RX < RY |
010110|RX|RY|xxx|x |
| INCHAR |
inchar RX |
Stores the ASCII representation of the current keyboard key in RX |
110101|RX|xxx|xxx|x |
| OUTCHAR |
outchar RX, RY |
Stores the value of RX to the frame buffer pixel pointed by RY |
110010|RX|RY|xxx|x |
| JMP |
jmp END |
Jumps to END |
000010|0000|x|xxxxx END |
| JEQ |
jeq END |
Jumps to END if Equal flag is set (?) |
000010|0001|x|xxxxx END |
| JNE |
jne END |
Jumps to END if Equal flag is not set (?) |
000010|0010|x|xxxxx END |
| JZ |
jz END |
Jumps to END if Zero flag is set (?) |
000010|0011|x|xxxxx END |
| JNZ |
jnz END |
Jumps to END if Zero flag is not set (?) |
000010|0100|x|xxxxx END |
| JC |
jc END |
Jumps to END if Carry flag is set (?) |
000010|0101|x|xxxxx END |
| JNC |
jnc END |
Jumps to END if Carry flag is not set (?) |
000010|0110|x|xxxxx END |
| JGR |
jgr END |
Jumps to END if Greater flag is set (?) |
000010|0111|x|xxxxx END |
| JLE |
jle END |
Jumps to END if Lesser flag is set (?) |
000010|1010|x|xxxxx END |
| JEG |
jeg END |
Jumps to END if Equal or Greater flag is set (?) |
000010|1001|x|xxxxx END |
| JEL |
jel END |
Jumps to END if Equal or Lesser flag is set (?) |
000010|1010|x|xxxxx END |
| JOV |
jov END |
Jumps to END if Overflow flag is set (?) |
000010|1011|x|xxxxx END |
| JNOV |
jnov END |
Jumps to END if Overflow flag is not set (?) |
000010|1100|x|xxxxx END |
| JN |
jn END |
Jumps to END if Negative flag is set (?) |
000010|1101|x|xxxxx END |
| JDZ |
jdz END |
Jumps to END if DivByZero flag is set (?) |
000010|1110|x|xxxxx END |
| CALL |
call END |
Calls END |
000011|0000|x|xxxxx END |
| CEQ |
ceq END |
Calls END if Equal flag is set (?) |
000011|0001|x|xxxxx |
| CNE |
cne END |
Calls END if Equal flag is not set (?) |
000011|0010|x|xxxxx |
| CZ |
cz END |
Calls END if Zero flag is set (?) |
000011|0011|x|xxxxx |
| CNZ |
cnz END |
Calls END if Zero flag is not set (?) |
000011|0100|x|xxxxx |
| CC |
cc END |
Calls END if Carry flag is set (?) |
000011|0101|x|xxxxx |
| CNC |
cnc END |
Calls END if Carry flag is not set (?) |
000011|0110|x|xxxxx |
| CGR |
cgr END |
Calls END if Greater flag is set (?) |
000011|0111|x|xxxxx |
| CLE |
cle END |
Calls END if Lesser flag is set (?) |
000011|1000|x|xxxxx |
| CEG |
ceg END |
Calls END if Equal or Greater flag is set (?) |
000011|1001|x|xxxxx |
| CEL |
cel END |
Calls END if Equal or Lesser flag is set (?) |
000011|1010|x|xxxxx |
| COV |
cov END |
Calls END if Overflow flag is set (?) |
000011|1011|x|xxxxx |
| CNOV |
cnov END |
Calls END if Overflow flag is not set (?) |
000011|1100|x|xxxxx |
| CN |
cn END |
Calls END if Negative flag is set (?) |
000011|1101|x|xxxxx |
| CDZ |
cdz END |
Calls END if DivByZero flag is set (?) |
000011|1110|x|xxxxx |
| RTS |
rts |
Returns to the instruction after the CALL |
000100|xxxx|x|xxxxx |
| PUSH |
push RX |
Pushes the value of RX to the Stack |
000101|RX|0|xxxxxx |
| PUSH |
push FR |
Pushes the value of FR to the Stack |
000101|xxx|1|xxxxxx |
| POP |
pop RX |
Pops the Stack to RX |
000110|RX|0|xxxxxx |
| POP |
pop FR |
Pops the Stack to FR |
000110|xxx|1|xxxxxx |
| CLEARC |
clearc |
Clears Carry |
001000|0|xxxxxxxxx |
| SETC |
setc |
Sets Carry |
001000|1|xxxxxxxxx |
| HALT |
halt |
Halts the processor |
001111|x|xxxxxxxxx |
| NOOP |
noop |
No opeation |
000000|x|xxxxxxxxx |
| BREAKP |
breakp |
Inserts a break point (?) |
001110|x|xxxxxxxxx |
This issue will serve as a way to document the decisions made for design of the ILDEArch architecture. Fell free to comment your ideas.
Current ICMC architecture
From monografia_compilador.pdf and ProcessadorICMC2.pdf we can derive that the architecture has:
It has a RISC instruction set with the following 72 instructions:
(Direct)
in the memory pointed by END
END
(Direct)
and stores in RX
END
(Indirect)
in the memory pointed by RY
(Indirect)
and stores in RX
(Immediatly)
NR
in RX
in RX
in SP
RY + RZ
in RX
RY + RZ + Carry
in RX
RY - RZ
in RX
RY - RZ + Carry
in RX
RY * RZ
in RX
RY * RZ + Carry
in RX
RY / RZ
in RX
RY / RZ + Carry
in RX
by one
by one
RY % RZ
in RX
RY & RZ
in RX
RY | RZ
in RX
RY ^ RZ
in RX
!RY
in RX
N times
N times
N times
filling with 0
N times
filling with 1
N times
filling with 0
N times
filling with 1
the result of
RX = RY,
RX > RY, and
RX < RY
of the current keyboard key
in RX
to the frame buffer pixel
pointed by RY
END
if Equal flag is set (?)
END
if Equal flag is not set (?)
END
if Zero flag is set (?)
END
if Zero flag is not set (?)
END
if Carry flag is set (?)
END
if Carry flag is not set (?)
END
if Greater flag is set (?)
END
if Lesser flag is set (?)
END
if Equal or Greater flag
is set (?)
END
if Equal or Lesser flag
is set (?)
END
if Overflow flag
is set (?)
END
if Overflow flag
is not set (?)
END
if Negative flag
is set (?)
END
if DivByZero flag
is set (?)
END
END
if Equal flag is set (?)
if Equal flag is not set (?)
if Zero flag is set (?)
if Zero flag is not set (?)
if Carry flag is set (?)
if Carry flag is not set (?)
if Greater flag is set (?)
if Lesser flag is set (?)
if Equal or Greater flag
is set (?)
if Equal or Lesser flag
is set (?)
if Overflow flag
is set (?)
if Overflow flag
is not set (?)
if Negative flag
is set (?)
if DivByZero flag
is set (?)
after the CALL
to the Stack
to the Stack
RX
FR