From 0a7a2a7a8f95730811117bd2aa904f1843f65071 Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Fri, 17 Apr 2020 22:07:14 -0400 Subject: Made both the assembly language monitor, and the emulator smaller, and faster. I am also starting to make SuBEditor's source code more readable. --- asmmon.c | 181 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 116 insertions(+), 65 deletions(-) (limited to 'asmmon.c') diff --git a/asmmon.c b/asmmon.c index de4b9a3..b1aead9 100644 --- a/asmmon.c +++ b/asmmon.c @@ -11,21 +11,24 @@ uint8_t isfixup = 0; static char tstr[2048]; void viewmem(uint64_t address) { + putchar('\n'); printf("\t\t\t"); for (int ind = 0; ind < 0x10; ind++) { printf("%02X", ind); - if (ind < 0x0F) - printf(" "); + if (ind < 0x0F) { + putchar(' '); + } } - printf("\n\n"); + puts("\n"); for (int hi = 0; hi < 0x10; hi++) { - printf("%016llX:\t", (address & ~0xF)+(hi*0x10)); + printf("$%016"PRIX64":\t", (address & ~0xF)+(hi*0x10)); for (int lo = 0; lo < 0x10; lo++) { printf("%02X", addr[(address & ~0xF)+lo+(hi*0x10)]); - if (lo < 0x0F) - printf(" "); + if (lo < 0x0F) { + putchar(' '); + } } - printf("\n"); + putchar('\n'); } } @@ -38,8 +41,9 @@ void usage() { puts("\t\t\t\targument specified is \"all\", list all"); puts("\t\t\t\tinstructions, along with a description"); puts("\t\t\t\tfor each of them."); - puts("\tlist, l\t\t\tLists the currently written program."); - puts("\tviewmem, vm, v\t\tGet the contents of memory"); + puts("\tlist, l [$%][start][-][$%][end] [d[ebug], l[inenum], a[ddress]]]"); + puts("\t\t\t\tLists the currently written program."); + puts("\tviewmem, v\t\tGet the contents of memory"); puts("\t\t\t\t(Displays 256 bytes of memory"); puts("\t\t\t\t starting from where the program counter"); puts("\t\t\t\t currently is)."); @@ -49,11 +53,15 @@ void usage() { void instinfo(const char *inst) { for(int i = 0; i < OPNUM; i++) { - if (!strcasecmp(inst, mne[i])) { - printf("%s\t%s\n", mne[i], instdesc[i]); - break; - } else if (!strcasecmp(inst, "all")) { - printf("%s\t%s\n", mne[i], instdesc[i]); + if (inst[0] == mne[i][0]) { + if (!strcasecmp(inst, mne[i])) { + printf("%s\t%s\n", mne[i], instdesc[i]); + break; + } + } else if (inst[0] == 'a') { + if (!strcasecmp(inst, "all")) { + printf("%s\t%s\n", mne[i], instdesc[i]); + } } } } @@ -91,7 +99,7 @@ char *showbits(uint64_t value, uint8_t bitnum, uint8_t dbg) { } -uint16_t list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t addr, uint8_t dbg) { +void list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t addr, uint8_t dbg) { uint16_t i = start; uint8_t j = 0; uint8_t flags = 0; @@ -126,7 +134,7 @@ uint16_t list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t add if (ln) { printf("%u\t", tokline[i].linenum); } else if (addr) { - printf("$%llX:\t", tokline[i].addr); + printf("$%"PRIX64":\t", tokline[i].addr); } spaces = tokline[i].sspace; tabs = tokline[i].stab; @@ -172,7 +180,8 @@ uint16_t list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t add } } if (flags & 0x20) { - printf("%s", get_symname(tokline[i].sym, 0)); + printf("%s", symbols[tokline[i].sym]->name); + /*get_symname(tokline[i].sym, 0));*/ if (tokline[i].islabel) { printf(": "); } else if (tokline[i].issym) { @@ -193,8 +202,8 @@ uint16_t list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t add } switch (tokline[i].opbase) { - case BASE_HEX: printf("$%llX", tokline[i].op); break; - case BASE_DEC: printf("%llu", tokline[i].op); break; + case BASE_HEX: printf("$%"PRIX64, tokline[i].op); break; + case BASE_DEC: printf("%"PRIu64, tokline[i].op); break; case BASE_BIN: printf("%%%s", showbits(tokline[i].op, bitnum, dbg)); break; } bitnum = 0; @@ -217,8 +226,8 @@ uint16_t list(uint16_t start, uint16_t end, uint8_t all, uint8_t ln, uint8_t add bitnum = bitsize[opsize-1]; } switch (tokline[i].aopbase) { - case BASE_HEX: printf("$%llX", tokline[i].aop); break; - case BASE_DEC: printf("%llu", tokline[i].aop); break; + case BASE_HEX: printf("$%"PRIX64, tokline[i].aop); break; + case BASE_DEC: printf("%"PRIu64, tokline[i].aop); break; case BASE_BIN: printf("%%%s", showbits(tokline[i].aop, bitnum, dbg)); break; } bitnum = 0; @@ -298,7 +307,7 @@ uint64_t assemble(uint8_t dbg) { for (; i < lineidx; i++) { if (dbg) { - printf("assemble(): i: $%llX\n", i); + printf("assemble(): i: $%X\n", i); } address = tokline[i].addr; tmpaddr = address; @@ -339,7 +348,7 @@ uint64_t assemble(uint8_t dbg) { printf("%u", rs != 0x00FF); printf("%u", ins != 0x00FF); printf("%u", dir != 0x00FF); - puts(""); + putchar('\n'); printf("assemble(): "); printf("flags: $%04X\n", flags); @@ -354,12 +363,14 @@ uint64_t assemble(uint8_t dbg) { opsize = 0; skip = 0; if ((flags & 0x53) == 0x42) { - value = use_symbol("", symid, tmpaddr, 1, 0); + /*value = use_symbol("", symid, tmpaddr, 1, 0);*/ + value = symbols[symid]->val; } else { value = tokline[i].op; } if ((flags & 0x51) == 0x41) { - value = use_symbol("", symid, tmpaddr, 1, 0); + /*value = use_symbol("", symid, tmpaddr, 1, 0);*/ + value = symbols[symid]->val; } if (flags & 0x220) { switch (cm) { @@ -368,14 +379,14 @@ uint64_t assemble(uint8_t dbg) { } } if (dbg) { - printf("assemble(): value: $%llX\n", value); + printf("assemble(): value: $%"PRIX64"\n", value); } switch (dir) { case DIR_ORG: tmpaddr = value; if (dbg) { printf("assemble(): "); - printf("The Program Counter's origin is now at, $%llX.\n", value); + printf("The Program Counter's origin is now at, $%"PRIX64".\n", value); } skip = 1; break; @@ -402,7 +413,7 @@ uint64_t assemble(uint8_t dbg) { if (dbg) { printf("assemble(): "); printf("Placed string \"%s\"", string[str]); - printf(", at address(es) $%llX-$%llX.\n", address, tmpaddr); + printf(", at address(es) $%"PRIX64"-$%"PRIX64".\n", address, tmpaddr); } } else { addr[tmpaddr++] = value & 0xFF; @@ -428,15 +439,15 @@ uint64_t assemble(uint8_t dbg) { tmp = 0; if (skip || flags & 0x80) { if (dbg) { - printf("assemble(): The address that this line starts at is, $%llX.\n", address); - printf("assemble(): The address that this line ends on is, $%llX.\n", tmpaddr); + printf("assemble(): The address that this line starts at is, $%"PRIX64".\n", address); + printf("assemble(): The address that this line ends on is, $%"PRIX64".\n", tmpaddr); } continue; } if (flags == 0x108) { if (dbg) { - printf("assemble(): The address that this line starts at is, $%llX.\n", address); - printf("assemble(): The address that this line ends on is, $%llX.\n", tmpaddr); + printf("assemble(): The address that this line starts at is, $%"PRIX64".\n", address); + printf("assemble(): The address that this line ends on is, $%"PRIX64".\n", tmpaddr); } continue; } @@ -547,11 +558,11 @@ uint64_t assemble(uint8_t dbg) { } } if (dbg) { - printf("assemble(): The address that this line starts at is, $%llX.\n", address); - printf("assemble(): The address that this line ends on is, $%llX.\n", tmpaddr); + printf("assemble(): The address that this line starts at is, $%"PRIX64".\n", address); + printf("assemble(): The address that this line ends on is, $%"PRIX64".\n", tmpaddr); printf("assemble(): The program size is now at"); - printf(", %llu bytes in decimal", bytecount); - printf(", and $%llX bytes in hex.\n", bytecount); + printf(", %"PRIu64" bytes in decimal", bytecount); + printf(", and $%"PRIX64" bytes in hex.\n", bytecount); } } return bytecount; @@ -567,9 +578,11 @@ int asmmon(const char *fn) { } uint8_t done = 0; uint8_t use_lexer = 1; - uint64_t address = 0x0000; + uint64_t address = 0; uint64_t bytecount = 0; - while (!(done & 1)) { + uint8_t dbg = 0; + init_symbol(); + while (!done) { /*char *buf = NULL;*/ char *cmd; char *arg = malloc(sizeof(char *)*128); @@ -577,7 +590,9 @@ int asmmon(const char *fn) { char *lex_line = NULL; size_t size; ssize_t line_len; - done = 0; + uint8_t cmds = 0; + /* Is shortend command. */ + uint8_t isshcmd = 0; if (!strcasecmp(fn, "stdin")) { line_len = getline(&lex_line, &size, stdin); } else { @@ -587,17 +602,28 @@ int asmmon(const char *fn) { memcpy(cmd, lex_line, line_len+1); cmd = strtok_r(cmd, " \t\n", &tmp); if (cmd != NULL) { - if (strcasecmp(cmd, "done") == 0) { - done |= 1; - } else { - if (cmd[0] == 'q' || !strcasecmp(cmd, "quit")) { + isshcmd = (cmd[1] == '\0' || cmd[1] == ' '); + switch (cmd[0]) { + case 'q': cmds = (isshcmd || !strcasecmp(cmd, "quit" )) << 0; break; + case 'v': cmds = (isshcmd || !strcasecmp(cmd, "viewmem")) << 1; break; + case 'l': cmds = (isshcmd || !strcasecmp(cmd, "list" )) << 2; break; + case 'a': cmds = (isshcmd || !strcasecmp(cmd, "asm" )) << 3; break; + case 'h': cmds = (isshcmd || !strcasecmp(cmd, "help" )) << 4; break; + case 'i': cmds = (isshcmd || !strcasecmp(cmd, "inst" )) << 5; break; + case 'd': cmds = (isshcmd || !strcasecmp(cmd, "done" )) << 6; break; + case 's': cmds = (isshcmd || !strcasecmp(cmd, "set" )) << 7; break; + case ' ': + case '\t': + cmds = 0xFF; + break; + } + switch (cmds) { + case 0x01: return 2; - } else if (cmd[0] == 'v' || !strcasecmp(cmd, "viewmem") || !strcasecmp(cmd, "vm")) { - done |= 4; + case 0x02: viewmem(address); - } else if (!strcasecmp(cmd, "l") || !strcasecmp(cmd, "list")) { - done |= 4; - /*tmp = strtok_r(lex_line, "\n", &tmp);*/ + break; + case 0x04: if (tmp != NULL) { uint16_t i = 0; uint16_t j = 0; @@ -630,7 +656,7 @@ int asmmon(const char *fn) { j = 0; break; } - for (; !isspace(tmp[i]) && tmp[i] != '-'; arg[j++] = tmp[i++]); + for (; !isspace(tmp[i]) && tmp[i] != '-' && tmp[i] != '\0' && tmp[i] != '\n'; arg[j++] = tmp[i++]); arg[j] = '\0'; j = 0; if (base != 0xFF) { @@ -662,31 +688,56 @@ int asmmon(const char *fn) { } else { list(0, 0, 1, 0, 0, 0); } - } else if (!strcasecmp(cmd, "asm") || !strcasecmp(cmd, "a")) { - done |= 4; + break; + case 0x08: puts("Assembling program."); - bytecount = assemble(0); + bytecount = assemble(dbg); puts("Finished assembling program."); - printf("Total Assembled Program Size: %llu/$%llX bytes.\n", bytecount, bytecount); - } else if (!strcasecmp(cmd, "help") || !strcasecmp(cmd, "h")) { - done |= 4; + printf("Total Assembled Program Size: %"PRIu64"/$%"PRIX64" bytes.\n", bytecount, bytecount); + break; + case 0x10: usage(); - } else if (!strcasecmp(cmd, "inst") || !strcasecmp(cmd, "i")) { - done |= 64; - done |= 6; - strtok_r(cmd, " \t", &tmp); + break; + case 0x20: if (tmp != NULL) { instinfo(tmp); } else { instinfo("all"); } - - } - if (use_lexer) { - if (!(done & 4)) { - address = lex(lex_line, address, 0); + break; + case 0x40: + done = 1; + break; + case 0x80: + if (tmp != NULL) { + uint16_t i = 0; + uint16_t j = 0; + uint8_t isdebug = 0; + while (tmp[i] != '\0') { + if (isspace(tmp[i])) { + for (; isspace(tmp[i]); i++); + } + for (; !isspace(tmp[i]) && tmp[i] != '\0' && tmp[i] != '\n'; arg[j++] = tmp[i++]); + arg[j] = '\0'; + j = 0; + isdebug = (arg[j] == 'd' || !strcasecmp(arg, "debug")); + if (isdebug) { + dbg = !dbg; + if (dbg) { + puts("Debug mode has been enabled."); + } else { + puts("Debug mode has been disabled."); + } + } + i++; + } } - } + break; + case 0xFF: + break; + default: + address = lex(lex_line, address, dbg); + break; } } } -- cgit v1.2.3-13-gbd6f