76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
#include <vector>
|
|
#include "Parser.h"
|
|
#include "Assembler.h"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if (argc < 3) {
|
|
std::cout << "Usage: " << argv[0] << " code.asm output.bin\n";
|
|
return 1;
|
|
}
|
|
|
|
try {
|
|
|
|
std::ifstream image(argv[1]);
|
|
if (image.is_open()) {
|
|
std::vector<uint8_t> bytes;
|
|
int c;
|
|
while (!image.eof() && (c = image.get()) != EOF) {
|
|
bytes.push_back(c);
|
|
}
|
|
|
|
|
|
Parser parser(bytes);
|
|
/*for (auto& f : parser.getTree()){
|
|
std::cout << f.label << ":\n";
|
|
for (auto& d : f.declarations){
|
|
if(!d.label.empty()){
|
|
std::cout << " " << d.label << ":\n";
|
|
}
|
|
std::cout << " ";
|
|
for (auto& t : d.tokens){
|
|
switch (t.getType()) {
|
|
case Token::Type::Operator:
|
|
std::cout << t.getTextValue() << " ";
|
|
break;
|
|
case Token::Type::RegisterName:
|
|
case Token::Type::RegisterLocation:
|
|
case Token::Type::CodeLabel:
|
|
case Token::Type::CodeLocation:
|
|
case Token::Type::Immediate:
|
|
std::cout << t.getTextValue() << ", ";
|
|
break;
|
|
|
|
case Token::Type::LocalLabel:
|
|
case Token::Type::Label:
|
|
break;
|
|
}
|
|
|
|
}
|
|
std::cout << "\n";
|
|
}
|
|
}*/
|
|
|
|
Assembler assembler(parser);
|
|
assembler.assemble();
|
|
|
|
std::ofstream patchedImage(argv[2]);
|
|
|
|
if (patchedImage.is_open()) {
|
|
auto &result = assembler.getImage();
|
|
for (auto c : result) {
|
|
patchedImage.put(c);
|
|
}
|
|
patchedImage.close();
|
|
}
|
|
|
|
}
|
|
} catch (const std::exception &e) {
|
|
std::cerr << e.what() << "\n";
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|