OpenCores
URL https://opencores.org/ocsvn/t48/t48/trunk

Subversion Repositories t48

[/] [t48/] [tags/] [rel_1_1/] [sw/] [i8039emu/] [8039dasm.c] - Blame information for rev 292

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 49 arniml
/****************************************************************************
2
 *
3
 *      mcs48 disassembler
4
 *
5
 * This file is Copyright 1996 Michael Cuddy, Fen's Ende Sofware.
6
 * Redistribution is allowed in source and binary form as long as both
7
 * forms are distributed together with the file 'README'.  This copyright
8
 * notice must also accompany the files.
9
 *
10
 * This software should be considered a small token to all of the
11
 * emulator authors for thier dilligence in preserving our Arcade and
12
 * Computer history.
13
 *
14
 * Michael Cuddy, Fen's Ende Software.
15
 * 11/25/1996
16
 *
17
 * Adapted by Andrea Mazzoleni for use with MAME
18
 *
19
 ***************************************************************************/
20
 
21
#include <stdio.h>
22
#include <stdlib.h>
23
#include <string.h>
24
#include <ctype.h>
25
 
26
#include "memory.h"
27
 
28
typedef unsigned char byte;
29
 
30
#define FMT(a,b) a, b
31
#define PTRS_PER_FORMAT 2
32
 
