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