comparison 68kinst.c @ 0:2432d177e1ac

Initial work on M68K instruction decoding
author Mike Pavone <pavone@retrodev.com>
date Mon, 29 Oct 2012 01:18:38 -0700
parents
children 5df303bf72e6
comparison
equal deleted inserted replaced
-1:000000000000 0:2432d177e1ac
1 #include "68kinst.h"
2
3 void m68k_decode_op(uint16_t op, m68k_op_info *dst)
4 {
5 uint8_t mode = (op >> 3) & 0x7;
6 uint8_t reg = op & 0x7;
7 dst->addr_mode = mode;
8 switch(mode)
9 {
10 case MODE_REG:
11 case MODE_AREG:
12 dst->params.regs.pri = reg;
13 break;
14 case MODE_
15 }
16 }
17
18 uint16_t * m68K_decode(uint16_t * istream, m68kinst * decoded)
19 {
20 uint8_t optype = *istream >> 12;
21 uint8_t size;
22 uint8_t immed;
23 switch(optype)
24 {
25 case BIT_MOVEP_IMMED:
26 //TODO: Implement me
27 break;
28 case MOVE_BYTE:
29 case MOVE_LONG:
30 case MOVE_WORD:
31 decoded->op = M68K_MOVE;
32 decoded->extra.size = optype == MOVE_BYTE ? OPSIZE_BYTE : (optype == MOVE_WORD ? OPSIZE_WORD : OPSIZE_LONG);
33 m68k_decode_op(*istream, &(decoded->src));
34 m68k_decode_op(((*istream >> 9) & 0x7) | , &(decoded->dst));
35 break;
36 case MISC:
37 //TODO: Implement me
38 break;
39 case QUICK_ARITH_LOOP:
40 size = (*istream >> 6) & 3;
41 if (size == 0x3) {
42 //DBcc, TRAPcc or Scc
43 decoded->extra.cond = (*istream >> 0x8) & 0xF;
44 switch ((*istream >> 3) & 0x7)
45 {
46 case 1: //DBcc
47 decoded->op = M68K_DBCC;
48 decoded->dst.addr_mode = MODE_REG;
49 decoded->dst.regs.pri = *istream & 0x7;
50 break;
51 case 7: //TRAPcc
52 decoded->op = M68K_TRAPCC;
53 decoded->src.addr_mode = MODE_PC_INDIRECT_ABS_IMMED;
54 decoded->src.regs.pri = MODE_IMMEDIATE;
55 //TODO: Figure out what to do with OPMODE and optional extention words
56 break;
57 default: //Scc
58 decoded->op = M68K_SCC;
59 M68k_decode_op(*istream, &(decoded->dst));
60 break;
61 }
62 } else {
63 //ADDQ, SUBQ
64 decoded->variant = VAR_QUICK;
65 decoded->extra.size = size;
66 decoded->src.addr_mode = MODE_PC_INDIRECT_ABS_IMMED;
67 decoded->src.regs.pri = MODE_IMMEDIATE;
68 immed = (*istream >> 9) & 0x7
69 if (!immed) {
70 immed = 8;
71 }
72 switch (size)
73 {
74 case OPSIZE_BYTE;
75 decoded->src.params.u8 = immed;
76 break;
77 case OPSIZE_WORD:
78 decoded->src.params.u16 = immed;
79 break;
80 case OPSIZE_LONG:
81 decoded->src.params.u38 = immed;
82 break;
83 }
84 if (*istream & 0x10) {
85 decoded->op = M68K_SUB;
86 } else {
87 decoded->op = M68K_ADD;
88 }
89 }
90 break;
91 }
92 }