33
const char *Formats[] = {
34
    FMT("00000011dddddddd", "add  a, #%X"),
35
    FMT("01101rrr", "add  a, %R"),
36
    FMT("0110000r", "add  a, @%R"),
37
    FMT("00010011dddddddd", "adc  a, #%X"),
38
    FMT("01111rrr", "adc  a, %R"),
39
    FMT("0111000r", "adc  a, @%R"),
40
    FMT("01010011dddddddd", "anl  a, #%X"),
41
    FMT("01011rrr", "anl  a, %R"),
42
    FMT("0101000r", "anl  a, @%R"),
43
    FMT("10011000dddddddd", "anl  bus, #%X"),
44
    FMT("10011001dddddddd", "anl  p1, #%X"),
45
    FMT("10011010dddddddd", "anl  p2, #%X"),
46
    FMT("100111pp", "anld %P, a"),
47
    FMT("aaa10100aaaaaaaa", "call %A"),
48
    FMT("00100111", "clr  a"),
49
    FMT("10010111", "clr  c"),
50
    FMT("10100101", "clr  f1"),
51
    FMT("10000101", "clr  f0"),
52
    FMT("00110111", "cpl  a"),
53
    FMT("10100111", "cpl  c"),
54
    FMT("10010101", "cpl  f0"),
55
    FMT("10110101", "cpl  f1"),
56
    FMT("01010111", "da   a"),
57
    FMT("00000111", "dec  a"),
58
    FMT("11001rrr", "dec  %R"),
59
    FMT("00010101", "dis  i"),
60
    FMT("00110101", "dis  tcnti"),
61
    FMT("11101rrraaaaaaaa", "djnz %R, %J"),
62
    FMT("00000101", "en   i"),
63
    FMT("00100101", "en   tcnti"),
64
    FMT("01110101", "ent0 clk"),
65
    FMT("00001001", "in   a, p1"),
66
    FMT("00001010", "in   a, p2"),
67
    FMT("00010111", "inc  a"),
68
    FMT("00011rrr", "inc  %R"),
69
    FMT("0001000r", "inc  @%R"),
70
    FMT("00001000", "ins  a,bus"),
71
    FMT("0001 0110aaaaaaaa", "jtf  %J"),
72
    FMT("0010 0110aaaaaaaa", "jnt0 %J"),
73
    FMT("0011 0110aaaaaaaa", "jt0  %J"),
74
    FMT("0100 0110aaaaaaaa", "jnt1 %J"),
75
    FMT("0101 0110aaaaaaaa", "jt1  %J"),
76
    FMT("0111 0110aaaaaaaa", "jf1  %J"),
77
    FMT("1000 0110aaaaaaaa", "jni  %J"),
78
    FMT("1001 0110aaaaaaaa", "jnz  %J"),
79
    FMT("1011 0110aaaaaaaa", "jf0  %J"),
80
    FMT("1100 0110aaaaaaaa", "jz   %J"),
81
    FMT("1110 0110aaaaaaaa", "jnc  %J"),
82
    FMT("1111 0110aaaaaaaa", "jc   %J"),
83
    FMT("bbb10010aaaaaaaa", "jb%B  %J"),
84
    FMT("aaa00100aaaaaaaa", "jmp  %A"),
85
    FMT("10110011", "jmpp @a"),
86
    FMT("00100011dddddddd", "mov  a, #%X"),
87
    FMT("11111rrr", "mov  a, %R"),
88
    FMT("1111000r", "mov  a, @%R"),
89
    FMT("11000111", "mov  a, psw"),
90
    FMT("10111rrrdddddddd", "mov  %R, #%X"),
91
    FMT("10101rrr", "mov  %R, a"),
92
    FMT("1010000r", "mov  @%R, a"),
93
    FMT("1011000rdddddddd", "mov  @%R, #%X"),
94
    FMT("11010111", "mov  psw, a"),
95
    FMT("000011pp", "movd a, %P"),
96
    FMT("001111pp", "movd %P, a"),
97
    FMT("01000010", "mov  a, t"),
98
    FMT("01100010", "mov  t, a"),
99
    FMT("11100011", "movp3 a, @a"),
100
    FMT("10100011", "movp a, @a"),
101
    FMT("1000000r", "movx a, @%R"),
102
    FMT("1001000r", "movx @%R, a"),
103
    FMT("0100 1rrr", "orl  a, %R"),
104
    FMT("0100 000r", "orl  a, @%R"),
105
    FMT("0100 0011dddddddd", "orl  a, #%X"),
106
    FMT("1000 1000dddddddd", "orl  bus, #%X"),
107
    FMT("1000 1001dddddddd", "orl  p1, #%X"),
108
    FMT("1000 1010dddddddd", "orl  p2, #%X"),
109
    FMT("1000 11pp", "orld %P, a"),
110
    FMT("00000010", "outl bus, a"),
111
    FMT("001110pp", "outl %P, a"),
112
    FMT("10000011", "ret"),
113
    FMT("10010011", "retr"),
114
    FMT("11100111", "rl   a"),
115
    FMT("11110111", "rlc  a"),
116
    FMT("01110111", "rr   a"),
117
    FMT("01100111", "rrc  a"),
118
    FMT("11100101", "sel  mb0"),
119
    FMT("11110101", "sel  mb1"),
120
    FMT("11000101", "sel  rb0"),
121
    FMT("11010101", "sel  rb1"),
122
    FMT("01100101", "stop tcnt"),
123
    FMT("01000101", "strt cnt"),
124
    FMT("01010101", "strt t"),
125
    FMT("01000111", "swap a"),
126
    FMT("00101rrr", "xch  a, %R"),
127
    FMT("0010000r", "xch  a, @%R"),
128
    FMT("0011000r", "xchd a, @%R"),
129
    FMT("1101 0011dddddddd", "xrl  a, #%X"),
130
    FMT("1101 1rrr", "xrl  a, %R"),
131
    FMT("1101 000r", "xrl  a, @%R"),
132
    FMT("00000000", "nop"),
133
    NULL
134
};
135
 
136
#define MAX_OPS (((sizeof(Formats) / sizeof(Formats[0])) - 1) / PTRS_PER_FORMAT)
137
 
138
typedef struct opcode {
139
    byte mask;  /* instruction mask */
140
    byte bits;  /* constant bits */
141
    char extcode;   /* value that gets extension code */
142
    const char *parse;  /* how to parse bits */
143
    const char *fmt;    /* instruction format */
144
} M48Opcode;
145
 
146
static M48Opcode Op[MAX_OPS+1];
147
static int OpInizialized = 0;
148
 
