Version bump for last commit; now at v2.0.23.
[rmac] / dsp56k_amode.h
1 //
2 // RMAC - Reboot's Macro Assembler for the Atari Jaguar Console System
3 // DSP56K_AMODE.H - Addressing Modes for Motorola DSP56001
4 // Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
5 // RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
6 // Source utilised with the kind permission of Landon Dyer
7 //
8
9 #ifndef __DSP56K_AMODE_H__
10 #define __DSP56K_AMODE_H__
11
12 #include "rmac.h"
13 #include "amode.h"
14
15 // Addressing-mode masks
16
17 #define M_ACC56      0x00000001L        // Accumulators A=A2:A1:A0 and B=B2:B1:B0
18 #define M_ACC48      0x00000002L        // Accumulators AB=A1:B1, BA=B1:A1, A10=A1:A0, B10=B1:B0
19 #define M_ACC24      0x00000004L        // Accumulators A0, A1, B0 and B1
20 #define M_ACC8       0x00000008L        // Accumulators A2 and B2
21 #define M_INP48      0x00000010L        // Input registers X=X1:X0 and Y=Y1:Y0
22 #define M_ALU24      0x00000020L        // Data ALU input registers X1, X0, Y1, Y0
23 #define M_DSPIM      0x00000040L        // #data
24 #define M_DSPIM12    0x00000080L        // #data
25 //#define M_DSPIM24    0x0000010        // #data
26 #define M_DSPPCU     0x00000200L        // Program control unit registers PC, MR, CCR, SR, OMR, LA, LC, SP, SS, SSH, SSL
27 #define M_DSPEA      0x00000400L        // Effective addressing modes (Rn)-Nn, (Rn)+Nn, (Rn)-, (Rn)+, (Rn), (Rn+Nn), -(Rn), <absolute address>
28 #define M_DSPAA      0x00000800L        // 6-bit Absolute Short Address
29 #define M_DSPPP      0x00001000L        // 6-bit I/O Short Address
30 #define M_DSPM       0x00002000L        // Modifier registers M0-M7
31 #define M_DSPR       0x00004000L        // Address registers R0-R7
32 #define M_DSPN       0x00008000L        // Address offset registers N0-N7
33 #define M_DSPABS12   0x00010000L        // xxx.12bit
34 #define M_DSPABS24   0x00020000L        // xxx.24bit
35 #define M_DSPABS06   0x00040000L        // xxx.6bit
36 #define M_DSPABS16   0x00080000L        // xxx.16bit
37 #define M_DSPIM8     0x00100000L        // #data
38
39 #define M_ALL48 (M_ACC56|M_INP48|M_ALU24)   // Input registers X=X1:X0, Y=Y1:Y0, A=A2:A1:A0, B=B2:B1:B0, X0, X1, Y0, Y1
40
41 #define C_DD    (M_ALU24)                   // 4 registers in data ALU: x0, x1, y0, y1
42 #define C_DDD   (M_ACC56|M_ACC24|M_ACC8)    // 8 accumulators in data ALU: a0, b0, a2, b2, a1, b1, a, b
43 #define C_LLL   (M_ACC56|M_ACC48|M_INP48)   // 8 extended-precision registers in data ALU: a10, b10, x, y, a, b, ab, ba
44 #define C_FFF   (M_DSPM)                    // 8 address modifier registers in address ALU:  m0-m7
45 #define C_NNN   (M_DSPN)                    // 8 address offset registers in address ALU: n0-n7
46 #define C_TTT   (M_DSPR)                    // 8 address registers in address: r0-r7
47 #define C_GGG   (M_DSPPCU)                  // 8 program controller registers: sr, omr, sp, ssh, la, lc
48 #define C_A18   (M_ALU24|C_DDD|C_LLL|C_FFF|C_NNN|C_TTT|C_GGG)   // All of the above registers
49
50 #define C_DSPABS24      (M_DSPABS06|M_DSPABS12|M_DSPABS16|M_DSPABS24)   // Everything up to 24-bit addresses
51 #define C_DSPABSEA      (C_DSPABS24|M_DSPEA)                                                    // All absolute addresses and all other ea addressing modes
52 #define C_DSPABS16  (M_DSPABS06|M_DSPABS12|M_DSPABS16)                          // Everything up to 16-bit addresses
53 #define C_LUADST    (M_DSPR|M_DSPN)                                                                     // Mask for LUA instruction destination
54 #define C_MOVEC     (M_DSPM|M_DSPPCU)                                                           // M0-M7 and SR, OMR, LA, LC, SP, SS, SSH, SSL
55 #define C_DSPIM         (M_DSPIM8 | M_DSPIM | M_DSPIM12)                                // All the immmediate sizes we want to alias
56
57 // Xn Input Register X1 or X0 (24 Bits)
58 // Yn Input Register Y1 or Y0 (24 Bits)
59 // An Accumulator Registers A2, A1, A0 (A2 \97 8 Bits, A1 and A0 \97 24 Bits)
60 // Bn Accumulator Registers B2, B1, B0 (B2 \97 8 Bits, B1 and B0 \97 24 Bits)
61 // X Input Register X = X1: X0 (48 Bits)
62 // Y Input Register Y = Y1: Y0 (48 Bits)
63 // A Accumulator A = A2: A1: A0 (56 Bits)*
64 // B Accumulator B = B2: B1: B0 (56 BIts)*
65 // AB Accumulators A and B = A1: B1 (48 Bits)*
66 // BA Accumulators B and A = B1: A1 (48 Bits)*
67 // A10 Accumulator A = A1: A0 (48 Bits)
68 // B10 Accumulator B= B1:B0 (48 bits)
69
70 // Attribute masks
71 #define PARMOVE      0x00000001L
72 #define NOPARMO      0x00000000L
73
74 // DSP EA modes
75
76 #define DSP_EA_POSTDEC  B8(00000000)
77 #define DSP_EA_POSTINC  B8(00001000)
78 #define DSP_EA_POSTDEC1 B8(00010000)
79 #define DSP_EA_POSTINC1 B8(00011000)
80 #define DSP_EA_NOUPD    B8(00100000)
81 #define DSP_EA_INDEX    B8(00101000)
82 #define DSP_EA_PREDEC1  B8(00111000)
83 #define DSP_EA_ABS      B8(00110000)
84 #define DSP_EA_IMM      B8(00110100)
85
86
87 // Mnemonic table structure
88 #define MNTABDSP  struct _mntabdsp
89 MNTABDSP {
90         LONG mn0, mn1;                          // Addressing modes
91         WORD mnattr;                            // Attributes (PARMOVE, ...)
92         LONG mninst;                            // Instruction mask
93         WORD mncont;                            // Continuation (or -1)
94         int (* mnfunc)(LONG);           // Mnemonic builder
95 };
96
97 // Addressing mode variables, output of dsp_amode()
98 int dsp_am0;                                    // Addressing mode
99 int dsp_a0reg;                                  // Register
100 int dsp_am1;                                    // Addressing mode
101 int dsp_a1reg;                                  // Register
102 int dsp_am2;                                    // Addressing mode
103 int dsp_a2reg;                                  // Register
104 int dsp_am3;                                    // Addressing mode
105 int dsp_a3reg;                                  // Register
106
107 TOKEN dsp_a0expr[EXPRSIZE];             // Expression
108 uint64_t dsp_a0exval;                   // Expression's value
109 WORD dsp_a0exattr;                              // Expression's attribute
110 SYM * dsp_a0esym;                               // External symbol involved in expr
111 LONG dsp_a0memspace;                    // Addressing mode's memory space (P, X, Y)
112 LONG dsp_a0perspace;                    // Peripheral space (X, Y - used in movep)
113 TOKEN dsp_a1expr[EXPRSIZE];             // Expression
114 uint64_t dsp_a1exval;                   // Expression's value
115 WORD dsp_a1exattr;                              // Expression's attribute
116 SYM * dsp_a1esym;                               // External symbol involved in expr
117 LONG dsp_a1memspace;                    // Addressing mode's memory space (P, X, Y)
118 LONG dsp_a1perspace;                    // Peripheral space (X, Y - used in movep)
119 TOKEN dsp_a2expr[EXPRSIZE];             // Expression
120 uint64_t dsp_a2exval;                   // Expression's value
121 WORD dsp_a2exattr;                              // Expression's attribute
122 SYM * dsp_a2esym;                               // External symbol involved in expr
123 TOKEN dsp_a3expr[EXPRSIZE];             // Expression
124 uint64_t dsp_a3exval;                   // Expression's value
125 WORD dsp_a3exattr;                              // Expression's attribute
126 SYM * dsp_a3esym;                               // External symbol involved in expr
127 int dsp_k;                                              // Multiplications sign
128 TOKEN dspImmedEXPR[EXPRSIZE];   // Expression
129 uint64_t dspImmedEXVAL;                 // Expression's value
130 WORD  dspImmedEXATTR;                   // Expression's attribute
131 SYM * dspImmedESYM;                             // External symbol involved in expr
132 int  deposit_extra_ea;                  // Optional effective address extension
133
134
135 // Extra ea deposit modes
136 enum
137 {
138         DEPOSIT_EXTRA_WORD  = 1,
139         DEPOSIT_EXTRA_FIXUP = 2,
140 };
141
142
143 // Prototypes
144 int dsp_amode(int maxea);
145 LONG parmoves(WORD dest);
146 int dsp_tcc4(LONG inst);
147
148 #endif // __DSP56K_AMODE_H__
149