commit 952d1ce5daeec48f0741e2324658b4785200fd15
parent b1f69d3efa85184384c2d2d02e03ed82b95b3007
Author: Virgil Dupras <hsoft@hardcoded.net>
Date: Fri, 31 Mar 2023 11:00:22 -0400
posix: update disassembler
Diffstat:
M | posix/dis.c | | | 124 | +++++++++++++++++++++++++++++-------------------------------------------------- |
1 file changed, 45 insertions(+), 79 deletions(-)
diff --git a/posix/dis.c b/posix/dis.c
@@ -13,16 +13,23 @@ as the ones compiled by the Forth backend of CC.
#define ARGINT 2
#define ARGFIVE 3 // byte + int
#define ARGOP 4 // byte + ?disp
-#define ARGOPN 5 // op + immediate
-#define ARGERR 6 // can't continue, arg size unknown
+#define ARGBINOP 5 // opidx + byte + ?disp
+#define ARGOPN 6 // op + immediate
+#define ARGERR 7 // can't continue, arg size unknown
#define OPHASDISP 0x08
+#define BINOPCNT 0x10
+static char* binops[BINOPCNT] = {
+ "+", "-", "*", "/", "%", "<<", ">>", "err",
+ "&", "|", "^", "err", "err", "err", "err", "err"
+};
+
struct op {
char *name; // NULL= no op
int arg;
};
-#define OPCNT 0xa8
+#define OPCNT 0x70
static struct op ops[OPCNT] = {
{"BR", ARGINT},
{"CALL", ARGINT},
@@ -43,37 +50,37 @@ static struct op ops[OPCNT] = {
{"WSWAPA", ARGNONE},
{"WFETCH", ARGOP},
- {"WSTORE", ARGOP},
+ {NULL, ARGERR},
{"WSWAP", ARGOP},
{"MADDN", ARGOPN},
{"WCMP", ARGOP},
{"WIFETCH", ARGOP},
{"WISTORE", ARGOP},
- {"WADD", ARGOP},
+ {"WLEA", ARGOP},
{"WFETCH16", ARGOP},
- {"WSTORE16", ARGOP},
+ {NULL, ARGERR},
{"WSWAP16", ARGOP},
{"MADDN16", ARGOPN},
{"WCMP16", ARGOP},
{"WIFETCH16", ARGOP},
{"WISTORE16", ARGOP},
- {"WADD16", ARGOP},
+ {"WLEA", ARGOP},
{"WFETCH8", ARGOP},
- {"WSTORE8", ARGOP},
+ {NULL, ARGERR},
{"WSWAP8", ARGOP},
{"MADDN8", ARGOPN},
{"WCMP8", ARGOP},
{"WIFETCH8", ARGOP},
{"WISTORE8", ARGOP},
- {"WADD8", ARGOP},
-
{"WLEA", ARGOP},
+
+ {NULL, ARGERR},
{"BOOTRD", ARGNONE},
{"STDOUT", ARGNONE},
{"MAYBEKEY", ARGNONE},
- {"HBANKGET", ARGNONE},
+ {NULL, ARGERR},
{"MAKEMEM", ARGNONE},
{"ADDDISP", ARGNONE},
{NULL, ARGERR},
@@ -101,13 +108,13 @@ static struct op ops[OPCNT] = {
{"CODE", ARGNONE},
{"CODE16", ARGNONE},
{"CODE8", ARGNONE},
- {NULL, ARGERR},
+ {"COMPBINOP", ARGNONE},
{NULL, ARGERR},
{NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
+ {"WBINOP", ARGBINOP},
+ {"WBINOP16", ARGBINOP},
+ {"WBINOP8", ARGBINOP},
{"DIVMOD", ARGNONE},
{NULL, ARGERR},
{"LT", ARGNONE},
@@ -128,73 +135,10 @@ static struct op ops[OPCNT] = {
{NULL, ARGERR},
{NULL, ARGERR},
{NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
-
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
{"CHECKZ", ARGNONE},
{"STOREZ", ARGNONE},
{"ACHECKZ", ARGNONE},
- {"WSUB", ARGOP},
- {"WMUL", ARGOP},
- {"WDIV", ARGOP},
- {"WMOD", ARGOPN},
- {"WSHL", ARGOP},
- {"WSHR", ARGOP},
- {"WLEA", ARGOP},
- {NULL, ARGERR},
-
- {"WSUB16", ARGOP},
- {"WMUL16", ARGOP},
- {"WDIV16", ARGOP},
- {"WMOD16", ARGOPN},
- {"WSHL16", ARGOP},
- {"WSHR16", ARGOP},
- {"WLEA", ARGOP},
- {NULL, ARGERR},
-
- {"WSUB8", ARGOP},
- {"WMUL8", ARGOP},
- {"WDIV8", ARGOP},
- {"WMOD8", ARGOPN},
- {"WSHL8", ARGOP},
- {"WSHR8", ARGOP},
- {"WLEA", ARGOP},
- {NULL, ARGERR},
-
- {"WAND", ARGOP},
- {"WOR", ARGOP},
- {"WXOR", ARGOP},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
-
- {"WAND16", ARGOP},
- {"WOR16", ARGOP},
- {"WXOR16", ARGOP},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
-
- {"WAND8", ARGOP},
- {"WOR8", ARGOP},
- {"WXOR8", ARGOP},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
- {NULL, ARGERR},
-
{"FCHILD", ARGNONE},
{"FOPEN", ARGNONE},
{"FREADBUF", ARGNONE},
@@ -244,6 +188,22 @@ int getint() {
return n;
}
+void printhalop(int n) {
+ printf("\t");
+ switch (n & 7) {
+ case 0: printf("W"); break;
+ case 1: printf("A"); break;
+ case 2: printf("PSP"); break;
+ case 3: printf("RSP"); break;
+ case 4: printf("m"); break;
+ case 5: printf("i"); break;
+ default: printf("err");
+ }
+ if (n & 0x10) printf("*");
+ if (n & 0x20) printf(">A");
+ if (n & 0x40) printf("<>");
+}
+
int printarg(int arg) { // returns 1 on success, 0 on error
int n;
switch (arg) {
@@ -264,9 +224,15 @@ int printarg(int arg) { // returns 1 on success, 0 on error
case ARGOP:
n = getchar();
offset++;
- printf("\t%x", n);
+ printhalop(n);
if (n&OPHASDISP) printarg(ARGINT);
break;
+ case ARGBINOP:
+ n = getchar();
+ offset++;
+ printf("\t%s", binops[n]);
+ printarg(ARGOP);
+ break;
case ARGOPN:
printarg(ARGOP);
printarg(ARGINT);