149
static void InitDasm8039(void)
150
{
151
    const char *p, **ops;
152
    byte mask, bits;
153
    int bit;
154
    int i;
155
 
156
    ops = Formats; i = 0;
157
    while (*ops) {
158
    p = *ops;
159
    mask = 0; bits = 0; bit = 7;
160
    while (*p && bit >= 0) {
161
        switch (*p++) {
162
            case '1': mask |= 1<<bit; bits |= 1<<bit; bit--; break;
163
            case '0': mask |= 1<<bit; bit--; break;
164
            case ' ': break;
165
            case 'b':
166
            case 'a': case 'r': case 'd': case 'p':
167
                bit --;
168
                break;
169
            default:
170
                printf("Invalid instruction encoding '%s %s'\n", ops[0],ops[1]);
171
                exit(1);
172
        }
173
    }
174
    if (bit != -1 ) {
175
        printf("not enough bits in encoding '%s %s' %d\n", ops[0],ops[1],bit);
176
        exit(1);
177
    }
178
    while (isspace(*p)) p++;
179
    if (*p) Op[i].extcode = *p;
180
    Op[i].bits = bits;
181
    Op[i].mask = mask;
182
    Op[i].fmt = ops[1];
183
    Op[i].parse = ops[0];
184
 
185
    ops += PTRS_PER_FORMAT;
186
    i++;
187
    }
188
 
189
    OpInizialized = 1;
190
}
191
 
192
int Dasm8039(char *buffer, unsigned pc)
193
{
194
    int b, a, d, r, p;  /* these can all be filled in by parsing an instruction */
195
    int i;
196
    int op;
197
    int cnt = 1;
198
    int code, bit;
199
    const char *cp;
200
 
201
    if (!OpInizialized) InitDasm8039();
202
 
203
    code = cpu_readop(pc);
204
    op = -1;    /* no matching opcode */
205
    for ( i = 0; i < MAX_OPS; i++)
206
    {
207
        if( (code & Op[i].mask) == Op[i].bits )
208
        {
209
            if (op != -1)
210
            {
211
                fprintf(stderr, "Error: opcode %02X matches %d (%s) and %d (%s)\n",
212
                    code,i,Op[i].fmt,op,Op[op].fmt);
213
            }
214
            op = i;
215
        }
216
    }
217
 
218
    if (op == -1)
219
    {
220
        sprintf(buffer,"db   %2.2x",code);
221
        return cnt;
222
    }
223
 
224
    if (Op[op].extcode)
225
    {
226
        cnt++;
227
        code <<= 8;
228
        code |= cpu_readop_arg((pc+1)&0xffff);
229
        bit = 15;
230
    }
231
    else
232
    {
233
        bit = 7;
234
    }
235
 
236
    /* shift out operands */
237
    cp = Op[op].parse;
238
    b = a = d = r = p = 0;
239
 
240
    while (bit >= 0)
241
    {
242
        /* printf("{%c/%d}",*cp,bit); */
243
        switch(*cp)
244
        {
245
            case 'a': a <<=1; a |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
246
            case 'b': b <<=1; b |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
247
            case 'd': d <<=1; d |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
248
            case 'r': r <<=1; r |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
249
            case 'p': p <<=1; p |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
250
            case ' ': break;
251
            case '1': case '0': bit--; break;
252
            case '\0': printf("premature end of parse string, opcode %x, bit = %d\n",code,bit); exit(1);
253
        }
254
        cp++;
255
    }
256
 
257
    /* now traverse format string */
258
    cp = Op[op].fmt;
259
    while (*cp)
260
    {
261
        if (*cp == '%')
262
        {
263
            char num[10], *q;
264
            cp++;
265
            switch (*cp++)
266
            {
267
                case 'A': sprintf(num,"0%04XH",a); break;
268
                case 'J': sprintf(num,"0%04XH",((pc+1) & 0xf00) | a); break;
269
                case 'B': sprintf(num,"%d",b); break;
270
                case 'D': sprintf(num,"%d",d); break;
271
                case 'X': sprintf(num,"0%02XH",d); break;
272
                case 'R': sprintf(num,"r%d",r); break;
273
                case 'P': sprintf(num,"p%d",p); break;
274
                default:
275
                    printf("illegal escape character in format '%s'\n",Op[op].fmt);
276
                    exit(1);
277
            }
278
            q = num; while (*q) *buffer++ = *q++;
279
            *buffer = '\0';
280
        }
281
        else
282
        {
283
            *buffer++ = *cp++;
284
            *buffer = '\0';
285
        }
286
    }
287
 
288
    return cnt;
289
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.