|
|
1.1 root 1: #include <stdio.h>
2: #include "m98k-opcode.h"
3:
4: static int bits(
5: unsigned long width);
6:
7: static char *cond[] = { "lt", "gt", "eq", "un"};
8: static char *pred[] = { "+", "-" };
9:
10: void
11: main(
12: int argc,
13: char *argv[],
14: char *envp[])
15: {
16: long i, j, x, d, p;
17:
18: for(i = 0; *(m98k_opcodes[i].name) != '\0'; i++){
19: printf("\t%s", m98k_opcodes[i].name);
20: if(IS_BRANCH_CONDITIONAL(m98k_opcodes[i].opcode)){
21: p = bits(5) & 1;
22: printf("%s", pred[p]);
23: }
24: if(m98k_opcodes[i].ops[0].type == NONE)
25: printf("\n");
26: else
27: printf("\t");
28: d = 0;
29: for(j = 0; j < 5 && m98k_opcodes[i].ops[j].type != NONE; j++){
30: switch(m98k_opcodes[i].ops[j].type){
31: case PCREL:
32: printf("_relitive");
33: break;
34: case BADDR:
35: printf("_absolute");
36: break;
37: case D:
38: printf("0x%04x(", bits(16));
39: d = 1;
40: break;
41: case DS:
42: printf("0x%04x(", bits(14) << 2);
43: d = 1;
44: break;
45: case SI:
46: case UI:
47: printf("0x%04x", bits(16));
48: break;
49: case GREG:
50: printf("r%d", bits(5) );
51: break;
52: case G0REG:
53: printf("r%d", bits(5) | 0x1 );
54: break;
55: case FREG:
56: printf("f%d", bits(5) );
57: break;
58: case SGREG:
59: printf("sr%d", bits(4) );
60: break;
61: case SPREG:
62: printf("%d", bits(10) );
63: break;
64: case BCND:
65: printf("cr%d+%s", bits(3), cond[bits(2)] );
66: break;
67: case CRF:
68: case CRFONLY:
69: x = bits(3);
70: printf("cr%d", x == 0 ? 1 : x);
71: break;
72: case sh:
73: printf("%d", bits(6) );
74: break;
75: case mb:
76: printf("%d", bits(6) );
77: break;
78: case NUM0:
79: case NUM:
80: if(j == 0 &&
81: IS_BRANCH_CONDITIONAL(m98k_opcodes[i].opcode)){
82: x = bits(m98k_opcodes[i].ops[j].width);
83: if(m98k_opcodes[i].ops[2].type == PCREL)
84: if(p == 0) /* + with negative disp */
85: x &= 0xfffffffe;
86: else
87: x |= 1;
88: else
89: if(p == 0) /* + with positive disp */
90: x |= 1;
91: else
92: x &= 0xfffffffe;
93: if(x == 20)
94: x = 0;
95: printf("%d", x);
96: }
97: else
98: printf("%d", bits(m98k_opcodes[i].ops[j].width) );
99: break;
100: case NONE:
101: break;
102: }
103: if(j == 5 || m98k_opcodes[i].ops[j+1].type == NONE){
104: if(d == 1)
105: printf(")\n");
106: else
107: printf("\n");
108: }
109: else{
110: if(m98k_opcodes[i].ops[j].type != D &&
111: m98k_opcodes[i].ops[j].type != DS)
112: printf(",");
113: }
114: }
115: }
116: exit(0);
117: }
118:
119: static
120: int
121: bits(
122: unsigned long width)
123: {
124: static int x = 1;
125:
126: x = (x + 1) & ((1 << width) - 1);
127: return(x);
128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.