urasm: cosmetix
[urasm.git] / src / urdis.c
blobe8ea1164e250b8c9a8defb1c306f29ee0bc75712
1 // URASM Z80 assembler
2 // coded by Ketmar // Vamprile Avalon
3 // GPLv3 or later
4 //
5 #include <stdint.h>
6 #include <stdlib.h>
7 #include <stdio.h>
8 #include <string.h>
9 #include <unistd.h>
11 #include "liburasm/liburasm.h"
14 static uint8_t memory[65536];
17 static uint8_t getByte (uint16_t addr) {
18 return memory[addr];
22 static const char *cmdName (const char *s) {
23 static char cmd[8];
24 const char *t = strchr(s, '\t');
25 if (!t) return s;
26 memset(cmd, 0, sizeof(cmd));
27 memmove(cmd, s, t-s);
28 while (strlen(cmd) < 5) strcat(cmd, " ");
29 return cmd;
33 static const char *cmdArgs (const char *s) {
34 const char *t = strchr(s, '\t');
35 if (!t) return s+strlen(s);
36 return t+1;
40 int main (int argc, char *argv[]) {
41 char dstr[256];
42 uint16_t pc = 0x0100U;//0xECC8UL;
43 int maxlen = 1416;
44 int len, idx, len1, f;
45 FILE *fl = fopen(argc>1?argv[1]:"zout_0100.bin", "rb");
46 if (!fl) { fprintf(stderr, "ERROR: can't open input file!\n"); return 1; }
47 if (argc > 2) pc = (strtol(argv[2], NULL, 0))&0xffff;
48 maxlen = fread(memory+pc, 1, 65536-pc, fl);
49 fclose(fl);
51 urGetByte = getByte;
52 while (maxlen > 0) {
53 if (pc >= 65535-16) break;
54 idx = urDisassembleFind(pc);
55 //if (idx < 0) break;
56 len = urDisassembleLength(idx);
57 len1 = urDisassembleOne(dstr, pc);
58 printf("%04X: [", pc);
59 for (f = 0; f < len1; ++f) { if (f) putchar(' '); printf("%02X", memory[pc+f]); }
60 for (; f < 4; ++f) { if (f) putchar(' '); printf(" "); }
61 printf("] idx=%d; len=%d; len1=%d; [%s%s]\n", idx, len, len1, cmdName(dstr), cmdArgs(dstr));
62 if (len != len1) abort();
63 if (len <= 0) abort();
64 pc += len1; maxlen -= len1;
67 return 0;