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