|
|
1.1 root 1: /* Generator is (c) James Ponder, 1997-2001 http://www.squish.net/generator/ */
2:
3: #include <stdio.h>
4: #include <string.h>
5: #include <ctype.h>
6:
7: #include "generator.h"
8: #include "cpu68k.h"
9:
10: /* forward references */
11:
1.1.1.2 ! root 12: void diss68k_getoperand(char *text, t_ipc * ipc, t_iib * iib, t_type type);
1.1 root 13:
14: /* functions */
15:
1.1.1.2 ! root 16: int diss68k_gettext(t_ipc * ipc, char *text)
1.1 root 17: {
18: t_iib *iib;
19: char *p, *c;
20: char src[64], dst[64];
21: char mnemonic[64];
22:
23: *text = '\0';
24:
25: iib = cpu68k_iibtable[ipc->opcode];
26:
27: if (iib == NULL)
28: return 0;
29:
30: diss68k_getoperand(dst, ipc, iib, tp_dst);
31: diss68k_getoperand(src, ipc, iib, tp_src);
32:
33: if ((iib->mnemonic == i_Bcc) || (iib->mnemonic == i_BSR) ||
34: (iib->mnemonic == i_DBcc)) {
35: sprintf(src, "$%08x", ipc->src);
36: }
37:
38: strcpy(mnemonic, mnemonic_table[iib->mnemonic].name);
39:
40: if ((p = strstr(mnemonic, "cc")) != NULL) {
41: if (iib->mnemonic == i_Bcc && iib->cc == 0) {
42: p[0] = 'R';
43: p[1] = 'A';
44: } else {
45: c = condition_table[iib->cc];
46: strcpy(p, c);
47: }
48: }
49:
1.1.1.2 ! root 50: switch (iib->size) {
1.1 root 51: case sz_byte:
52: strcat(mnemonic, ".B");
53: break;
54: case sz_word:
55: strcat(mnemonic, ".W");
56: break;
57: case sz_long:
58: strcat(mnemonic, ".L");
59: break;
60: default:
61: break;
62: }
63:
64: sprintf(text, "%-10s %s%s%s", mnemonic, src, dst[0] ? "," : "", dst);
65:
66: return 1;
67: }
68:
1.1.1.2 ! root 69: void diss68k_getoperand(char *text, t_ipc * ipc, t_iib * iib, t_type type)
1.1 root 70: {
71: int bitpos;
72: uint32 val;
73:
74: if (type == tp_src) {
75: bitpos = iib->sbitpos;
76: val = ipc->src;
77: } else {
78: bitpos = iib->dbitpos;
79: val = ipc->dst;
80: }
81:
1.1.1.2 ! root 82: switch (type == tp_src ? iib->stype : iib->dtype) {
1.1 root 83: case dt_Dreg:
1.1.1.2 ! root 84: sprintf(text, "D%d", (ipc->opcode >> bitpos) & 7);
1.1 root 85: break;
86: case dt_Areg:
1.1.1.2 ! root 87: sprintf(text, "A%d", (ipc->opcode >> bitpos) & 7);
1.1 root 88: break;
89: case dt_Aind:
1.1.1.2 ! root 90: sprintf(text, "(A%d)", (ipc->opcode >> bitpos) & 7);
1.1 root 91: break;
92: case dt_Ainc:
1.1.1.2 ! root 93: sprintf(text, "(A%d)+", (ipc->opcode >> bitpos) & 7);
1.1 root 94: break;
95: case dt_Adec:
1.1.1.2 ! root 96: sprintf(text, "-(A%d)", (ipc->opcode >> bitpos) & 7);
1.1 root 97: break;
98: case dt_Adis:
1.1.1.2 ! root 99: sprintf(text, "$%04x(A%d)", (uint16)val, (ipc->opcode >> bitpos) & 7);
1.1 root 100: break;
101: case dt_Aidx:
1.1.1.2 ! root 102: sprintf(text, "$%02x(A%d,Rx.X)", (uint8)val, (ipc->opcode >> bitpos) & 7);
1.1 root 103: break;
104: case dt_AbsW:
105: sprintf(text, "$%08x", val);
106: break;
107: case dt_AbsL:
108: sprintf(text, "$%08x", val);
109: break;
110: case dt_Pdis:
111: sprintf(text, "$%08x(pc)", val);
112: break;
113: case dt_Pidx:
114: sprintf(text, "$%08x(pc, Rx.X)", val);
115: break;
116: case dt_ImmB:
117: sprintf(text, "#$%02x", val);
118: break;
119: case dt_ImmW:
120: sprintf(text, "#$%04x", val);
121: break;
122: case dt_ImmL:
123: sprintf(text, "#$%08x", val);
124: break;
125: case dt_ImmS:
126: sprintf(text, "#%d", iib->immvalue);
127: break;
128: case dt_Imm3:
1.1.1.2 ! root 129: sprintf(text, "#%d", (ipc->opcode >> bitpos) & 7);
1.1 root 130: break;
131: case dt_Imm4:
1.1.1.2 ! root 132: sprintf(text, "#%d", (ipc->opcode >> bitpos) & 15);
1.1 root 133: break;
134: case dt_Imm8:
1.1.1.2 ! root 135: sprintf(text, "#%d", (ipc->opcode >> bitpos) & 255);
1.1 root 136: break;
137: case dt_Imm8s:
138: sprintf(text, "#%d", (sint32)val);
139: break;
140: default:
141: sprintf(text, "");
142: break;
143: }
144: }
145:
146: int diss68k_getdumpline(uint32 addr68k, uint8 *addr, char *dumpline)
147: {
148: t_ipc ipc;
149: t_iib *iibp = cpu68k_iibtable[LOCENDIAN16(*(uint16 *)addr)];
150: int words, i;
151: char dissline[64], *p;
152:
153: if (addr68k < 256) {
1.1.1.2 ! root 154: sprintf(dissline, "dc.l $%08x", LOCENDIAN32(*(uint32 *)addr));
1.1 root 155: words = 2;
156: } else {
157: cpu68k_ipc(addr68k, addr, iibp, &ipc);
158: if (!diss68k_gettext(&ipc, dissline))
159: strcpy(dissline, "Illegal Instruction");
160: words = ipc.wordlen;
161: }
162:
163: p = dumpline;
1.1.1.2 ! root 164: p += sprintf(p, "%6x : %04x ", addr68k, (addr[0] << 8) + addr[1]);
1.1 root 165: for (i = 1; i < words; i++) {
1.1.1.2 ! root 166: p += sprintf(p, "%04x ", (addr[i * 2] << 8) + addr[i * 2 + 1]);
1.1 root 167: }
1.1.1.2 ! root 168: for (i = 29 - strlen(dumpline); i > 0; i--) {
1.1 root 169: *p++ = ' ';
170: }
1.1.1.2 ! root 171: p += sprintf(p, ": ");
1.1 root 172: for (i = 0; i < words; i++) {
1.1.1.2 ! root 173: if (isalnum(addr[i * 2])) {
! 174: *p++ = addr[i * 2];
1.1 root 175: } else
176: *p++ = '.';
1.1.1.2 ! root 177: if (isalnum(addr[i * 2 + 1])) {
! 178: *p++ = addr[i * 2 + 1];
1.1 root 179: } else
180: *p++ = '.';
181: }
182: *p = '\0';
1.1.1.2 ! root 183: for (i = 39 - strlen(dumpline); i > 0; i--) {
1.1 root 184: *p++ = ' ';
185: }
186: if (iibp) {
187: sprintf(p, " : %4d : %s\n", iibp->funcnum, dissline);
188: } else {
189: sprintf(p, " : : %s\n", dissline);
190: }
191:
192: return words;
193: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.