* sim/ucsim/cmd.src/info.cc, sim/ucsim/cmd.src/bp.cc,
[fw/sdcc] / sim / ucsim / hc08.src / hc08.cc
index 3550cbb9ded3904e3f2268a22921a0c27be557f8..2028ee13fc5f50f7289d27ebeba448d8caf75a60 100644 (file)
@@ -2,9 +2,9 @@
  * Simulator of microcontrollers (hc08.cc)
  *
  * some hc08 code base from Karl Bongers karl@turbobit.com
- * 
+ *
  * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
- * 
+ *
  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
  *
  */
@@ -49,10 +49,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #define uint32 t_addr
 #define uint8 unsigned char
-#define int8 char
-
-const bool TRUE = 1;
-const bool FALSE = 0;
 
 /*******************************************************************/
 
@@ -102,7 +98,7 @@ cl_hc08::reset(void)
 }
 
 
-char *
+const char *
 cl_hc08::id_string(void)
 {
   return("unspecified HC08");
@@ -181,9 +177,8 @@ int
 cl_hc08::inst_length(t_addr addr)
 {
   int len = 0;
-  char *s;
 
-  s = get_disasm_info(addr, &len, NULL, NULL);
+  get_disasm_info(addr, &len, NULL, NULL);
 
   return len;
 }
@@ -192,9 +187,8 @@ int
 cl_hc08::inst_branch(t_addr addr)
 {
   int b;
-  char *s;
 
-  s = get_disasm_info(addr, NULL, &b, NULL);
+  get_disasm_info(addr, NULL, &b, NULL);
 
   return b;
 }
@@ -206,13 +200,13 @@ cl_hc08::longest_inst(void)
 }
 
 
