1
2 /*
3 * O2/8048 disassembler
4 */
5
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include "types.h"
11 #include "table.h"
12
13 #define BIOSLEN 1024
14 #define MAXLEN 8192
15
16
17 Byte rom[MAXLEN+BIOSLEN];
18
19
disasm(ADDRESS p)20 int disasm (ADDRESS p) {
21 Byte op,d;
22 ADDRESS adr;
23 Byte nb;
24
25 op=rom[p++];
26 printf("%04x:",p-1);
27 printf(" %s",lookup[op].mnemonic);
28 nb = lookup[op].bytes;
29 switch(lookup[op].type) {
30 case 0:
31 printf("\n");
32 break;
33 case 1:
34 d=rom[p];
35 printf(" #%02x\n",d);
36 break;
37 case 2:
38 adr=rom[p];
39 adr = adr | ((op & 0xE0) << 3);
40 printf(" $%03x\n",adr);
41 break;
42 case 3:
43 printf(" $%02x\n",rom[p]);
44 break;
45 }
46 if (op == 0x83 || op == 0x93) printf("\n");
47 return nb;
48 }
49
50
main(int argc,char ** argv)51 int main(int argc, char **argv){
52 int n;
53 long len;
54 FILE *fn;
55 ADDRESS pc;
56
57 if (argc<2) {
58 printf("Usage: dis48 [file]\n");
59 exit(0);
60 }
61
62 /* load image */
63
64 fn=fopen(argv[1],"rb");
65 if (!fn) {
66 printf("Error loading %s\n",argv[1]);
67 exit(0);
68 }
69 fseek(fn, 0L, SEEK_END);
70 len=ftell(fn);
71
72 if (len>MAXLEN) {
73 printf("Invalid image size");
74 fclose(fn);
75 exit(0);
76 }
77
78 rewind(fn);
79 if (fread(&rom[BIOSLEN],1,len,fn) != (size_t)len) {
80 printf("Error loading %s\n",argv[1]);
81 fclose(fn);
82 exit(0);
83 }
84 fclose(fn);
85
86 pc = BIOSLEN;
87 while (pc < BIOSLEN+len) {
88 n = disasm(pc);
89 pc = pc + n;
90 }
91 exit(0);
92 }
93
94