12 Commits
v1.5 ... v1.8

Author SHA1 Message Date
f881b9b4e7 update version to v1.8 2024-12-13 18:09:06 +01:00
00b0368f03 update test 2024-12-13 18:08:26 +01:00
6eec4d8d3d update README 2024-12-13 18:08:19 +01:00
7ab4540201 Omg je suis aveugle 2024-12-13 16:40:39 +00:00
7615546f9e update README 2024-12-13 16:48:31 +01:00
9f77c1ec11 update to v1.7 2024-12-13 16:41:44 +01:00
0ae55ef466 fix label address 2024-12-13 16:38:56 +01:00
ada82368d0 fix bit padding 2024-12-13 16:35:05 +01:00
9f1d80cd9e align hexa output 2024-12-13 16:04:29 +01:00
ade88faa0b fix load and store 2024-12-10 18:06:23 +01:00
99a7e32269 update to v1.6 2024-12-07 12:36:11 +01:00
348f7bf720 fix logisim output 2024-12-07 12:35:53 +01:00
6 changed files with 64 additions and 38 deletions

View File

@@ -25,8 +25,8 @@ operations:
SR R1 R2 R3 SR R1 R2 R3
MUL R1 R2 R3 MUL R1 R2 R3
io: io:
STR R1 R2 R3 STR R1 R2
LD R1 R2 R3 LD R1 R2
sauts: sauts:
JMP controle JMP controle
JEQU R1 R2 io JEQU R1 R2 io
@@ -42,22 +42,22 @@ Produces
``` ```
00000100 10100000 00000000 00000001 00000100 10100000 00000000 00000001
00010000 10100110 00000000 00000000 00001000 10100110 00000000 00000000
00100100 10100000 00000000 00100001 00010100 10100000 00000000 00100001
01000000 10100110 00000000 00000000 00100000 10100110 00000000 00000000
00011000 10100110 00000000 00000000
00101000 10100110 00000000 00000000
00110000 10100110 00000000 00000000 00110000 10100110 00000000 00000000
01010000 10100110 00000000 00000000 00111000 10100110 00000000 00000000
01100000 10100110 00000000 00000000 01000000 10100000 00000000 00000000
01110000 10100110 00000000 00000000 01001000 10100000 00000000 00000000
01000000 10100110 00000000 00000000 11000000 00000000 00000000 00001111
01010000 10100110 00000000 00000000 11001000 10100000 00000000 00001000
11000000 00000000 00000000 00010000 11010000 10100000 00000000 00001010
11010000 10100000 00000000 00001001 11011000 10100000 00000000 00000000
11100000 10100000 00000000 00001011 11100000 10100000 00000000 00001111
11110000 10100000 00000000 00000001 11101000 00000000 00000000 00001000
11000000 10100000 00000000 00010000 11110000 00000000 00000000 00000000
11010000 00000000 00000000 00001001
11100000 00000000 00000000 00000000
``` ```
## Releases ## Releases

View File

