1 /* rabpst.c */ 2 3 /* 4 * Copyright (C) 1989-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 * ported to the Rabbit2000 by 25 * Ulrich Raich and Razaq Ijoduola 26 * PS Division 27 * CERN 28 * CH-1211 Geneva-23 29 * email: Ulrich dot Raich at cern dot ch 30 */ 31 32 /* 33 * Extensions: P. Felber 34 * 35 * Altered by Leland Morrison to support rabbit 2000 36 * and rabbit 4000 instruction sets (2011) 37 */ 38 39 #include "asxxxx.h" 40 #include "rab.h" 41 42 /* 43 * Mnemonic Structure 44 */ 45 struct mne mne[] = { 46 47 /* machine */ 48 49 /* system */ 50 51 { NULL, "CON", S_ATYP, 0, A_CON }, 52 { NULL, "OVR", S_ATYP, 0, A_OVR }, 53 { NULL, "REL", S_ATYP, 0, A_REL }, 54 { NULL, "ABS", S_ATYP, 0, A_ABS }, 55 { NULL, "NOPAG", S_ATYP, 0, A_NOPAG }, 56 { NULL, "PAG", S_ATYP, 0, A_PAG }, 57 58 { NULL, ".page", S_PAGE, 0, 0 }, 59 { NULL, ".title", S_HEADER, 0, O_TITLE }, 60 { NULL, ".sbttl", S_HEADER, 0, O_SBTTL }, 61 { NULL, ".module", S_MODUL, 0, 0 }, 62 { NULL, ".include", S_INCL, 0, 0 }, 63 { NULL, ".area", S_AREA, 0, 0 }, 64 { NULL, ".org", S_ORG, 0, 0 }, 65 { NULL, ".radix", S_RADIX, 0, 0 }, 66 { NULL, ".globl", S_GLOBL, 0, 0 }, 67 { NULL, ".local", S_LOCAL, 0, 0 }, 68 { NULL, ".if", S_CONDITIONAL, 0, O_IF }, 69 { NULL, ".iff", S_CONDITIONAL, 0, O_IFF }, 70 { NULL, ".ift", S_CONDITIONAL, 0, O_IFT }, 71 { NULL, ".iftf", S_CONDITIONAL, 0, O_IFTF }, 72 { NULL, ".ifgt", S_CONDITIONAL, 0, O_IFGT }, 73 { NULL, ".iflt", S_CONDITIONAL, 0, O_IFLT }, 74 { NULL, ".ifge", S_CONDITIONAL, 0, O_IFGE }, 75 { NULL, ".ifle", S_CONDITIONAL, 0, O_IFLE }, 76 { NULL, ".ifeq", S_CONDITIONAL, 0, O_IFEQ }, 77 { NULL, ".ifne", S_CONDITIONAL, 0, O_IFNE }, 78 { NULL, ".iif", S_CONDITIONAL, 0, O_IIF }, 79 { NULL, ".iiff", S_CONDITIONAL, 0, O_IIFF }, 80 { NULL, ".iift", S_CONDITIONAL, 0, O_IIFT }, 81 { NULL, ".iiftf", S_CONDITIONAL, 0, O_IIFTF }, 82 { NULL, ".iifgt", S_CONDITIONAL, 0, O_IIFGT }, 83 { NULL, ".iiflt", S_CONDITIONAL, 0, O_IIFLT }, 84 { NULL, ".iifge", S_CONDITIONAL, 0, O_IIFGE }, 85 { NULL, ".iifle", S_CONDITIONAL, 0, O_IIFLE }, 86 { NULL, ".iifeq", S_CONDITIONAL, 0, O_IIFEQ }, 87 { NULL, ".iifne", S_CONDITIONAL, 0, O_IIFNE }, 88 { NULL, ".else", S_CONDITIONAL, 0, O_ELSE }, 89 { NULL, ".endif", S_CONDITIONAL, 0, O_ENDIF }, 90 { NULL, ".list", S_LISTING, 0, O_LIST }, 91 { NULL, ".nlist", S_LISTING, 0, O_NLIST }, 92 { NULL, ".equ", S_EQU, 0, O_EQU }, 93 { NULL, ".gblequ", S_EQU, 0, O_GBLEQU}, 94 { NULL, ".lclequ", S_EQU, 0, O_LCLEQU}, 95 { NULL, ".byte", S_DATA, 0, O_1BYTE }, 96 { NULL, ".db", S_DATA, 0, O_1BYTE }, 97 { NULL, ".fcb", S_DATA, 0, O_1BYTE }, 98 { NULL, ".word", S_DATA, 0, O_2BYTE }, 99 { NULL, ".dw", S_DATA, 0, O_2BYTE }, 100 { NULL, ".fdb", S_DATA, 0, O_2BYTE }, 101 /* { NULL, ".3byte", S_DATA, 0, O_3BYTE }, */ 102 /* { NULL, ".triple", S_DATA, 0, O_3BYTE }, */ 103 /* { NULL, ".4byte", S_DATA, 0, O_4BYTE }, */ 104 /* { NULL, ".quad", S_DATA, 0, O_4BYTE }, */ 105 { NULL, ".df", S_FLOAT, 0, 0 }, 106 { NULL, ".blkb", S_BLK, 0, O_1BYTE }, 107 { NULL, ".ds", S_BLK, 0, O_1BYTE }, 108 { NULL, ".rmb", S_BLK, 0, O_1BYTE }, 109 { NULL, ".rs", S_BLK, 0, O_1BYTE }, 110 { NULL, ".blkw", S_BLK, 0, O_2BYTE }, 111 /* { NULL, ".blk3", S_BLK, 0, O_3BYTE }, */ 112 /* { NULL, ".blk4", S_BLK, 0, O_4BYTE }, */ 113 { NULL, ".ascii", S_ASCIX, 0, O_ASCII }, 114 { NULL, ".ascis", S_ASCIX, 0, O_ASCIS }, 115 { NULL, ".asciz", S_ASCIX, 0, O_ASCIZ }, 116 { NULL, ".str", S_ASCIX, 0, O_ASCII }, 117 { NULL, ".strs", S_ASCIX, 0, O_ASCIS }, 118 { NULL, ".strz", S_ASCIX, 0, O_ASCIZ }, 119 { NULL, ".fcc", S_ASCIX, 0, O_ASCII }, 120 { NULL, ".even", S_BOUNDARY, 0, O_EVEN }, 121 { NULL, ".odd", S_BOUNDARY, 0, O_ODD }, 122 { NULL, ".bndry", S_BOUNDARY, 0, O_BNDRY }, 123 /* sdas specific */ 124 { NULL, ".optsdcc", S_OPTSDCC, 0, 0 }, 125 /* end sdas specific */ 126 127 /* Macro Processor */ 128 129 { NULL, ".macro", S_MACRO, 0, O_MACRO }, 130 { NULL, ".endm", S_MACRO, 0, O_ENDM }, 131 { NULL, ".mexit", S_MACRO, 0, O_MEXIT }, 132 133 { NULL, ".narg", S_MACRO, 0, O_NARG }, 134 { NULL, ".nchr", S_MACRO, 0, O_NCHR }, 135 { NULL, ".ntyp", S_MACRO, 0, O_NTYP }, 136 137 { NULL, ".irp", S_MACRO, 0, O_IRP }, 138 { NULL, ".irpc", S_MACRO, 0, O_IRPC }, 139 { NULL, ".rept", S_MACRO, 0, O_REPT }, 140 141 { NULL, ".nval", S_MACRO, 0, O_NVAL }, 142 143 { NULL, ".mdelete", S_MACRO, 0, O_MDEL }, 144 145 /* Machines */ 146 147 { NULL, ".r4k", S_CPU, 0, X_R4K }, 148 { NULL, ".r3k", S_CPU, 0, X_R2K }, 149 { NULL, ".r2k", S_CPU, 0, X_R2K }, 150 { NULL, ".hd64", S_CPU, 0, X_HD64 }, 151 { NULL, ".z180", S_CPU, 0, X_HD64 }, 152 { NULL, ".z80", S_CPU, 0, X_Z80 }, 153 154 /* rabbit (warning: derived from "z80 / hd64180") */ 155 156 { NULL, "ld", S_LD, 0, 0x40 }, 157 158 { NULL, "call", S_CALL, 0, 0xC4 }, 159 { NULL, "jp", S_JP, 0, 0xC2 }, 160 { NULL, "jr", S_JR, 0, 0x18 }, 161 { NULL, "djnz", S_DJNZ, 0, 0x10 }, 162 { NULL, "ret", S_RET, 0, 0xC0 }, 163 164 { NULL, "bit", S_BIT, 0, 0x40 }, 165 { NULL, "res", S_BIT, 0, 0x80 }, 166 { NULL, "set", S_BIT, 0, 0xC0 }, 167 168 { NULL, "inc", S_INC, 0, 0x04 }, 169 { NULL, "dec", S_DEC, 0, 0x05 }, 170 171 { NULL, "add", S_ADD, 0, 0x80 }, 172 { NULL, "adc", S_ADC, 0, 0x88 }, 173 { NULL, "sbc", S_SBC, 0, 0x98 }, 174 175 { NULL, "and", S_AND, 0, 0xA0 }, 176 { NULL, "or", S_AND, 0, 0xB0 }, 177 { NULL, "sub", S_SUB, 0, 0x90 }, 178 { NULL, "xor", S_AND, 0, 0xA8 }, 179 { NULL, "cp", S_AND, 0, 0xB8 }, 180 181 { NULL, "ex", S_EX, 0, 0xE3 }, 182 183 { NULL, "push", S_PUSH, 0, 0xC5 }, 184 { NULL, "pop", S_PUSH, 0, 0xC1 }, 185 186 /* { NULL, "in", S_IN, 0, 0xDB }, */ 187 /* { NULL, "out", S_OUT, 0, 0xD3 }, */ 188 189 { NULL, "ioi", S_IN, 0, 0xD3 }, 190 { NULL, "ioe", S_OUT, 0, 0xDB }, 191 192 { NULL, "rl", S_RL, 0, 0x10 }, 193 { NULL, "rlc", S_RL, 0, 0x00 }, 194 { NULL, "rr", S_RL, 0, 0x18 }, 195 { NULL, "rrc", S_RL, 0, 0x08 }, 196 { NULL, "sla", S_RL, 0, 0x20 }, 197 { NULL, "sra", S_RL, 0, 0x28 }, 198 { NULL, "srl", S_RL, 0, 0x38 }, 199 200 { NULL, "rst", S_RST, 0, 0xC7 }, 201 202 /* { NULL, "im", S_IM, 0, 0xED }, */ 203 204 { NULL, "ccf", S_INH1, 0, 0x3F }, 205 { NULL, "cpl", S_INH1, 0, 0x2F }, 206 /* { NULL, "daa", S_INH1, 0, 0x27 }, */ 207 /* { NULL, "di", S_INH1, 0, 0xF3 }, */ 208 /* { NULL, "ei", S_INH1, 0, 0xFB }, */ 209 { NULL, "ipset", S_IM, 0, 0xED }, 210 { NULL, "ipset0", S_INH2, 0, 0x46 }, 211 { NULL, "ipset1", S_INH2, 0, 0x56 }, 212 { NULL, "ipset2", S_INH2, 0, 0x4E }, 213 { NULL, "ipset3", S_INH2, 0, 0x5E }, 214 { NULL, "ipres", S_INH2, 0, 0x5D }, 215 { NULL, "exx", S_INH1, 0, 0xD9 }, 216 { NULL, "nop", S_INH1, 0, 0x00 }, 217 218 /* { NULL, "halt", S_INH1, 0, 0x76 }, */ 219 { NULL, "altd", S_INH1, 0, 0x76 }, 220 221 { NULL, "rla", S_INH1, 0, 0x17 }, 222 { NULL, "rlca", S_INH1, 0, 0x07 }, 223 { NULL, "rra", S_INH1, 0, 0x1F }, 224 { NULL, "rrca", S_INH1, 0, 0x0F }, 225 { NULL, "scf", S_INH1, 0, 0x37 }, 226 227 /* { NULL, "cpd", S_INH2, 0, 0xA9 }, */ 228 /* { NULL, "cpdr", S_INH2, 0, 0xB9 }, */ 229 /* { NULL, "cpi", S_INH2, 0, 0xA1 }, */ 230 /* { NULL, "cpir", S_INH2, 0, 0xB1 }, */ 231 /* { NULL, "ind", S_INH2, 0, 0xAA }, */ 232 /* { NULL, "indr", S_INH2, 0, 0xBA }, */ 233 /* { NULL, "ini", S_INH2, 0, 0xA2 }, */ 234 /* { NULL, "inir", S_INH2, 0, 0xB2 }, */ 235 { NULL, "ldd", S_INH2, 0, 0xA8 }, 236 { NULL, "lddr", S_INH2, 0, 0xB8 }, 237 { NULL, "ldi", S_INH2, 0, 0xA0 }, 238 { NULL, "ldir", S_INH2, 0, 0xB0 }, 239 { NULL, "neg", S_NEG, 0, 0x44 }, 240 /* { NULL, "outd", S_INH2, 0, 0xAB }, */ 241 /* { NULL, "otdr", S_INH2, 0, 0xBB }, */ 242 /* { NULL, "outi", S_INH2, 0, 0xA3 }, */ 243 /* { NULL, "otir", S_INH2, 0, 0xB3 }, */ 244 { NULL, "reti", S_INH2, 0, 0x4D }, 245 /* { NULL, "retn", S_INH2, 0, 0x45 }, */ 246 { NULL, "lret", S_INH2, 0, 0x45 }, 247 /* { NULL, "rld", S_INH2, 0, 0x6F }, */ 248 /* { NULL, "rrd", S_INH2, S_EOL, 0x67 } */ 249 250 { NULL, "mul", S_INH1, 0, 0xF7 }, 251 252 { NULL, "idet", R3K_INH1, 0, 0x5B }, 253 { NULL, "lddsr", R3K_INH2, 0, 0x98 }, 254 { NULL, "ldisr", R3K_INH2, 0, 0x90 }, 255 { NULL, "lsddr", R3K_INH2, 0, 0xD8 }, 256 { NULL, "lsdr", R3K_INH2, 0, 0xF8 }, 257 { NULL, "lsidr", R3K_INH2, 0, 0xD0 }, 258 { NULL, "lsir", R3K_INH2, 0, 0xF0 }, 259 { NULL, "rdmode", R3K_INH2, 0, 0x7F }, 260 { NULL, "setusr", R3K_INH2, 0, 0x6F }, 261 { NULL, "sures", R3K_INH2, 0, 0x7D }, 262 { NULL, "uma", R3K_INH2, 0, 0xC0 }, 263 { NULL, "ums", R3K_INH2, 0, 0xC8 }, 264 265 { NULL, "jre", X_JRE, 0, 0xA3 }, 266 { NULL, "clr", X_CLR, 0, 0xBF }, 267 { NULL, "ljp", X_LJP, 0, 0xC7 }, 268 { NULL, "lcall", X_LCALL, 0, 0xCF }, 269 { NULL, "lret", S_INH2, 0, 0x45 }, 270 { NULL, "bool", X_BOOL, 0, 0xCC }, 271 { NULL, "syscall", R4K_INH2, 0, 0x75 }, 272 { NULL, "sysret", R4K_INH2, 0, 0x83 }, 273 { NULL, "mulu", X_R4K_MULU, S_EOL, 0xA7 } 274 }; 275