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