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)