duskos

dusk os fork
git clone git://git.alexwennerberg.com/duskos
Log | Files | Refs | README | LICENSE

commit 952d1ce5daeec48f0741e2324658b4785200fd15
parent b1f69d3efa85184384c2d2d02e03ed82b95b3007
Author: Virgil Dupras <hsoft@hardcoded.net>
Date:   Fri, 31 Mar 2023 11:00:22 -0400

posix: update disassembler

Diffstat:
Mposix/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);