1 /* ds8pst.c */
2 
3 /*
4  *  Copyright (C) 1998-2009  Alan R. Baldwin
5  *
6  *  This program is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *
20  * Alan R. Baldwin
21  * 721 Berkeley St.
22  * Kent, Ohio  44240
23  *
24  *   This Assembler Ported by
25  *      jhartman at compuserve dot com
26  *      noice at noicedebugger dot com
27  *
28  *   Modified from i51pst.c
29  *      Bill McKinnon
30  *      w_mckinnon at conknet dot com
31  *
32  */
33 
34 #include "asxxxx.h"
35 #include "ds8.h"
36 
37 /*
38  * Basic Relocation Mode Definition
39  *
40  *      #define         R_NORM  0000            No Bit Positioning
41  */
42 char    mode0[32] = {   /* R_NORM */
43         '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
44         '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
45         '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
46         '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237'
47 };
48 
49 /*
50  * Additional Relocation Mode Definitions
51  *
52  * Specification for the 11-bit addressing mode:
53  */
54 char    mode1[32] = {   /* R_J11 */
55         '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
56         '\215', '\216', '\217', '\013', '\014', '\015', '\016', '\017',
57         '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
58         '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037'
59 };
60 
61 /*
62  * Specification for the 19-bit addressing mode:
63  */
64 char    mode2[32] = {   /* R_J19 */
65         '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
66         '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
67         '\225', '\226', '\227', '\023', '\024', '\025', '\026', '\027',
68         '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037'
69 };
70 
71 /*
72  *     *m_def is a pointer to the bit relocation definition.
73  *      m_flag indicates that bit position swapping is required.
74  *      m_dbits contains the active bit positions for the output.
75  *      m_sbits contains the active bit positions for the input.
76  *
77  *      struct  mode
78  *      {
79  *              char *  m_def;          Bit Relocation Definition
80  *              a_uint  m_flag;         Bit Swapping Flag
81  *              a_uint  m_dbits;        Destination Bit Mask
82  *              a_uint  m_sbits;        Source Bit Mask
83  *      };
84  */
85 #ifdef  LONGINT
86 struct  mode    mode[3] = {
87     {   &mode0[0],      0,      0x0000FFFFl,    0x0000FFFFl     },
88     {   &mode1[0],      1,      0x0000E0FFl,    0x000007FFl     },
89     {   &mode2[0],      1,      0x00E0FFFFl,    0x0007FFFFl     }
90 };
91 #else
92 struct  mode    mode[3] = {
93     {   &mode0[0],      0,      0x0000FFFF,     0x0000FFFF      },
94     {   &mode1[0],      1,      0x0000E0FF,     0x000007FF      },
95     {   &mode2[0],      1,      0x00E0FFFF,     0x0007FFFF      }
96 };
97 #endif
98 
99 /*
100  * Array of Pointers to mode Structures
101  */
102 struct  mode    *modep[16] = {
103         &mode[0],       &mode[1],       &mode[2],       NULL,
104         NULL,           NULL,           NULL,           NULL,
105         NULL,           NULL,           NULL,           NULL,
106         NULL,           NULL,           NULL,           NULL
107 };
108 
109 /*
110  * Mnemonic Structure
111  */
112 struct  mne     mne[] = {
113 
114         /* machine */
115 
116     {   NULL,   ".amode",       S_AMODE,        0,      0       },
117 
118     {   NULL,   ".cpu",         S_CPU,          0,      DS______        },
119     {   NULL,   ".DS8XCXXX",    S_CPU,          0,      DS8XCXXX        },
120     {   NULL,   ".DS80C310",    S_CPU,          0,      DS80C310        },
121     {   NULL,   ".DS80C320",    S_CPU,          0,      DS80C320        },
122     {   NULL,   ".DS80C323",    S_CPU,          0,      DS80C323        },
123     {   NULL,   ".DS80C390",    S_CPU,          0,      DS80C390        },
124     {   NULL,   ".DS83C520",    S_CPU,          0,      DS83C520        },
125     {   NULL,   ".DS83C530",    S_CPU,          0,      DS83C530        },
126     {   NULL,   ".DS83C550",    S_CPU,          0,      DS83C550        },
127     {   NULL,   ".DS87C520",    S_CPU,          0,      DS87C520        },
128     {   NULL,   ".DS87C530",    S_CPU,          0,      DS87C530        },
129     {   NULL,   ".DS87C550",    S_CPU,          0,      DS87C550        },
130 
131         /* system */
132 
133 
134     {   NULL,   "CON",          S_ATYP,         0,      A_CON   },
135     {   NULL,   "OVR",          S_ATYP,         0,      A_OVR   },
136     {   NULL,   "REL",          S_ATYP,         0,      A_REL   },
137     {   NULL,   "ABS",          S_ATYP,         0,      A_ABS   },
138     {   NULL,   "NOPAG",        S_ATYP,         0,      A_NOPAG },
139     {   NULL,   "PAG",          S_ATYP,         0,      A_PAG   },
140 
141     {   NULL,   "CODE",         S_ATYP,         0,      A_CODE  },
142     {   NULL,   "DATA",         S_ATYP,         0,      A_DATA  },
143     {   NULL,   "XDATA",        S_ATYP,         0,      A_XDATA },
144     {   NULL,   "BIT",          S_ATYP,         0,      A_BIT   },
145 
146     {   NULL,   ".page",        S_PAGE,         0,      0       },
147     {   NULL,   ".title",       S_HEADER,       0,      O_TITLE },
148     {   NULL,   ".sbttl",       S_HEADER,       0,      O_SBTTL },
149     {   NULL,   ".module",      S_MODUL,        0,      0       },
150     {   NULL,   ".include",     S_INCL,         0,      0       },
151     {   NULL,   ".area",        S_AREA,         0,      0       },
152     {   NULL,   ".org",         S_ORG,          0,      0       },
153     {   NULL,   ".radix",       S_RADIX,        0,      0       },
154     {   NULL,   ".globl",       S_GLOBL,        0,      0       },
155     {   NULL,   ".local",       S_LOCAL,        0,      0       },
156     {   NULL,   ".if",          S_CONDITIONAL,  0,      O_IF    },
157     {   NULL,   ".iff",         S_CONDITIONAL,  0,      O_IFF   },
158     {   NULL,   ".ift",         S_CONDITIONAL,  0,      O_IFT   },
159     {   NULL,   ".iftf",        S_CONDITIONAL,  0,      O_IFTF  },
160     {   NULL,   ".ifgt",        S_CONDITIONAL,  0,      O_IFGT  },
161     {   NULL,   ".iflt",        S_CONDITIONAL,  0,      O_IFLT  },
162     {   NULL,   ".ifge",        S_CONDITIONAL,  0,      O_IFGE  },
163     {   NULL,   ".ifle",        S_CONDITIONAL,  0,      O_IFLE  },
164     {   NULL,   ".ifeq",        S_CONDITIONAL,  0,      O_IFEQ  },
165     {   NULL,   ".ifne",        S_CONDITIONAL,  0,      O_IFNE  },
166     {   NULL,   ".iif",         S_CONDITIONAL,  0,      O_IIF   },
167     {   NULL,   ".iiff",        S_CONDITIONAL,  0,      O_IIFF  },
168     {   NULL,   ".iift",        S_CONDITIONAL,  0,      O_IIFT  },
169     {   NULL,   ".iiftf",       S_CONDITIONAL,  0,      O_IIFTF },
170     {   NULL,   ".iifgt",       S_CONDITIONAL,  0,      O_IIFGT },
171     {   NULL,   ".iiflt",       S_CONDITIONAL,  0,      O_IIFLT },
172     {   NULL,   ".iifge",       S_CONDITIONAL,  0,      O_IIFGE },
173     {   NULL,   ".iifle",       S_CONDITIONAL,  0,      O_IIFLE },
174     {   NULL,   ".iifeq",       S_CONDITIONAL,  0,      O_IIFEQ },
175     {   NULL,   ".iifne",       S_CONDITIONAL,  0,      O_IIFNE },
176     {   NULL,   ".else",        S_CONDITIONAL,  0,      O_ELSE  },
177     {   NULL,   ".endif",       S_CONDITIONAL,  0,      O_ENDIF },
178     {   NULL,   ".list",        S_LISTING,      0,      O_LIST  },
179     {   NULL,   ".nlist",       S_LISTING,      0,      O_NLIST },
180     {   NULL,   ".equ",         S_EQU,          0,      O_EQU   },
181     {   NULL,   ".gblequ",      S_EQU,          0,      O_GBLEQU},
182     {   NULL,   ".lclequ",      S_EQU,          0,      O_LCLEQU},
183 /* sdas specific */
184     {   NULL,   ".optsdcc",     S_OPTSDCC,      0,      0       },
185 /* end sdas specific */
186     {   NULL,   ".byte",        S_DATA,         0,      O_1BYTE },
187     {   NULL,   ".db",          S_DATA,         0,      O_1BYTE },
188     {   NULL,   ".fcb",         S_DATA,         0,      O_1BYTE },
189     {   NULL,   ".word",        S_DATA,         0,      O_2BYTE },
190     {   NULL,   ".dw",          S_DATA,         0,      O_2BYTE },
191     {   NULL,   ".fdb",         S_DATA,         0,      O_2BYTE },
192     {   NULL,   ".3byte",       S_DATA,         0,      O_3BYTE },
193     {   NULL,   ".triple",      S_DATA,         0,      O_3BYTE },
194 /*    { NULL,   ".4byte",       S_DATA,         0,      O_4BYTE },      */
195 /*    { NULL,   ".quad",        S_DATA,         0,      O_4BYTE },      */
196     {   NULL,   ".blkb",        S_BLK,          0,      O_1BYTE },
197     {   NULL,   ".ds",          S_BLK,          0,      O_1BYTE },
198     {   NULL,   ".rmb",         S_BLK,          0,      O_1BYTE },
199     {   NULL,   ".rs",          S_BLK,          0,      O_1BYTE },
200     {   NULL,   ".blkw",        S_BLK,          0,      O_2BYTE },
201     {   NULL,   ".blk3",        S_BLK,          0,      O_3BYTE },
202 /*    { NULL,   ".blk4",        S_BLK,          0,      O_4BYTE },      */
203     {   NULL,   ".ascii",       S_ASCIX,        0,      O_ASCII },
204     {   NULL,   ".ascis",       S_ASCIX,        0,      O_ASCIS },
205     {   NULL,   ".asciz",       S_ASCIX,        0,      O_ASCIZ },
206     {   NULL,   ".str",         S_ASCIX,        0,      O_ASCII },
207     {   NULL,   ".strs",        S_ASCIX,        0,      O_ASCIS },
208     {   NULL,   ".strz",        S_ASCIX,        0,      O_ASCIZ },
209     {   NULL,   ".fcc",         S_ASCIX,        0,      O_ASCII },
210     {   NULL,   ".even",        S_BOUNDARY,     0,      O_EVEN  },
211     {   NULL,   ".odd",         S_BOUNDARY,     0,      O_ODD   },
212     {   NULL,   ".bndry",       S_BOUNDARY,     0,      O_BNDRY },
213     {   NULL,   ".16bit",       S_BITS,         0,      O_2BYTE },
214     {   NULL,   ".24bit",       S_BITS,         0,      O_3BYTE },
215 
216         /* Macro Processor */
217 
218     {   NULL,   ".macro",       S_MACRO,        0,      O_MACRO },
219     {   NULL,   ".endm",        S_MACRO,        0,      O_ENDM  },
220     {   NULL,   ".mexit",       S_MACRO,        0,      O_MEXIT },
221 
222     {   NULL,   ".narg",        S_MACRO,        0,      O_NARG  },
223     {   NULL,   ".nchr",        S_MACRO,        0,      O_NCHR  },
224     {   NULL,   ".ntyp",        S_MACRO,        0,      O_NTYP  },
225 
226     {   NULL,   ".irp",         S_MACRO,        0,      O_IRP   },
227     {   NULL,   ".irpc",        S_MACRO,        0,      O_IRPC  },
228     {   NULL,   ".rept",        S_MACRO,        0,      O_REPT  },
229 
230     {   NULL,   ".nval",        S_MACRO,        0,      O_NVAL  },
231 
232     {   NULL,   ".mdelete",     S_MACRO,        0,      O_MDEL  },
233 
234         /* machine */
235 
236     {   NULL,   "a",            S_A,            0,      A       },
237     {   NULL,   "ab",           S_AB,           0,      0       },
238     {   NULL,   "dptr",         S_DPTR,         0,      DPTR    },
239     {   NULL,   "pc",           S_PC,           0,      PC      },
240     {   NULL,   "r0",           S_REG,          0,      R0      },
241     {   NULL,   "r1",           S_REG,          0,      R1      },
242     {   NULL,   "r2",           S_REG,          0,      R2      },
243     {   NULL,   "r3",           S_REG,          0,      R3      },
244     {   NULL,   "r4",           S_REG,          0,      R4      },
245     {   NULL,   "r5",           S_REG,          0,      R5      },
246     {   NULL,   "r6",           S_REG,          0,      R6      },
247     {   NULL,   "r7",           S_REG,          0,      R7      },
248 
249     {   NULL,   "nop",          S_INH,          0,      0x00    },
250     {   NULL,   "ret",          S_INH,          0,      0x22    },
251     {   NULL,   "reti",         S_INH,          0,      0x32    },
252 
253     {   NULL,   "ajmp",         S_JMP11,        0,      0x01    },
254     {   NULL,   "acall",        S_JMP11,        0,      0x11    },
255     {   NULL,   "ljmp",         S_JMP16,        0,      0x02    },
256     {   NULL,   "lcall",        S_JMP16,        0,      0x12    },
257 
258     {   NULL,   "rr",           S_ACC,          0,      0x03    },
259     {   NULL,   "rrc",          S_ACC,          0,      0x13    },
260     {   NULL,   "rl",           S_ACC,          0,      0x23    },
261     {   NULL,   "rlc",          S_ACC,          0,      0x33    },
262     {   NULL,   "swap",         S_ACC,          0,      0xC4    },
263     {   NULL,   "da",           S_ACC,          0,      0xD4    },
264 
265     {   NULL,   "inc",          S_TYP1,         0,      0x00    },
266     {   NULL,   "dec",          S_TYP1,         0,      0x10    },
267 
268     {   NULL,   "add",          S_TYP2,         0,      0x20    },
269     {   NULL,   "addc",         S_TYP2,         0,      0x30    },
270     {   NULL,   "subb",         S_TYP2,         0,      0x90    },
271 
272     {   NULL,   "orl",          S_TYP3,         0,      0x40    },
273     {   NULL,   "anl",          S_TYP3,         0,      0x50    },
274     {   NULL,   "xrl",          S_TYP3,         0,      0x60    },
275 
276     {   NULL,   "xch",          S_TYP4,         0,      0xC0    },
277 
278     {   NULL,   "mov",          S_MOV,          0,      0x00    },
279 
280     {   NULL,   "jbc",          S_BITBR,        0,      0x10    },
281     {   NULL,   "jb",           S_BITBR,        0,      0x20    },
282     {   NULL,   "jnb",          S_BITBR,        0,      0x30    },
283 
284     {   NULL,   "jc",           S_BR,           0,      0x40    },
285     {   NULL,   "jnc",          S_BR,           0,      0x50    },
286     {   NULL,   "jz",           S_BR,           0,      0x60    },
287     {   NULL,   "jnz",          S_BR,           0,      0x70    },
288     {   NULL,   "sjmp",         S_BR,           0,      0x80    },
289 
290     {   NULL,   "cjne",         S_CJNE,         0,      0xB0    },
291     {   NULL,   "djnz",         S_DJNZ,         0,      0xD0    },
292     {   NULL,   "jmp",          S_JMP,          0,      0x73    },
293     {   NULL,   "movc",         S_MOVC,         0,      0x83    },
294     {   NULL,   "movx",         S_MOVX,         0,      0x00    },
295     {   NULL,   "div",          S_AB,           0,      0x84    },
296     {   NULL,   "mul",          S_AB,           0,      0xA4    },
297     {   NULL,   "clr",          S_ACBIT,        0,      0xC2    },
298     {   NULL,   "cpl",          S_ACBIT,        0,      0xB2    },
299     {   NULL,   "setb",         S_SETB,         0,      0xD2    },
300     {   NULL,   "push",         S_DIRECT,       0,      0xC0    },
301     {   NULL,   "pop",          S_DIRECT,       0,      0xD0    },
302     {   NULL,   "xchd",         S_XCHD,         S_EOL,  0xD6    }
303 };
304 
305 struct PreDef preDef[] = {
306     {   "AC",           0x00D6  },
307     {   "ACC",          0x00E0  },
308     {   "ACC.0",        0x00E0  },
309     {   "ACC.1",        0x00E1  },
310     {   "ACC.2",        0x00E2  },
311     {   "ACC.3",        0x00E3  },
312     {   "ACC.4",        0x00E4  },
313     {   "ACC.5",        0x00E5  },
314     {   "ACC.6",        0x00E6  },
315     {   "ACC.7",        0x00E7  },
316     {   "B",            0x00F0  },
317     {   "B.0",          0x00F0  },
318     {   "B.1",          0x00F1  },
319     {   "B.2",          0x00F2  },
320     {   "B.3",          0x00F3  },
321     {   "B.4",          0x00F4  },
322     {   "B.5",          0x00F5  },
323     {   "B.6",          0x00F6  },
324     {   "B.7",          0x00F7  },
325     {   "CY",           0x00D7  },
326     {   "DPH",          0x0083  },
327     {   "DPL",          0x0082  },
328     {   "EA",           0x00AF  },
329     {   "F0",           0x00D5  },
330     {   "IE",           0x00A8  },
331     {   "IP",           0x00B8  },
332     {   "OV",           0x00D2  },
333     {   "P",            0x00D0  },
334    {   "PCON",         0x0087  },
335     {   "PS",           0x00BC  },
336     {   "PSW",          0x00D0  },
337     {   "RS0",          0x00D3  },
338     {   "RS1",          0x00D4  },
339     {   "SM0",          0x009F  },
340     {   "SM1",          0x009E  },
341     {   "SM2",          0x009D  },
342     {   "SP",           0x0081  },
343     {   NULL,           0x0000  }
344 };
345