Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
instruction_encoding [2021/04/25 14:20] – [ALU instructions] simerinstruction_encoding [2024/07/01 13:29] (current) – [Multiplication] simer
Line 7: Line 7:
 ^Contents|Opcode0|Operand A|Opcode1|6-bit Immediate         || ^Contents|Opcode0|Operand A|Opcode1|6-bit Immediate         ||
  
 +===== Summary =====
 +
 +^Opcode 0\1     ^ 0       ^ 1            ^ 2           ^ 3  ^ 4                        ^ 5        ^ 6        ^ 7     ^
 +^Addressing mode|[BP+Imm6]|#Imm6                     |[Rs]|Rs,#Imm16,[Addr16], Rs ASR|Rs LSL/LSR|Rs ROL/ROR|[Addr6]|
 +^        | **ADD**, //JB, JNAE, JCC// ||             | **ADD** |||||
 +^        | **ADC**, //JAE, JNB, JCS// ||             | **ADC** |||||
 +^        | **SUB**, //JGE, JNL, JSC// ||             | **SUB** |||||
 +^        | **SBC**, //JL, JNGE, JSS// ||             | **SBC** |||||
 +^        | **CMP**, //JNE, JNZ//      ||             | **CMP** |||||
 +^        | //JE, JZ//                 ||                       ||||||
 +^        | **NEG**, //JPL//           ||             | **NEG** |||||
 +^        | //JMI//                    ||                       ||||||
 +^        | **XOR**, //JBE, JNA//      ||             | **XOR** |||||
 +^        | **LD**, //JA, JNBE//       ||POP,RETF,RETI| **LD**  |||||
 +^        | **OR**, //JLE, JNG//       ||             | **OR**  |||||
 +^        | **AND**, //JG, JNLE//      ||             | **AND** |||||
 +^        | **TEST**, //JVC//          ||             | **TEST**|||||
 +^        | **ST**, //JVS//            ||PUSH         | **ST**  |||||
 +^        | //JMP//                    ||             ||||||
 +^        | MUL.us        |CALL         |MAC.us,//GOTO// | MAC.us |MUL.ss|INT,IRQ,FIR_MOV,BREAK|MAC.ss ||
 +
 +  * Instructions in bold: uses the addressing mode listed on the first line
 +  * Instructions in italics: only if operand A (destination register) is PC
 ===== Special instructions ===== ===== Special instructions =====
  
Line 21: Line 44:
 Note: Operand A and Operand B cannot be 0, 6 or 7 (it is not possible to multiply SP, SR or PC with something). Note: Operand A and Operand B cannot be 0, 6 or 7 (it is not possible to multiply SP, SR or PC with something).
 They also can not be 3 or 4 in MAC (MR is used for intermediate results). If the size of the MAC  They also can not be 3 or 4 in MAC (MR is used for intermediate results). If the size of the MAC 
-operation is exactly 16, it will be stored as N=0.+operation is exactly 16, it will be encoded as N=0.
 ==== CALL and GOTO ==== ==== CALL and GOTO ====
  
Line 55: Line 78:
 Jump instructions are identified by Operand A = 7 (makes sense, because they change the PC which is register 7) Jump instructions are identified by Operand A = 7 (makes sense, because they change the PC which is register 7)
  
