criscv/src/main.c
Minecon724 86d73692f9
update
something's very wrong idk what
2024-10-17 19:35:00 +02:00

94 lines
No EOL
2.3 KiB
C

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "program_loader.h"
#include "cpu.h"
int main(int argc, char *argv[]) {
if (argc == 1) {
fprintf(stderr, "Usage: criscv <binary program>\n");
return 1;
}
AddressSpace *addressSpace = create_address_space(256, 256);
printf("Address space: %dB ROM, %dB RAM\n", addressSpace->romSize, addressSpace->ramSize);
if (load_to_rom(argv[1], addressSpace) != 0) {
fprintf(stderr, "Error loading program\n");
return 1;
}
CPU cpu = create_cpu(addressSpace);
cpu.registers[1] = addressSpace->romSize + addressSpace->ramSize; // make jumping to x1 end the program
printf("\n----- Start of program -----");
int code;
uint32_t cycles = 0;
while ((code = cpu_cycle(&cpu)) == 0) {
cycles++;
//sleep(1);
}
printf("\n\n----- End of program -----\n");
printf("\n Emulator exit code: \033[1m%d\033[0m\n", code);
printf(" Program exit code: \033[1m%d\033[0m (x10)\n", cpu.registers[10]);
printf(" Cycles: \033[1m%u\033[0m\n\n", cycles);
int cols[8] = {0};
int total = 0;
for (int col=0; col<8; col++) {
int len;
for (int row=0; row<4; row++) {
int i = 8 * row + col;
len = snprintf(NULL, 0, "%d: \033[1m0x%X\033[0m (%u)", i, cpu.registers[i], cpu.registers[i]);
if (len > cols[col]) {
cols[col] = len;
}
}
total += len;
}
printf("+");
for (int i=0; i<8; i++) {
for (int j=0; j<cols[i] - 6; j++) {
printf("-");
}
printf("+");
}
for (int i=0; i<32; i++) {
if (i % 8 == 0) {
printf("\n| ");
}
int row = i / 8;
int col = i - row * 8;
int len = cols[col];
char *entry = malloc(len);
char *entryy = malloc(len);
memset(entry, ' ', len);
int flen = snprintf(entryy, len+1, "%d: \033[1m0x%X\033[0m (%u)", i, cpu.registers[i], cpu.registers[i]);
for (int j=0; j<flen; j++) {
entry[j] = entryy[j];
}
printf("%s | ", entry);
}
printf("\n+");
for (int i=0; i<8; i++) {
for (int j=0; j<cols[i] - 6; j++) {
printf("-");
}
printf("+");
}
printf("\n");
return 0;
}