* sim/ucsim/configure, sim/ucsim/cmd.src/newcmdcl.h,
[fw/sdcc] / sim / ucsim / hc08.src / hc08.cc
index 06af92c95137d473c77925c8e743054b8e5191a9..f333990d6cf5bb0329cfc392ae09794a11ecf2a6 100644 (file)
@@ -51,9 +51,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #define uint8 unsigned char
 #define int8 char
 
-const bool TRUE = 1;
-const bool FALSE = 0;
-
 /*******************************************************************/
 
 
@@ -74,7 +71,7 @@ cl_hc08::init(void)
 
   xtal = 8000000;
 
-  rom= mem(MEM_ROM);
+  rom= address_space(MEM_ROM_ID);
 //  ram= mem(MEM_XRAM);
   ram= rom;
 
@@ -112,7 +109,7 @@ cl_hc08::id_string(void)
 /*
  * Making elements of the controller
  */
-
+/*
 t_addr
 cl_hc08::get_mem_size(enum mem_class type)
 {
@@ -124,7 +121,7 @@ cl_hc08::get_mem_size(enum mem_class type)
     }
  return(cl_uc::get_mem_size(type));
 }
-
+*/
 void
 cl_hc08::mk_hw_elements(void)
 {
@@ -132,6 +129,27 @@ cl_hc08::mk_hw_elements(void)
   /* t_uc::mk_hw() does nothing */
 }
 
+void
+cl_hc08::make_memories(void)
+{
+  class cl_address_space *as;
+
+  as= new cl_address_space("rom", 0, 0x10000, 8);
+  as->init();
+  address_spaces->add(as);
+
+  class cl_address_decoder *ad;
+  class cl_memory_chip *chip;
+
+  chip= new cl_memory_chip("rom_chip", 0x10000, 8);
+  chip->init();
+  memchips->add(chip);
+  ad= new cl_address_decoder(as= address_space("rom"), chip, 0, 0xffff, 0);
+  ad->init();
+  as->decoders->add(ad);
+  ad->activate(0);
+}
+
 
 /*
  * Help command interpreter
@@ -199,12 +217,12 @@ cl_hc08::get_disasm_info(t_addr addr,
   int start_addr = addr;
   struct dis_entry *dis_e;
 
-  code= get_mem(MEM_ROM, addr++);
+  code= get_mem(MEM_ROM_ID, addr++);
   dis_e = NULL;
 
   switch(code) {
     case 0x9e:  /* ESC code to sp relative op-codes */
-      code= get_mem(MEM_ROM, addr++);
+      code= get_mem(MEM_ROM_ID, addr++);
       i= 0;
       while ((code & disass_hc08_9e[i].mask) != disass_hc08_9e[i].code &&
         disass_hc08_9e[i].mnemonic)
@@ -272,46 +290,46 @@ cl_hc08::disass(t_addr addr, char *sep)
          switch (*(b++))
            {
            case 's': // s    signed byte immediate
-             sprintf(temp, "#%d", (char)get_mem(MEM_ROM, addr+immed_offset));
+             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, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM, addr+immed_offset+1))) );
+                (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, addr+immed_offset));
+             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, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM, addr+immed_offset+1))) );
+                (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, addr+immed_offset));
+             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, addr+immed_offset)<<8) |
-                       (get_mem(MEM_ROM, addr+immed_offset+1))) );
+                (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, addr+immed_offset));
+              sprintf(temp, "0x%02x", (uint)get_mem(MEM_ROM_ID, addr+immed_offset));
              ++immed_offset;
              break;
            case 'p': // b    byte index offset
               sprintf(temp, "0x%04x",
                  addr+immed_offset+1
-                 +(char)get_mem(MEM_ROM, addr+immed_offset));
+                 +(char)get_mem(MEM_ROM_ID, addr+immed_offset));
              ++immed_offset;
              break;
            default:
@@ -397,71 +415,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:
@@ -469,56 +487,56 @@ 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);
@@ -532,47 +550,48 @@ 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);
   }
 
-  if (PC)
+  /*if (PC)
     PC--;
   else
-    PC= get_mem_size(MEM_ROM)-1;
+  PC= get_mem_size(MEM_ROM_ID)-1;*/
+  PC= rom->inc_address(PC, -1);
 
   sim->stop(resINV_INST);
   return(resINV_INST);