jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 1 jb302@36: jb302@36: jb302@36: C51 COMPILER V9.02, COMPILATION OF MODULE ISET jb302@36: OBJECT MODULE PLACED IN iset.obj jb302@36: COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE src\iset.c OMF2 BROWSE DEBUG PRINT(.\iset.lst) OBJECT(iset.obj) jb302@36: jb302@36: line level source jb302@36: jb302@36: 1 /* iset.c jb302@36: 2 * IR functions */ jb302@36: 3 #include "iset.h" jb302@36: 4 #include "mem.h" jb302@36: 5 jb302@36: 6 /* useful macros */ jb302@36: 7 #define NNN (IR & 0x07) jb302@36: 8 #define MMM ((IR & 0x38) >> 3) jb302@36: 9 jb302@36: 10 /* 0x00 - NOP */ jb302@36: 11 void jb302@36: 12 NOP(void) { jb302@36: 13 1 } jb302@36: 14 jb302@36: 15 /* 0x08 - SET C jb302@36: 16 * 0x0A - SET BS jb302@36: 17 * 0x0C - SET IE */ jb302@36: 18 void jb302@36: 19 SET(void) { jb302@36: 20 1 switch (IR) { jb302@36: 21 2 jb302@36: 22 2 case 0x08: jb302@36: 23 2 set_flag(C, 0x01); jb302@36: 24 2 break; jb302@36: 25 2 jb302@36: 26 2 case 0x0A: jb302@36: 27 2 set_flag(BS, 0x01); jb302@36: 28 2 break; jb302@36: 29 2 jb302@36: 30 2 case 0x0C: jb302@36: 31 2 set_flag(IE, 0x01); jb302@36: 32 2 break; jb302@36: 33 2 jb302@36: 34 2 default: jb302@36: 35 2 break; jb302@36: 36 2 } jb302@36: 37 1 } jb302@36: 38 jb302@36: 39 /* 0x09 - CLR C jb302@36: 40 * 0x0B - CLR BS jb302@36: 41 * 0x0D - CLR IE */ jb302@36: 42 void jb302@36: 43 CLR(void) { jb302@36: 44 1 switch (IR) { jb302@36: 45 2 jb302@36: 46 2 case 0x09: jb302@36: 47 2 set_flag(C, 0x00); jb302@36: 48 2 break; jb302@36: 49 2 jb302@36: 50 2 case 0x0B: jb302@36: 51 2 set_flag(BS, 0x00); jb302@36: 52 2 break; jb302@36: 53 2 jb302@36: 54 2 case 0x0D: jb302@36: 55 2 set_flag(IE, 0x00); jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 2 jb302@36: jb302@36: 56 2 break; jb302@36: 57 2 jb302@36: 58 2 default: jb302@36: 59 2 break; jb302@36: 60 2 } jb302@36: 61 1 } jb302@36: 62 jb302@36: 63 /* 0x0E - CPL C jb302@36: 64 * 0x0F - CPL A */ jb302@36: 65 void jb302@36: 66 CPL(void) { jb302@36: 67 1 switch (IR) { jb302@36: 68 2 jb302@36: 69 2 case 0x0E: jb302@36: 70 2 if (get_flag(C) == 0) { jb302@36: 71 3 set_flag(C, 0x01); jb302@36: 72 3 } jb302@36: 73 2 else { jb302@36: 74 3 set_flag(C, 0x00); jb302@36: 75 3 } jb302@36: 76 2 jb302@36: 77 2 case 0x0F: jb302@36: 78 2 A = ~A; jb302@36: 79 2 break; jb302@36: 80 2 jb302@36: 81 2 default: jb302@36: 82 2 break; jb302@36: 83 2 } jb302@36: 84 1 } jb302@36: 85 jb302@36: 86 /* 0x10 - XCSD */ jb302@36: 87 void jb302@36: 88 XCSD(void) { jb302@36: 89 1 tmpw = get_wide(SP); jb302@36: 90 1 set_wide(SP, get_wide(DPTR)); jb302@36: 91 1 set_wide(DPTR, tmpw); jb302@36: 92 1 } jb302@36: 93 jb302@36: 94 /* 0x11 - SFA */ jb302@36: 95 void jb302@36: 96 SFA(void) { jb302@36: 97 1 A = flags; jb302@36: 98 1 } jb302@36: 99 jb302@36: 100 /* 0x12 - LAF */ jb302@36: 101 void jb302@36: 102 LAF(void) { jb302@36: 103 1 flags = A; jb302@36: 104 1 } jb302@36: 105 jb302@36: 106 /* 0b00010XXX - special MOVs jb302@36: 107 * 0b00011XXX - direct, indirect and indexed MOVs jb302@36: 108 * 0b00100nnn - register-indirect MOVs - MOV @DPTR, Rn jb302@36: 109 * 0b00101nnn - immediate movs - MOV Rn, #data8 jb302@36: 110 * 0b00110nnn - MOV Rn, A jb302@36: 111 * 0b00111nnn - MOV A, Rn jb302@36: 112 * 0b01mmmnnn - 64 register move instructions jb302@36: 113 * jb302@36: 114 * this is a mess */ jb302@36: 115 void jb302@36: 116 MOV(void) { jb302@36: 117 1 switch (IR & 0x40) { jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 3 jb302@36: jb302@36: 118 2 jb302@36: 119 2 case 0x00: jb302@36: 120 2 switch (IR & 0xF8) { jb302@36: 121 3 jb302@36: 122 3 /* 0b00010XXX - special MOVs*/ jb302@36: 123 3 case 0x10: jb302@36: 124 3 switch (NNN) { jb302@36: 125 4 jb302@36: 126 4 /* MOV DPTR, SP */ jb302@36: 127 4 case 3: jb302@36: 128 4 set_wide(DPTR, get_wide(SP)); jb302@36: 129 4 break; jb302@36: 130 4 jb302@36: 131 4 /* MOV SP, DPTR */ jb302@36: 132 4 case 4: jb302@36: 133 4 set_wide(SP, get_wide(DPTR)); jb302@36: 134 4 break; jb302@36: 135 4 jb302@36: 136 4 /* MOV A, #data8 */ jb302@36: 137 4 case 5: jb302@36: 138 4 A = fetch(); jb302@36: 139 4 break; jb302@36: 140 4 jb302@36: 141 4 /* MOV SP, #data16 */ jb302@36: 142 4 case 6: jb302@36: 143 4 set_wide(SP, fetch_wide()); jb302@36: 144 4 break; jb302@36: 145 4 jb302@36: 146 4 /* MOV DPTR, #data16 */ jb302@36: 147 4 case 7: jb302@36: 148 4 set_wide(DPTR, fetch_wide()); jb302@36: 149 4 break; jb302@36: 150 4 jb302@36: 151 4 default: jb302@36: 152 4 break; jb302@36: 153 4 } jb302@36: 154 3 break; jb302@36: 155 3 jb302@36: 156 3 /* 0b00011XXX - direct, indirect and indexed MOVs*/ jb302@36: 157 3 case 0x18: jb302@36: 158 3 switch (NNN) { jb302@36: 159 4 jb302@36: 160 4 /* MOV A, addr16 */ jb302@36: 161 4 case 0: jb302@36: 162 4 set_wide(TMP, fetch_wide()); jb302@36: 163 4 A = mem[get_wide(TMP)]; jb302@36: 164 4 break; jb302@36: 165 4 jb302@36: 166 4 /* MOV addr16, A */ jb302@36: 167 4 case 1: jb302@36: 168 4 set_wide(TMP, fetch_wide()); jb302@36: 169 4 mem[get_wide(TMP)] = A; jb302@36: 170 4 break; jb302@36: 171 4 jb302@36: 172 4 /* MOV A, @A+DPTR */ jb302@36: 173 4 case 2: jb302@36: 174 4 set_wide(TMP, A + get_wide(DPTR)); jb302@36: 175 4 A = mem[get_wide(TMP)]; jb302@36: 176 4 break; jb302@36: 177 4 jb302@36: 178 4 /* MOV A, @A+PC */ jb302@36: 179 4 case 3: jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 4 jb302@36: jb302@36: 180 4 set_wide(TMP, A + get_wide(PC)); jb302@36: 181 4 A = mem[TMP]; jb302@36: 182 4 break; jb302@36: 183 4 jb302@36: 184 4 /* MOV A, @addr16 */ jb302@36: 185 4 case 4: jb302@36: 186 4 set_wide(TMP, fetch_wide()); jb302@36: 187 4 A = mem[mem[get_wide(TMP)]]; jb302@36: 188 4 break; jb302@36: 189 4 jb302@36: 190 4 /* MOV @addr16, A */ jb302@36: 191 4 case 5: jb302@36: 192 4 set_wide(TMP, fetch_wide()); jb302@36: 193 4 mem[mem[get_wide(TMP)]] = A; jb302@36: 194 4 break; jb302@36: 195 4 jb302@36: 196 4 /* MOV A, @DPTR */ jb302@36: 197 4 case 6: jb302@36: 198 4 set_wide(TMP, get_wide(DPTR)); jb302@36: 199 4 A = mem[get_wide(TMP)]; jb302@36: 200 4 break; jb302@36: 201 4 jb302@36: 202 4 /* MOV @DPTR, A */ jb302@36: 203 4 case 7: jb302@36: 204 4 set_wide(TMP, get_wide(DPTR)); jb302@36: 205 4 mem[get_wide(TMP)] = A; jb302@36: 206 4 break; jb302@36: 207 4 jb302@36: 208 4 default: jb302@36: 209 4 break; jb302@36: 210 4 } jb302@36: 211 3 break; jb302@36: 212 3 jb302@36: 213 3 /* 0b00100nnn - MOV @DPTR, Rn*/ jb302@36: 214 3 case 0x20: jb302@36: 215 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 216 3 mem[get_wide(TMP)] = get_reg(NNN); jb302@36: 217 3 break; jb302@36: 218 3 jb302@36: 219 3 /* 0b00101nnn - immediate movs - MOV Rn, #data8*/ jb302@36: 220 3 case 0x28: jb302@36: 221 3 set_reg(NNN, fetch()); jb302@36: 222 3 break; jb302@36: 223 3 jb302@36: 224 3 /* 0b00110nnn - MOV Rn, A */ jb302@36: 225 3 case 0x30: jb302@36: 226 3 set_reg(NNN, A); jb302@36: 227 3 break; jb302@36: 228 3 jb302@36: 229 3 /* 0b00111nnn MOV A, Rn */ jb302@36: 230 3 case 0x38: jb302@36: 231 3 A = get_reg(NNN); jb302@36: 232 3 break; jb302@36: 233 3 jb302@36: 234 3 default: jb302@36: 235 3 break; jb302@36: 236 3 } jb302@36: 237 2 break;; jb302@36: 238 2 jb302@36: 239 2 /* 0b01mmmnnn MOV Rm Rn jb302@36: 240 2 * if m == n: MOV Rm, @DPTR */ jb302@36: 241 2 case 0x40: jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 5 jb302@36: jb302@36: 242 2 if (NNN == MMM) { jb302@36: 243 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 244 3 set_reg(NNN, mem[get_wide(TMP)]); jb302@36: 245 3 } jb302@36: 246 2 else { jb302@36: 247 3 set_reg(MMM, get_reg(NNN)); jb302@36: 248 3 } jb302@36: 249 2 break; jb302@36: 250 2 jb302@36: 251 2 default: jb302@36: 252 2 break; jb302@36: 253 2 } jb302@36: 254 1 } jb302@36: 255 jb302@36: 256 jb302@36: 257 /* 0x80 - ANL A, R0 jb302@36: 258 * 0x81 - ANL A, R1 jb302@36: 259 * 0x82 - ANL A, R2 jb302@36: 260 * 0x83 - ANL A, R3 jb302@36: 261 * 0x84 - ANL A, DPH jb302@36: 262 * 0x85 - ANL A, DPL jb302@36: 263 * 0x86 - ANL A, #data8 jb302@36: 264 * 0x87 - ANL A, @DPTR */ jb302@36: 265 void jb302@36: 266 ANL(void) { jb302@36: 267 1 if (NNN < 6) { jb302@36: 268 2 A = A & get_reg(NNN); jb302@36: 269 2 } jb302@36: 270 1 else { jb302@36: 271 2 switch (NNN) { jb302@36: 272 3 jb302@36: 273 3 case 6: jb302@36: 274 3 A = A & fetch(); jb302@36: 275 3 break; jb302@36: 276 3 jb302@36: 277 3 case 7: jb302@36: 278 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 279 3 A = A & mem[TMP]; jb302@36: 280 3 break; jb302@36: 281 3 } jb302@36: 282 2 } jb302@36: 283 1 set_zp(A); jb302@36: 284 1 } jb302@36: 285 jb302@36: 286 /* 0x88 - ORL A, R0 jb302@36: 287 * 0x89 - ORL A, R1 jb302@36: 288 * 0x8A - ORL A, R2 jb302@36: 289 * 0x8B - ORL A, R3 jb302@36: 290 * 0x8C - ORL A, DPH jb302@36: 291 * 0x8D - ORL A, DPL jb302@36: 292 * 0x8E - ORL A, #data8 jb302@36: 293 * 0x8F - ORL A, @DPTR */ jb302@36: 294 void jb302@36: 295 ORL(void) { jb302@36: 296 1 if (NNN < 6) { jb302@36: 297 2 A = A | get_reg(NNN); jb302@36: 298 2 } jb302@36: 299 1 else { jb302@36: 300 2 switch (NNN) { jb302@36: 301 3 jb302@36: 302 3 case 6: jb302@36: 303 3 A = A | fetch(); jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 6 jb302@36: jb302@36: 304 3 break; jb302@36: 305 3 jb302@36: 306 3 case 7: jb302@36: 307 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 308 3 A = A | mem[TMP]; jb302@36: 309 3 break; jb302@36: 310 3 } jb302@36: 311 2 } jb302@36: 312 1 set_zp(A); jb302@36: 313 1 } jb302@36: 314 jb302@36: 315 /* 0x90 - XRL A, R0 jb302@36: 316 * 0x91 - XRL A, R1 jb302@36: 317 * 0x92 - XRL A, R2 jb302@36: 318 * 0x93 - XRL A, R3 jb302@36: 319 * 0x94 - XRL A, DPH jb302@36: 320 * 0x95 - XRL A, DPL jb302@36: 321 * 0x96 - XRL A, #data8 jb302@36: 322 * 0x97 - XRL A, @DPTR */ jb302@36: 323 void jb302@36: 324 XRL(void) { jb302@36: 325 1 if (NNN < 6) { jb302@36: 326 2 A = A ^ get_reg(NNN); jb302@36: 327 2 } jb302@36: 328 1 else { jb302@36: 329 2 switch (NNN) { jb302@36: 330 3 jb302@36: 331 3 case 6: jb302@36: 332 3 A = A ^ fetch(); jb302@36: 333 3 break; jb302@36: 334 3 jb302@36: 335 3 case 7: jb302@36: 336 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 337 3 A = A ^ mem[TMP]; jb302@36: 338 3 break; jb302@36: 339 3 } jb302@36: 340 2 } jb302@36: 341 1 set_zp(A); jb302@36: 342 1 } jb302@36: 343 jb302@36: 344 /* 0x98 - RL A */ jb302@36: 345 void jb302@36: 346 RL(void) { jb302@36: 347 1 A = (A << 1) | (A >> 7); jb302@36: 348 1 } jb302@36: 349 jb302@36: 350 /* 0x99 - RLC A */ jb302@36: 351 void jb302@36: 352 RLC(void) { jb302@36: 353 1 tmpb = A; jb302@36: 354 1 A = (A << 1) | get_flag(C); jb302@36: 355 1 set_flag(C, tmpb >> 7); jb302@36: 356 1 } jb302@36: 357 jb302@36: 358 /* 0x9A - RR A */ jb302@36: 359 void jb302@36: 360 RR(void) { jb302@36: 361 1 A = (A >> 1) | (A << 7); jb302@36: 362 1 } jb302@36: 363 jb302@36: 364 /* 0x9B - RRC A */ jb302@36: 365 void jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 7 jb302@36: jb302@36: 366 RRC(void) { jb302@36: 367 1 tmpb = A; jb302@36: 368 1 A = (A >> 1) | (get_flag(C) << 7); jb302@36: 369 1 set_flag(C, tmpb & 0x01); jb302@36: 370 1 } jb302@36: 371 jb302@36: 372 /* 0x9C - INC DPTR jb302@36: 373 * 0x9E - INC A */ jb302@36: 374 void jb302@36: 375 INC(void) { jb302@36: 376 1 switch (IR) { jb302@36: 377 2 jb302@36: 378 2 case 0x9C: jb302@36: 379 2 tmpw = get_wide(DPTR); jb302@36: 380 2 if ((tmpw + 1) > 0xFFFF) { jb302@36: 381 3 set_flag(OV, 1); jb302@36: 382 3 } jb302@36: 383 2 set_wide(DPTR, tmpw + 1); jb302@36: 384 2 set_zp(DPL); jb302@36: 385 2 set_zp(DPH); jb302@36: 386 2 break; jb302@36: 387 2 jb302@36: 388 2 case 0x9E: jb302@36: 389 2 if ((A + 1) > 0xFF) { jb302@36: 390 3 set_flag(OV, 1); jb302@36: 391 3 } jb302@36: 392 2 A++; jb302@36: 393 2 set_zp(A); jb302@36: 394 2 jb302@36: 395 2 } jb302@36: 396 1 } jb302@36: 397 jb302@36: 398 /* 0x9D - DEC DPTR jb302@36: 399 * 0x9F - DEC A */ jb302@36: 400 void jb302@36: 401 DEC(void) { jb302@36: 402 1 switch (IR) { jb302@36: 403 2 jb302@36: 404 2 case 0x9D: jb302@36: 405 2 tmpw = get_wide(DPTR); jb302@36: 406 2 if ((tmpw - 1) < 0) { jb302@36: 407 3 set_flag(OV, 1); jb302@36: 408 3 } jb302@36: 409 2 set_wide(DPTR, tmpw - 1); jb302@36: 410 2 set_zp(DPL); jb302@36: 411 2 set_zp(DPH); jb302@36: 412 2 jb302@36: 413 2 case 0x9F: jb302@36: 414 2 if ((A - 1) < 0) { jb302@36: 415 3 set_flag(OV, 1); jb302@36: 416 3 } jb302@36: 417 2 A--; jb302@36: 418 2 set_zp(A); jb302@36: 419 2 } jb302@36: 420 1 } jb302@36: 421 jb302@36: 422 /* 0xA0 - ADD A, R0 jb302@36: 423 * 0xA1 - ADD A, R1 jb302@36: 424 * 0xA2 - ADD A, R2 jb302@36: 425 * 0xA3 - ADD A, R3 jb302@36: 426 * 0xA4 - ADD A, DPH jb302@36: 427 * 0xA5 - ADD A, DPL jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 8 jb302@36: jb302@36: 428 * 0xA6 - ADD A, #data8 jb302@36: 429 * 0xA7 - ADD A, @DPTR */ jb302@36: 430 void jb302@36: 431 ADD(void) { jb302@36: 432 1 if (NNN < 6) { jb302@36: 433 2 if ((A + get_reg(NNN)) > 0xFF) { jb302@36: 434 3 set_flag(OV, 1); jb302@36: 435 3 } jb302@36: 436 2 else { jb302@36: 437 3 set_flag(OV, 0); jb302@36: 438 3 } jb302@36: 439 2 A = A + get_reg(NNN); jb302@36: 440 2 set_zp(A); jb302@36: 441 2 } jb302@36: 442 1 else { jb302@36: 443 2 switch (NNN) { jb302@36: 444 3 jb302@36: 445 3 case 6: jb302@36: 446 3 tmpb = fetch(); jb302@36: 447 3 if ((A + tmpb) > 0xFF) { jb302@36: 448 4 set_flag(OV, 1); jb302@36: 449 4 } jb302@36: 450 3 else { jb302@36: 451 4 set_flag(OV, 0); jb302@36: 452 4 } jb302@36: 453 3 A = A + tmpb; jb302@36: 454 3 set_zp(A); jb302@36: 455 3 break; jb302@36: 456 3 jb302@36: 457 3 case 7: jb302@36: 458 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 459 3 if ((A + mem[TMP]) > 0xFF) { jb302@36: 460 4 set_flag(OV, 1); jb302@36: 461 4 } jb302@36: 462 3 else { jb302@36: 463 4 set_flag(OV, 0); jb302@36: 464 4 } jb302@36: 465 3 A = A + mem[TMP]; jb302@36: 466 3 set_zp(A); jb302@36: 467 3 break; jb302@36: 468 3 } jb302@36: 469 2 } jb302@36: 470 1 jb302@36: 471 1 } jb302@36: 472 jb302@36: 473 /* 0xA8 - ADDC A, R0 jb302@36: 474 * 0xA9 - ADDC A, R1 jb302@36: 475 * 0xAA - ADDC A, R2 jb302@36: 476 * 0xAB - ADDC A, R3 jb302@36: 477 * 0xAC - ADDC A, DPH jb302@36: 478 * 0xAD - ADDC A, DPL jb302@36: 479 * 0xAE - ADDC A, #data8 jb302@36: 480 * 0xAF - ADDC A, @DPTR */ jb302@36: 481 void jb302@36: 482 ADDC(void) { jb302@36: 483 1 if (NNN < 6) { jb302@36: 484 2 if ((A + get_reg(NNN) + get_flag(C)) > 0xFF) { jb302@36: 485 3 set_flag(C, 1); jb302@36: 486 3 } jb302@36: 487 2 else { jb302@36: 488 3 set_flag(C, 0); jb302@36: 489 3 } jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 9 jb302@36: jb302@36: 490 2 A = A + get_reg(NNN) + get_flag(C); jb302@36: 491 2 set_zp(A); jb302@36: 492 2 } jb302@36: 493 1 else { jb302@36: 494 2 switch (NNN) { jb302@36: 495 3 jb302@36: 496 3 case 6: jb302@36: 497 3 tmpb = fetch(); jb302@36: 498 3 if ((A + tmpb + get_flag(C)) > 0xFF) { jb302@36: 499 4 set_flag(C, 1); jb302@36: 500 4 } jb302@36: 501 3 else { jb302@36: 502 4 set_flag(C, 0); jb302@36: 503 4 } jb302@36: 504 3 A = A + tmpb + get_flag(C); jb302@36: 505 3 set_zp(A); jb302@36: 506 3 break; jb302@36: 507 3 jb302@36: 508 3 case 7: jb302@36: 509 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 510 3 if ((A + mem[TMP] + get_flag(C)) > 0xFF) { jb302@36: 511 4 set_flag(C, 1); jb302@36: 512 4 } jb302@36: 513 3 else { jb302@36: 514 4 set_flag(C, 0); jb302@36: 515 4 } jb302@36: 516 3 A = A + mem[TMP] + get_flag(C); jb302@36: 517 3 set_zp(A); jb302@36: 518 3 break; jb302@36: 519 3 } jb302@36: 520 2 } jb302@36: 521 1 jb302@36: 522 1 jb302@36: 523 1 } jb302@36: 524 jb302@36: 525 /* 0xB0 - SUB A, R0 jb302@36: 526 * 0xB1 - SUB A, R1 jb302@36: 527 * 0xB2 - SUB A, R2 jb302@36: 528 * 0xB3 - SUB A, R3 jb302@36: 529 * 0xB4 - SB A, DPH jb302@36: 530 * 0xB5 - SUB A, DPL jb302@36: 531 * 0xB6 - SUB A, #data8 jb302@36: 532 * 0xB7 - SUB A, @DPTR */ jb302@36: 533 void jb302@36: 534 SUB(void) { jb302@36: 535 1 if (NNN < 6) { jb302@36: 536 2 if ((A - get_reg(NNN)) < 0){ jb302@36: 537 3 set_flag(S, 1); jb302@36: 538 3 } jb302@36: 539 2 else { jb302@36: 540 3 set_flag(S, 0); jb302@36: 541 3 } jb302@36: 542 2 A = A - get_reg(NNN); jb302@36: 543 2 set_zp(A); jb302@36: 544 2 } jb302@36: 545 1 else { jb302@36: 546 2 switch (NNN) { jb302@36: 547 3 jb302@36: 548 3 case 6: jb302@36: 549 3 tmpb = fetch(); jb302@36: 550 3 if ((A - tmpb) < 0) { jb302@36: 551 4 set_flag(S, 1); jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 10 jb302@36: jb302@36: 552 4 } jb302@36: 553 3 else { jb302@36: 554 4 set_flag(S, 0); jb302@36: 555 4 } jb302@36: 556 3 A = A - tmpb; jb302@36: 557 3 set_zp(A); jb302@36: 558 3 break; jb302@36: 559 3 jb302@36: 560 3 case 7: jb302@36: 561 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 562 3 if ((A - mem[TMP]) < 0) { jb302@36: 563 4 set_flag(S, 1); jb302@36: 564 4 } jb302@36: 565 3 else { jb302@36: 566 4 set_flag(S, 0); jb302@36: 567 4 } jb302@36: 568 3 A = A - mem[TMP]; jb302@36: 569 3 set_zp(A); jb302@36: 570 3 break; jb302@36: 571 3 } jb302@36: 572 2 } jb302@36: 573 1 } jb302@36: 574 jb302@36: 575 /* 0xB8 - SUBB A, R0 jb302@36: 576 * 0xB9 - SUBB A, R1 jb302@36: 577 * 0xBA - SUBB A, R2 jb302@36: 578 * 0xBB - SUBB A, R3 jb302@36: 579 * 0xBC - SUBB A, DPH jb302@36: 580 * 0xBD - SUBB A, DPL jb302@36: 581 * 0xBE - SUBB A, #data8 jb302@36: 582 * 0xBF - SUBB A, @DPTR */ jb302@36: 583 void jb302@36: 584 SUBB(void) { jb302@36: 585 1 if (NNN < 6) { jb302@36: 586 2 if ((A - get_reg(NNN) - get_flag(C)) < 0){ jb302@36: 587 3 set_flag(C, 1); jb302@36: 588 3 } jb302@36: 589 2 else { jb302@36: 590 3 set_flag(C, 0); jb302@36: 591 3 } jb302@36: 592 2 A = A - get_reg(NNN) -get_flag(C); jb302@36: 593 2 set_zp(A); jb302@36: 594 2 } jb302@36: 595 1 else { jb302@36: 596 2 switch (NNN) { jb302@36: 597 3 jb302@36: 598 3 case 6: jb302@36: 599 3 tmpb = fetch(); jb302@36: 600 3 if ((A - tmpb - get_flag(C)) < 0) { jb302@36: 601 4 set_flag(C, 1); jb302@36: 602 4 } jb302@36: 603 3 else { jb302@36: 604 4 set_flag(C, 0); jb302@36: 605 4 } jb302@36: 606 3 A = A - tmpb - get_flag(C); jb302@36: 607 3 set_zp(A); jb302@36: 608 3 break; jb302@36: 609 3 jb302@36: 610 3 case 7: jb302@36: 611 3 set_wide(TMP, get_wide(DPTR)); jb302@36: 612 3 if ((A - mem[TMP] - get_flag(C)) < 0) { jb302@36: 613 4 set_flag(C, 1); jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 11 jb302@36: jb302@36: 614 4 } jb302@36: 615 3 else { jb302@36: 616 4 set_flag(C, 0); jb302@36: 617 4 } jb302@36: 618 3 A = A - mem[TMP] - get_flag(C); jb302@36: 619 3 set_zp(A); jb302@36: 620 3 break; jb302@36: 621 3 } jb302@36: 622 2 } jb302@36: 623 1 } jb302@36: 624 jb302@36: 625 void jb302@36: 626 PJMP(void) { jb302@36: 627 1 /* implement me */ jb302@36: 628 1 } jb302@36: 629 jb302@36: 630 void jb302@36: 631 PCALL(void) { jb302@36: 632 1 /* implement me */ jb302@36: 633 1 } jb302@36: 634 jb302@36: 635 /* 0xD0 - DJNZ R0, rel8 jb302@36: 636 * 0xD1 - DJNZ R1, rel8 jb302@36: 637 * 0xD2 - DJNZ R2, rel8 jb302@36: 638 * 0xD3 - DJNZ R3, rel8 */ jb302@36: 639 void jb302@36: 640 DJNZ(void) { jb302@36: 641 1 set_reg(NNN, get_reg(NNN) - 1); jb302@36: 642 1 if (get_reg(NNN) == 0) { jb302@36: 643 2 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); jb302@36: 644 2 } jb302@36: 645 1 else { jb302@36: 646 2 inc_pc(1); jb302@36: 647 2 } jb302@36: 648 1 } jb302@36: 649 jb302@36: 650 /* 0xD4 - CJNE R0, #data, rel8 jb302@36: 651 * 0xD5 - CJNE R1, #data, rel8 jb302@36: 652 * 0xD6 - CJNE R2, #data, rel8 jb302@36: 653 * 0xD7 - CJNE R3, #data, rel8 jb302@36: 654 * 0xDF - CJNE A, #data8, rel8 */ jb302@36: 655 void jb302@36: 656 CJNE(void) { jb302@36: 657 1 switch(IR) { jb302@36: 658 2 jb302@36: 659 2 case 0xDF: jb302@36: 660 2 tmpb = fetch(); jb302@36: 661 2 if (tmpb != A) { jb302@36: 662 3 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); jb302@36: 663 3 } jb302@36: 664 2 else { jb302@36: 665 3 inc_pc(1); jb302@36: 666 3 } jb302@36: 667 2 break; jb302@36: 668 2 jb302@36: 669 2 jb302@36: 670 2 default: jb302@36: 671 2 tmpb = fetch(); jb302@36: 672 2 if (tmpb != get_reg(NNN - 4)) { jb302@36: 673 3 set_wide(PC, get_wide(PC) + (signed char)fetch() - 1); jb302@36: 674 3 } jb302@36: 675 2 else { jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 12 jb302@36: jb302@36: 676 3 inc_pc(1); jb302@36: 677 3 } jb302@36: 678 2 break; jb302@36: 679 2 } jb302@36: 680 1 } jb302@36: 681 jb302@36: 682 /* 0xD8 - LJMP addr16 */ jb302@36: 683 void jb302@36: 684 LJMP(void) { jb302@36: 685 1 set_wide(PC, fetch_wide()); jb302@36: 686 1 } jb302@36: 687 jb302@36: 688 /* 0xD9 - LCALL addr16 */ jb302@36: 689 void jb302@36: 690 LCALL(void) { jb302@36: 691 1 /* push PC to stack */ jb302@36: 692 1 mem[get_wide(SP)] = get_reg(PCL); jb302@36: 693 1 set_wide(SP, get_wide(SP) + 1); jb302@36: 694 1 mem[get_wide(SP)] = get_reg(PCH); jb302@36: 695 1 set_wide(SP, get_wide(SP) + 1); jb302@36: 696 1 /* jmp */ jb302@36: 697 1 set_wide(PC, fetch_wide()); jb302@36: 698 1 } jb302@36: 699 jb302@36: 700 /* 0xDA - RET */ jb302@36: 701 void jb302@36: 702 RET(void) { jb302@36: 703 1 /* get PC from stack */ jb302@36: 704 1 set_wide(SP, get_wide(SP) - 1); jb302@36: 705 1 tmpb = mem[get_wide(SP)]; /* PCH */ jb302@36: 706 1 set_wide(SP, get_wide(SP) - 1); jb302@36: 707 1 set_wide(PC, MWIDE(tmpb, mem[get_wide(SP)])); jb302@36: 708 1 } jb302@36: 709 jb302@36: 710 void jb302@36: 711 RETI(void) { jb302@36: 712 1 /* implement me */ jb302@36: 713 1 } jb302@36: 714 jb302@36: 715 /* 0xDC - SJMP rel8 */ jb302@36: 716 void jb302@36: 717 SJMP(void) { jb302@36: 718 1 /* -1 because the fetch() increments the PC */ jb302@36: 719 1 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 720 1 } jb302@36: 721 jb302@36: 722 /* 0xDD - JMP @A+DPTR jb302@36: 723 * 0xDE - JMP @DPTR */ jb302@36: 724 void jb302@36: 725 JMP(void) { jb302@36: 726 1 switch(IR) { jb302@36: 727 2 jb302@36: 728 2 case 0xDD: jb302@36: 729 2 set_wide(PC, A + get_wide(DPTR)); jb302@36: 730 2 break; jb302@36: 731 2 jb302@36: 732 2 case 0xDE: jb302@36: 733 2 set_wide(PC, get_wide(DPTR)); jb302@36: 734 2 break; jb302@36: 735 2 } jb302@36: 736 1 } jb302@36: 737 jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 13 jb302@36: jb302@36: 738 /* 0xE0 - JZ rel8 */ jb302@36: 739 void jb302@36: 740 JZ(void) { jb302@36: 741 1 if (get_flag(Z) == 1) { jb302@36: 742 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 743 2 } jb302@36: 744 1 /* skip rel8 if jump not needed */ jb302@36: 745 1 else { jb302@36: 746 2 inc_pc(1); jb302@36: 747 2 } jb302@36: 748 1 } jb302@36: 749 jb302@36: 750 /* 0xE1 - JNZ rel8 */ jb302@36: 751 void jb302@36: 752 JNZ(void) { jb302@36: 753 1 if (get_flag(Z) == 0) { jb302@36: 754 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 755 2 } jb302@36: 756 1 else { jb302@36: 757 2 inc_pc(1); jb302@36: 758 2 } jb302@36: 759 1 } jb302@36: 760 jb302@36: 761 /* 0xE2 - JC rel8 */ jb302@36: 762 void jb302@36: 763 JC(void) { jb302@36: 764 1 if (get_flag(C) == 1) { jb302@36: 765 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 766 2 } jb302@36: 767 1 else { jb302@36: 768 2 inc_pc(1); jb302@36: 769 2 } jb302@36: 770 1 } jb302@36: 771 jb302@36: 772 /* 0xE3 - JNC rel8 */ jb302@36: 773 void jb302@36: 774 JNC(void) { jb302@36: 775 1 if (get_flag(C) == 0) { jb302@36: 776 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 777 2 } jb302@36: 778 1 else { jb302@36: 779 2 inc_pc(1); jb302@36: 780 2 } jb302@36: 781 1 } jb302@36: 782 jb302@36: 783 /* 0xE4 - JPO rel8 */ jb302@36: 784 void jb302@36: 785 JPO(void) { jb302@36: 786 1 /* P = 1 when parity even */ jb302@36: 787 1 if (get_flag(P) == 0) { jb302@36: 788 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 789 2 } jb302@36: 790 1 else { jb302@36: 791 2 inc_pc(1); jb302@36: 792 2 } jb302@36: 793 1 jb302@36: 794 1 } jb302@36: 795 jb302@36: 796 /* 0xE5 - JPE rel8 */ jb302@36: 797 void jb302@36: 798 JPE(void) { jb302@36: 799 1 if (get_flag(P) == 1) { jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 14 jb302@36: jb302@36: 800 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 801 2 } jb302@36: 802 1 else { jb302@36: 803 2 inc_pc(1); jb302@36: 804 2 } jb302@36: 805 1 } jb302@36: 806 jb302@36: 807 /* 0xE6 - JS rel8 */ jb302@36: 808 void jb302@36: 809 JS(void) { jb302@36: 810 1 if (get_flag(S) == 1) { jb302@36: 811 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 812 2 } jb302@36: 813 1 else { jb302@36: 814 2 inc_pc(1); jb302@36: 815 2 } jb302@36: 816 1 } jb302@36: 817 jb302@36: 818 /* 0xE7 - JNS rel8 */ jb302@36: 819 void jb302@36: 820 JNS(void) { jb302@36: 821 1 if (get_flag(S) == 0) { jb302@36: 822 2 set_wide(PC, get_wide(PC) + (signed char)fetch() -1); jb302@36: 823 2 } jb302@36: 824 1 else { jb302@36: 825 2 inc_pc(1); jb302@36: 826 2 } jb302@36: 827 1 } jb302@36: 828 jb302@36: 829 /* 0xE8 - PUSH R0 jb302@36: 830 * 0xE9 - PUSH R1 jb302@36: 831 * 0xEA - PUSH R2 jb302@36: 832 * 0xEB - PUSH R3 jb302@36: 833 * 0xEC - PUSH DPH jb302@36: 834 * 0xED - PUSH DPL jb302@36: 835 * 0xEE - PUSH A jb302@36: 836 * 0xEF - PUSH FLAGS */ jb302@36: 837 void jb302@36: 838 PUSH(void) { jb302@36: 839 1 if (NNN < 6) { jb302@36: 840 2 mem[get_wide(SP)] = get_reg(NNN); jb302@36: 841 2 set_wide(SP, get_wide(SP) + 1); jb302@36: 842 2 jb302@36: 843 2 } jb302@36: 844 1 else { jb302@36: 845 2 switch(IR) { jb302@36: 846 3 jb302@36: 847 3 case 0xEE: jb302@36: 848 3 mem[get_wide(SP)] = A; jb302@36: 849 3 set_wide(SP, get_wide(SP) + 1); jb302@36: 850 3 break; jb302@36: 851 3 jb302@36: 852 3 case 0xEF: jb302@36: 853 3 mem[get_wide(SP)] = flags; jb302@36: 854 3 set_wide(SP, get_wide(SP) + 1); jb302@36: 855 3 break; jb302@36: 856 3 jb302@36: 857 3 default: jb302@36: 858 3 break; jb302@36: 859 3 } jb302@36: 860 2 } jb302@36: 861 1 } jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 15 jb302@36: jb302@36: 862 jb302@36: 863 /* 0xF0 - POP R0 jb302@36: 864 * 0xF1 - POP R1 jb302@36: 865 * 0xF2 - POP R2 jb302@36: 866 * 0xF3 - POP R3 jb302@36: 867 * 0xF4 - POP DPH jb302@36: 868 * 0xF5 - POP DPL jb302@36: 869 * 0xF6 - POP A jb302@36: 870 * 0xF7 - POP FLAGS */ jb302@36: 871 void jb302@36: 872 POP(void) { jb302@36: 873 1 if (NNN < 6) { jb302@36: 874 2 set_wide(SP, get_wide(SP) - 1); jb302@36: 875 2 set_reg(NNN, mem[get_wide(SP)]); jb302@36: 876 2 } jb302@36: 877 1 else { jb302@36: 878 2 switch(IR) { jb302@36: 879 3 jb302@36: 880 3 case 0xF6: jb302@36: 881 3 set_wide(SP, get_wide(SP) - 1); jb302@36: 882 3 A = mem[get_wide(SP)]; jb302@36: 883 3 break; jb302@36: 884 3 jb302@36: 885 3 case 0xF7: jb302@36: 886 3 set_wide(SP, get_wide(SP) - 1); jb302@36: 887 3 flags = mem[get_wide(SP)]; jb302@36: 888 3 break; jb302@36: 889 3 jb302@36: 890 3 default: jb302@36: 891 3 break; jb302@36: 892 3 } jb302@36: 893 2 } jb302@36: 894 1 } jb302@36: 895 jb302@36: 896 jb302@36: 897 /* 0xF8 - MUL R0, R1 */ jb302@36: 898 void jb302@36: 899 MUL(void) { jb302@36: 900 1 /* implement me */ jb302@36: 901 1 } jb302@36: 902 jb302@36: 903 /* 0xF9 - DIV R0, R1 */ jb302@36: 904 void jb302@36: 905 DIV(void) { jb302@36: 906 1 /* implement me */ jb302@36: 907 1 } jb302@36: 908 jb302@36: 909 /* 0xFA - DA A */ jb302@36: 910 void jb302@36: 911 DA(void) { jb302@36: 912 1 /* implement me */ jb302@36: 913 1 } jb302@36: 914 jb302@36: 915 /* 0xFC - IN port_addr */ jb302@36: 916 void jb302@36: 917 IN(void) { jb302@36: 918 1 /* implement me */ jb302@36: 919 1 } jb302@36: 920 jb302@36: 921 /* 0xFD - OUT port_addr */ jb302@36: 922 void jb302@36: 923 OUT(void) { jb302@36: C51 COMPILER V9.02 ISET 04/17/2014 15:17:32 PAGE 16 jb302@36: jb302@36: 924 1 /* implement me */ jb302@36: 925 1 } jb302@36: 926 jb302@36: 927 /* 0xFE INT vect8 */ jb302@36: 928 void jb302@36: 929 INT(void) { jb302@36: 930 1 /* implement me */ jb302@36: 931 1 } jb302@36: 932 jb302@36: 933 /* 0xFF - HLT */ jb302@36: 934 void jb302@36: 935 HLT(void) { jb302@36: 936 1 /* implement me */ jb302@36: 937 1 } jb302@36: jb302@36: jb302@36: MODULE INFORMATION: STATIC OVERLAYABLE jb302@36: CODE SIZE = 2932 ---- jb302@36: CONSTANT SIZE = ---- ---- jb302@36: XDATA SIZE = ---- ---- jb302@36: PDATA SIZE = ---- ---- jb302@36: DATA SIZE = ---- ---- jb302@36: IDATA SIZE = ---- ---- jb302@36: BIT SIZE = ---- ---- jb302@36: EDATA SIZE = ---- ---- jb302@36: HDATA SIZE = ---- ---- jb302@36: XDATA CONST SIZE = ---- ---- jb302@36: FAR CONST SIZE = ---- ---- jb302@36: END OF MODULE INFORMATION. jb302@36: jb302@36: jb302@36: C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)