-^Instruction    ^Opcode0^Operand A^Opcode1  ^6-bit Immediate +^Instruction    ^Opcode0^Operand A^Opcode1  ^6-bit Immediate  ^Condition   
-^ JB, JNAE, JCC |  0    |       |Direction| Jump offset     | +^ JB, JNAE, JCC |  0    |       |Direction| Jump offset     | C = 0      
-^ JAE, JNB, JCS |  1    |       |Direction| Jump offset     | +^ JAE, JNB, JCS |  1    |       |Direction| Jump offset     | C = 1      
-^ JGE, JNL, JSC |  2    |       |Direction| Jump offset     | +^ JGE, JNL, JSC |  2    |       |Direction| Jump offset     | S = 0      
-^ JL, JNGE, JSS |  3    |       |Direction| Jump offset     | +^ JL, JNGE, JSS |  3    |       |Direction| Jump offset     | S = 1      
-^ JNE, JNZ      |  4    |       |Direction| Jump offset     | +^ JNE, JNZ      |  4    |       |Direction| Jump offset     | Z = 0      
-^ JE, JZ        |  5    |       |Direction| Jump offset     | +^ JE, JZ        |  5    |       |Direction| Jump offset     | Z = 1      
-^ JPL            6    |       |Direction| Jump offset     | +^ JPL            6    |       |Direction| Jump offset     | N = 0      
-^ JMI            7    |       |Direction| Jump offset     | +^ JMI            7    |       |Direction| Jump offset     | N = 1      
-^ JBE, JNA      |  8    |       |Direction| Jump offset     | +^ JBE, JNA      |  8    |       |Direction| Jump offset     | !(Z=0&C=1) 
-^ JA, JNBE      |  9    |       |Direction| Jump offset     | +^ JA, JNBE      |  9    |       |Direction| Jump offset     | Z=0 & C=1  
-^ JLE, JNG      |  A    |       |Direction| Jump offset     | +^ JLE, JNG      |  A    |       |Direction| Jump offset     | !(Z=0&S=0) 
-^ JG, JNLE      |  B    |       |Direction| Jump offset     | +^ JG, JNLE      |  B    |       |Direction| Jump offset     | Z=0 & S=0  
-^ JVC            C    |       |Direction| Jump offset     | +^ JVC            C    |       |Direction| Jump offset     | N = S      
-^ JVS            D    |       |Direction| Jump offset     | +^ JVS            D    |       |Direction| Jump offset     | N != S     | 
-^ JMP            E    |       |Direction| Jump offset     |+^ JMP            E    |       |Direction| Jump offset     | Always     |
 |                F    |       | Reserved for special instructions || |                F    |       | Reserved for special instructions ||
  
Line 114: Line 137:
 ^%% D:[++Rs]      %%| ALU op|  Op. A  | 3       | 7                | Rs      | ^%% D:[++Rs]      %%| ALU op|  Op. A  | 3       | 7                | Rs      |
 ^%% Rs            %%| ALU op|  Op. A  | 4       | 0                | Rs      | ^%% Rs            %%| ALU op|  Op. A  | 4       | 0                | Rs      |
-^%% #Imm16        %%| ALU op|  Op. A  | 4       | 1                | Rs      | |16-bit immediate in next word| +^%% #Imm16        %%| ALU op|  Op. A  | 4       | 1                | Rs*     | |16-bit immediate in next word, Rs is first operand
-^%% From [Addr16] %%| ALU op|  Op. A  | 4       | 2                | Rs      | |16-bit address in next word| +^%% From [Addr16] %%| ALU op|  Op. A  | 4       | 2                | Rs*     | |16-bit address in next word, Rs is first operand
-^%% To [Addr16]   %%| ALU op|  Op. A  | 4       | 3                | Rs      | |16-bit address in next word|+^%% To [Addr16]   %%| ALU op|  Op. A  | 4       | 3                | Rs*     | |16-bit address in next word, Rs is first operand|
 ^%% Rs ASR shift  %%| ALU op|  Op. A  | 4       | 4 + (shift - 1)  | Rs      | ^%% Rs ASR shift  %%| ALU op|  Op. A  | 4       | 4 + (shift - 1)  | Rs      |
 ^%% Rs LSL shift  %%| ALU op|  Op. A  | 5       | shift - 1        | Rs      | ^%% Rs LSL shift  %%| ALU op|  Op. A  | 5       | shift - 1        | Rs      |
Line 137: Line 160:
  
 The ST operation uses the second source operand (Rs, address, ...) as the target, and operand A (always a register) as the source. The ST operation uses the second source operand (Rs, address, ...) as the target, and operand A (always a register) as the source.
 +
 +Other operations can use both forms, so the "From [Addr16]" would be something like this:
 +
 +''R3 = R2 + [Addr16]''
 +
 +and the "To [Addr16]" corresponds to:
 +
 +''[Addr16] = R2 + R3''
 +
 +(so in this case the register encoded in OPA is used as a source, not a destination).
 +
 +The LD and ST operations with the 16-bit addressing mode ignore the value of Rs, they use only Ra and the 16-bit value.
instruction_encoding.txt · Last modified: 2024/07/01 13:29 by simer
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0