-char *
+const char *
 cl_hc08::get_disasm_info(t_addr addr,
                         int *ret_len,
                         int *ret_branch,
                         int *immed_offset)
 {
-  char *b = NULL;
+  const char *b = NULL;
   uint code;
   int len = 0;
   int immed_n = 0;
@@ -267,18 +261,19 @@ cl_hc08::get_disasm_info(t_addr addr,
   return b;
 }
 
-char *
-cl_hc08::disass(t_addr addr, char *sep)
+const char *
+cl_hc08::disass(t_addr addr, const char *sep)
 {
   char work[256], temp[20];
-  char *buf, *p, *b, *t;
+  const char *b;
+  char *buf, *p, *t;
   int len = 0;
   int immed_offset = 0;
 
   p= work;
 
   b = get_disasm_info(addr, &len, NULL, &immed_offset);
-  
+
   if (b == NULL) {
     buf= (char*)malloc(30);
     strcpy(buf, "UNKNOWN/INVALID");
@@ -288,63 +283,63 @@ cl_hc08::disass(t_addr addr, char *sep)
   while (*b)
     {
       if (*b == '%')
-       {
-         b++;
-         switch (*(b++))
-           {
-           case 's': // s    signed byte immediate
-             sprintf(temp, "#%d", (char)get_mem(MEM_ROM_ID, addr+immed_offset));
-             ++immed_offset;
-             break;
-           case 'w': // w    word immediate operand
-             sprintf(temp, "#0x%04x",
-                (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
-             ++immed_offset;
-             ++immed_offset;
-             break;
-           case 'b': // b    byte immediate operand
-             sprintf(temp, "#0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
-             ++immed_offset;
-             break;
-           case 'x': // x    extended addressing
-             sprintf(temp, "0x%04x",
-                (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
-             ++immed_offset;
-             ++immed_offset;
-             break;
-           case 'd': // d    direct addressing
-             sprintf(temp, "*0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
-             ++immed_offset;
-             break;
-           case '2': // 2    word index offset
-             sprintf(temp, "0x%04x",
-                (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
-             ++immed_offset;
-             ++immed_offset;
-             break;
-           case '1': // b    byte index offset
+        {
+          b++;
+          switch (*(b++))
+            {
+            case 's': // s    signed byte immediate
+              sprintf(temp, "#%d", (char)get_mem(MEM_ROM_ID, addr+immed_offset));
+              ++immed_offset;
+              break;
+            case 'w': // w    word immediate operand
+              sprintf(temp, "#0x%04x",
+                 (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
+                        (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
+              ++immed_offset;
+              ++immed_offset;
+              break;
+            case 'b': // b    byte immediate operand
+              sprintf(temp, "#0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
+              ++immed_offset;
+              break;
+            case 'x': // x    extended addressing
+              sprintf(temp, "0x%04x",
+                 (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
+                        (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
+              ++immed_offset;
+              ++immed_offset;
+              break;
+            case 'd': // d    direct addressing
+              sprintf(temp, "*0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
+              ++immed_offset;
+              break;
+            case '2': // 2    word index offset
+              sprintf(temp, "0x%04x",
+                 (uint)((get_mem(MEM_ROM_ID, addr+immed_offset)<<8) |
+                        (get_mem(MEM_ROM_ID, addr+immed_offset+1))) );
+              ++immed_offset;
+              ++immed_offset;
+              break;
+            case '1': // b    byte index offset
               sprintf(temp, "0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
-             ++immed_offset;
-             break;
-           case 'p': // b    byte index offset
+              ++immed_offset;
+              break;
+            case 'p': // b    byte index offset
               sprintf(temp, "0x%04x",
                  addr+immed_offset+1
                  +(char)get_mem(MEM_ROM_ID, addr+immed_offset));
-             ++immed_offset;
-             break;
-           default:
-             strcpy(temp, "?");
-             break;
-           }
-         t= temp;
-         while (*t)
-           *(p++)= *(t++);
-       }
+              ++immed_offset;
+              break;
+            default:
+              strcpy(temp, "?");
+              break;
+            }
+          t= temp;
+          while (*t)
+            *(p++)= *(t++);
+        }
       else
-       *(p++)= *(b++);
+        *(p++)= *(b++);
     }
   *p= '\0';
 
@@ -358,14 +353,14 @@ cl_hc08::disass(t_addr addr, char *sep)
     buf= (char *)malloc(6+strlen(p)+1);
   else
     buf= (char *)malloc((p-work)+strlen(sep)+strlen(p)+1);
-  for (p= work, b= buf; *p != ' '; p++, b++)
-    *b= *p;
+  for (p= work, t= buf; *p != ' '; p++, t++)
+    *t= *p;
   p++;
-  *b= '\0';
+  *t= '\0';
   if (sep == NULL)
     {
       while (strlen(buf) < 6)
-       strcat(buf, " ");
+        strcat(buf, " ");
     }
   else
     strcat(buf, sep);
@@ -375,27 +370,27 @@ cl_hc08::disass(t_addr addr, char *sep)
 
 
 void
-cl_hc08::print_regs(class cl_console *con)
+cl_hc08::print_regs(class cl_console_base *con)
 {
   con->dd_printf("V--HINZC  Flags= 0x%02x %3d %c  ",
-                regs.P, regs.P, isprint(regs.P)?regs.P:'.');
+                 regs.P, regs.P, isprint(regs.P)?regs.P:'.');
   con->dd_printf("A= 0x%02x %3d %c\n",
-                regs.A, regs.A, isprint(regs.A)?regs.A:'.');
+                 regs.A, regs.A, isprint(regs.A)?regs.A:'.');
   con->dd_printf("%c--%c%c%c%c%c  ",
-                (regs.P&BIT_V)?'1':'0',
-                (regs.P&BIT_H)?'1':'0',
-                (regs.P&BIT_I)?'1':'0',
-                (regs.P&BIT_N)?'1':'0',
-                (regs.P&BIT_Z)?'1':'0',
-                (regs.P&BIT_C)?'1':'0');
+                 (regs.P&BIT_V)?'1':'0',
+                 (regs.P&BIT_H)?'1':'0',
+                 (regs.P&BIT_I)?'1':'0',
+                 (regs.P&BIT_N)?'1':'0',
+                 (regs.P&BIT_Z)?'1':'0',
+                 (regs.P&BIT_C)?'1':'0');
   con->dd_printf("    H= 0x%02x %3d %c  ",
-                regs.H, regs.H, isprint(regs.H)?regs.H:'.');
+                 regs.H, regs.H, isprint(regs.H)?regs.H:'.');
   con->dd_printf("X= 0x%02x %3d %c\n",
-                regs.X, regs.X, isprint(regs.X)?regs.X:'.');
+                 regs.X, regs.X, isprint(regs.X)?regs.X:'.');
   con->dd_printf("SP= 0x%04x [SP+1]= %02x %3d %c\n",
-                regs.SP, ram->get(regs.SP+1), ram->get(regs.SP+1),
-                isprint(ram->get(regs.SP+1))?ram->get(regs.SP+1):'.');
-  
+                 regs.SP, ram->get(regs.SP+1), ram->get(regs.SP+1),
+                 isprint(ram->get(regs.SP+1))?ram->get(regs.SP+1):'.');
+
   print_disass(PC, con);
 }
 
@@ -418,71 +413,71 @@ cl_hc08::exec_inst(void)
     return(resBREAKPOINT);
   tick(1);
   switch ((code >> 4) & 0xf) {
-    case 0x0: return(inst_bittestsetclear(code, FALSE));
-    case 0x1: return(inst_bitsetclear(code, FALSE));
-    case 0x2: return(inst_condbranch(code, FALSE));
+    case 0x0: return(inst_bittestsetclear(code, false));
+    case 0x1: return(inst_bitsetclear(code, false));
+    case 0x2: return(inst_condbranch(code, false));
     case 0x3:
     case 0x4:
     case 0x5:
     case 0x6:
     case 0x7:
       switch (code & 0xf) {
-        case 0x0: return(inst_neg(code, FALSE));
-        case 0x1: return(inst_cbeq(code, FALSE));
+        case 0x0: return(inst_neg(code, false));
+        case 0x1: return(inst_cbeq(code, false));
         case 0x2:
           switch (code) {
-            case 0x42: return(inst_mul(code, FALSE));
-            case 0x52: return(inst_div(code, FALSE));
-            case 0x62: return(inst_nsa(code, FALSE));
-            case 0x72: return(inst_daa(code, FALSE));
+            case 0x42: return(inst_mul(code, false));
+            case 0x52: return(inst_div(code, false));
+            case 0x62: return(inst_nsa(code, false));
+            case 0x72: return(inst_daa(code, false));
             default: return(resHALT);
           }
-        case 0x3: return(inst_com(code, FALSE));
-        case 0x4: return(inst_lsr(code, FALSE));
+        case 0x3: return(inst_com(code, false));
+        case 0x4: return(inst_lsr(code, false));
         case 0x5:
           switch (code) {
-            case 0x35: return(inst_sthx(code, FALSE));
+            case 0x35: return(inst_sthx(code, false));
             case 0x45:
-            case 0x55: return(inst_ldhx(code, FALSE));
+            case 0x55: return(inst_ldhx(code, false));
             case 0x65:
-            case 0x75: return(inst_cphx(code, FALSE));
+            case 0x75: return(inst_cphx(code, false));
             default: return(resHALT);
           }
-        case 0x6: return(inst_ror(code, FALSE));
-        case 0x7: return(inst_asr(code, FALSE));
-        case 0x8: return(inst_lsl(code, FALSE));
-        case 0x9: return(inst_rol(code, FALSE));
-        case 0xa: return(inst_dec(code, FALSE));
-        case 0xb: return(inst_dbnz(code, FALSE));
-        case 0xc: return(inst_inc(code, FALSE));
-        case 0xd: return(inst_tst(code, FALSE));
+        case 0x6: return(inst_ror(code, false));
+        case 0x7: return(inst_asr(code, false));
+        case 0x8: return(inst_lsl(code, false));
+        case 0x9: return(inst_rol(code, false));
+        case 0xa: return(inst_dec(code, false));
+        case 0xb: return(inst_dbnz(code, false));
+        case 0xc: return(inst_inc(code, false));
+        case 0xd: return(inst_tst(code, false));
         case 0xe:
           switch (code) {
             case 0x4e:
             case 0x5e:
             case 0x6e:
-            case 0x7e: return(inst_mov(code, FALSE));
+            case 0x7e: return(inst_mov(code, false));
             default: return(resHALT);
           }
-        case 0xf: return(inst_clr(code, FALSE));
+        case 0xf: return(inst_clr(code, false));
         default: return(resHALT);
       }
     case 0x8:
       switch (code & 0xf) {
-        case 0x0: return(inst_rti(code, FALSE));
-        case 0x1: return(inst_rts(code, FALSE));
-        case 0x3: return(inst_swi(code, FALSE));
+        case 0x0: return(inst_rti(code, false));
+        case 0x1: return(inst_rts(code, false));
+        case 0x3: return(inst_swi(code, false));
         case 0x4:
-        case 0x5: return(inst_transfer(code, FALSE));
+        case 0x5: return(inst_transfer(code, false));
         case 0x6:
         case 0x7:
         case 0x8:
         case 0x9:
         case 0xa:
-        case 0xb: return(inst_pushpull(code, FALSE));
-        case 0xc: return(inst_clrh(code, FALSE));
-        case 0xe: return(inst_stop(code, FALSE));
-        case 0xf: return(inst_wait(code, FALSE));
+        case 0xb: return(inst_pushpull(code, false));
+        case 0xc: return(inst_clrh(code, false));
+        case 0xe: return(inst_stop(code, false));
+        case 0xf: return(inst_wait(code, false));
         default: return(resHALT);
       }
     case 0x9:
@@ -490,61 +485,61 @@ cl_hc08::exec_inst(void)
         case 0x0:
         case 0x1:
         case 0x2:
-        case 0x3: return(inst_condbranch(code, FALSE));
+        case 0x3: return(inst_condbranch(code, false));
         case 0x4:
         case 0x5:
         case 0x7:
-        case 0xf: return(inst_transfer(code, FALSE));
+        case 0xf: return(inst_transfer(code, false));
         case 0x8:
         case 0x9:
         case 0xa:
-        case 0xb: return(inst_setclearflags(code, FALSE));
-        case 0xc: return(inst_rsp(code, FALSE));
-        case 0xd: return(inst_nop(code, FALSE));
+        case 0xb: return(inst_setclearflags(code, false));
+        case 0xc: return(inst_rsp(code, false));
+        case 0xd: return(inst_nop(code, false));
         case 0xe:
           code = fetch();
           switch ((code >> 4) & 0xf) {
             case 0x6:
               switch (code & 0xf) {
-                case 0x0: return(inst_neg(code, TRUE));
-                case 0x1: return(inst_cbeq(code, TRUE));
-                case 0x3: return(inst_com(code, TRUE));
-                case 0x4: return(inst_lsr(code, TRUE));
-                case 0x6: return(inst_ror(code, TRUE));
-                case 0x7: return(inst_asr(code, TRUE));
-                case 0x8: return(inst_lsl(code, TRUE));
-                case 0x9: return(inst_rol(code, TRUE));
-                case 0xa: return(inst_dec(code, TRUE));
-                case 0xb: return(inst_dbnz(code, TRUE));
-                case 0xc: return(inst_inc(code, TRUE));
-                case 0xd: return(inst_tst(code, TRUE));
-                case 0xf: return(inst_clr(code, TRUE));
+                case 0x0: return(inst_neg(code, true));
+                case 0x1: return(inst_cbeq(code, true));
+                case 0x3: return(inst_com(code, true));
+                case 0x4: return(inst_lsr(code, true));
+                case 0x6: return(inst_ror(code, true));
+                case 0x7: return(inst_asr(code, true));
+                case 0x8: return(inst_lsl(code, true));
+                case 0x9: return(inst_rol(code, true));
+                case 0xa: return(inst_dec(code, true));
+                case 0xb: return(inst_dbnz(code, true));
+                case 0xc: return(inst_inc(code, true));
+                case 0xd: return(inst_tst(code, true));
+                case 0xf: return(inst_clr(code, true));
                 default: return(resHALT);
               }
             case 0xd:
             case 0xe:
               switch (code & 0xf) {
-                case 0x0: return(inst_sub(code, TRUE));
-                case 0x1: return(inst_cmp(code, TRUE));
-                case 0x2: return(inst_sbc(code, TRUE));
-                case 0x3: return(inst_cpx(code, TRUE));
-                case 0x4: return(inst_and(code, TRUE));
-                case 0x5: return(inst_bit(code, TRUE));
-                case 0x6: return(inst_lda(code, TRUE));
-                case 0x7: return(inst_sta(code, TRUE));
-                case 0x8: return(inst_eor(code, TRUE));
-                case 0x9: return(inst_adc(code, TRUE));
-                case 0xa: return(inst_ora(code, TRUE));
-                case 0xb: return(inst_add(code, TRUE));
+                case 0x0: return(inst_sub(code, true));
+                case 0x1: return(inst_cmp(code, true));
+                case 0x2: return(inst_sbc(code, true));
+                case 0x3: return(inst_cpx(code, true));
+                case 0x4: return(inst_and(code, true));
+                case 0x5: return(inst_bit(code, true));
+                case 0x6: return(inst_lda(code, true));
+                case 0x7: return(inst_sta(code, true));
+                case 0x8: return(inst_eor(code, true));
+                case 0x9: return(inst_adc(code, true));
+                case 0xa: return(inst_ora(code, true));
+                case 0xb: return(inst_add(code, true));
                 case 0xc: return(resHALT);
                 case 0xd: putchar(regs.A); fflush(stdout); return(resGO);
-                case 0xe: return(inst_ldx(code, TRUE));
-                case 0xf: return(inst_stx(code, TRUE));
+                case 0xe: return(inst_ldx(code, true));
+                case 0xf: return(inst_stx(code, true));
                 default: return(resHALT);
               }
             default: return(resHALT);
           }
-              
+
       }
     case 0xa:
     case 0xb:
@@ -553,38 +548,38 @@ cl_hc08::exec_inst(void)
     case 0xe:
     case 0xf:
       switch (code & 0xf) {
-        case 0x0: return(inst_sub(code, FALSE));
-        case 0x1: return(inst_cmp(code, FALSE));
-        case 0x2: return(inst_sbc(code, FALSE));
-        case 0x3: return(inst_cpx(code, FALSE));
-        case 0x4: return(inst_and(code, FALSE));
-        case 0x5: return(inst_bit(code, FALSE));
-        case 0x6: return(inst_lda(code, FALSE));
+        case 0x0: return(inst_sub(code, false));
+        case 0x1: return(inst_cmp(code, false));
+        case 0x2: return(inst_sbc(code, false));
+        case 0x3: return(inst_cpx(code, false));
+        case 0x4: return(inst_and(code, false));
+        case 0x5: return(inst_bit(code, false));
+        case 0x6: return(inst_lda(code, false));
         case 0x7:
           if (code==0xa7)
-            return(inst_ais(code, FALSE));
+            return(inst_ais(code, false));
           else
-            return(inst_sta(code, FALSE));
-        case 0x8: return(inst_eor(code, FALSE));
-        case 0x9: return(inst_adc(code, FALSE));
-        case 0xa: return(inst_ora(code, FALSE));
-        case 0xb: return(inst_add(code, FALSE));
+            return(inst_sta(code, false));
+        case 0x8: return(inst_eor(code, false));
+        case 0x9: return(inst_adc(code, false));
+        case 0xa: return(inst_ora(code, false));
+        case 0xb: return(inst_add(code, false));
         case 0xc:
           if (code==0xac)
             return(resHALT);
           else
-            return(inst_jmp(code, FALSE));
+            return(inst_jmp(code, false));
         case 0xd:
           if (code==0xad)
-            return(inst_bsr(code, FALSE));
+            return(inst_bsr(code, false));
           else
-            return(inst_jsr(code, FALSE));
-        case 0xe: return(inst_ldx(code, FALSE));
+            return(inst_jsr(code, false));
+        case 0xe: return(inst_ldx(code, false));
         case 0xf:
           if (code==0xaf)
-            return(inst_aix(code, FALSE));
+            return(inst_aix(code, false));
           else
-            return(inst_stx(code, FALSE));
+            return(inst_stx(code, false));
         default: return(resHALT);
       }
     default: return(resHALT);