1a5a4af3bSchristos /* pyramid.opcode.h -- gdb initial attempt. 2a5a4af3bSchristos 3*8b657b07Schristos Copyright (C) 2001-2022 Free Software Foundation, Inc. 4a5a4af3bSchristos 5a5a4af3bSchristos This program is free software; you can redistribute it and/or modify 6a5a4af3bSchristos it under the terms of the GNU General Public License as published by 7a5a4af3bSchristos the Free Software Foundation; either version 3, or (at your option) 8a5a4af3bSchristos any later version. 9a5a4af3bSchristos 10a5a4af3bSchristos This program is distributed in the hope that it will be useful, 11a5a4af3bSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of 12a5a4af3bSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13a5a4af3bSchristos GNU General Public License for more details. 14a5a4af3bSchristos 15a5a4af3bSchristos You should have received a copy of the GNU General Public License 16a5a4af3bSchristos along with this program; if not, write to the Free Software 17a5a4af3bSchristos Foundation, Inc., 51 Franklin Street - Fifth Floor, 18a5a4af3bSchristos Boston, MA 02110-1301, USA. */ 19a5a4af3bSchristos 20a5a4af3bSchristos /* pyramid opcode table: wot to do with this 21a5a4af3bSchristos particular opcode */ 22a5a4af3bSchristos 23a5a4af3bSchristos struct pyr_datum 24a5a4af3bSchristos { 25a5a4af3bSchristos char nargs; 26a5a4af3bSchristos char * args; /* how to compile said opcode */ 27a5a4af3bSchristos unsigned long mask; /* Bit vector: which operand modes are valid 28a5a4af3bSchristos for this opcode */ 29a5a4af3bSchristos unsigned char code; /* op-code (always 6(?) bits */ 30a5a4af3bSchristos }; 31a5a4af3bSchristos 32a5a4af3bSchristos typedef struct pyr_insn_format 33a5a4af3bSchristos { 34a5a4af3bSchristos unsigned int mode :4; 35a5a4af3bSchristos unsigned int operator :8; 36a5a4af3bSchristos unsigned int index_scale :2; 37a5a4af3bSchristos unsigned int index_reg :6; 38a5a4af3bSchristos unsigned int operand_1 :6; 39a5a4af3bSchristos unsigned int operand_2:6; 40a5a4af3bSchristos } pyr_insn_format; 41a5a4af3bSchristos 42a5a4af3bSchristos 43a5a4af3bSchristos /* We store four bytes of opcode for all opcodes. 44a5a4af3bSchristos Pyramid is sufficiently RISCy that: 45a5a4af3bSchristos - insns are always an integral number of words; 46a5a4af3bSchristos - the length of any insn can be told from the first word of 47a5a4af3bSchristos the insn. (ie, if there are zero, one, or two words of 48a5a4af3bSchristos immediate operand/offset). 49a5a4af3bSchristos 50a5a4af3bSchristos 51a5a4af3bSchristos The args component is a string containing two characters for each 52a5a4af3bSchristos operand of the instruction. The first specifies the kind of operand; 53a5a4af3bSchristos the second, the place it is stored. */ 54a5a4af3bSchristos 55a5a4af3bSchristos /* Kinds of operands: 56a5a4af3bSchristos mask assembler syntax description 57a5a4af3bSchristos 0x0001: movw Rn,Rn register to register 58a5a4af3bSchristos 0x0002: movw K,Rn quick immediate to register 59a5a4af3bSchristos 0x0004: movw I,Rn long immediate to register 60a5a4af3bSchristos 0x0008: movw (Rn),Rn register indirect to register 61a5a4af3bSchristos movw (Rn)[x],Rn register indirect to register 62a5a4af3bSchristos 0x0010: movw I(Rn),Rn offset register indirect to register 63a5a4af3bSchristos movw I(Rn)[x],Rn offset register indirect, indexed, to register 64a5a4af3bSchristos 65a5a4af3bSchristos 0x0020: movw Rn,(Rn) register to register indirect 66a5a4af3bSchristos 0x0040: movw K,(Rn) quick immediate to register indirect 67a5a4af3bSchristos 0x0080: movw I,(Rn) long immediate to register indirect 68a5a4af3bSchristos 0x0100: movw (Rn),(Rn) register indirect to-register indirect 69a5a4af3bSchristos 0x0100: movw (Rn),(Rn) register indirect to-register indirect 70a5a4af3bSchristos 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect 71a5a4af3bSchristos 0x0200: movw I(Rn),(Rn) register indirect+offset to register indirect 72a5a4af3bSchristos 73a5a4af3bSchristos 0x0400: movw Rn,I(Rn) register to register indirect+offset 74a5a4af3bSchristos 0x0800: movw K,I(Rn) quick immediate to register indirect+offset 75a5a4af3bSchristos 0x1000: movw I,I(Rn) long immediate to register indirect+offset 76a5a4af3bSchristos 0x1000: movw (Rn),I(Rn) register indirect to-register indirect+offset 77a5a4af3bSchristos 0x1000: movw I(Rn),I(Rn) register indirect+offset to register indirect 78a5a4af3bSchristos +offset 79a5a4af3bSchristos 0x0000: (irregular) ??? 80a5a4af3bSchristos 81a5a4af3bSchristos 82a5a4af3bSchristos Each insn has a four-bit field encoding the type(s) of its operands. 83a5a4af3bSchristos */ 84a5a4af3bSchristos 85a5a4af3bSchristos /* Some common combinations 86a5a4af3bSchristos */ 87a5a4af3bSchristos 88a5a4af3bSchristos /* the first 5,(0x1|0x2|0x4|0x8|0x10) ie (1|2|4|8|16), ie ( 32 -1)*/ 89a5a4af3bSchristos #define GEN_TO_REG (31) 90a5a4af3bSchristos 91a5a4af3bSchristos #define UNKNOWN ((unsigned long)-1) 92a5a4af3bSchristos #define ANY (GEN_TO_REG | (GEN_TO_REG << 5) | (GEN_TO_REG << 15)) 93a5a4af3bSchristos 94a5a4af3bSchristos #define CONVERT (1|8|0x10|0x20|0x200) 95a5a4af3bSchristos 96a5a4af3bSchristos #define K_TO_REG (2) 97a5a4af3bSchristos #define I_TO_REG (4) 98a5a4af3bSchristos #define NOTK_TO_REG (GEN_TO_REG & ~K_TO_REG) 99a5a4af3bSchristos #define NOTI_TO_REG (GEN_TO_REG & ~I_TO_REG) 100a5a4af3bSchristos 101a5a4af3bSchristos /* The assembler requires that this array be sorted as follows: 102a5a4af3bSchristos all instances of the same mnemonic must be consecutive. 103a5a4af3bSchristos All instances of the same mnemonic with the same number of operands 104a5a4af3bSchristos must be consecutive. 105a5a4af3bSchristos */ 106a5a4af3bSchristos 107a5a4af3bSchristos struct pyr_opcode /* pyr opcode text */ 108a5a4af3bSchristos { 109a5a4af3bSchristos char * name; /* opcode name: lowercase string [key] */ 110a5a4af3bSchristos struct pyr_datum datum; /* rest of opcode table [datum] */ 111a5a4af3bSchristos }; 112a5a4af3bSchristos 113a5a4af3bSchristos #define pyr_how args 114a5a4af3bSchristos #define pyr_nargs nargs 115a5a4af3bSchristos #define pyr_mask mask 116a5a4af3bSchristos #define pyr_name name 117a5a4af3bSchristos 118a5a4af3bSchristos struct pyr_opcode pyr_opcodes[] = 119a5a4af3bSchristos { 120a5a4af3bSchristos {"movb", { 2, "", UNKNOWN, 0x11}, }, 121a5a4af3bSchristos {"movh", { 2, "", UNKNOWN, 0x12} }, 122a5a4af3bSchristos {"movw", { 2, "", ANY, 0x10} }, 123a5a4af3bSchristos {"movl", { 2, "", ANY, 0x13} }, 124a5a4af3bSchristos {"mnegw", { 2, "", (0x1|0x8|0x10), 0x14} }, 125a5a4af3bSchristos {"mnegf", { 2, "", 0x1, 0x15} }, 126a5a4af3bSchristos {"mnegd", { 2, "", 0x1, 0x16} }, 127a5a4af3bSchristos {"mcomw", { 2, "", (0x1|0x8|0x10), 0x17} }, 128a5a4af3bSchristos {"mabsw", { 2, "", (0x1|0x8|0x10), 0x18} }, 129a5a4af3bSchristos {"mabsf", { 2, "", 0x1, 0x19} }, 130a5a4af3bSchristos {"mabsd", { 2, "", 0x1, 0x1a} }, 131a5a4af3bSchristos {"mtstw", { 2, "", (0x1|0x8|0x10), 0x1c} }, 132a5a4af3bSchristos {"mtstf", { 2, "", 0x1, 0x1d} }, 133a5a4af3bSchristos {"mtstd", { 2, "", 0x1, 0x1e} }, 134a5a4af3bSchristos {"mova", { 2, "", 0x8|0x10, 0x1f} }, 135a5a4af3bSchristos {"movzbw", { 2, "", (0x1|0x8|0x10), 0x20} }, 136a5a4af3bSchristos {"movzhw", { 2, "", (0x1|0x8|0x10), 0x21} }, 137a5a4af3bSchristos /* 2 insns out of order here */ 138a5a4af3bSchristos {"movbl", { 2, "", 1, 0x4f} }, 139a5a4af3bSchristos {"filbl", { 2, "", 1, 0x4e} }, 140a5a4af3bSchristos 141a5a4af3bSchristos {"cvtbw", { 2, "", CONVERT, 0x22} }, 142a5a4af3bSchristos {"cvthw", { 2, "", CONVERT, 0x23} }, 143a5a4af3bSchristos {"cvtwb", { 2, "", CONVERT, 0x24} }, 144a5a4af3bSchristos {"cvtwh", { 2, "", CONVERT, 0x25} }, 145a5a4af3bSchristos {"cvtwf", { 2, "", CONVERT, 0x26} }, 146a5a4af3bSchristos {"cvtwd", { 2, "", CONVERT, 0x27} }, 147a5a4af3bSchristos {"cvtfw", { 2, "", CONVERT, 0x28} }, 148a5a4af3bSchristos {"cvtfd", { 2, "", CONVERT, 0x29} }, 149a5a4af3bSchristos {"cvtdw", { 2, "", CONVERT, 0x2a} }, 150a5a4af3bSchristos {"cvtdf", { 2, "", CONVERT, 0x2b} }, 151a5a4af3bSchristos 152a5a4af3bSchristos {"addw", { 2, "", GEN_TO_REG, 0x40} }, 153a5a4af3bSchristos {"addwc", { 2, "", GEN_TO_REG, 0x41} }, 154a5a4af3bSchristos {"subw", { 2, "", GEN_TO_REG, 0x42} }, 155a5a4af3bSchristos {"subwb", { 2, "", GEN_TO_REG, 0x43} }, 156a5a4af3bSchristos {"rsubw", { 2, "", GEN_TO_REG, 0x44} }, 157a5a4af3bSchristos {"mulw", { 2, "", GEN_TO_REG, 0x45} }, 158a5a4af3bSchristos {"emul", { 2, "", GEN_TO_REG, 0x47} }, 159a5a4af3bSchristos {"umulw", { 2, "", GEN_TO_REG, 0x46} }, 160a5a4af3bSchristos {"divw", { 2, "", GEN_TO_REG, 0x48} }, 161a5a4af3bSchristos {"ediv", { 2, "", GEN_TO_REG, 0x4a} }, 162a5a4af3bSchristos {"rdivw", { 2, "", GEN_TO_REG, 0x4b} }, 163a5a4af3bSchristos {"udivw", { 2, "", GEN_TO_REG, 0x49} }, 164a5a4af3bSchristos {"modw", { 2, "", GEN_TO_REG, 0x4c} }, 165a5a4af3bSchristos {"umodw", { 2, "", GEN_TO_REG, 0x4d} }, 166a5a4af3bSchristos 167a5a4af3bSchristos 168a5a4af3bSchristos {"addf", { 2, "", 1, 0x50} }, 169a5a4af3bSchristos {"addd", { 2, "", 1, 0x51} }, 170a5a4af3bSchristos {"subf", { 2, "", 1, 0x52} }, 171a5a4af3bSchristos {"subd", { 2, "", 1, 0x53} }, 172a5a4af3bSchristos {"mulf", { 2, "", 1, 0x56} }, 173a5a4af3bSchristos {"muld", { 2, "", 1, 0x57} }, 174a5a4af3bSchristos {"divf", { 2, "", 1, 0x58} }, 175a5a4af3bSchristos {"divd", { 2, "", 1, 0x59} }, 176a5a4af3bSchristos 177a5a4af3bSchristos 178a5a4af3bSchristos {"cmpb", { 2, "", UNKNOWN, 0x61} }, 179a5a4af3bSchristos {"cmph", { 2, "", UNKNOWN, 0x62} }, 180a5a4af3bSchristos {"cmpw", { 2, "", UNKNOWN, 0x60} }, 181a5a4af3bSchristos {"ucmpb", { 2, "", UNKNOWN, 0x66} }, 182a5a4af3bSchristos /* WHY no "ucmph"??? */ 183a5a4af3bSchristos {"ucmpw", { 2, "", UNKNOWN, 0x65} }, 184a5a4af3bSchristos {"xchw", { 2, "", UNKNOWN, 0x0f} }, 185a5a4af3bSchristos 186a5a4af3bSchristos 187a5a4af3bSchristos {"andw", { 2, "", GEN_TO_REG, 0x30} }, 188a5a4af3bSchristos {"orw", { 2, "", GEN_TO_REG, 0x31} }, 189a5a4af3bSchristos {"xorw", { 2, "", GEN_TO_REG, 0x32} }, 190a5a4af3bSchristos {"bicw", { 2, "", GEN_TO_REG, 0x33} }, 191a5a4af3bSchristos {"lshlw", { 2, "", GEN_TO_REG, 0x38} }, 192a5a4af3bSchristos {"ashlw", { 2, "", GEN_TO_REG, 0x3a} }, 193a5a4af3bSchristos {"ashll", { 2, "", GEN_TO_REG, 0x3c} }, 194a5a4af3bSchristos {"ashrw", { 2, "", GEN_TO_REG, 0x3b} }, 195a5a4af3bSchristos {"ashrl", { 2, "", GEN_TO_REG, 0x3d} }, 196a5a4af3bSchristos {"rotlw", { 2, "", GEN_TO_REG, 0x3e} }, 197a5a4af3bSchristos {"rotrw", { 2, "", GEN_TO_REG, 0x3f} }, 198a5a4af3bSchristos 199a5a4af3bSchristos /* push and pop insns are "going away next release". */ 200a5a4af3bSchristos {"pushw", { 2, "", GEN_TO_REG, 0x0c} }, 201a5a4af3bSchristos {"popw", { 2, "", (0x1|0x8|0x10), 0x0d} }, 202a5a4af3bSchristos {"pusha", { 2, "", (0x8|0x10), 0x0e} }, 203a5a4af3bSchristos 204a5a4af3bSchristos {"bitsw", { 2, "", UNKNOWN, 0x35} }, 205a5a4af3bSchristos {"bitcw", { 2, "", UNKNOWN, 0x36} }, 206a5a4af3bSchristos /* some kind of ibra/dbra insns??*/ 207a5a4af3bSchristos {"icmpw", { 2, "", UNKNOWN, 0x67} }, 208a5a4af3bSchristos {"dcmpw", { 2, "", (1|4|0x20|0x80|0x400|0x1000), 0x69} },/*FIXME*/ 209a5a4af3bSchristos {"acmpw", { 2, "", 1, 0x6b} }, 210a5a4af3bSchristos 211a5a4af3bSchristos /* Call is written as a 1-op insn, but is always (dis)assembled as a 2-op 212a5a4af3bSchristos insn with a 2nd op of tr14. The assembler will have to grok this. */ 213a5a4af3bSchristos {"call", { 2, "", GEN_TO_REG, 0x04} }, 214a5a4af3bSchristos {"call", { 1, "", GEN_TO_REG, 0x04} }, 215a5a4af3bSchristos 216a5a4af3bSchristos {"callk", { 1, "", UNKNOWN, 0x06} },/* system call?*/ 217a5a4af3bSchristos /* Ret is usually written as a 0-op insn, but gets disassembled as a 218a5a4af3bSchristos 1-op insn. The operand is always tr15. */ 219a5a4af3bSchristos {"ret", { 0, "", UNKNOWN, 0x09} }, 220a5a4af3bSchristos {"ret", { 1, "", UNKNOWN, 0x09} }, 221a5a4af3bSchristos {"adsf", { 2, "", (1|2|4), 0x08} }, 222a5a4af3bSchristos {"retd", { 2, "", UNKNOWN, 0x0a} }, 223a5a4af3bSchristos {"btc", { 2, "", UNKNOWN, 0x01} }, 224a5a4af3bSchristos {"bfc", { 2, "", UNKNOWN, 0x02} }, 225a5a4af3bSchristos /* Careful: halt is 0x00000000. Jump must have some other (mode?)bit set?? */ 226a5a4af3bSchristos {"jump", { 1, "", UNKNOWN, 0x00} }, 227a5a4af3bSchristos {"btp", { 2, "", UNKNOWN, 0xf00} }, 228a5a4af3bSchristos /* read control-stack pointer is another 1-or-2 operand insn. */ 229a5a4af3bSchristos {"rcsp", { 2, "", UNKNOWN, 0x01f} }, 230a5a4af3bSchristos {"rcsp", { 1, "", UNKNOWN, 0x01f} } 231a5a4af3bSchristos }; 232a5a4af3bSchristos 233a5a4af3bSchristos /* end: pyramid.opcode.h */ 234a5a4af3bSchristos /* One day I will have to take the time to find out what operands 235a5a4af3bSchristos are valid for these insns, and guess at what they mean. 236a5a4af3bSchristos 237a5a4af3bSchristos I can't imagine what the "I???" insns (iglob, etc) do. 238a5a4af3bSchristos 239a5a4af3bSchristos the arithmetic-sounding insns ending in "p" sound awfully like BCD 240a5a4af3bSchristos arithmetic insns: 241a5a4af3bSchristos dshlp -> Decimal SHift Left Packed 242a5a4af3bSchristos dshrp -> Decimal SHift Right Packed 243a5a4af3bSchristos and cvtlp would be convert long to packed. 244a5a4af3bSchristos I have no idea how the operands are interpreted; but having them be 245a5a4af3bSchristos a long register with (address, length) of an in-memory packed BCD operand 246a5a4af3bSchristos would not be surprising. 247a5a4af3bSchristos They are unlikely to be a packed bcd string: 64 bits of long give 248a5a4af3bSchristos is only 15 digits+sign, which isn't enough for COBOL. 249a5a4af3bSchristos */ 250a5a4af3bSchristos #if 0 251a5a4af3bSchristos {"wcsp", { 2, "", UNKNOWN, 0x00} }, /*write csp?*/ 252a5a4af3bSchristos /* The OSx Operating System Porting Guide claims SSL does things 253a5a4af3bSchristos with tr12 (a register reserved to it) to do with static block-structure 254a5a4af3bSchristos references. SSL=Set Static Link? It's "Going away next release". */ 255a5a4af3bSchristos {"ssl", { 2, "", UNKNOWN, 0x00} }, 256a5a4af3bSchristos {"ccmps", { 2, "", UNKNOWN, 0x00} }, 257a5a4af3bSchristos {"lcd", { 2, "", UNKNOWN, 0x00} }, 258a5a4af3bSchristos {"uemul", { 2, "", UNKNOWN, 0x00} }, /*unsigned emul*/ 259a5a4af3bSchristos {"srf", { 2, "", UNKNOWN, 0x00} }, /*Gidget time???*/ 260a5a4af3bSchristos {"mnegp", { 2, "", UNKNOWN, 0x00} }, /move-neg phys?*/ 261a5a4af3bSchristos {"ldp", { 2, "", UNKNOWN, 0x00} }, /*load phys?*/ 262a5a4af3bSchristos {"ldti", { 2, "", UNKNOWN, 0x00} }, 263a5a4af3bSchristos {"ldb", { 2, "", UNKNOWN, 0x00} }, 264a5a4af3bSchristos {"stp", { 2, "", UNKNOWN, 0x00} }, 265a5a4af3bSchristos {"stti", { 2, "", UNKNOWN, 0x00} }, 266a5a4af3bSchristos {"stb", { 2, "", UNKNOWN, 0x00} }, 267a5a4af3bSchristos {"stu", { 2, "", UNKNOWN, 0x00} }, 268a5a4af3bSchristos {"addp", { 2, "", UNKNOWN, 0x00} }, 269a5a4af3bSchristos {"subp", { 2, "", UNKNOWN, 0x00} }, 270a5a4af3bSchristos {"mulp", { 2, "", UNKNOWN, 0x00} }, 271a5a4af3bSchristos {"divp", { 2, "", UNKNOWN, 0x00} }, 272a5a4af3bSchristos {"dshlp", { 2, "", UNKNOWN, 0x00} }, /* dec shl packed? */ 273a5a4af3bSchristos {"dshrp", { 2, "", UNKNOWN, 0x00} }, /* dec shr packed? */ 274a5a4af3bSchristos {"movs", { 2, "", UNKNOWN, 0x00} }, /*move (string?)?*/ 275a5a4af3bSchristos {"cmpp", { 2, "", UNKNOWN, 0x00} }, /* cmp phys?*/ 276a5a4af3bSchristos {"cmps", { 2, "", UNKNOWN, 0x00} }, /* cmp (string?)?*/ 277a5a4af3bSchristos {"cvtlp", { 2, "", UNKNOWN, 0x00} }, /* cvt long to p??*/ 278a5a4af3bSchristos {"cvtpl", { 2, "", UNKNOWN, 0x00} }, /* cvt p to l??*/ 279a5a4af3bSchristos {"dintr", { 2, "", UNKNOWN, 0x00} }, /* ?? intr ?*/ 280a5a4af3bSchristos {"rphysw", { 2, "", UNKNOWN, 0x00} }, /* read phys word?*/ 281a5a4af3bSchristos {"wphysw", { 2, "", UNKNOWN, 0x00} }, /* write phys word?*/ 282a5a4af3bSchristos {"cmovs", { 2, "", UNKNOWN, 0x00} }, 283a5a4af3bSchristos {"rsubw", { 2, "", UNKNOWN, 0x00} }, 284a5a4af3bSchristos {"bicpsw", { 2, "", UNKNOWN, 0x00} }, /* clr bit in psw? */ 285a5a4af3bSchristos {"bispsw", { 2, "", UNKNOWN, 0x00} }, /* set bit in psw? */ 286a5a4af3bSchristos {"eio", { 2, "", UNKNOWN, 0x00} }, /* ?? ?io ? */ 287a5a4af3bSchristos {"callp", { 2, "", UNKNOWN, 0x00} }, /* call phys?*/ 288a5a4af3bSchristos {"callr", { 2, "", UNKNOWN, 0x00} }, 289a5a4af3bSchristos {"lpcxt", { 2, "", UNKNOWN, 0x00} }, /*load proc context*/ 290a5a4af3bSchristos {"rei", { 2, "", UNKNOWN, 0x00} }, /*ret from intrpt*/ 291a5a4af3bSchristos {"rport", { 2, "", UNKNOWN, 0x00} }, /*read-port?*/ 292a5a4af3bSchristos {"rtod", { 2, "", UNKNOWN, 0x00} }, /*read-time-of-day?*/ 293a5a4af3bSchristos {"ssi", { 2, "", UNKNOWN, 0x00} }, 294a5a4af3bSchristos {"vtpa", { 2, "", UNKNOWN, 0x00} }, /*virt-to-phys-addr?*/ 295a5a4af3bSchristos {"wicl", { 2, "", UNKNOWN, 0x00} }, /* write icl ? */ 296a5a4af3bSchristos {"wport", { 2, "", UNKNOWN, 0x00} }, /*write-port?*/ 297a5a4af3bSchristos {"wtod", { 2, "", UNKNOWN, 0x00} }, /*write-time-of-day?*/ 298a5a4af3bSchristos {"flic", { 2, "", UNKNOWN, 0x00} }, 299a5a4af3bSchristos {"iglob", { 2, "", UNKNOWN, 0x00} }, /* I global? */ 300a5a4af3bSchristos {"iphys", { 2, "", UNKNOWN, 0x00} }, /* I physical? */ 301a5a4af3bSchristos {"ipid", { 2, "", UNKNOWN, 0x00} }, /* I pid? */ 302a5a4af3bSchristos {"ivect", { 2, "", UNKNOWN, 0x00} }, /* I vector? */ 303a5a4af3bSchristos {"lamst", { 2, "", UNKNOWN, 0x00} }, 304a5a4af3bSchristos {"tio", { 2, "", UNKNOWN, 0x00} }, 305a5a4af3bSchristos #endif 306