@@ -51,6 +51,17 @@ static std::map<std::string, Instruction> INSTRUCTION_KEYS = {
{"ret", {SautControle, Ret}}, {"ret", {SautControle, Ret}},
}; };
constexpr int LINE_LENGTH = 32;
constexpr int INSTRUCTION_BITS_COUNT = 2;
constexpr int OPERATION_BITS_COUNT = 3;
constexpr int IMMEDIATE_BITS_COUNT = 1;
constexpr int INSTRUCTION_BLOCK_SIZE = INSTRUCTION_BITS_COUNT + OPERATION_BITS_COUNT + IMMEDIATE_BITS_COUNT;
constexpr int REGISTRY_BITS_COUNT = 3;
static constexpr int GetOffset(int a_Start, int a_BlockSize) {
return LINE_LENGTH - a_Start - a_BlockSize;
}
std::uint32_t Assembleur::ParseLabel(const std::string& a_Label) { std::uint32_t Assembleur::ParseLabel(const std::string& a_Label) {
auto it = m_Labels.find(a_Label); auto it = m_Labels.find(a_Label);
@@ -58,41 +69,60 @@ std::uint32_t Assembleur::ParseLabel(const std::string& a_Label) {
throw std::invalid_argument("Label " + a_Label + " not found !"); throw std::invalid_argument("Label " + a_Label + " not found !");
} }
return it->second; // the address starts at 0, not 1
return it->second - 1;
} }
void Assembleur::AddLabel(const std::string& a_Label, std::uint32_t a_Line) { void Assembleur::AddLabel(const std::string& a_Label, std::uint32_t a_Line) {
m_Labels.insert({a_Label, a_Line}); m_Labels.insert({a_Label, a_Line});
} }
// 2 bits type instruction | 3 bits sous-type opération
std::uint32_t Assembleur::IToInt(Instruction a_Instruction) { std::uint32_t Assembleur::IToInt(Instruction a_Instruction) {
return static_cast<std::uint32_t>(a_Instruction.m_Instruction) << 30 | static_cast<std::uint32_t>(a_Instruction.m_SubInstruction) return static_cast<std::uint32_t>(a_Instruction.m_Instruction) << GetOffset(0, INSTRUCTION_BITS_COUNT) |
<< 28; static_cast<std::uint32_t>(a_Instruction.m_SubInstruction) << GetOffset(INSTRUCTION_BITS_COUNT, OPERATION_BITS_COUNT);
} }
// 5 bits instruction | 1 bit immédiat (non utilisé) | 3 bits R1 | 3 bits R2 | 3 bits R3
std::uint32_t Assembleur::ParseOperation(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_R3) { std::uint32_t Assembleur::ParseOperation(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_R3) {
return IToInt(a_Instruction) | a_R1 << 23 | a_R2 << 20 | a_R3 << 17; return IToInt(a_Instruction) |
a_R1 << GetOffset(INSTRUCTION_BLOCK_SIZE, REGISTRY_BITS_COUNT) |
a_R2 << GetOffset(INSTRUCTION_BLOCK_SIZE + REGISTRY_BITS_COUNT, REGISTRY_BITS_COUNT) |
a_R3 << GetOffset(INSTRUCTION_BLOCK_SIZE + 2 * REGISTRY_BITS_COUNT, REGISTRY_BITS_COUNT);
} }
// 5 bits instruction | 1 bit immédiat | 3 bits R1 | 3 bits R2 | 20 bits constante
std::uint32_t Assembleur::ParseOperationImmediate( std::uint32_t Assembleur::ParseOperationImmediate(
Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_C1) { Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_C1) {
return IToInt(a_Instruction) | 1 << 26 | a_R1 << 23 | a_R2 << 20 | a_C1; return IToInt(a_Instruction) | 1 << GetOffset(INSTRUCTION_BITS_COUNT + OPERATION_BITS_COUNT, IMMEDIATE_BITS_COUNT) |
a_R1 << GetOffset(INSTRUCTION_BLOCK_SIZE, REGISTRY_BITS_COUNT) |
a_R2 << GetOffset(INSTRUCTION_BLOCK_SIZE + REGISTRY_BITS_COUNT, REGISTRY_BITS_COUNT) |
a_C1;
} }
// 5 bits instruction | 1 bit immédiat (non utilisé) | 26 bits adresse du label
std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, const std::string& a_Label) { std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, const std::string& a_Label) {
return IToInt(a_Instruction) | ParseLabel(a_Label) & 0x3FFFFFF; return IToInt(a_Instruction) | ParseLabel(a_Label) & 0x3FFFFFF;
} }
// 5 bits instruction | 1 bit immédiat (non utilisé) | 3 bits R1 | 3 bits R2 | 20 bits adresse du label
std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, std::uint8_t a_R1, std::uint8_t a_R2, const std::string& a_Label) { std::uint32_t Assembleur::ParseJump(Instruction a_Instruction, std::uint8_t a_R1, std::uint8_t a_R2, const std::string& a_Label) {
return IToInt(a_Instruction) | a_R1 << 23 | a_R2 << 20 | ParseLabel(a_Label) & 0xFFFFF; return IToInt(a_Instruction) |
a_R1 << GetOffset(INSTRUCTION_BLOCK_SIZE, REGISTRY_BITS_COUNT) |
a_R2 << GetOffset(INSTRUCTION_BLOCK_SIZE + REGISTRY_BITS_COUNT, REGISTRY_BITS_COUNT) |
ParseLabel(a_Label) & 0xFFFFF;
} }
// 5 bits instruction | 1 bit immédiat (non utilisé)
std::uint32_t Assembleur::ParseJump(Instruction a_Instruction) { std::uint32_t Assembleur::ParseJump(Instruction a_Instruction) {
return IToInt(a_Instruction); return IToInt(a_Instruction);
} }
std::uint32_t Assembleur::ParseIO(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_R3) { // 5 bits instruction | 1 bit immédiat (non utilisé) | 3 bits R1 | 3 bits R2
return IToInt(a_Instruction) | a_R1 << 23 | a_R2 << 20 | a_R3 << 17; std::uint32_t Assembleur::ParseIO(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2) {
return IToInt(a_Instruction) |
a_R1 << GetOffset(INSTRUCTION_BLOCK_SIZE, REGISTRY_BITS_COUNT) |
a_R2 << GetOffset(INSTRUCTION_BLOCK_SIZE + REGISTRY_BITS_COUNT, REGISTRY_BITS_COUNT);
} }
@@ -146,9 +176,9 @@ std::uint32_t Assembleur::ParseInstruction(const std::string& a_Str, std::uint32
} }
case Memoire: { case Memoire: {
std::string R1, R2, R3; std::string R1, R2;
ss >> R1 >> R2 >> R3; ss >> R1 >> R2;
return ParseIO(instruction, ParseRegistry(R1), ParseRegistry(R2), ParseRegistry(R3)); return ParseIO(instruction, ParseRegistry(R1), ParseRegistry(R2));
} }
case SautControle: { case SautControle: {

View File

@@ -39,5 +39,5 @@ class Assembleur {
std::uint32_t ParseJump(Instruction a_Instruction); std::uint32_t ParseJump(Instruction a_Instruction);
std::uint32_t ParseIO(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2, std::uint32_t a_R3); std::uint32_t ParseIO(Instruction a_Instruction, std::uint32_t a_R1, std::uint32_t a_R2);
}; };

View File

@@ -99,12 +99,8 @@ void OutputFileLogisim(BinaryData& a_Data, const std::string& fileName, const st
for (std::uint32_t number : a_Data) { for (std::uint32_t number : a_Data) {
if (cursor % 8 == 0) { if (cursor % 8 == 0) {
file << std::setfill('0') << std::setw(4) << std::hex << cursor << std::dec << ": "; file << std::setfill('0') << std::setw(4) << std::hex << cursor << std::dec << ": ";
file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " "
<< std::bitset<8>(number) << " ";
} else {
file << std::bitset<8>(number >> 24) << " " << std::bitset<8>(number >> 16) << " " << std::bitset<8>(number >> 8) << " "
<< std::bitset<8>(number) << "\n";
} }
cursor += 4; file << std::setfill('0') << std::setw(8) << std::hex << number << std::dec << (((cursor + 1) % 8 == 0) ? "\n" : " ");
cursor++;
} }
} }

View File

@@ -3,7 +3,7 @@
#include "IO.h" #include "IO.h"
#define ASSEMBLEUR_VERSION "1.5" #define ASSEMBLEUR_VERSION "1.8"
int main(int argc, char** argv) { int main(int argc, char** argv) {

View File

@@ -8,8 +8,8 @@ operations:
SR R1 R2 R3 SR R1 R2 R3
MUL R1 R2 R3 MUL R1 R2 R3
io: io:
STR R1 R2 R3 STR R1 R2
LD R1 R2 R3 LD R1 R2
sauts: sauts:
JMP controle JMP controle
JEQU R1 R2 io JEQU R1 R2 io