summaryrefslogtreecommitdiff
path: root/asmmon.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-04-17 22:07:14 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2020-04-17 22:07:14 -0400
commit0a7a2a7a8f95730811117bd2aa904f1843f65071 (patch)
tree24d62bbdba0df124c7fe8af781312af993236ebb /asmmon.c
parentc5150ee31f07208422f1435de9b35a0d0168cbb5 (diff)
Made both the assembly language monitor, and the
emulator smaller, and faster. I am also starting to make SuBEditor's source code more readable.
Diffstat (limited to 'asmmon.c')
-rw-r--r--asmmon.c181
1 files changed, 116 insertions, 65 deletions
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;
}
}
}