1 /**************************************************************************** 2 * 3 * Description: table of non-instruction reserved words: 4 * - registers, 5 * - predefined types 6 * - operators (unary + binary), 7 * - language types 8 * for directives see directve.h! 9 * for instructions see instruct.h! 10 * 11 ****************************************************************************/ 12 13 /* v1.96: items needn't be sorted anymore! 14 * The items are stored in structures of type special_item. 15 * If an item is inserted, moved or deleted, the project needs 16 * a full rebuild. 17 */ 18 19 /* field usage: 20 * type = RWT_ value SpecialTable.type uint_8 21 * value = flags SpecialTable.value unsigned 22 * bytval = value SpecialTable.bytval uint_8 23 * flags = RWF_ flags ResWordTable.flags uint_8 24 * cpu = cpu flags SpecialTable.cpu uint_16 25 * sflags = SpecialTable.sflags unsigned 26 * for registers, the 'value' field contains OP_ flags. 27 * Since this field has type unsigned, it may be 16-bits wide only. 28 * This is no problem, since all register-related flags are in the low word. 29 */ 30 /* token str type value bytval flags cpu sflags */ 31 32 /* registers AH-BH must be consecutive, start with AH and end with BH */ 33 34 res(AL, al, RWT_REG, OP_AL, 0, 0, P_86, 1) 35 res(CL, cl, RWT_REG, OP_CL, 1, 0, P_86, 1) 36 res(DL, dl, RWT_REG, OP_R8, 2, 0, P_86, 1) 37 res(BL, bl, RWT_REG, OP_R8, 3, 0, P_86, 1) 38 res(AH, ah, RWT_REG, OP_R8, 4, 0, P_86, 1) 39 res(CH, ch, RWT_REG, OP_R8, 5, 0, P_86, 1) 40 res(DH, dh, RWT_REG, OP_R8, 6, 0, P_86, 1) 41 res(BH, bh, RWT_REG, OP_R8, 7, 0, P_86, 1) 42 43 res(AX, ax, RWT_REG, OP_AX, 0, 0, P_86, 2) 44 res(CX, cx, RWT_REG, OP_R16, 1, 0, P_86, 2) 45 res(DX, dx, RWT_REG, OP_DX, 2, 0, P_86, 2) 46 res(BX, bx, RWT_REG, OP_R16, 3, 0, P_86, SFR_IREG|2) 47 res(SP, sp, RWT_REG, OP_R16, 4, 0, P_86, 2) 48 res(BP, bp, RWT_REG, OP_R16, 5, 0, P_86, SFR_SSBASED|SFR_IREG|2) 49 res(SI, si, RWT_REG, OP_R16, 6, 0, P_86, SFR_IREG|2) 50 res(DI, di, RWT_REG, OP_R16, 7, 0, P_86, SFR_IREG|2) 51 52 res(EAX, eax, RWT_REG, OP_EAX, 0, 0, P_386, SFR_IREG|4) 53 res(ECX, ecx, RWT_REG, OP_R32, 1, 0, P_386, SFR_IREG|4) 54 res(EDX, edx, RWT_REG, OP_R32, 2, 0, P_386, SFR_IREG|4) 55 res(EBX, ebx, RWT_REG, OP_R32, 3, 0, P_386, SFR_IREG|4) 56 res(ESP, esp, RWT_REG, OP_R32, 4, 0, P_386, SFR_SSBASED|SFR_IREG|4) 57 res(EBP, ebp, RWT_REG, OP_R32, 5, 0, P_386, SFR_SSBASED|SFR_IREG|4) 58 res(ESI, esi, RWT_REG, OP_R32, 6, 0, P_386, SFR_IREG|4) 59 res(EDI, edi, RWT_REG, OP_R32, 7, 0, P_386, SFR_IREG|4) 60 61 /* registers ES-GS must be consecutive */ 62 res(ES, es, RWT_REG, OP_SR86, 0, 0, P_86, 0) 63 res(CS, cs, RWT_REG, OP_SR86, 1, 0, P_86, 0) 64 res(SS, ss, RWT_REG, OP_SR86, 2, 0, P_86, 0) 65 res(DS, ds, RWT_REG, OP_SR86, 3, 0, P_86, 0) 66 res(FS, fs, RWT_REG, OP_SR386, 4, 0, P_386, 0) 67 res(GS, gs, RWT_REG, OP_SR386, 5, 0, P_386, 0) 68 69 res(ST, st, RWT_REG, OP_ST, 0, 0, P_87, 10) 70 71 res(MM0, mm0, RWT_REG, OP_MMX, 0, 0, P_MMX, 8) 72 res(MM1, mm1, RWT_REG, OP_MMX, 1, 0, P_MMX, 8) 73 res(MM2, mm2, RWT_REG, OP_MMX, 2, 0, P_MMX, 8) 74 res(MM3, mm3, RWT_REG, OP_MMX, 3, 0, P_MMX, 8) 75 res(MM4, mm4, RWT_REG, OP_MMX, 4, 0, P_MMX, 8) 76 res(MM5, mm5, RWT_REG, OP_MMX, 5, 0, P_MMX, 8) 77 res(MM6, mm6, RWT_REG, OP_MMX, 6, 0, P_MMX, 8) 78 res(MM7, mm7, RWT_REG, OP_MMX, 7, 0, P_MMX, 8) 79 80 res(XMM0, xmm0, RWT_REG, OP_XMM, 0, 0, P_SSE1, 16) 81 res(XMM1, xmm1, RWT_REG, OP_XMM, 1, 0, P_SSE1, 16) 82 res(XMM2, xmm2, RWT_REG, OP_XMM, 2, 0, P_SSE1, 16) 83 res(XMM3, xmm3, RWT_REG, OP_XMM, 3, 0, P_SSE1, 16) 84 res(XMM4, xmm4, RWT_REG, OP_XMM, 4, 0, P_SSE1, 16) 85 res(XMM5, xmm5, RWT_REG, OP_XMM, 5, 0, P_SSE1, 16) 86 res(XMM6, xmm6, RWT_REG, OP_XMM, 6, 0, P_SSE1, 16) 87 res(XMM7, xmm7, RWT_REG, OP_XMM, 7, 0, P_SSE1, 16) 88 #if AVXSUPP 89 res(YMM0, ymm0, RWT_REG, OP_YMM, 0, 0, P_AVX, 32) 90 res(YMM1, ymm1, RWT_REG, OP_YMM, 1, 0, P_AVX, 32) 91 res(YMM2, ymm2, RWT_REG, OP_YMM, 2, 0, P_AVX, 32) 92 res(YMM3, ymm3, RWT_REG, OP_YMM, 3, 0, P_AVX, 32) 93 res(YMM4, ymm4, RWT_REG, OP_YMM, 4, 0, P_AVX, 32) 94 res(YMM5, ymm5, RWT_REG, OP_YMM, 5, 0, P_AVX, 32) 95 res(YMM6, ymm6, RWT_REG, OP_YMM, 6, 0, P_AVX, 32) 96 res(YMM7, ymm7, RWT_REG, OP_YMM, 7, 0, P_AVX, 32) 97 #endif 98 99 res(CR0, cr0, RWT_REG, OP_RSPEC, 0, 0, P_386, 0) 100 res(CR2, cr2, RWT_REG, OP_RSPEC, 2, 0, P_386, 0) 101 res(CR3, cr3, RWT_REG, OP_RSPEC, 3, 0, P_386, 0) 102 res(CR4, cr4, RWT_REG, OP_RSPEC, 4, 0, P_586, 0) 103 res(DR0, dr0, RWT_REG, OP_RSPEC, 0|0x10, 0, P_386, 0) 104 res(DR1, dr1, RWT_REG, OP_RSPEC, 1|0x10, 0, P_386, 0) 105 res(DR2, dr2, RWT_REG, OP_RSPEC, 2|0x10, 0, P_386, 0) 106 res(DR3, dr3, RWT_REG, OP_RSPEC, 3|0x10, 0, P_386, 0) 107 res(DR6, dr6, RWT_REG, OP_RSPEC, 6|0x10, 0, P_386, 0) 108 res(DR7, dr7, RWT_REG, OP_RSPEC, 7|0x10, 0, P_386, 0) 109 /* v2.11: add RWF_IA32 to TRx registers */ 110 res(TR3, tr3, RWT_REG, OP_RSPEC, 3|0x20,RWF_IA32,P_486, 0) 111 res(TR4, tr4, RWT_REG, OP_RSPEC, 4|0x20,RWF_IA32,P_486, 0) 112 res(TR5, tr5, RWT_REG, OP_RSPEC, 5|0x20,RWF_IA32,P_486, 0) 113 res(TR6, tr6, RWT_REG, OP_RSPEC, 6|0x20,RWF_IA32,P_386, 0) 114 res(TR7, tr7, RWT_REG, OP_RSPEC, 7|0x20,RWF_IA32,P_386, 0) 115 116 #if AMD64_SUPPORT 117 118 /* for simplicity, all x64 reserved words must be consecutive 119 * ( see Set64Bit() in parser.c ). 120 */ 121 122 res(SPL, spl, RWT_REG, OP_R8, 4, RWF_X64, P_64, 1) 123 res(BPL, bpl, RWT_REG, OP_R8, 5, RWF_X64, P_64, 1) 124 res(SIL, sil, RWT_REG, OP_R8, 6, RWF_X64, P_64, 1) 125 res(DIL, dil, RWT_REG, OP_R8, 7, RWF_X64, P_64, 1) 126 res(R8B, r8b, RWT_REG, OP_R8, 8, RWF_X64, P_64, 1) 127 res(R9B, r9b, RWT_REG, OP_R8, 9, RWF_X64, P_64, 1) 128 res(R10B, r10b, RWT_REG, OP_R8, 10, RWF_X64, P_64, 1) 129 res(R11B, r11b, RWT_REG, OP_R8, 11, RWF_X64, P_64, 1) 130 res(R12B, r12b, RWT_REG, OP_R8, 12, RWF_X64, P_64, 1) 131 res(R13B, r13b, RWT_REG, OP_R8, 13, RWF_X64, P_64, 1) 132 res(R14B, r14b, RWT_REG, OP_R8, 14, RWF_X64, P_64, 1) 133 res(R15B, r15b, RWT_REG, OP_R8, 15, RWF_X64, P_64, 1) 134 135 res(R8W, r8w, RWT_REG, OP_R16, 8, RWF_X64, P_64, 2) 136 res(R9W, r9w, RWT_REG, OP_R16, 9, RWF_X64, P_64, 2) 137 res(R10W, r10w, RWT_REG, OP_R16, 10, RWF_X64, P_64, 2) 138 res(R11W, r11w, RWT_REG, OP_R16, 11, RWF_X64, P_64, 2) 139 res(R12W, r12w, RWT_REG, OP_R16, 12, RWF_X64, P_64, 2) 140 res(R13W, r13w, RWT_REG, OP_R16, 13, RWF_X64, P_64, 2) 141 res(R14W, r14w, RWT_REG, OP_R16, 14, RWF_X64, P_64, 2) 142 res(R15W, r15w, RWT_REG, OP_R16, 15, RWF_X64, P_64, 2) 143 144 res(R8D, r8d, RWT_REG, OP_R32, 8, RWF_X64, P_64, SFR_IREG|4) 145 res(R9D, r9d, RWT_REG, OP_R32, 9, RWF_X64, P_64, SFR_IREG|4) 146 res(R10D, r10d, RWT_REG, OP_R32, 10, RWF_X64, P_64, SFR_IREG|4) 147 res(R11D, r11d, RWT_REG, OP_R32, 11, RWF_X64, P_64, SFR_IREG|4) 148 res(R12D, r12d, RWT_REG, OP_R32, 12, RWF_X64, P_64, SFR_IREG|4) 149 res(R13D, r13d, RWT_REG, OP_R32, 13, RWF_X64, P_64, SFR_IREG|4) 150 res(R14D, r14d, RWT_REG, OP_R32, 14, RWF_X64, P_64, SFR_IREG|4) 151 res(R15D, r15d, RWT_REG, OP_R32, 15, RWF_X64, P_64, SFR_IREG|4) 152 153 res(RAX, rax, RWT_REG, OP_RAX, 0, RWF_X64, P_64, SFR_IREG|8) 154 res(RCX, rcx, RWT_REG, OP_R64, 1, RWF_X64, P_64, SFR_IREG|8) 155 res(RDX, rdx, RWT_REG, OP_R64, 2, RWF_X64, P_64, SFR_IREG|8) 156 res(RBX, rbx, RWT_REG, OP_R64, 3, RWF_X64, P_64, SFR_IREG|8) 157 res(RSP, rsp, RWT_REG, OP_R64, 4, RWF_X64, P_64, SFR_SSBASED|SFR_IREG|8) 158 res(RBP, rbp, RWT_REG, OP_R64, 5, RWF_X64, P_64, SFR_SSBASED|SFR_IREG|8) 159 res(RSI, rsi, RWT_REG, OP_R64, 6, RWF_X64, P_64, SFR_IREG|8) 160 res(RDI, rdi, RWT_REG, OP_R64, 7, RWF_X64, P_64, SFR_IREG|8) 161 res(R8, r8, RWT_REG, OP_R64, 8, RWF_X64, P_64, SFR_IREG|8) 162 res(R9, r9, RWT_REG, OP_R64, 9, RWF_X64, P_64, SFR_IREG|8) 163 res(R10, r10, RWT_REG, OP_R64, 10, RWF_X64, P_64, SFR_IREG|8) 164 res(R11, r11, RWT_REG, OP_R64, 11, RWF_X64, P_64, SFR_IREG|8) 165 res(R12, r12, RWT_REG, OP_R64, 12, RWF_X64, P_64, SFR_IREG|8) 166 res(R13, r13, RWT_REG, OP_R64, 13, RWF_X64, P_64, SFR_IREG|8) 167 res(R14, r14, RWT_REG, OP_R64, 14, RWF_X64, P_64, SFR_IREG|8) 168 res(R15, r15, RWT_REG, OP_R64, 15, RWF_X64, P_64, SFR_IREG|8) 169 170 res(XMM8, xmm8, RWT_REG, OP_XMM, 8, RWF_X64, P_64, 16) 171 res(XMM9, xmm9, RWT_REG, OP_XMM, 9, RWF_X64, P_64, 16) 172 res(XMM10,xmm10,RWT_REG, OP_XMM, 10, RWF_X64, P_64, 16) 173 res(XMM11,xmm11,RWT_REG, OP_XMM, 11, RWF_X64, P_64, 16) 174 res(XMM12,xmm12,RWT_REG, OP_XMM, 12, RWF_X64, P_64, 16) 175 res(XMM13,xmm13,RWT_REG, OP_XMM, 13, RWF_X64, P_64, 16) 176 res(XMM14,xmm14,RWT_REG, OP_XMM, 14, RWF_X64, P_64, 16) 177 res(XMM15,xmm15,RWT_REG, OP_XMM, 15, RWF_X64, P_64, 16) 178 #if AVXSUPP 179 res(YMM8, ymm8, RWT_REG, OP_YMM, 8, RWF_X64, P_AVX|P_64, 32) 180 res(YMM9, ymm9, RWT_REG, OP_YMM, 9, RWF_X64, P_AVX|P_64, 32) 181 res(YMM10,ymm10,RWT_REG, OP_YMM, 10, RWF_X64, P_AVX|P_64, 32) 182 res(YMM11,ymm11,RWT_REG, OP_YMM, 11, RWF_X64, P_AVX|P_64, 32) 183 res(YMM12,ymm12,RWT_REG, OP_YMM, 12, RWF_X64, P_AVX|P_64, 32) 184 res(YMM13,ymm13,RWT_REG, OP_YMM, 13, RWF_X64, P_AVX|P_64, 32) 185 res(YMM14,ymm14,RWT_REG, OP_YMM, 14, RWF_X64, P_AVX|P_64, 32) 186 res(YMM15,ymm15,RWT_REG, OP_YMM, 15, RWF_X64, P_AVX|P_64, 32) 187 #endif 188 189 res(CR8, cr8, RWT_REG, OP_RSPEC, 8, RWF_X64, P_64, 0) 190 191 #endif 192 193 /* predefined types. BYTE must be first! */ 194 /* token str type value bytval flags cpu sflags */ 195 196 res(BYTE, byte, RWT_STYPE, 0, MT_BYTE, 0, P_86, USE_EMPTY) 197 res(SBYTE, sbyte, RWT_STYPE, 0, MT_SBYTE, 0, P_86, USE_EMPTY) 198 res(WORD, word, RWT_STYPE, 0, MT_WORD, 0, P_86, USE_EMPTY) 199 res(SWORD, sword, RWT_STYPE, 0, MT_SWORD, 0, P_86, USE_EMPTY) 200 res(DWORD, dword, RWT_STYPE, 0, MT_DWORD, 0, P_86, USE_EMPTY) 201 res(SDWORD, sdword, RWT_STYPE, 0, MT_SDWORD, 0, P_86, USE_EMPTY) 202 res(REAL4, real4, RWT_STYPE, 0, MT_REAL4, 0, P_86, USE_EMPTY) 203 res(FWORD, fword, RWT_STYPE, 0, MT_FWORD, 0, P_86, USE_EMPTY) 204 res(QWORD, qword, RWT_STYPE, 0, MT_QWORD, 0, P_86, USE_EMPTY) 205 res(SQWORD, sqword, RWT_STYPE, 0, MT_SQWORD, 0, P_86, USE_EMPTY) 206 res(REAL8, real8, RWT_STYPE, 0, MT_REAL8, 0, P_86, USE_EMPTY) 207 res(TBYTE, tbyte, RWT_STYPE, 0, MT_TBYTE, 0, P_86, USE_EMPTY) 208 res(REAL10, real10, RWT_STYPE, 0, MT_REAL10, 0, P_86, USE_EMPTY) 209 res(OWORD, oword, RWT_STYPE, 0, MT_OWORD, 0, P_86, USE_EMPTY) 210 #if AVXSUPP 211 res(YMMWORD,ymmword, RWT_STYPE, 0, MT_YMMWORD, 0, P_AVX, USE_EMPTY) 212 #endif 213 /* NEAR must be first, FAR32 must be last, all contiguous */ 214 res(NEAR, near, RWT_STYPE, 0, MT_NEAR, 0, P_86, USE_EMPTY) 215 res(FAR, far, RWT_STYPE, 0, MT_FAR, 0, P_86, USE_EMPTY) 216 res(NEAR16, near16, RWT_STYPE, 0, MT_NEAR, 0, P_386, USE16) 217 res(NEAR32, near32, RWT_STYPE, 0, MT_NEAR, 0, P_386, USE32) 218 res(FAR16, far16, RWT_STYPE, 0, MT_FAR, 0, P_386, USE16) 219 res(FAR32, far32, RWT_STYPE, 0, MT_FAR, 0, P_386, USE32) 220 #if XMMWORD 221 res(MMWORD, mmword, RWT_STYPE, 0, MT_QWORD, 0, P_586|P_MMX, USE_EMPTY) 222 res(XMMWORD,xmmword, RWT_STYPE, 0, MT_OWORD, 0, P_686|P_SSE1, USE_EMPTY) 223 #endif 224 225 /* unary operators. bytval contains priority */ 226 /* token str type value bytval flags cpu sflags */ 227 res(DOT_TYPE, .type, RWT_UNARY_OP, AT_ALL, 14, 0, P_86, UOT_DOT_TYPE ) 228 res(HIGH, high, RWT_UNARY_OP, AT_TLN, 6, 0, P_86, UOT_HIGH ) 229 #if LOHI32 230 res(HIGH32, high32, RWT_UNARY_OP, AT_CONST | AT_FLOAT, 6, 0, P_86, UOT_HIGH32 ) 231 #endif 232 res(HIGHWORD, highword, RWT_UNARY_OP, AT_CONST, 6, 0, P_86, UOT_HIGHWORD ) 233 #if IMAGERELSUPP 234 /* v2.10: changed AT_TLN to AT_LABEL */ 235 //res(IMAGEREL, imagerel, RWT_UNARY_OP, AT_TLN, 5, 0, P_86, UOT_IMAGEREL ) 236 res(IMAGEREL, imagerel, RWT_UNARY_OP, AT_LABEL, 5, 0, P_86, UOT_IMAGEREL ) 237 #endif 238 res(LENGTH, length, RWT_UNARY_OP, AT_LF, 3, 0, P_86, UOT_LENGTH ) 239 res(LENGTHOF, lengthof, RWT_UNARY_OP, AT_LF, 3, 0, P_86, UOT_LENGTHOF ) 240 res(LOW, low, RWT_UNARY_OP, AT_TLN, 6, 0, P_86, UOT_LOW ) 241 #if LOHI32 242 res(LOW32, low32, RWT_UNARY_OP, AT_TLN | AT_FLOAT, 6, 0, P_86, UOT_LOW32 ) 243 #endif 244 res(LOWWORD, lowword, RWT_UNARY_OP, AT_TLN, 6, 0, P_86, UOT_LOWWORD ) 245 res(LROFFSET, lroffset, RWT_UNARY_OP, AT_LFN, 5, 0, P_86, UOT_LROFFSET ) 246 res(MASK, mask, RWT_UNARY_OP, AT_TBF, 3, 0, P_86, UOT_MASK ) 247 res(OFFSET, offset, RWT_UNARY_OP, AT_TLFN, 5, 0, P_86, UOT_OFFSET ) 248 res(OPATTR, opattr, RWT_UNARY_OP, AT_ALL, 14, 0, P_86, UOT_OPATTR ) 249 #if SECTIONRELSUPP 250 res(SECTIONREL, sectionrel, RWT_UNARY_OP, AT_LABEL, 5, 0, P_86, UOT_SECTIONREL) 251 #endif 252 res(SEG, seg, RWT_UNARY_OP, AT_LABEL, 5, 0, P_86, UOT_SEG ) 253 res(SHORT, short, RWT_UNARY_OP, AT_LABEL, 14, 0, P_86, UOT_SHORT ) 254 res(SIZE, size, RWT_UNARY_OP, AT_TLF, 3, 0, P_86, UOT_SIZE ) 255 res(SIZEOF, sizeof, RWT_UNARY_OP, AT_TLF, 3, 0, P_86, UOT_SIZEOF ) 256 res(THIS, this, RWT_UNARY_OP, AT_TYPE, 5, 0, P_86, UOT_THIS ) 257 res(TYPE, type, RWT_UNARY_OP, AT_ALL, 5, 0, P_86, UOT_TYPE ) 258 res(WIDTH, width, RWT_UNARY_OP, AT_TBF, 3, 0, P_86, UOT_WIDTH ) 259 260 /* binary operators. bytval contains priority */ 261 262 /* token str type value bytval flags cpu sflags */ 263 res(EQ, eq, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 264 res(NE, ne, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 265 res(GE, ge, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 266 res(GT, gt, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 267 res(LE, le, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 268 res(LT, lt, RWT_BINARY_OP, 0, 10, 0, P_86, 0) 269 res(MOD, mod, RWT_BINARY_OP, 0, 8, 0, P_86, 0) 270 res(PTR, ptr, RWT_BINARY_OP, 0, 4, 0, P_86, 0) 271 272 /* DUP is also a binary operator, but must be handled differently. */ 273 274 res(DUP, dup, RWT_RES_ID, 0, 0, 0, P_86, 0) 275 res(ADDR, addr, RWT_RES_ID, 0, 0, 0, P_86, 0) 276 res(FLAT, flat, RWT_RES_ID, 0, 0, 0, P_86, 0) 277 res(VARARG, vararg,RWT_RES_ID, 0, 0, 0, P_86, 0) 278 #if AMD64_SUPPORT 279 res(FRAME, frame, RWT_RES_ID, 0, 0, RWF_X64, P_64, 0) 280 #endif 281 282 /* languages, must be in this order! */ 283 /* token str type value bytval flags cpu sflags */ 284 res(C, c, RWT_RES_ID, 0, LANG_C, 0, P_86, 0) 285 res(SYSCALL, syscall, RWT_RES_ID, 0, LANG_SYSCALL, 0, P_86, 0) 286 res(STDCALL, stdcall, RWT_RES_ID, 0, LANG_STDCALL, 0, P_86, 0) 287 res(PASCAL, pascal, RWT_RES_ID, 0, LANG_PASCAL, 0, P_86, 0) 288 res(FORTRAN, fortran, RWT_RES_ID, 0, LANG_FORTRAN, 0, P_86, 0) 289 res(BASIC, basic, RWT_RES_ID, 0, LANG_BASIC, 0, P_86, 0) 290 res(FASTCALL, fastcall, RWT_RES_ID, 0, LANG_FASTCALL, 0, P_86, 0) 291 292